diff --git a/MyTracks/res/layout/mytracks_layout.xml b/MyTracks/res/layout/mytracks_layout.xml new file mode 100644 index 000000000..1e4c30873 --- /dev/null +++ b/MyTracks/res/layout/mytracks_layout.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index ab94f5e45..81eefb854 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -20,7 +20,6 @@ import static com.google.android.apps.mytracks.Constants.RESUME_TRACK_EXTRA_NAME import com.google.android.apps.mytracks.MyTracks; import com.google.android.apps.mytracks.Constants; -import com.google.android.apps.mytracks.TrackDataHub; import com.google.android.apps.mytracks.content.MyTracksLocation; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Sensor; @@ -278,10 +277,6 @@ public class TrackRecordingService extends Service implements LocationListener { announcementExecutor.update(); splitExecutor.update(); - // Send broadcast that the track has been updated. - sendTrackBroadcast(R.string.track_updated_broadcast_action, - recordingTrack.getId()); - return true; } @@ -409,13 +404,11 @@ public class TrackRecordingService extends Service implements LocationListener { public void unregisterLocationListener() { if (locationManager == null) { - Log.e(TAG, - "TrackRecordingService: Do not have any location manager."); + Log.e(TAG, "TrackRecordingService: Do not have any location manager."); return; } locationManager.removeUpdates(this); - Log.d(TAG, - "Location listener now unregistered w/ TrackRecordingService."); + Log.d(TAG, "Location listener now unregistered w/ TrackRecordingService."); } private Track getRecordingTrack() { @@ -1112,9 +1105,6 @@ public class TrackRecordingService extends Service implements LocationListener { // Persist the current recording track. prefManager.setRecordingTrack(recordingTrackId); - TrackDataHub dataHub = MyTracks.getInstance().getDataHub(); - dataHub.loadTrack(track.getId()); - // Notify the world that we're now recording. sendTrackBroadcast( R.string.track_started_broadcast_action, recordingTrackId); @@ -1160,6 +1150,7 @@ public class TrackRecordingService extends Service implements LocationListener { } releaseWakeLock(); + unregisterLocationListener(); // Notify the world that we're no longer recording. sendTrackBroadcast( diff --git a/MyTracks/src/com/google/android/apps/mytracks/widgets/AppWidgetProvider.java b/MyTracks/src/com/google/android/apps/mytracks/widgets/AppWidgetProvider.java index 715cd438c..163a57774 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/widgets/AppWidgetProvider.java +++ b/MyTracks/src/com/google/android/apps/mytracks/widgets/AppWidgetProvider.java @@ -21,12 +21,15 @@ import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.database.ContentObserver; +import android.os.Handler; import android.util.Log; import android.widget.RemoteViews; import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; +import com.google.android.apps.mytracks.content.TracksColumns; import com.google.android.apps.mytracks.services.TrackRecordingService; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.StringUtils; @@ -39,9 +42,54 @@ import com.google.android.maps.mytracks.R; * @author Paul R. Saxman */ public class AppWidgetProvider extends android.appwidget.AppWidgetProvider { + + class TrackObserver extends ContentObserver { + + public TrackObserver() { + super(contentHandler); + } + + public void onChange(boolean selfChange) { + updateTrack(-1, null); + } + } + + private final Handler contentHandler; + private MyTracksProviderUtils providerUtils; + // TODO kill this. I am fairly certain this is a bug. + private Context context; + private String unknown; + private String time; + private String distance; + private String speed; + + public AppWidgetProvider() { + super(); + contentHandler = new Handler(); + } + + @Override + public void onEnabled(Context context) { + context.getContentResolver().registerContentObserver(TracksColumns.CONTENT_URI, true, new TrackObserver()); + initialize(context); + } + + private void initialize(Context context) { + if (this.context != null) { + return; + } + providerUtils = MyTracksProviderUtils.Factory.get(context); + this.context = context; + this.distance = context.getString(R.string.kilometer); + this.speed = context.getString(R.string.kilometer_per_hour); + this.time = context.getString(R.string.min); + this.unknown = context.getString(R.string.unknown); + } + @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); + initialize(context); long trackId = intent.getLongExtra( context.getString(R.string.track_id_broadcast_extra), -1); @@ -51,27 +99,32 @@ public class AppWidgetProvider extends android.appwidget.AppWidgetProvider { "MyTracksAppWidgetProvider.onReceive: trackId=" + trackId + ", action=" + action); + updateTrack(trackId, action); + } + + private void updateTrack(long trackId, String action) { Track track = null; if (trackId != -1) { Log.d(Constants.TAG, "MyTracksAppWidgetProvider.onReceive: Retrieving specified track."); - track = MyTracksProviderUtils.Factory.get(context).getTrack(trackId); + track = providerUtils.getTrack(trackId); } else { Log.d(Constants.TAG, "MyTracksAppWidgetProvider.onReceive: Attempting to retrieve previous track."); - track = MyTracksProviderUtils.Factory.get(context).getLastTrack(); + // TODO we should really read the pref. + track = providerUtils.getLastTrack(); } AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - ComponentName widget = - new ComponentName(context, AppWidgetProvider.class); - RemoteViews views = new RemoteViews(context.getPackageName(), - R.layout.appwidget); + ComponentName widget = new ComponentName(context, AppWidgetProvider.class); + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(widget); for (int appWidgetId : appWidgetIds) { - updateViewButton(views, context, action); - updateViewTrackStatistics(views, track, context); + if (action != null) { + updateViewButton(views, context, action); + } + updateViewTrackStatistics(views, track); appWidgetManager.updateAppWidget(appWidgetId, views); } } @@ -112,15 +165,13 @@ public class AppWidgetProvider extends android.appwidget.AppWidgetProvider { * the specified track. * * @param views The RemoteViews to update with statistics - * @param context The Context of the AppWidget * @param track The track to extract statistics from. */ - protected void updateViewTrackStatistics(RemoteViews views, Track track, - Context context) { + protected void updateViewTrackStatistics(RemoteViews views, Track track) { if (track == null) { - views.setTextViewText(R.id.appwidget_distance_text, "NA"); - views.setTextViewText(R.id.appwidget_time_text, "NA"); - views.setTextViewText(R.id.appwidget_speed_text, "NA"); + views.setTextViewText(R.id.appwidget_distance_text, unknown); + views.setTextViewText(R.id.appwidget_time_text, unknown); + views.setTextViewText(R.id.appwidget_speed_text, unknown); return; } @@ -131,19 +182,20 @@ public class AppWidgetProvider extends android.appwidget.AppWidgetProvider { TripStatistics stats = track.getStatistics(); + // TODO replace this with format strings and miles. // convert meters to kilometers String distance = StringUtils.formatSingleDecimalPlace(stats.getTotalDistance() / 1000) - + " " + context.getString(R.string.kilometer); + + " " + this.distance; // convert ms to minutes String time = StringUtils.formatSingleDecimalPlace(stats.getMovingTime() / 60000d) - + " mins"; + + " " + this.time; - String speed = "NA"; + String speed = unknown; if (!Double.isNaN(stats.getAverageMovingSpeed())) { // convert m/s to km/h speed = StringUtils.formatSingleDecimalPlace(stats.getAverageMovingSpeed() * 3.6) - + " " + context.getString(R.string.kilometer_per_hour); + + " " + this.speed; } views.setTextViewText(R.id.appwidget_distance_text, distance); diff --git a/MyTracksLib/res/values/third_party.xml b/MyTracksLib/res/values/third_party.xml index 3d91435c1..52adbb40e 100644 --- a/MyTracksLib/res/values/third_party.xml +++ b/MyTracksLib/res/values/third_party.xml @@ -26,7 +26,6 @@ limitations under the License. com.google.android.apps.mytracks.TRACK_PAUSED com.google.android.apps.mytracks.TRACK_RESUMED com.google.android.apps.mytracks.TRACK_STOPPED - com.google.android.apps.mytracks.TRACK_UPDATED com.google.android.apps.mytracks.TRACK_ID