diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index bc2602625..76ecaf101 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -236,10 +236,7 @@ limitations under the License. - - - diff --git a/MyTracks/res/drawable-hdpi/track_widget_record_button.png b/MyTracks/res/drawable-hdpi/track_widget_record_button.png deleted file mode 100644 index 443fd673d..000000000 Binary files a/MyTracks/res/drawable-hdpi/track_widget_record_button.png and /dev/null differ diff --git a/MyTracks/res/drawable-hdpi/track_widget_stop_button.png b/MyTracks/res/drawable-hdpi/track_widget_stop_button.png deleted file mode 100644 index b833ea8a1..000000000 Binary files a/MyTracks/res/drawable-hdpi/track_widget_stop_button.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/track_widget_record_button.png b/MyTracks/res/drawable-mdpi/track_widget_record_button.png deleted file mode 100644 index dae871219..000000000 Binary files a/MyTracks/res/drawable-mdpi/track_widget_record_button.png and /dev/null differ diff --git a/MyTracks/res/drawable-mdpi/track_widget_stop_button.png b/MyTracks/res/drawable-mdpi/track_widget_stop_button.png deleted file mode 100644 index fd7c98350..000000000 Binary files a/MyTracks/res/drawable-mdpi/track_widget_stop_button.png and /dev/null differ diff --git a/MyTracks/res/drawable-xhdpi/track_widget_record_button.png b/MyTracks/res/drawable-xhdpi/track_widget_record_button.png deleted file mode 100644 index 4feece325..000000000 Binary files a/MyTracks/res/drawable-xhdpi/track_widget_record_button.png and /dev/null differ diff --git a/MyTracks/res/drawable-xhdpi/track_widget_stop_button.png b/MyTracks/res/drawable-xhdpi/track_widget_stop_button.png deleted file mode 100644 index 5d3b1fe01..000000000 Binary files a/MyTracks/res/drawable-xhdpi/track_widget_stop_button.png and /dev/null differ diff --git a/MyTracks/res/drawable/track_widget_record_button_background.xml b/MyTracks/res/drawable/track_widget_record_button_background.xml deleted file mode 100644 index d87b626d5..000000000 --- a/MyTracks/res/drawable/track_widget_record_button_background.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/MyTracks/res/drawable/track_widget_stop_button_background.xml b/MyTracks/res/drawable/track_widget_stop_button_background.xml deleted file mode 100644 index 047941831..000000000 --- a/MyTracks/res/drawable/track_widget_stop_button_background.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/MyTracks/res/layout/track_widget.xml b/MyTracks/res/layout/track_widget.xml index bc45e2169..12b826aae 100644 --- a/MyTracks/res/layout/track_widget.xml +++ b/MyTracks/res/layout/track_widget.xml @@ -15,94 +15,100 @@ See the License for the specific language governing permissions and limitations under the License. --> - + android:orientation="vertical" + android:paddingBottom="8dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingTop="8dp" > + android:layout_height="wrap_content" + android:layout_width="fill_parent" + android:orientation="vertical" > - + + - + + - - - - + - - - - + android:id="@+id/track_widget_moving_time_container" + android:layout_height="wrap_content" + android:layout_width="fill_parent" + android:orientation="vertical" > + + + + + + + + + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:src="@drawable/btn_record" /> + + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:src="@drawable/btn_stop_0" /> \ No newline at end of file diff --git a/MyTracks/res/values/do_not_translate.xml b/MyTracks/res/values/do_not_translate.xml index a2e8525f1..b2f975b7e 100644 --- a/MyTracks/res/values/do_not_translate.xml +++ b/MyTracks/res/values/do_not_translate.xml @@ -94,7 +94,8 @@ Google은 이용자에 대한 위치정보의 이용∙제공사실을 위치정 LOCATION NUMBER com.google.android.apps.mytracks.END_CURRENT_TRACK - android.intent.action.SAVE + com.google.android.apps.mytracks.PAUSE_CURRENT_TRACK + com.google.android.apps.mytracks.RESUME_CURRENT_TRACK com.google.android.apps.mytracks.START_NEW_TRACK - \ No newline at end of file diff --git a/MyTracks/res/values/styles.xml b/MyTracks/res/values/styles.xml index 01cf7d323..864e625b5 100644 --- a/MyTracks/res/values/styles.xml +++ b/MyTracks/res/values/styles.xml @@ -192,17 +192,11 @@ limitations under the License. fill_parent vertical - - + + - - \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/ControlRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/ControlRecordingService.java index 7b7b9f378..3fb94f757 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/ControlRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/ControlRecordingService.java @@ -114,6 +114,10 @@ public class ControlRecordingService extends IntentService implements ServiceCon trackRecordingService.startNewTrack(); } else if (action.equals(getString(R.string.track_action_end))) { trackRecordingService.endCurrentTrack(); + } else if (action.equals(getString(R.string.track_action_pause))) { + trackRecordingService.pauseCurrentTrack(); + } else if (action.equals(getString(R.string.track_action_resume))) { + trackRecordingService.resumeCurrentTrack(); } } catch (RemoteException e) { Log.d(TAG, "ControlRecordingService onHandleIntent RemoteException", e); 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 67d4f4d63..c7fb0bda0 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java +++ b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java @@ -45,8 +45,9 @@ import android.view.View; import android.widget.RemoteViews; /** - * A track widget to start/stop recording, launch My Tracks, and display track - * statistics (distance, time, speed) for the selected track or the last track. + * A track widget to start/stop/pause/resume recording, launch My Tracks, and + * display track statistics (total distance, total time, average speed, and + * moving time) for the recording track, the selected track or the last track. * * @author Sandor Dornbush * @author Paul R. Saxman @@ -67,21 +68,28 @@ public class TrackWidgetProvider extends AppWidgetProvider @Override public void onChange(boolean selfChange) { - updateTrack(null); + update(); } } + // Set in constructor private final Handler handler; + + // Set when initializing private Context context; private TrackObserver trackObserver; private MyTracksProviderUtils myTracksProviderUtils; - + private RemoteViews remoteViews; private String unknown; - private String trackStartedBroadcastAction; - private String trackStoppedBroadcastAction; - private SharedPreferences sharedPreferences; + + // Set if there is a track + private TripStatistics tripStatistics; + + // Preferences private long selectedTrackId; + private long recordingTrackId; + private boolean recordingtrackPaused; private boolean metricUnits; private boolean reportSpeed; private boolean showMovingTime; @@ -93,6 +101,24 @@ public class TrackWidgetProvider extends AppWidgetProvider @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + if (key == null + || key.equals(PreferencesUtils.getKey(context, R.string.selected_track_id_key))) { + selectedTrackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key); + } + if (key == null + || key.equals(PreferencesUtils.getKey(context, R.string.recording_track_id_key))) { + long oldValue = recordingTrackId; + recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); + if (oldValue == PreferencesUtils.RECORDING_TRACK_ID_DEFAULT + && recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { + recordingtrackPaused = false; + } + } + if (key == null + || key.equals(PreferencesUtils.getKey(context, R.string.recording_track_paused_key))) { + recordingtrackPaused = PreferencesUtils.getBoolean(context, + R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT); + } if (key == null || key.equals(PreferencesUtils.getKey(context, R.string.metric_units_key))) { metricUnits = PreferencesUtils.getBoolean( context, R.string.metric_units_key, PreferencesUtils.METRIC_UNITS_DEFAULT); @@ -106,29 +132,33 @@ public class TrackWidgetProvider extends AppWidgetProvider showMovingTime = PreferencesUtils.getBoolean(context, R.string.stats_show_moving_time_key, PreferencesUtils.STATS_SHOW_MOVING_TIME_DEFAULT); } - if (key == null - || key.equals(PreferencesUtils.getKey(context, R.string.selected_track_id_key))) { - selectedTrackId = PreferencesUtils.getLong(context, R.string.selected_track_id_key); - } if (key != null) { - updateTrack(null); + update(); } } @Override public void onReceive(Context aContext, Intent intent) { super.onReceive(aContext, intent); - initialize(aContext); + if (context == null) { + // Not initialized + context = aContext; + trackObserver = new TrackObserver(); + myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); + remoteViews = new RemoteViews(context.getPackageName(), R.layout.track_widget); - selectedTrackId = intent.getLongExtra( - context.getString(R.string.track_id_broadcast_extra), selectedTrackId); + unknown = context.getString(R.string.value_unknown); + + sharedPreferences = context.getSharedPreferences(SETTINGS_NAME, Context.MODE_PRIVATE); + sharedPreferences.registerOnSharedPreferenceChangeListener(this); + onSharedPreferenceChanged(sharedPreferences, null); + context.getContentResolver() + .registerContentObserver(TracksColumns.CONTENT_URI, true, trackObserver); + } String action = intent.getAction(); - if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action) - || AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action) - || trackStartedBroadcastAction.equals(action) - || trackStoppedBroadcastAction.equals(action)) { - updateTrack(action); + || AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) { + update(); } } @@ -142,44 +172,24 @@ public class TrackWidgetProvider extends AppWidgetProvider } } - /** - * Initializes the widget. - * - * @param aContext a context - */ - private void initialize(Context aContext) { - if (context != null) { - // Already initialized - return; - } - context = aContext; - trackObserver = new TrackObserver(); - myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); - - unknown = context.getString(R.string.value_unknown); - trackStartedBroadcastAction = context.getString(R.string.track_started_broadcast_action); - trackStoppedBroadcastAction = context.getString(R.string.track_stopped_broadcast_action); - - sharedPreferences = context.getSharedPreferences(SETTINGS_NAME, Context.MODE_PRIVATE); - sharedPreferences.registerOnSharedPreferenceChangeListener(this); - onSharedPreferenceChanged(sharedPreferences, null); - - context.getContentResolver() - .registerContentObserver(TracksColumns.CONTENT_URI, true, trackObserver); - } - /** * Updates the widget. - * - * @param action the action */ - private void updateTrack(String action) { - RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.track_widget); + private void update() { + boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; + long trackId = isRecording ? recordingTrackId : selectedTrackId; + Track track = trackId != -1L ? myTracksProviderUtils.getTrack(trackId) + : myTracksProviderUtils.getLastTrack(); + tripStatistics = track == null ? null : track.getTripStatistics(); - if (action != null) { - updateButton(remoteViews, action); - } - updateView(remoteViews); + updateStatisticsContainer(track); + updateTotalDistance(); + updateTotalTime(isRecording); + updateAverageSpeed(); + updateMovingTime(); + updateRecordButton(isRecording); + updateRecordStatus(isRecording); + updateStopButton(isRecording); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds( @@ -190,75 +200,11 @@ public class TrackWidgetProvider extends AppWidgetProvider } /** - * Updates button to start/stop recording. + * Updates the statistics container. * - * @param remoteViews the remote views - * @param action the action + * @param track the track. */ - private void updateButton(RemoteViews remoteViews, String action) { - boolean isRecording = trackStartedBroadcastAction.equals(action); - remoteViews.setViewVisibility( - R.id.track_widget_record_button, isRecording ? View.GONE : View.VISIBLE); - remoteViews.setViewVisibility( - R.id.track_widget_stop_button, isRecording ? View.VISIBLE : View.INVISIBLE); - Intent intent = new Intent(context, ControlRecordingService.class).setAction( - context.getString(isRecording ? R.string.track_action_end : R.string.track_action_start)); - PendingIntent pendingIntent = PendingIntent.getService( - context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent( - isRecording ? R.id.track_widget_stop_button : R.id.track_widget_record_button, - pendingIntent); - } - - /** - * Updates view. - * - * @param remoteViews the remote views - */ - private void updateView(RemoteViews remoteViews) { - Track track = selectedTrackId != PreferencesUtils.SELECTED_TRACK_ID_DEFAULT ? myTracksProviderUtils - .getTrack(selectedTrackId) - : myTracksProviderUtils.getLastTrack(); - TripStatistics tripStatistics = track == null ? null : track.getTripStatistics(); - - String distanceValue = tripStatistics == null ? unknown - : StringUtils.formatDistance(context, tripStatistics.getTotalDistance(), metricUnits); - remoteViews.setTextViewText(R.id.track_widget_distance_value, distanceValue); - - String totalTimeValue = tripStatistics == null ? unknown - : StringUtils.formatElapsedTime(tripStatistics.getTotalTime()); - remoteViews.setTextViewText(R.id.track_widget_total_time_value, totalTimeValue); - - String averageSpeedLabel = context.getString( - reportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace); - remoteViews.setTextViewText(R.id.track_widget_average_speed_label, averageSpeedLabel); - String averageSpeedValue = tripStatistics == null ? unknown - : StringUtils.formatSpeed( - context, tripStatistics.getAverageSpeed(), metricUnits, reportSpeed); - remoteViews.setTextViewText(R.id.track_widget_average_speed_value, averageSpeedValue); - - setStatVisibility(remoteViews, R.id.track_widget_moving_time_stat, - R.id.track_widget_moving_time_separator, showMovingTime); - if (showMovingTime) { - String movingTimeValue = tripStatistics == null ? unknown - : StringUtils.formatElapsedTime(tripStatistics.getMovingTime()); - remoteViews.setTextViewText(R.id.track_widget_moving_time_value, movingTimeValue); - } - - setStatVisibility(remoteViews, R.id.track_widget_average_moving_speed_stat, - R.id.track_widget_average_moving_speed_separator, showMovingTime); - if (showMovingTime) { - String averageMovingSpeedLabel = context.getString( - reportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace); - remoteViews.setTextViewText( - R.id.track_widget_average_moving_speed_label, averageMovingSpeedLabel); - String averageMovingSpeedValue = tripStatistics == null ? unknown - : StringUtils.formatSpeed( - context, tripStatistics.getAverageMovingSpeed(), metricUnits, reportSpeed); - remoteViews.setTextViewText( - R.id.track_widget_average_moving_speed_value, averageMovingSpeedValue); - } - + private void updateStatisticsContainer(Track track) { Intent intent; if (track != null) { intent = IntentUtils.newIntent(context, TrackDetailActivity.class) @@ -270,12 +216,120 @@ public class TrackWidgetProvider extends AppWidgetProvider taskStackBuilder.addNextIntent(intent); PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0, 0); remoteViews.setOnClickPendingIntent(R.id.track_widget_statistics, pendingIntent); - remoteViews.setOnClickPendingIntent(R.id.track_widget_icon, pendingIntent); } - private void setStatVisibility( - RemoteViews remoteViews, int statId, int separatorId, boolean show) { - remoteViews.setViewVisibility(statId, show ? View.VISIBLE : View.GONE); - remoteViews.setViewVisibility(separatorId, show ? View.VISIBLE : View.GONE); + /** + * Updates total distance. + */ + private void updateTotalDistance() { + String totalDistanceValue = tripStatistics == null ? unknown + : StringUtils.formatDistance(context, tripStatistics.getTotalDistance(), metricUnits); + remoteViews.setTextViewText(R.id.track_widget_total_distance_value, totalDistanceValue); + } + + /** + * Updates total time. + * + * @param isRecording true if recording + */ + private void updateTotalTime(boolean isRecording) { + String totalTimeValue; + if (tripStatistics == null) { + totalTimeValue = unknown; + } else { + long totalTime = tripStatistics.getTotalTime(); + if (isRecording && !recordingtrackPaused) { + totalTime += System.currentTimeMillis() - tripStatistics.getStopTime(); + } + totalTimeValue = StringUtils.formatElapsedTime(totalTime); + } + remoteViews.setTextViewText(R.id.track_widget_total_time_value, totalTimeValue); + } + + /** + * Updates average speed. + */ + private void updateAverageSpeed() { + String averageSpeedLabel = context.getString( + reportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace); + remoteViews.setTextViewText(R.id.track_widget_average_speed_label, averageSpeedLabel); + String averageSpeedValue = tripStatistics == null ? unknown + : StringUtils.formatSpeed( + context, tripStatistics.getAverageSpeed(), metricUnits, reportSpeed); + remoteViews.setTextViewText(R.id.track_widget_average_speed_value, averageSpeedValue); + } + + /** + * Updates moving time. + */ + private void updateMovingTime() { + remoteViews.setViewVisibility( + R.id.track_widget_moving_time_container, showMovingTime ? View.VISIBLE : View.GONE); + if (showMovingTime) { + String movingTimeValue = tripStatistics == null ? unknown + : StringUtils.formatElapsedTime(tripStatistics.getMovingTime()); + remoteViews.setTextViewText(R.id.track_widget_moving_time_value, movingTimeValue); + } + } + + /** + * Updates the record button. + * + * @param isRecording true if recording + */ + private void updateRecordButton(boolean isRecording) { + remoteViews.setImageViewResource(R.id.track_widget_record_button, + isRecording && !recordingtrackPaused ? R.drawable.btn_pause : R.drawable.btn_record); + int recordActionId; + if (isRecording) { + recordActionId = recordingtrackPaused ? R.string.track_action_resume + : R.string.track_action_pause; + } else { + recordActionId = R.string.track_action_start; + } + Intent intent = new Intent(context, ControlRecordingService.class).setAction( + context.getString(recordActionId)); + PendingIntent pendingIntent = PendingIntent.getService( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + remoteViews.setOnClickPendingIntent(R.id.track_widget_record_button, pendingIntent); + } + + /** + * Updates recording status. + * + * @param isRecording true if recording + */ + private void updateRecordStatus(boolean isRecording) { + String status; + int colorId; + if (isRecording) { + status = context.getString( + recordingtrackPaused ? R.string.generic_paused : R.string.generic_recording); + colorId = recordingtrackPaused ? android.R.color.white : R.color.red; + } else { + status = ""; + colorId = android.R.color.white; + } + remoteViews.setTextColor( + R.id.track_widget_record_status, context.getResources().getColor(colorId)); + remoteViews.setTextViewText(R.id.track_widget_record_status, status); + } + + /** + * Updates the stop button. + * + * @param isRecording true if recording + */ + private void updateStopButton(boolean isRecording) { + remoteViews.setImageViewResource( + R.id.track_widget_stop_button, isRecording ? R.drawable.btn_stop_1 : R.drawable.btn_stop_0); + remoteViews.setBoolean(R.id.track_widget_stop_button, "setEnabled", isRecording); + if (isRecording) { + Intent intent = new Intent(context, ControlRecordingService.class).setAction( + context.getString(R.string.track_action_end)); + PendingIntent pendingIntent = PendingIntent.getService( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + remoteViews.setOnClickPendingIntent(R.id.track_widget_stop_button, pendingIntent); + } } }