From 2aa72f42308a7b67af525f04ea951635b259a19a Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Tue, 5 Jun 2012 11:03:34 -0700 Subject: [PATCH] Use TaskStackBuilder to support cross tasks navigation. --- .../android/apps/mytracks/ImportActivity.java | 9 ++-- .../services/TrackRecordingService.java | 21 ++++++---- .../mytracks/widgets/TrackWidgetProvider.java | 41 ++++++++++--------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/ImportActivity.java b/MyTracks/src/com/google/android/apps/mytracks/ImportActivity.java index aa49e76f0..3998b5b30 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ImportActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ImportActivity.java @@ -30,6 +30,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.support.v4.app.TaskStackBuilder; import android.util.Log; import android.widget.Toast; @@ -142,10 +143,12 @@ public class ImportActivity extends Activity { @Override public void onClick(DialogInterface dialog, int which) { if (!importAll && trackId != -1L) { - Intent intent = IntentUtils.newIntent( - ImportActivity.this, TrackDetailActivity.class) + Intent intent = IntentUtils + .newIntent(ImportActivity.this, TrackDetailActivity.class) .putExtra(TrackDetailActivity.EXTRA_TRACK_ID, trackId); - startActivity(intent); + TaskStackBuilder taskStackBuilder = TaskStackBuilder.from(ImportActivity.this); + taskStackBuilder.addNextIntent(intent); + taskStackBuilder.startActivities(); } finish(); } 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 c5fcad88e..975cf5ee7 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -64,6 +64,8 @@ import android.os.IBinder; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.Process; +import android.support.v4.app.NotificationCompat; +import android.support.v4.app.TaskStackBuilder; import android.util.Log; import java.util.Locale; @@ -479,16 +481,19 @@ public class TrackRecordingService extends Service { */ private void showNotification() { if (isRecording) { - Notification notification = new Notification( - R.drawable.my_tracks_notification_icon, null, System.currentTimeMillis()); Intent intent = IntentUtils.newIntent(this, TrackDetailActivity.class) .putExtra(TrackDetailActivity.EXTRA_TRACK_ID, recordingTrackId); - PendingIntent contentIntent = PendingIntent.getActivity( - this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - notification.setLatestEventInfo(this, getString(R.string.my_tracks_app_name), - getString(R.string.track_record_notification), contentIntent); - notification.flags += Notification.FLAG_NO_CLEAR; - startForegroundService(notification); + TaskStackBuilder taskStackBuilder = TaskStackBuilder.from(this); + taskStackBuilder.addNextIntent(intent); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this) + .setContentIntent(taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)) + .setContentText(getString(R.string.track_record_notification)) + .setContentTitle(getString(R.string.my_tracks_app_name)) + .setOngoing(true) + .setSmallIcon(R.drawable.my_tracks_notification_icon) + .setWhen(System.currentTimeMillis()); + startForegroundService(builder.getNotification()); } else { stopForegroundService(); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java index d02a5eb11..c3d3f19f8 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java +++ b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java @@ -40,6 +40,7 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.database.ContentObserver; import android.os.Handler; +import android.support.v4.app.TaskStackBuilder; import android.widget.RemoteViews; /** @@ -172,26 +173,13 @@ public class TrackWidgetProvider extends AppWidgetProvider * @param action the action */ private void updateTrack(String action) { - Track track = selectedTrackId != PreferencesUtils.SELECTED_TRACK_ID_DEFAULT ? myTracksProviderUtils - .getTrack(selectedTrackId) - : myTracksProviderUtils.getLastTrack(); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.track_widget); - Intent intent; - if (track != null) { - intent = IntentUtils.newIntent(context, TrackDetailActivity.class) - .putExtra(TrackDetailActivity.EXTRA_TRACK_ID, track.getId()); - } else { - intent = IntentUtils.newIntent(context, TrackListActivity.class); - } - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); - remoteViews.setOnClickPendingIntent(R.id.track_widget_statistics, pendingIntent); - if (action != null) { updateButton(remoteViews, action); } - updateStatistics(remoteViews, track); - + updateStatistics(remoteViews); + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds( new ComponentName(context, TrackWidgetProvider.class)); @@ -209,13 +197,14 @@ public class TrackWidgetProvider extends AppWidgetProvider private void updateButton(RemoteViews remoteViews, String action) { int trackAction = trackStartedBroadcastAction.equals(action) ? R.string.track_action_end : R.string.track_action_start; - int icon = trackStartedBroadcastAction.equals(action) ? R.drawable.app_widget_button_enabled - : R.drawable.app_widget_button_disabled; Intent intent = new Intent(context, ControlRecordingService.class).setAction( context.getString(trackAction)); PendingIntent pendingIntent = PendingIntent.getService( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.track_widget_button, pendingIntent); + + int icon = trackStartedBroadcastAction.equals(action) ? R.drawable.app_widget_button_enabled + : R.drawable.app_widget_button_disabled; remoteViews.setImageViewResource(R.id.track_widget_button, icon); } @@ -223,9 +212,10 @@ public class TrackWidgetProvider extends AppWidgetProvider * Updates statistics. * * @param remoteViews the remote views - * @param track the track */ - private void updateStatistics(RemoteViews remoteViews, Track track) { + private void updateStatistics(RemoteViews remoteViews) { + Track track = selectedTrackId != PreferencesUtils.SELECTED_TRACK_ID_DEFAULT + ? myTracksProviderUtils.getTrack(selectedTrackId) : myTracksProviderUtils.getLastTrack(); TripStatistics tripStatistics = track == null ? null : track.getStatistics(); String distance = tripStatistics == null ? unknown : StringUtils.formatDistance(context, tripStatistics.getTotalDistance(), metricUnits); @@ -240,6 +230,7 @@ public class TrackWidgetProvider extends AppWidgetProvider speedLabelId = reportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace; } + String speed = tripStatistics == null ? unknown : StringUtils.formatSpeed( context, useTotalTime ? tripStatistics.getAverageSpeed() : tripStatistics.getAverageMovingSpeed(), metricUnits, reportSpeed); @@ -248,5 +239,17 @@ public class TrackWidgetProvider extends AppWidgetProvider remoteViews.setTextViewText(R.id.track_widget_time_value, time); remoteViews.setTextViewText(R.id.track_widget_speed_label, context.getString(speedLabelId)); remoteViews.setTextViewText(R.id.track_widget_speed_value, speed); + + Intent intent; + if (track != null) { + intent = IntentUtils.newIntent(context, TrackDetailActivity.class) + .putExtra(TrackDetailActivity.EXTRA_TRACK_ID, track.getId()); + } else { + intent = IntentUtils.newIntent(context, TrackListActivity.class); + } + TaskStackBuilder taskStackBuilder = TaskStackBuilder.from(context); + taskStackBuilder.addNextIntent(intent); + remoteViews.setOnClickPendingIntent( + R.id.track_widget_statistics, taskStackBuilder.getPendingIntent(0, 0)); } }