diff --git a/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java b/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java deleted file mode 100644 index 4bad6d532..000000000 --- a/MyTracks/src/com/google/android/apps/mytracks/MenuManager.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.google.android.apps.mytracks; - -import static com.google.android.apps.mytracks.Constants.CHART_TAB_TAG; -import static com.google.android.apps.mytracks.Constants.MAP_TAB_TAG; - -import com.google.android.maps.mytracks.R; - -import android.app.Activity; -import android.content.Intent; -import android.view.Menu; -import android.view.MenuItem; - -/** - * Manage the application menus. - * - * @author Sandor Dornbush - */ -class MenuManager { - - private final TrackDetailActivity activity; - private MenuItem recordTrack; - private MenuItem stopRecording; - - public MenuManager(TrackDetailActivity activity) { - this.activity = activity; - } - - /** - * Fills the menu with its initial options. - * - * @param menu the menu to fill - * @return true on success, false otherwise - */ - public boolean onCreateOptionsMenu(Menu menu) { - activity.getMenuInflater().inflate(R.menu.track_detail, menu); - - // TODO: Replace search button with search widget if API level >= 11 - return true; - } - - /** - * Prepares the menu for display. - * - * @param menu the menu to update for display - * @param hasRecorded whether any track has been recorded - * @param isRecording whether we're recording a track now - * @param hasSelectedTrack whether there's a track currently selected for display - * @param isSatelliteMode whether the map is currently in satellite mode - * @param currentTabTag the tag for the currently-displayed tab - */ - public void onPrepareOptionsMenu(Menu menu, boolean hasRecorded, - boolean isRecording, boolean hasSelectedTrack, - boolean isSatelliteMode, String currentTabTag) { - menu.findItem(R.id.menu_markers) - .setEnabled(hasRecorded && hasSelectedTrack); - - recordTrack = menu.findItem(R.id.menu_record_track); - stopRecording = menu.findItem(R.id.menu_stop_recording); - updateActionItems(isRecording); - - menu.findItem(R.id.menu_chart_settings) - .setVisible(CHART_TAB_TAG.equals(currentTabTag)); - - boolean isMapTab = MAP_TAB_TAG.equals(currentTabTag); - menu.findItem(R.id.menu_my_location) - .setVisible(isMapTab); - menu.findItem(R.id.menu_satellite_mode) - .setVisible(isMapTab) - .setTitle(isSatelliteMode ? R.string.menu_map_mode : R.string.menu_satellite_mode); - } - - /** - * Updates the action items.
- * TODO: also update the action items when - * - * - * @param isRecording true if recording a track - */ - private void updateActionItems(boolean isRecording) { - recordTrack.setEnabled(!isRecording).setVisible(!isRecording); - stopRecording.setEnabled(isRecording).setVisible(isRecording); - } - - /** - * Called when an option from the menu is selected. - * - * @param item the selected item - * @return true if the action was handled, false otherwise - */ - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_record_track: { - activity.startRecording(); - updateActionItems(true); - return true; - } - case R.id.menu_stop_recording: { - activity.stopRecording(); - updateActionItems(false); - return true; - } - case R.id.menu_markers: { - Intent startIntent = new Intent(activity, WaypointsList.class); - startIntent.putExtra("trackid", activity.getSelectedTrackId()); - activity.startActivityForResult(startIntent, Constants.SHOW_WAYPOINT); - return true; - } - case R.id.menu_sensor_state: { - return startActivity(SensorStateActivity.class); - } - case R.id.menu_settings: { - return startActivity(SettingsActivity.class); - } - case R.id.menu_aggregated_statistics: { - return startActivity(AggregatedStatsActivity.class); - } - case R.id.menu_help: { - return startActivity(WelcomeActivity.class); - } - case R.id.menu_search: { - // TODO: Pass the current track ID and current location to do some fancier ranking. - activity.onSearchRequested(); - return true; - } - case R.id.menu_chart_settings: { - activity.showChartSettings(); - return true; - } - case R.id.menu_my_location: { - activity.showMyLocation(); - return true; - } - case R.id.menu_satellite_mode: { - activity.toggleSatelliteView(); - return true; - } - } - - return false; - } - - /** - * Starts an activity with the given class. - */ - private boolean startActivity(Class activityClass) { - activity.startActivity(new Intent(activity, activityClass)); - return true; - } -} diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java index 97df82df0..d03cfde73 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -29,6 +29,7 @@ import com.google.android.apps.mytracks.services.ServiceUtils; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.util.ApiAdapterFactory; import com.google.android.maps.mytracks.R; +import com.google.common.annotations.VisibleForTesting; import android.app.TabActivity; import android.content.Context; @@ -64,10 +65,12 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener private MyTracksProviderUtils myTracksProviderUtils; private SharedPreferences sharedPreferences; private TrackDataHub trackDataHub; - private MenuManager menuManager; private TrackRecordingServiceConnection trackRecordingServiceConnection; private NavControls navControls; + private MenuItem recordTrack; + private MenuItem stopRecording; + /** * True if a new track should be created after the track recording service * binds. @@ -106,7 +109,6 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener myTracksProviderUtils = MyTracksProviderUtils.Factory.get(this); sharedPreferences = getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE); trackDataHub = ((MyTracksApplication) getApplication()).getTrackDataHub(); - menuManager = new MenuManager(this); trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, serviceBindCallback); setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM); @@ -196,29 +198,117 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener @Override public boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - return menuManager.onCreateOptionsMenu(menu); + getMenuInflater().inflate(R.menu.track_detail, menu); + recordTrack = menu.findItem(R.id.menu_record_track); + stopRecording = menu.findItem(R.id.menu_stop_recording); + return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { - MapActivity map = getMapTab(); - boolean isSatelliteView = map != null ? map.isSatelliteView() : false; + updateMenuItems(ServiceUtils.isRecording( + this, trackRecordingServiceConnection.getServiceIfBound(), sharedPreferences)); - menuManager.onPrepareOptionsMenu(menu, myTracksProviderUtils.getLastTrack() != null, - ServiceUtils.isRecording(this, trackRecordingServiceConnection.getServiceIfBound(), sharedPreferences), - trackDataHub.isATrackSelected(), - isSatelliteView, - getTabHost().getCurrentTabTag()); + String currentTabTag = getTabHost().getCurrentTabTag(); + menu.findItem(R.id.menu_chart_settings).setVisible(CHART_TAB_TAG.equals(currentTabTag)); + menu.findItem(R.id.menu_my_location).setVisible(MAP_TAB_TAG.equals(currentTabTag)); + + // Set map or satellite mode + MapActivity mapActivity = (MapActivity) getLocalActivityManager().getActivity(MAP_TAB_TAG); + boolean isSatelliteMode = mapActivity != null ? mapActivity.isSatelliteView() : false; + menu.findItem(R.id.menu_satellite_mode) + .setVisible(MAP_TAB_TAG.equals(currentTabTag)) + .setTitle(isSatelliteMode ? R.string.menu_map_mode : R.string.menu_satellite_mode); return super.onPrepareOptionsMenu(menu); } + /** + * Updates menu item + * + * @param isRecording true if recording + */ + private void updateMenuItems(boolean isRecording) { + if (recordTrack != null) { + recordTrack.setVisible(!isRecording); + } + if (stopRecording != null) { + stopRecording.setVisible(isRecording); + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { - return menuManager.onOptionsItemSelected(item) - ? true - : super.onOptionsItemSelected(item); + MapActivity mapActivity; + switch (item.getItemId()) { + case R.id.menu_record_track: + updateMenuItems(true); + startRecording(); + return true; + case R.id.menu_stop_recording: + updateMenuItems(false); + stopRecording(); + return true; + case R.id.menu_markers: + Intent intent = new Intent(this, WaypointsList.class) + .putExtra("trackid", trackDataHub.getSelectedTrackId()); + startActivityForResult(intent, Constants.SHOW_WAYPOINT); + return true; + case R.id.menu_sensor_state: + startActivity(new Intent(this, SensorStateActivity.class)); + return true; + case R.id.menu_settings: + startActivity(new Intent(this, SettingsActivity.class)); + return true; + case R.id.menu_aggregated_statistics: + startActivity(new Intent(this, AggregatedStatsActivity.class)); + return true; + case R.id.menu_help: + startActivity(new Intent(this, WelcomeActivity.class)); + return true; + case R.id.menu_search: + onSearchRequested(); + return true; + case R.id.menu_chart_settings: + ChartActivity chartActivity = (ChartActivity) getLocalActivityManager() + .getActivity(CHART_TAB_TAG); + if (chartActivity != null) { + chartActivity.showChartSettingsDialog(); + } + return true; + case R.id.menu_my_location: + mapActivity = (MapActivity) getLocalActivityManager().getActivity(MAP_TAB_TAG); + if (mapActivity != null) { + mapActivity.showMyLocation(); + } + return true; + case R.id.menu_satellite_mode: + mapActivity = (MapActivity) getLocalActivityManager().getActivity(MAP_TAB_TAG); + if (mapActivity != null) { + mapActivity.setSatelliteView(!mapActivity.isSatelliteView()); + } + return true; + default: + return false; + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, final Intent results) { + if (requestCode != Constants.SHOW_WAYPOINT) { + Log.d(TAG, "Warning unhandled request code: " + requestCode); + return; + } + if (results != null) { + long waypointId = results.getLongExtra(WaypointDetails.WAYPOINT_ID_EXTRA, -1L); + if (waypointId != -1L) { + MapActivity mapActivity = (MapActivity) getLocalActivityManager().getActivity(MAP_TAB_TAG); + if (mapActivity != null) { + getTabHost().setCurrentTab(0); + mapActivity.showWaypoint(waypointId); + } + } + } } @Override @@ -240,21 +330,11 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener } @Override - public void onActivityResult(int requestCode, int resultCode, final Intent results) { - if (requestCode != Constants.SHOW_WAYPOINT) { - Log.d(TAG, "Warning unhandled request code: " + requestCode); - return; - } - if (results != null) { - long waypointId = results.getLongExtra(WaypointDetails.WAYPOINT_ID_EXTRA, -1L); - if (waypointId != -1L) { - MapActivity map = getMapTab(); - if (map != null) { - getTabHost().setCurrentTab(0); - map.showWaypoint(waypointId); - } - } + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + navControls.show(); } + return false; } private void showWaypoint(long trackId, long waypointId) { @@ -268,14 +348,6 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener } } - @Override - public boolean onTouch(View v, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - navControls.show(); - } - return false; - } - /** * Inserts a waypoint marker. * @@ -320,6 +392,7 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener * Starts the track recording service (if not already running) and binds to * it. Starts recording a new track. */ + @VisibleForTesting void startRecording() { synchronized (trackRecordingServiceConnection) { startNewTrackRequested = true; @@ -337,11 +410,10 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener * Stops the track recording service and unbinds from it. Will display a toast * "Stopped recording" and pop up the Track Details activity. */ + @VisibleForTesting void stopRecording() { // Save the track id as the shared preference will overwrite the recording track id. - SharedPreferences sharedPreferences = getSharedPreferences( - Constants.SETTINGS_NAME, Context.MODE_PRIVATE); - long currentTrackId = sharedPreferences.getLong(getString(R.string.recording_track_key), -1); + long currentTrackId = sharedPreferences.getLong(getString(R.string.recording_track_key), -1L); ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); if (trackRecordingService != null) { @@ -361,52 +433,4 @@ public class TrackDetailActivity extends TabActivity implements OnTouchListener startActivity(intent); } } - - long getSelectedTrackId() { - return trackDataHub.getSelectedTrackId(); - } - - /** - * Asks the chart tab to show its settings. - */ - public void showChartSettings() { - ChartActivity chart = getChartTab(); - if (chart != null) { - chart.showChartSettingsDialog(); - } - } - - /** - * Asks the map tab to show the map in satellite mode. - */ - public void toggleSatelliteView() { - MapActivity mapTab = getMapTab(); - if (mapTab != null) { - mapTab.setSatelliteView(!mapTab.isSatelliteView()); - } - } - - /** - * Asks the map tab to jump to the current location. - */ - public void showMyLocation() { - MapActivity mapTab = getMapTab(); - if (mapTab != null) { - mapTab.showMyLocation(); - } - } - - /** - * Returns the map tab instance if available, or null otherwise. - */ - private MapActivity getMapTab() { - return (MapActivity) getLocalActivityManager().getActivity(MAP_TAB_TAG); - } - - /** - * Returns the chart tab instance if available, or null otherwise. - */ - private ChartActivity getChartTab() { - return (ChartActivity) getLocalActivityManager().getActivity(CHART_TAB_TAG); - } } \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 9d6fdbd3e..5c7a34251 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -35,7 +35,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.os.Bundle; import android.os.Parcelable; @@ -447,17 +446,7 @@ public class TrackListActivity extends FragmentActivity { R.string.track_list_delete_all_confirm_message, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - MyTracksProviderUtils.Factory.get(getActivity()).deleteAllTracks(); - /* - * TODO Verify that selected_track_key is still needed with the - * ICS navigation design - */ - SharedPreferences sharedPreferences = getActivity() - .getSharedPreferences(Constants.SETTINGS_NAME, Context.MODE_PRIVATE); - Editor editor = sharedPreferences.edit(); - // TODO: Go through data manager - editor.putLong(getString(R.string.selected_track_key), -1L); - ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); + MyTracksProviderUtils.Factory.get(getActivity()).deleteAllTracks(); } }); } diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/TrackDetailActivityTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/TrackDetailActivityTest.java index d01e671ae..7b412de1e 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/TrackDetailActivityTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/TrackDetailActivityTest.java @@ -59,10 +59,7 @@ public class TrackDetailActivityTest extends ActivityInstrumentationTestCase2