From 09798c95c24a0e06f29e1c03b600412ab12c39b7 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 21 Jun 2019 00:03:29 +0200 Subject: [PATCH] Removed Accounts and sync. --- myTracks/build.gradle | 21 - .../SendFusionTablesActivityTest.java | 85 --- .../SendFusionTablesUtilsTest.java | 212 ------ myTracks/src/main/AndroidManifest.xml | 16 +- .../AbstractSendToGoogleActivity.java | 73 +-- .../apps/mytracks/ChartValueSeries.java | 6 +- .../android/apps/mytracks/ChartView.java | 18 +- .../apps/mytracks/DeleteAsyncTask.java | 37 +- .../android/apps/mytracks/HelpActivity.java | 132 ---- .../apps/mytracks/MarkerEditActivity.java | 12 - .../apps/mytracks/MarkerListActivity.java | 2 - .../apps/mytracks/SearchListActivity.java | 14 +- .../apps/mytracks/TrackDetailActivity.java | 44 +- .../apps/mytracks/TrackEditActivity.java | 62 +- .../apps/mytracks/TrackListActivity.java | 161 +---- .../content/DescriptionGeneratorImpl.java | 6 +- .../mytracks/content/MyTracksProvider.java | 11 +- .../apps/mytracks/content/TrackDataHub.java | 12 +- .../mytracks/fragments/ChartFragment.java | 22 +- .../ChooseAccountDialogFragment.java | 123 ---- .../ConfirmDeleteDialogFragment.java | 16 +- .../fragments/ConfirmSyncDialogFragment.java | 89 --- .../fragments/EulaDialogFragment.java | 148 ----- .../fragments/ExportDialogFragment.java | 158 +---- .../fragments/InstallEarthDialogFragment.java | 58 -- .../fragments/MapLayerDialogFragment.java | 71 -- .../fragments/PlayMultipleDialogFragment.java | 136 ---- .../fragments/ShareTrackDialogFragment.java | 210 ------ .../io/file/exporter/KmlTrackWriter.java | 22 +- .../io/file/exporter/SaveActivity.java | 8 +- .../file/importer/GpxFileTrackImporter.java | 8 +- .../file/importer/KmlFileTrackImporter.java | 2 +- .../apps/mytracks/io/sync/SyncAdapter.java | 604 ------------------ .../apps/mytracks/io/sync/SyncService.java | 47 -- .../apps/mytracks/io/sync/SyncUtils.java | 557 ---------------- .../maps/DynamicSpeedTrackPathDescriptor.java | 10 +- .../mytracks/maps/MultiColorTrackPath.java | 6 +- .../services/ControlRecordingService.java | 8 +- .../services/TrackRecordingService.java | 8 +- .../tasks/AnnouncementPeriodicTask.java | 20 +- .../tasks/CheckPermissionAsyncTask.java | 99 --- .../settings/AdvancedSettingsActivity.java | 3 - .../mytracks/settings/SettingsActivity.java | 167 +---- .../mytracks/stats/TripStatisticsUpdater.java | 10 +- .../apps/mytracks/util/AccountUtils.java | 75 --- .../apps/mytracks/util/ChartURLGenerator.java | 6 +- .../android/apps/mytracks/util/EulaUtils.java | 88 --- .../apps/mytracks/util/GoogleEarthUtils.java | 95 --- .../mytracks/util/GoogleFeedbackUtils.java | 63 -- .../apps/mytracks/util/PreferencesUtils.java | 17 +- .../apps/mytracks/util/TrackNameUtils.java | 6 +- .../apps/mytracks/util/TrackUtils.java | 7 - .../main/res/layout/account_spinner_item.xml | 24 - myTracks/src/main/res/layout/help.xml | 38 -- myTracks/src/main/res/layout/map.xml | 42 -- myTracks/src/main/res/menu/help.xml | 28 - .../src/main/res/menu/list_context_menu.xml | 5 - myTracks/src/main/res/menu/map.xml | 25 - myTracks/src/main/res/menu/track_detail.xml | 12 - myTracks/src/main/res/menu/track_list.xml | 12 - myTracks/src/main/res/values/strings.xml | 6 - myTracks/src/main/res/xml/sync_adapter.xml | 21 - .../content/MyTracksProviderUtilsImpl.java | 4 - .../android/apps/mytracks/content/Track.java | 11 - 64 files changed, 168 insertions(+), 3951 deletions(-) delete mode 100644 myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesActivityTest.java delete mode 100644 myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtilsTest.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/HelpActivity.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmSyncDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/InstallEarthDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/MapLayerDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/PlayMultipleDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ShareTrackDialogFragment.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncAdapter.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncService.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncUtils.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/CheckPermissionAsyncTask.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/util/AccountUtils.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/util/EulaUtils.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleEarthUtils.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java delete mode 100644 myTracks/src/main/res/layout/account_spinner_item.xml delete mode 100644 myTracks/src/main/res/layout/help.xml delete mode 100644 myTracks/src/main/res/layout/map.xml delete mode 100644 myTracks/src/main/res/menu/help.xml delete mode 100644 myTracks/src/main/res/menu/map.xml delete mode 100644 myTracks/src/main/res/xml/sync_adapter.xml diff --git a/myTracks/build.gradle b/myTracks/build.gradle index 5d7cf3bdc..f3ab474ee 100644 --- a/myTracks/build.gradle +++ b/myTracks/build.gradle @@ -22,38 +22,17 @@ android { dependencies { compile project(':myTracksLib') - //compile files('libs/android-support-v4.jar') compile files('libs/antlib.jar') - //compile files('libs/gdata-client-1.0.jar') - //compile files('libs/gdata-client-meta-1.0.jar') - //compile files('libs/gdata-core-1.0.jar') - //compile files('libs/gdata-spreadsheet-3.0.jar') - //compile files('libs/gdata-spreadsheet-meta-3.0.jar') compile files('libs/google-api-client-1.12.0-beta.jar') compile files('libs/google-api-client-android-1.12.0-beta.jar') compile files('libs/google-api-services-drive-v2-rev30-1.12.0-beta.jar') - //compile files('libs/google-api-services-fusiontables-v1-rev16-1.12.0-beta.jar') - //compile files('libs/google-common.jar') compile files('libs/google-http-client-1.12.0-beta.jar') compile files('libs/google-http-client-android-1.12.0-beta.jar') compile files('libs/google-http-client-gson-1.12.0-beta.jar') - //compile files('libs/google-http-client-jackson-1.12.0-beta.jar') - //compile files('libs/google-http-client-jackson2-1.12.0-beta.jar') - //compile files('libs/google-oauth-client-1.12.0-beta.jar') - //compile files('libs/google-play-services.jar') - //compile files('libs/gson-2.1.jar') - compile files('libs/guava-jdk5-13.0.jar') //@visiblefortesting - //compile files('libs/jackson-core-2.0.5.jar') - //compile files('libs/jackson-core-asl-1.9.9.jar') - //compile files('libs/jsr305.jar') - //compile files('libs/libGoogleAnalytics.jar') androidTestCompile files('libs/AndroidMockGenerator.jar') androidTestCompile files('libs/robotium-solo-5.0.1.jar') implementation 'com.google.android.gms:play-services-location:11.8.0' implementation 'com.google.android.gms:play-services:11.8.0' implementation 'com.google.android.gms:play-services-auth:11.8.0' -// compile 'com.google.firebase:firebase-core:9.2.0' -// compile 'com.google.firebase:firebase-auth:9.2.0' -// compile 'com.google.firebase:firebase-messaging:11.8.0' } diff --git a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesActivityTest.java b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesActivityTest.java deleted file mode 100644 index 9e2db29d6..000000000 --- a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesActivityTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2012 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.io.fusiontables; - -import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest; -import com.google.android.apps.mytracks.io.sendtogoogle.UploadResultActivity; -import com.google.android.apps.mytracks.io.spreadsheets.SendSpreadsheetsActivity; - -import android.test.AndroidTestCase; - -/** - * Tests the {@link SendFusionTablesActivity}. - * - * @author Youtao Liu - */ -public class SendFusionTablesActivityTest extends AndroidTestCase { - - private SendFusionTablesActivity sendFusionTablesActivity; - private SendRequest sendRequest; - - @Override - protected void setUp() throws Exception { - super.setUp(); - sendRequest = new SendRequest(1L); - sendFusionTablesActivity = new SendFusionTablesActivity(); - } - - /** - * Tests the method - * {@link SendFusionTablesActivity#getNextClass(SendRequest, boolean)}. Sets - * the flags of "sendSpreadsheets" and "cancel" to false and false. - */ - public void testGetNextClass_notCancelNotSendSpreadsheets() { - sendRequest.setSendSpreadsheets(false); - Class next = sendFusionTablesActivity.getNextClass(sendRequest, false); - assertEquals(UploadResultActivity.class, next); - } - - /** - * Tests the method - * {@link SendFusionTablesActivity#getNextClass(SendRequest, boolean)}. Sets - * the flags of "sendSpreadsheets" and "cancel" to true and false. - */ - public void testGetNextClass_notCancelSendSpreadsheets() { - sendRequest.setSendSpreadsheets(true); - Class next = sendFusionTablesActivity.getNextClass(sendRequest, false); - assertEquals(SendSpreadsheetsActivity.class, next); - } - - /** - * Tests the method - * {@link SendFusionTablesActivity#getNextClass(SendRequest,boolean)}. Sets - * the flags of "sendSpreadsheets" and "cancel" to true and true. - */ - public void testGetNextClass_cancelSendSpreadsheets() { - sendRequest.setSendSpreadsheets(true); - Class next = sendFusionTablesActivity.getNextClass(sendRequest, true); - assertEquals(UploadResultActivity.class, next); - } - - /** - * Tests the method - * {@link SendFusionTablesActivity#getNextClass(SendRequest,boolean)}. Sets - * the flags of "sendSpreadsheets" and "cancel" to false and true. - */ - public void testGetNextClass_cancelNotSendSpreadsheets() { - sendRequest.setSendSpreadsheets(false); - Class next = sendFusionTablesActivity.getNextClass(sendRequest, true); - assertEquals(UploadResultActivity.class, next); - } - -} diff --git a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtilsTest.java b/myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtilsTest.java deleted file mode 100644 index a25c37b2b..000000000 --- a/myTracks/src/androidTest/java/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtilsTest.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2012 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.io.fusiontables; - -import com.google.android.apps.mytracks.content.Track; -import com.google.android.apps.mytracks.stats.TripStatistics; - -import android.location.Location; - -import java.util.ArrayList; - -import junit.framework.TestCase; - -/** - * Tests {@link SendFusionTablesUtils}. - * - * @author Jimmy Shih - */ -public class SendFusionTablesUtilsTest extends TestCase { - - /** - * Tests {@link SendFusionTablesUtils#getMapUrl(Track, String)} with null track. - */ - public void testGetMapUrl_null_track() { - assertEquals(null, SendFusionTablesUtils.getMapUrl(null, "123")); - } - - /** - * Tests {@link SendFusionTablesUtils#getMapUrl(Track, String)} with null stats. - */ - public void testGetMapUrl_null_stats() { - Track track = new Track(); - track.setTripStatistics(null); - assertEquals(null, SendFusionTablesUtils.getMapUrl(track, "123")); - } - - /** - * Tests {@link SendFusionTablesUtils#getMapUrl(Track, String)} with a valid track. - */ - public void testGetMapUrl_valid_track() { - Track track = new Track(); - track.setNumberOfPoints(2); - TripStatistics stats = new TripStatistics(); - stats.setBounds((int) 100.E6, (int) 10.E6, (int) 50.E6, (int) 5.E6); - track.setTripStatistics(stats); - assertEquals( - "https://www.google.com/fusiontables/embedviz?" - + "viz=MAP&q=select+col0,+col1,+col2,+col3+from+123+&h=false&lat=7.500000&lng=75.000000" - + "&z=15&t=1&l=col2", SendFusionTablesUtils.getMapUrl(track, "123")); - } - - /** - * Tests (@link {@link SendFusionTablesUtils#formatSqlValues(String...)} with - * no value. - */ - public void testFormatSqlValues_no_value() { - assertEquals("()", SendFusionTablesUtils.formatSqlValues()); - } - - /** - * Tests (@link {@link SendFusionTablesUtils#formatSqlValues(String...)} with - * an empty string. - */ - public void testFormatSqlValues_empty_string() { - assertEquals("(\'\')", SendFusionTablesUtils.formatSqlValues("")); - } - - /** - * Tests (@link {@link SendFusionTablesUtils#formatSqlValues(String...)} with - * one value. - */ - public void testFormatSqlValues_one_value() { - assertEquals("(\'first\')", SendFusionTablesUtils.formatSqlValues("first")); - } - - /** - * Tests (@link {@link SendFusionTablesUtils#formatSqlValues(String...)} with - * two values. - */ - public void testFormatSqlValues_two_values() { - assertEquals( - "(\'first\',\'second\')", SendFusionTablesUtils.formatSqlValues("first", "second")); - } - - /** - * Tests {@link SendFusionTablesUtils#escapeSqlString(String)} with a value - * containing several single quotes. - */ - public void testEscapeSqValuel() { - String value = "let's'"; - assertEquals("let''s''", SendFusionTablesUtils.escapeSqlString(value)); - } - - /** - * Tests {@link SendFusionTablesUtils#getKmlPoint(Location)} with a null - * point. - */ - public void testGetKmlPoint_null_point() { - assertEquals( - "", SendFusionTablesUtils.getKmlPoint(null)); - } - - /** - * Tests {@link SendFusionTablesUtils#getKmlPoint(Location)} with a valid - * point. - */ - public void testGetKmlPoint_valid_point() { - Location location = new Location("test"); - location.setLongitude(10.1); - location.setLatitude(20.2); - location.setAltitude(30.3); - assertEquals("10.1,20.2,30.3", - SendFusionTablesUtils.getKmlPoint(location)); - } - - /** - * Tests {@link SendFusionTablesUtils#getKmlLineString(ArrayList)} with a null - * locations. - */ - public void testKmlLineString_null_locations() { - assertEquals("", - SendFusionTablesUtils.getKmlLineString(null)); - } - - /** - * Tests {@link SendFusionTablesUtils#getKmlLineString(ArrayList)} with no - * location. - */ - public void testKmlLineString_no_location() { - ArrayList locations = new ArrayList(); - assertEquals("", - SendFusionTablesUtils.getKmlLineString(locations)); - } - - /** - * Tests {@link SendFusionTablesUtils#getKmlLineString(ArrayList)} with one - * location. - */ - public void testKmlLineString_one_location() { - ArrayList locations = new ArrayList(); - Location location = new Location("test"); - location.setLongitude(10.1); - location.setLatitude(20.2); - location.setAltitude(30.3); - locations.add(location); - assertEquals("10.1,20.2,30.3", - SendFusionTablesUtils.getKmlLineString(locations)); - } - - /** - * Tests {@link SendFusionTablesUtils#getKmlLineString(ArrayList)} with two - * locations. - */ - public void testKmlLineString_two_locations() { - ArrayList locations = new ArrayList(); - Location location1 = new Location("test"); - location1.setLongitude(10.1); - location1.setLatitude(20.2); - location1.setAltitude(30.3); - locations.add(location1); - - Location location2 = new Location("test"); - location2.setLongitude(1.1); - location2.setLatitude(2.2); - location2.removeAltitude(); - locations.add(location2); - - assertEquals("10.1,20.2,30.3 1.1,2.2", - SendFusionTablesUtils.getKmlLineString(locations)); - } - - /** - * Tests {@link SendFusionTablesUtils#appendLocation(Location, StringBuilder)} - * with no altitude. - */ - public void testAppendLocation_no_altitude() { - StringBuilder builder = new StringBuilder(); - Location location = new Location("test"); - location.setLongitude(10.1); - location.setLatitude(20.2); - location.removeAltitude(); - SendFusionTablesUtils.appendLocation(location, builder); - assertEquals("10.1,20.2", builder.toString()); - } - - /** - * Tests {@link SendFusionTablesUtils#appendLocation(Location, StringBuilder)} - * with altitude. - */ - public void testAppendLocation_has_altitude() { - StringBuilder builder = new StringBuilder(); - Location location = new Location("test"); - location.setLongitude(10.1); - location.setLatitude(20.2); - location.setAltitude(30.3); - SendFusionTablesUtils.appendLocation(location, builder); - assertEquals("10.1,20.2,30.3", builder.toString()); - } -} \ No newline at end of file diff --git a/myTracks/src/main/AndroidManifest.xml b/myTracks/src/main/AndroidManifest.xml index c72dd7729..b4db76e9a 100644 --- a/myTracks/src/main/AndroidManifest.xml +++ b/myTracks/src/main/AndroidManifest.xml @@ -156,10 +156,7 @@ limitations under the License. android:label="@string/menu_aggregated_statistics" android:name="com.google.android.apps.mytracks.AggregatedStatsActivity" /> - - + @@ -231,17 +228,6 @@ limitations under the License. - - - - - - - * - share track
- * - export track to Google services
- * - enable sync to Google Drive
* - delete tracks
- * - play tracks - * + * * @author Jimmy Shih */ -public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActivity - implements ShareTrackCaller, ConfirmDeleteCaller { +public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActivity implements ConfirmDeleteCaller { - private static final String TAG = AbstractMyTracksActivity.class.getSimpleName(); - private static final String SEND_REQUEST_KEY = "send_request_key"; - private static final int DRIVE_REQUEST_CODE = 0; - private static final int FUSION_TABLES_REQUEST_CODE = 1; - private static final int SPREADSHEETS_REQUEST_CODE = 2; private static final int DELETE_REQUEST_CODE = 3; protected static final int GOOGLE_PLAY_SERVICES_REQUEST_CODE = 4; protected static final int CAMERA_REQUEST_CODE = 5; - private CheckPermissionAsyncTask asyncTask; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState != null) { - //sendRequest = savedInstanceState.getParcelable(SEND_REQUEST_KEY); - } - Object retained = getLastCustomNonConfigurationInstance(); - if (retained instanceof CheckPermissionAsyncTask) { - asyncTask = (CheckPermissionAsyncTask) retained; - asyncTask.setActivity(this); - } - } - - @Override - public Object onRetainCustomNonConfigurationInstance() { - if (asyncTask != null) { - asyncTask.setActivity(null); - } - return asyncTask; - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { @@ -95,16 +54,6 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv } } - /** - * Shares a track. - * - * @param trackId the track id - */ - protected void shareTrack(long trackId) { - ShareTrackDialogFragment.newInstance(trackId) - .show(getSupportFragmentManager(), ShareTrackDialogFragment.SHARE_TRACK_DIALOG_TAG); - } - /** * Call when not able to get permission for a google service. */ @@ -155,22 +104,4 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv * Called after {@link DeleteActivity} returns its result. */ abstract protected void onDeleted(); - - /** - * Play tracks in Google Earth. - * - * @param trackIds the track ids - */ - protected void playTracks(long[] trackIds) { - if (GoogleEarthUtils.isEarthInstalled(this)) { - Intent intent = IntentUtils.newIntent(this, SaveActivity.class) - .putExtra(SaveActivity.EXTRA_TRACK_IDS, trackIds) - .putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) TrackFileFormat.KML) - .putExtra(SaveActivity.EXTRA_PLAY_TRACK, true); - startActivity(intent); - } else { - new InstallEarthDialogFragment().show( - getSupportFragmentManager(), InstallEarthDialogFragment.INSTALL_EARTH_DIALOG_TAG); - } - } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/ChartValueSeries.java b/myTracks/src/main/java/com/google/android/apps/mytracks/ChartValueSeries.java index 5e6a8f01c..3c95943d6 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/ChartValueSeries.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/ChartValueSeries.java @@ -16,15 +16,15 @@ package com.google.android.apps.mytracks; -import com.google.android.apps.mytracks.stats.ExtremityMonitor; -import com.google.common.annotations.VisibleForTesting; - import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Paint.Style; import android.graphics.Path; +import android.support.annotation.VisibleForTesting; + +import com.google.android.apps.mytracks.stats.ExtremityMonitor; import java.text.NumberFormat; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/ChartView.java b/myTracks/src/main/java/com/google/android/apps/mytracks/ChartView.java index ff39181d7..1e708c1b3 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/ChartView.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/ChartView.java @@ -16,15 +16,6 @@ package com.google.android.apps.mytracks; -import com.google.android.apps.mytracks.content.Waypoint; -import com.google.android.apps.mytracks.content.Waypoint.WaypointType; -import com.google.android.apps.mytracks.stats.ExtremityMonitor; -import com.google.android.apps.mytracks.util.IntentUtils; -import com.google.android.apps.mytracks.util.StringUtils; -import com.google.android.apps.mytracks.util.UnitConversions; -import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - import android.content.Context; import android.content.Intent; import android.graphics.Canvas; @@ -36,12 +27,21 @@ import android.graphics.Paint.Style; import android.graphics.Path; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.support.annotation.VisibleForTesting; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.widget.Scroller; +import com.google.android.apps.mytracks.content.Waypoint; +import com.google.android.apps.mytracks.content.Waypoint.WaypointType; +import com.google.android.apps.mytracks.stats.ExtremityMonitor; +import com.google.android.apps.mytracks.util.IntentUtils; +import com.google.android.apps.mytracks.util.StringUtils; +import com.google.android.apps.mytracks.util.UnitConversions; +import com.google.android.maps.mytracks.R; + import java.text.NumberFormat; import java.util.ArrayList; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/DeleteAsyncTask.java b/myTracks/src/main/java/com/google/android/apps/mytracks/DeleteAsyncTask.java index 55d222896..99f90372d 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/DeleteAsyncTask.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/DeleteAsyncTask.java @@ -16,16 +16,13 @@ package com.google.android.apps.mytracks; * the License. */ -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.Track; -import com.google.android.apps.mytracks.io.sync.SyncUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.apps.mytracks.util.UnitConversions; -import com.google.android.maps.mytracks.R; - import android.content.Context; import android.os.AsyncTask; +import com.google.android.apps.mytracks.content.MyTracksProviderUtils; +import com.google.android.apps.mytracks.content.Track; +import com.google.android.apps.mytracks.util.UnitConversions; + /** * Async Task to delete tracks. * @@ -81,40 +78,16 @@ public class DeleteAsyncTask extends AsyncTask { MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); if (trackIds.length == 1 && trackIds[0] == -1L) { - try { - while (SyncUtils.isSyncActive(context)) { - if (isCancelled()) { - return false; - } - Thread.sleep(ONE_SECOND); - } - } catch (InterruptedException e) { - return false; - } - SyncUtils.disableSync(context); myTracksProviderUtils.deleteAllTracks(context); - return true; } else { for (long id : trackIds) { if (isCancelled()) { return false; } - Track track = myTracksProviderUtils.getTrack(id); myTracksProviderUtils.deleteTrack(context, id); - if (track != null) { - String driveId = track.getDriveId(); - if (driveId != null && !driveId.equals("")) { - boolean driveSync = PreferencesUtils.getBoolean( - context, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); - if (driveSync) { - PreferencesUtils.addToList(context, R.string.drive_deleted_list_key, - PreferencesUtils.DRIVE_DELETED_LIST_DEFAULT, driveId); - } - } - } } - return true; } + return true; } @Override diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/HelpActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/HelpActivity.java deleted file mode 100644 index b9d4d2d4d..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/HelpActivity.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2008 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 com.google.android.apps.mytracks.fragments.EulaDialogFragment; -import com.google.android.apps.mytracks.fragments.EulaDialogFragment.EulaCaller; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; -import com.google.android.apps.mytracks.util.GoogleFeedbackUtils; -import com.google.android.apps.mytracks.util.SystemUtils; -import com.google.android.maps.mytracks.R; - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import android.widget.Button; - -import java.util.Locale; - -/** - * An activity that displays the help page. - * - * @author Sandor Dornbush - */ -public class HelpActivity extends AbstractMyTracksActivity implements EulaCaller { - - WebView webView; - - @SuppressLint("SetJavaScriptEnabled") - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - String subtitle = getString(R.string.my_tracks_app_name) + " v" - + SystemUtils.getMyTracksVersion(this); - ApiAdapterFactory.getApiAdapter() - .setTitleAndSubtitle(this, getString(R.string.menu_help), subtitle); - - webView = (WebView) findViewById(R.id.help_webview); - webView.getSettings().setJavaScriptEnabled(true); - webView.setWebViewClient(new WebViewClient()); - - if (savedInstanceState == null) { - String language = Locale.getDefault().getLanguage(); - if (language == null || language.equals("")) { - language = "en"; - } - webView.loadUrl(getString(R.string.my_tracks_help_url, language)); - } else { - webView.restoreState(savedInstanceState); - } - - Button feedback = (Button) findViewById(R.id.help_feedback); - boolean showFeedback = ApiAdapterFactory.getApiAdapter().isGoogleFeedbackAvailable(); - feedback.setVisibility(showFeedback ? View.VISIBLE : View.GONE); - if (showFeedback) { - feedback.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - GoogleFeedbackUtils.bindFeedback(HelpActivity.this); - } - }); - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (webView != null) { - webView.saveState(outState); - } - } - - @Override - protected int getLayoutResId() { - return R.layout.help; - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.help, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - Intent intent; - switch (item.getItemId()) { - case R.id.help_play_store: - intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse("market://details?id=com.google.android.maps.mytracks")); - startActivity(intent); - return true; - case R.id.help_eula: - EulaDialogFragment.newInstance(true) - .show(getSupportFragmentManager(), EulaDialogFragment.EULA_DIALOG_TAG); - return true; - case R.id.help_forum: - intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse( - "http://groups.google.com/a/googleproductforums.com/forum/#!categories/maps/mytracks/")); - startActivity(intent); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - public void onEulaDone() { - // Do nothing - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerEditActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerEditActivity.java index 222702515..a783fdc17 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerEditActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerEditActivity.java @@ -125,18 +125,6 @@ public class MarkerEditActivity extends AbstractMyTracksActivity { } else { saveMarker(); } - boolean driveSync = PreferencesUtils.getBoolean( - MarkerEditActivity.this, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); - if (driveSync) { - MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get( - MarkerEditActivity.this); - Track track = myTracksProviderUtils.getTrack(newMarker ? trackId : waypoint.getTrackId()); - track.setModifiedTime(System.currentTimeMillis()); - myTracksProviderUtils.updateTrack(track); - PreferencesUtils.addToList(MarkerEditActivity.this, R.string.drive_edited_list_key, - PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT, String.valueOf(track.getId())); - } - finish(); } }); diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerListActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerListActivity.java index fff828226..bd7a6b957 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerListActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/MarkerListActivity.java @@ -72,8 +72,6 @@ public class MarkerListActivity extends AbstractMyTracksActivity implements Dele public void onPrepare(Menu menu, int[] positions, long[] ids, boolean showSelectAll) { boolean isSingleSelection = ids.length == 1; - // Always disable - menu.findItem(R.id.list_context_menu_play).setVisible(false); // Always disable menu.findItem(R.id.list_context_menu_share).setVisible(false); // One item diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/SearchListActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/SearchListActivity.java index 8940aea8e..820d52cc2 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/SearchListActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/SearchListActivity.java @@ -149,9 +149,6 @@ public class SearchListActivity extends AbstractSendToGoogleActivity implements isSingleSelectionShareWithMe = false; isSingleSelectionTrack = false; } - // Not recording, one item, item is a track - menu.findItem(R.id.list_context_menu_play) - .setVisible(!isRecording && isSingleSelection && isSingleSelectionTrack); // Not recording, one item, item is a track, not shareWithMe item menu.findItem(R.id.list_context_menu_share).setVisible(!isRecording && isSingleSelection && isSingleSelectionTrack && !isSingleSelectionShareWithMe); @@ -347,11 +344,9 @@ public class SearchListActivity extends AbstractSendToGoogleActivity implements Long markerId = (Long) item.get(MARKER_ID_FIELD); Intent intent; switch (itemId) { - case R.id.list_context_menu_play: - playTracks(new long[] {trackId}); - return true; case R.id.list_context_menu_share: - shareTrack(trackId); + //TODO + Log.e(TAG, "Not implemented"); return true; case R.id.list_context_menu_show_on_map: intent = IntentUtils.newIntent(this, TrackDetailActivity.class) @@ -557,9 +552,4 @@ public class SearchListActivity extends AbstractSendToGoogleActivity implements } }); } - - @Override - public void onShareTrackDone(long trackId, boolean makePublic, String emails, Account account) { - - } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackDetailActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackDetailActivity.java index c030384d8..082b06cdd 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackDetailActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackDetailActivity.java @@ -29,9 +29,6 @@ import com.google.android.apps.mytracks.fragments.ExportDialogFragment; import com.google.android.apps.mytracks.fragments.ExportDialogFragment.ExportCaller; import com.google.android.apps.mytracks.fragments.ExportDialogFragment.ExportType; import com.google.android.apps.mytracks.fragments.FrequencyDialogFragment; -import com.google.android.apps.mytracks.fragments.MapLayerDialogFragment; -import com.google.android.apps.mytracks.fragments.PlayMultipleDialogFragment; -import com.google.android.apps.mytracks.fragments.PlayMultipleDialogFragment.PlayMultipleCaller; import com.google.android.apps.mytracks.fragments.StatsFragment; import com.google.android.apps.mytracks.io.file.TrackFileFormat; import com.google.android.apps.mytracks.io.file.exporter.SaveActivity; @@ -80,7 +77,7 @@ import java.util.Date; * @author Rodrigo Damazio */ public class TrackDetailActivity extends AbstractSendToGoogleActivity - implements ChooseActivityTypeCaller, ExportCaller, PlayMultipleCaller { + implements ChooseActivityTypeCaller, ExportCaller { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_MARKER_ID = "marker_id"; @@ -114,7 +111,6 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity private MenuItem insertMarkerMenuItem; private MenuItem insertPhotoMenuItem; - private MenuItem playMenuItem; private MenuItem shareMenuItem; private MenuItem exportMenuItem; private MenuItem voiceFrequencyMenuItem; @@ -357,7 +353,6 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity insertMarkerMenuItem = menu.findItem(R.id.track_detail_insert_marker); insertPhotoMenuItem = menu.findItem(R.id.track_detail_insert_photo); - playMenuItem = menu.findItem(R.id.track_detail_play); shareMenuItem = menu.findItem(R.id.track_detail_share); shareMenuItem.setEnabled(!isSharedWithMe); @@ -402,21 +397,11 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(intent, CAMERA_REQUEST_CODE); return true; - case R.id.track_detail_play: - playTracks(new long[] {trackId}); - return true; - case R.id.track_detail_share: - shareTrack(trackId); - return true; case R.id.track_detail_markers: intent = IntentUtils.newIntent(this, MarkerListActivity.class) .putExtra(MarkerListActivity.EXTRA_TRACK_ID, trackId); startActivity(intent); return true; - case R.id.track_detail_play_multiple: - PlayMultipleDialogFragment.newInstance(trackId) - .show(getSupportFragmentManager(), PlayMultipleDialogFragment.PLAY_MULTIPLE_DIALOG_TAG); - return true; case R.id.track_detail_voice_frequency: FrequencyDialogFragment.newInstance(R.string.voice_frequency_key, PreferencesUtils.VOICE_FREQUENCY_DEFAULT, R.string.menu_voice_frequency) @@ -449,10 +434,6 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity intent = IntentUtils.newIntent(this, SettingsActivity.class); startActivity(intent); return true; - case R.id.track_detail_help_feedback: - intent = IntentUtils.newIntent(this, HelpActivity.class); - startActivity(intent); - return true; default: return super.onOptionsItemSelected(item); } @@ -470,7 +451,6 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity return super.onTrackballEvent(event); } - @Override public void onExportDone( ExportType exportType, TrackFileFormat trackFileFormat, Account account) { if (exportType == ExportType.EXTERNAL_STORAGE) { @@ -563,9 +543,6 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity if (insertPhotoMenuItem != null) { insertPhotoMenuItem.setVisible(hasCamera && isRecording && !isPaused); } - if (playMenuItem != null) { - playMenuItem.setVisible(!isRecording); - } if (shareMenuItem != null && shareMenuItem.isEnabled()) { shareMenuItem.setVisible(!isRecording); } @@ -610,22 +587,9 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } } - + @Override - public void onPlayMultipleDone(long[] trackIds) { - playTracks(trackIds); + public void onExportDone(ExportType exportType, TrackFileFormat trackFileFormat) { + //TODO } - - /** - * Shows the map layer dialog. - */ - public void showMapLayerDialog() { - new MapLayerDialogFragment().show( - getSupportFragmentManager(), MapLayerDialogFragment.MAP_LAYER_DIALOG_TAG); - } - - @Override - public void onShareTrackDone(long trackId, boolean makePublic, String emails, Account account) { - - } } \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackEditActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackEditActivity.java index 418264086..ecb56bb87 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackEditActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackEditActivity.java @@ -18,24 +18,14 @@ package com.google.android.apps.mytracks; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; -import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment; -import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment.ChooseAccountCaller; import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment; import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller; -import com.google.android.apps.mytracks.fragments.EnableSyncDialogFragment; -import com.google.android.apps.mytracks.fragments.EnableSyncDialogFragment.EnableSyncCaller; -import com.google.android.apps.mytracks.io.sync.SyncUtils; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; -import com.google.android.apps.mytracks.services.tasks.CheckPermissionAsyncTask; -import com.google.android.apps.mytracks.services.tasks.CheckPermissionAsyncTask.CheckPermissionCaller; -import com.google.android.apps.mytracks.util.EulaUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.apps.mytracks.util.TrackUtils; import com.google.android.maps.mytracks.R; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; @@ -48,7 +38,6 @@ import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; -import android.widget.Toast; /** * An activity that let's the user see and edit the user editable track meta @@ -56,8 +45,7 @@ import android.widget.Toast; * * @author Leif Hendrik Wilden */ -public class TrackEditActivity extends AbstractMyTracksActivity implements ChooseActivityTypeCaller, - EnableSyncCaller, ChooseAccountCaller, CheckPermissionCaller { +public class TrackEditActivity extends AbstractMyTracksActivity implements ChooseActivityTypeCaller { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_NEW_TRACK = "new_track"; @@ -80,18 +68,10 @@ public class TrackEditActivity extends AbstractMyTracksActivity implements Choos private boolean newWeight = false; - private CheckPermissionAsyncTask syncDriveAsyncTask; - @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - Object retained = getLastCustomNonConfigurationInstance(); - if (retained instanceof CheckPermissionAsyncTask) { - syncDriveAsyncTask = (CheckPermissionAsyncTask) retained; - syncDriveAsyncTask.setActivity(this); - } - trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null); trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L); if (trackId == -1L) { @@ -177,19 +157,6 @@ public class TrackEditActivity extends AbstractMyTracksActivity implements Choos TrackUtils.updateTrack(TrackEditActivity.this, track, name.getText().toString(), activityType.getText().toString(), description.getText().toString(), myTracksProviderUtils, trackRecordingServiceConnection, newWeight); - - if (EulaUtils.showEnableSync(TrackEditActivity.this)) { - EulaUtils.setShowEnableSync(TrackEditActivity.this); - if (PreferencesUtils.getBoolean(TrackEditActivity.this, R.string.drive_sync_key, - PreferencesUtils.DRIVE_SYNC_DEFAULT)) { - finish(); - } else { - new EnableSyncDialogFragment().show( - getSupportFragmentManager(), EnableSyncDialogFragment.ENABLE_SYNC_DIALOG_TAG); - } - } else { - finish(); - } } }); @@ -209,13 +176,6 @@ public class TrackEditActivity extends AbstractMyTracksActivity implements Choos } } - @Override - public Object onRetainCustomNonConfigurationInstance() { - if (syncDriveAsyncTask != null) { - syncDriveAsyncTask.setActivity(null); - } - return syncDriveAsyncTask; - } @Override protected void onStart() { @@ -253,24 +213,4 @@ public class TrackEditActivity extends AbstractMyTracksActivity implements Choos setActivityTypeIcon(value); activityType.setText(getString(TrackIconUtils.getIconActivityType(value))); } - - @Override - public void onEnableSyncDone(boolean enable) { - if (enable) { - new ChooseAccountDialogFragment().show( - getSupportFragmentManager(), ChooseAccountDialogFragment.CHOOSE_ACCOUNT_DIALOG_TAG); - } else { - finish(); - } - } - - @Override - public void onChooseAccountDone(String account) { - - } - - @Override - public void onCheckPermissionDone(String scope, boolean success, Intent userRecoverableIntent) { - - } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java index b71e658ca..eeb67764d 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java @@ -16,42 +16,6 @@ package com.google.android.apps.mytracks; -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.fragments.ChooseAccountDialogFragment; -import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment.ChooseAccountCaller; -import com.google.android.apps.mytracks.fragments.ConfirmSyncDialogFragment; -import com.google.android.apps.mytracks.fragments.ConfirmSyncDialogFragment.ConfirmSyncCaller; -import com.google.android.apps.mytracks.fragments.EulaDialogFragment; -import com.google.android.apps.mytracks.fragments.EulaDialogFragment.EulaCaller; -import com.google.android.apps.mytracks.fragments.FileTypeDialogFragment; -import com.google.android.apps.mytracks.fragments.FileTypeDialogFragment.FileTypeCaller; -import com.google.android.apps.mytracks.fragments.PlayMultipleDialogFragment; -import com.google.android.apps.mytracks.fragments.PlayMultipleDialogFragment.PlayMultipleCaller; -import com.google.android.apps.mytracks.io.file.TrackFileFormat; -import com.google.android.apps.mytracks.io.file.exporter.SaveActivity; -import com.google.android.apps.mytracks.io.file.importer.ImportActivity; -import com.google.android.apps.mytracks.io.sync.SyncUtils; -import com.google.android.apps.mytracks.services.ITrackRecordingService; -import com.google.android.apps.mytracks.services.MyTracksLocationManager; -import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; -import com.google.android.apps.mytracks.settings.SettingsActivity; -import com.google.android.apps.mytracks.util.ApiAdapterFactory; -import com.google.android.apps.mytracks.util.EulaUtils; -import com.google.android.apps.mytracks.util.GoogleLocationUtils; -import com.google.android.apps.mytracks.util.IntentUtils; -import com.google.android.apps.mytracks.util.ListItemUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.apps.mytracks.util.StringUtils; -import com.google.android.apps.mytracks.util.TrackIconUtils; -import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; -import com.google.android.apps.mytracks.util.TrackUtils; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.android.maps.mytracks.BuildConfig; -import com.google.android.maps.mytracks.R; - import android.accounts.Account; import android.app.Dialog; import android.app.SearchManager; @@ -65,7 +29,6 @@ import android.os.Bundle; import android.os.Looper; import android.os.Parcelable; import android.os.RemoteException; -import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; @@ -84,6 +47,32 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.Toast; +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.fragments.FileTypeDialogFragment; +import com.google.android.apps.mytracks.fragments.FileTypeDialogFragment.FileTypeCaller; +import com.google.android.apps.mytracks.io.file.TrackFileFormat; +import com.google.android.apps.mytracks.io.file.exporter.SaveActivity; +import com.google.android.apps.mytracks.io.file.importer.ImportActivity; +import com.google.android.apps.mytracks.services.ITrackRecordingService; +import com.google.android.apps.mytracks.services.MyTracksLocationManager; +import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; +import com.google.android.apps.mytracks.settings.SettingsActivity; +import com.google.android.apps.mytracks.util.ApiAdapterFactory; +import com.google.android.apps.mytracks.util.GoogleLocationUtils; +import com.google.android.apps.mytracks.util.IntentUtils; +import com.google.android.apps.mytracks.util.ListItemUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.apps.mytracks.util.StringUtils; +import com.google.android.apps.mytracks.util.TrackIconUtils; +import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; +import com.google.android.apps.mytracks.util.TrackUtils; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GooglePlayServicesUtil; +import com.google.android.maps.mytracks.BuildConfig; +import com.google.android.maps.mytracks.R; + import java.util.Locale; /** @@ -91,8 +80,7 @@ import java.util.Locale; * * @author Leif Hendrik Wilden */ -public class TrackListActivity extends AbstractSendToGoogleActivity - implements EulaCaller, FileTypeCaller, PlayMultipleCaller, ChooseAccountCaller, ConfirmSyncCaller { +public class TrackListActivity extends AbstractSendToGoogleActivity implements FileTypeCaller { private static final String TAG = TrackListActivity.class.getSimpleName(); private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME, @@ -181,11 +169,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT); } - if (key == null || key.equals( - PreferencesUtils.getKey(TrackListActivity.this, R.string.drive_sync_key))) { - driveSync = PreferencesUtils.getBoolean(TrackListActivity.this, R.string.drive_sync_key, - PreferencesUtils.DRIVE_SYNC_DEFAULT); - } if (key != null) { runOnUiThread(new Runnable() { @Override @@ -217,8 +200,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity isSingleSelectionShareWithMe = false; } - // Not recording - menu.findItem(R.id.list_context_menu_play).setVisible(!isRecording); // Not recording, one item, not sharedWithMe item menu.findItem(R.id.list_context_menu_share) .setVisible(!isRecording && isSingleSelection && !isSingleSelectionShareWithMe); @@ -298,13 +279,10 @@ public class TrackListActivity extends AbstractSendToGoogleActivity private boolean metricUnits = true; private long recordingTrackId = PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; private boolean recordingTrackPaused = PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT; - private boolean driveSync = PreferencesUtils.DRIVE_SYNC_DEFAULT; // Menu items private MenuItem searchMenuItem; private MenuItem startGpsMenuItem; - private MenuItem playMultipleItem; - private MenuItem syncNowMenuItem; private MenuItem aggregatedStatisticsMenuItem; private MenuItem exportAllMenuItem; private MenuItem importAllMenuItem; @@ -456,16 +434,10 @@ public class TrackListActivity extends AbstractSendToGoogleActivity public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.track_list, menu); - menu.findItem(R.id.track_list_help_feedback).setTitle( - ApiAdapterFactory.getApiAdapter().isGoogleFeedbackAvailable() ? R.string.menu_help_feedback - : R.string.menu_help); - searchMenuItem = menu.findItem(R.id.track_list_search); ApiAdapterFactory.getApiAdapter().configureSearchWidget(this, searchMenuItem, trackController); startGpsMenuItem = menu.findItem(R.id.track_list_start_gps); - playMultipleItem = menu.findItem(R.id.track_list_play_mutliple); - syncNowMenuItem = menu.findItem(R.id.track_list_sync_now); aggregatedStatisticsMenuItem = menu.findItem(R.id.track_list_aggregated_statistics); exportAllMenuItem = menu.findItem(R.id.track_list_export_all); importAllMenuItem = menu.findItem(R.id.track_list_import_all); @@ -526,18 +498,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity } myTracksLocationManager.close(); return true; - case R.id.track_list_play_mutliple: - PlayMultipleDialogFragment.newInstance(-1L) - .show(getSupportFragmentManager(), PlayMultipleDialogFragment.PLAY_MULTIPLE_DIALOG_TAG); - return true; - case R.id.track_list_sync_now: - if (driveSync) { - SyncUtils.syncNow(this); - } else { - new ChooseAccountDialogFragment().show( - getSupportFragmentManager(), ChooseAccountDialogFragment.CHOOSE_ACCOUNT_DIALOG_TAG); - } - return true; case R.id.track_list_aggregated_statistics: intent = IntentUtils.newIntent(this, AggregatedStatsActivity.class); startActivity(intent); @@ -559,10 +519,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity intent = IntentUtils.newIntent(this, SettingsActivity.class); startActivity(intent); return true; - case R.id.track_list_help_feedback: - intent = IntentUtils.newIntent(this, HelpActivity.class); - startActivity(intent); - return true; default: return super.onOptionsItemSelected(item); } @@ -638,14 +594,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity * Shows start up dialogs. */ public void showStartupDialogs() { - if (!EulaUtils.hasAcceptedEula(this)) { - Fragment fragment = getSupportFragmentManager() - .findFragmentByTag(EulaDialogFragment.EULA_DIALOG_TAG); - if (fragment == null) { - EulaDialogFragment.newInstance(false) - .show(getSupportFragmentManager(), EulaDialogFragment.EULA_DIALOG_TAG); - } - } else { + { // If stats_units_key is undefined, set it if (PreferencesUtils.getString(this, R.string.stats_units_key, "").equals("")) { String statsUnits = getString( @@ -657,15 +606,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity } } - @Override - public void onEulaDone() { - if (EulaUtils.hasAcceptedEula(this)) { - showStartupDialogs(); - return; - } - finish(); - } - private void checkGooglePlayServices() { int code = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (code != ConnectionResult.SUCCESS) { @@ -701,12 +641,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity TrackIconUtils.setMenuIconColor(startGpsMenuItem); } } - if (playMultipleItem != null) { - playMultipleItem.setVisible(hasTrack); - } - if (syncNowMenuItem != null) { - syncNowMenuItem.setTitle(driveSync ? R.string.menu_sync_now : R.string.menu_sync_drive); - } if (aggregatedStatisticsMenuItem != null) { aggregatedStatisticsMenuItem.setVisible(hasTrack); } @@ -746,11 +680,9 @@ public class TrackListActivity extends AbstractSendToGoogleActivity */ private boolean handleContextItem(int itemId, long[] trackIds) { switch (itemId) { - case R.id.list_context_menu_play: - playTracks(trackIds); - return true; case R.id.list_context_menu_share: - shareTrack(trackIds[0]); + //TODO + Log.e(TAG, "Not implemented"); return true; case R.id.list_context_menu_edit: Intent intent = IntentUtils.newIntent(this, TrackEditActivity.class) @@ -769,38 +701,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity listView.setItemChecked(i, true); } return false; - default: - return false; } - } - - @Override - public void onPlayMultipleDone(long[] trackIds) { - playTracks(trackIds); - } - - @Override - public void onChooseAccountDone(String account) { - PreferencesUtils.setString(this, R.string.google_account_key, account); - if (PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT.equals(account)) { - return; - } else { - new ConfirmSyncDialogFragment().show( - getSupportFragmentManager(), ConfirmSyncDialogFragment.CONFIRM_SYNC_DIALOG_TAG); - } - } - - @Override - public void onConfirmSyncDone(boolean enable) { - if (enable) { - String googleAccount = PreferencesUtils.getString( - this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - //enableSync(new Account(googleAccount, Constants.ACCOUNT_TYPE)); - } - } - - @Override - public void onShareTrackDone(long trackId, boolean makePublic, String emails, Account account) { - + return false; } } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/DescriptionGeneratorImpl.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/DescriptionGeneratorImpl.java index 1be60953a..e77ffccc9 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/DescriptionGeneratorImpl.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/DescriptionGeneratorImpl.java @@ -16,14 +16,14 @@ package com.google.android.apps.mytracks.content; +import android.content.Context; +import android.support.annotation.VisibleForTesting; + import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.ChartURLGenerator; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.content.Context; import java.util.Vector; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java index 467b3bdc8..a82644662 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/MyTracksProvider.java @@ -16,11 +16,6 @@ package com.google.android.apps.mytracks.content; -import com.google.android.apps.mytracks.util.FileUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; @@ -37,9 +32,14 @@ import android.net.Uri; import android.os.Binder; import android.os.ParcelFileDescriptor; import android.os.Process; +import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.util.Log; +import com.google.android.apps.mytracks.util.FileUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.maps.mytracks.R; + import java.io.File; import java.io.FileNotFoundException; @@ -52,6 +52,7 @@ import java.io.FileNotFoundException; public class MyTracksProvider extends ContentProvider { private static final String TAG = MyTracksProvider.class.getSimpleName(); + @VisibleForTesting static final int DATABASE_VERSION = 22; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackDataHub.java b/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackDataHub.java index 68c276f4e..11879df0e 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackDataHub.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/content/TrackDataHub.java @@ -16,19 +16,19 @@ package com.google.android.apps.mytracks.content; -import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator; -import com.google.android.apps.mytracks.util.LocationUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - import android.content.Context; import android.database.Cursor; import android.location.Location; import android.os.Handler; import android.os.HandlerThread; +import android.support.annotation.VisibleForTesting; import android.util.Log; +import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator; +import com.google.android.apps.mytracks.util.LocationUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.maps.mytracks.R; + import java.util.Collections; import java.util.EnumSet; import java.util.Set; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java index 59979b900..332ff4cc6 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChartFragment.java @@ -16,6 +16,17 @@ package com.google.android.apps.mytracks.fragments; +import android.location.Location; +import android.os.Bundle; +import android.support.annotation.VisibleForTesting; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.widget.ZoomControls; + import com.google.android.apps.mytracks.ChartView; import com.google.android.apps.mytracks.TrackDetailActivity; import com.google.android.apps.mytracks.content.MyTracksLocation; @@ -33,17 +44,6 @@ import com.google.android.apps.mytracks.util.LocationUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.location.Location; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.widget.ZoomControls; import java.util.ArrayList; import java.util.EnumSet; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java deleted file mode 100644 index fd48631d9..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2013 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.fragments; - -import com.google.android.apps.mytracks.Constants; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; - -/** - * A DialogFragment to choose an account. - * - * @author Jimmy Shih - */ -public class ChooseAccountDialogFragment extends AbstractMyTracksDialogFragment { - - /** - * Interface for caller of this dialog fragment. - * - * @author Jimmy Shih - */ - public interface ChooseAccountCaller { - - /** - * Called when choose account is done. - * - * @param account the account chosen - */ - public void onChooseAccountDone(String account); - } - - public static final String CHOOSE_ACCOUNT_DIALOG_TAG = "chooseAccount"; - - private ChooseAccountCaller caller; - private Account[] accounts; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - caller = (ChooseAccountCaller) activity; - } catch (ClassCastException e) { - throw new ClassCastException( - activity.toString() + " must implement " + ChooseAccountCaller.class.getSimpleName()); - } - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - FragmentActivity fragmentActivity = getActivity(); - accounts = AccountManager.get(fragmentActivity).getAccountsByType(Constants.ACCOUNT_TYPE); - - if (accounts.length == 1) { - dismiss(); - caller.onChooseAccountDone(accounts[0].name); - return; - } - } - - @Override - protected Dialog createDialog() { - if (accounts.length == 0) { - return new AlertDialog.Builder(getActivity()).setMessage( - R.string.send_google_no_account_message).setTitle(R.string.send_google_no_account_title) - .setPositiveButton(R.string.generic_ok, new OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - caller.onChooseAccountDone(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - } - }).create(); - } - String[] choices = new String[accounts.length]; - for (int i = 0; i < accounts.length; i++) { - choices[i] = accounts[i].name; - } - return new AlertDialog.Builder(getActivity()).setNegativeButton( - R.string.generic_cancel, new OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - caller.onChooseAccountDone(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - - } - }).setPositiveButton(R.string.generic_ok, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); - caller.onChooseAccountDone(accounts[position].name); - } - }).setSingleChoiceItems(choices, 0, null).setTitle(R.string.send_google_choose_account_title) - .create(); - } - - @Override - public void onCancel(DialogInterface dialog) { - caller.onChooseAccountDone(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmDeleteDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmDeleteDialogFragment.java index d66c93317..f70a346aa 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmDeleteDialogFragment.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmDeleteDialogFragment.java @@ -84,18 +84,10 @@ public class ConfirmDeleteDialogFragment extends AbstractMyTracksDialogFragment final long[] trackIds = getArguments().getLongArray(KEY_TRACK_IDS); int titleId; int messageId; - if (trackIds.length == 1 && trackIds[0] == -1L) { - boolean driveSync = PreferencesUtils.getBoolean( - getActivity(), R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); - titleId = R.string.generic_delete_all_confirm_title; - messageId = driveSync ? R.string.track_delete_all_confirm_message_sync_on - : R.string.track_delete_all_confirm_message_sync_off; - } else { - titleId = trackIds.length > 1 ? R.string.generic_delete_selected_confirm_title - : R.string.track_delete_one_confirm_title; - messageId = trackIds.length > 1 ? R.string.track_delete_multiple_confirm_message - : R.string.track_delete_one_confirm_message; - } + titleId = trackIds.length > 1 ? R.string.generic_delete_selected_confirm_title + : R.string.track_delete_one_confirm_title; + messageId = trackIds.length > 1 ? R.string.track_delete_multiple_confirm_message + : R.string.track_delete_one_confirm_message; return DialogUtils.createConfirmationDialog( getActivity(), titleId, getString(messageId), new DialogInterface.OnClickListener() { @Override diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmSyncDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmSyncDialogFragment.java deleted file mode 100644 index 45cc19933..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ConfirmSyncDialogFragment.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2013 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.fragments; - -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.support.v4.app.FragmentActivity; - -/** - * A DialogFrament to confirm sync to Google Drive. - * - * @author Jimmy Shih - */ -public class ConfirmSyncDialogFragment extends AbstractMyTracksDialogFragment { - - /** - * Interface for caller of this dialog fragment. - * - * @author Jimmy Shih - */ - public interface ConfirmSyncCaller { - - /** - * Called when confirm sync is done. - */ - public void onConfirmSyncDone(boolean enable); - } - - public static final String CONFIRM_SYNC_DIALOG_TAG = "confirmSyncDialog"; - - private ConfirmSyncCaller caller; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - caller = (ConfirmSyncCaller) activity; - } catch (ClassCastException e) { - throw new ClassCastException( - activity.toString() + " must implement " + ConfirmSyncCaller.class.getSimpleName()); - } - } - - @Override - protected Dialog createDialog() { - FragmentActivity fragmentActivity = getActivity(); - String googleAccount = PreferencesUtils.getString( - fragmentActivity, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - String message = getString( - R.string.sync_drive_confirm_message, googleAccount, getString(R.string.my_tracks_app_name)); - return new AlertDialog.Builder(fragmentActivity).setMessage(message) - .setNegativeButton(R.string.generic_no, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - caller.onConfirmSyncDone(false); - } - }).setPositiveButton(R.string.generic_yes, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - caller.onConfirmSyncDone(true); - } - }).setTitle(R.string.sync_drive_confirm_title).create(); - } - - @Override - public void onCancel(DialogInterface arg0) { - caller.onConfirmSyncDone(false); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java deleted file mode 100644 index 1ee5053c3..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2012 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.fragments; - -import com.google.android.apps.mytracks.util.EulaUtils; -import com.google.android.maps.mytracks.R; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.SpannableString; -import android.text.method.LinkMovementMethod; -import android.text.util.Linkify; -import android.view.KeyEvent; -import android.widget.TextView; - -/** - * A DialogFragment to show EULA. - * - * @author Jimmy Shih - */ -public class EulaDialogFragment extends AbstractMyTracksDialogFragment { - - /** - * Interface for caller of this dialog fragment. - * - * @author Jimmy Shih - */ - public interface EulaCaller { - - /** - * Called when eula is done. - */ - public void onEulaDone(); - } - - public static final String EULA_DIALOG_TAG = "eulaDialog"; - private static final String KEY_HAS_ACCEPTED = "hasAccepted"; - private static final String GOOGLE_URL = "m.google.com"; - private static final String KOREAN = "ko"; - - /** - * Creates a new instance of {@link EulaDialogFragment}. - * - * @param hasAccepted true if the user has accepted the eula. - */ - public static EulaDialogFragment newInstance(boolean hasAccepted) { - Bundle bundle = new Bundle(); - bundle.putBoolean(KEY_HAS_ACCEPTED, hasAccepted); - - EulaDialogFragment eulaDialogFragment = new EulaDialogFragment(); - eulaDialogFragment.setArguments(bundle); - return eulaDialogFragment; - } - - private EulaCaller caller; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - caller = (EulaCaller) activity; - } catch (ClassCastException e) { - throw new ClassCastException( - activity.toString() + " must implement " + EulaCaller.class.getSimpleName()); - } - } - - @Override - protected Dialog createDialog() { - boolean hasAccepted = getArguments().getBoolean(KEY_HAS_ACCEPTED); - - SpannableString message = new SpannableString(getEulaText()); - Linkify.addLinks(message, Linkify.WEB_URLS); - - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setMessage(message) - .setTitle(R.string.menu_help_eula); - - if (hasAccepted) { - builder.setPositiveButton(R.string.generic_ok, null); - } else { - builder.setNegativeButton(R.string.eula_decline, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - caller.onEulaDone(); - } - }).setOnKeyListener(new DialogInterface.OnKeyListener() { - @Override - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_SEARCH) { - return true; - } - return false; - } - }).setPositiveButton(R.string.eula_accept, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - EulaUtils.setAcceptedEula(getActivity()); - caller.onEulaDone(); - } - }); - } - return builder.create(); - } - - @Override - public void onStart() { - super.onStart(); - TextView textView = (TextView) getDialog().findViewById(android.R.id.message); - textView.setMovementMethod(LinkMovementMethod.getInstance()); - textView.setTextAppearance(getActivity(), R.style.TextSmall); - } - - @Override - public void onCancel(DialogInterface arg0) { - caller.onEulaDone(); - } - - /** - * Gets the EULA text. - */ - private String getEulaText() { - String tos = getString(R.string.eula_date) + "\n\n" + getString(R.string.eula_body, GOOGLE_URL) - + "\n\n" + getString(R.string.eula_footer, GOOGLE_URL) + "\n\n" - + getString(R.string.eula_copyright_year); - boolean isKorean = getResources().getConfiguration().locale.getLanguage().equals(KOREAN); - if (isKorean) { - tos += "\n\n" + getString(R.string.eula_korean); - } - return tos; - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ExportDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ExportDialogFragment.java index 25e0096fd..609c6752a 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ExportDialogFragment.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ExportDialogFragment.java @@ -18,7 +18,6 @@ package com.google.android.apps.mytracks.fragments; import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.io.file.TrackFileFormat; -import com.google.android.apps.mytracks.util.AccountUtils; import com.google.android.apps.mytracks.util.FileUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; @@ -53,10 +52,6 @@ public class ExportDialogFragment extends AbstractMyTracksDialogFragment { * @author Jimmy Shih */ public enum ExportType { - GOOGLE_DRIVE(R.string.export_google_drive), - GOOGLE_MAPS(R.string.export_google_maps), - GOOGLE_FUSION_TABLES(R.string.export_google_fusion_tables), - GOOGLE_SPREADSHEET(R.string.export_google_spreadsheets), EXTERNAL_STORAGE(R.string.export_external_storage); final int resId; @@ -77,35 +72,24 @@ public class ExportDialogFragment extends AbstractMyTracksDialogFragment { * * @param exportType the export type * @param trackFileFormat the track file format - * @param account the account */ public void onExportDone( - ExportType exportType, TrackFileFormat trackFileFormat, Account account); + ExportType exportType, TrackFileFormat trackFileFormat); } public static final String EXPORT_DIALOG_TAG = "export"; - private static final String KEY_HIDE_DRIVE = "hideDrive"; - public static ExportDialogFragment newInstance(boolean hideDrive) { - Bundle bundle = new Bundle(); - bundle.putBoolean(KEY_HIDE_DRIVE, hideDrive); - - ExportDialogFragment fragment = new ExportDialogFragment(); - fragment.setArguments(bundle); - return fragment; + //TODO REMOVE + return new ExportDialogFragment(); } private ExportCaller caller; - private Account[] accounts; private ArrayList exportTypeOptionsList; // UI elements private Spinner exportTypeOptions; - private RadioGroup exportGoogleMapsOptions; - private RadioGroup exportGoogleFusionTablesOptions; private RadioGroup exportExternalStorageOptions; - private Spinner accountSpinner; @Override public void onAttach(Activity activity) { @@ -121,34 +105,10 @@ public class ExportDialogFragment extends AbstractMyTracksDialogFragment { @Override protected Dialog createDialog() { FragmentActivity fragmentActivity = getActivity(); - accounts = AccountManager.get(fragmentActivity).getAccountsByType(Constants.ACCOUNT_TYPE); // Get views View view = fragmentActivity.getLayoutInflater().inflate(R.layout.export, null); exportTypeOptions = (Spinner) view.findViewById(R.id.export_type_options); - exportGoogleMapsOptions = (RadioGroup) view.findViewById(R.id.export_google_maps_options); - exportGoogleFusionTablesOptions = (RadioGroup) view.findViewById( - R.id.export_google_fusion_tables_options); - exportExternalStorageOptions = (RadioGroup) view.findViewById( - R.id.export_external_storage_options); - accountSpinner = (Spinner) view.findViewById(R.id.export_account); - - // Setup exportTypeOptions - setupExportTypeOptions(fragmentActivity); - - // Setup exportGoogleMapsOptions - boolean exportGoogleMapsPublic = PreferencesUtils.getBoolean(fragmentActivity, - R.string.export_google_maps_public_key, PreferencesUtils.EXPORT_GOOGLE_MAPS_PUBLIC_DEFAULT); - exportGoogleMapsOptions.check( - exportGoogleMapsPublic ? R.id.export_google_maps_public : R.id.export_google_maps_unlisted); - - // Setup exportGoogleFusionTablesOptions - boolean exportGoogleFusionTablesPublic = PreferencesUtils.getBoolean(fragmentActivity, - R.string.export_google_fusion_tables_public_key, - PreferencesUtils.EXPORT_GOOGLE_FUSION_TABLES_PUBLIC_DEFAULT); - exportGoogleFusionTablesOptions.check( - exportGoogleFusionTablesPublic ? R.id.export_google_fusion_tables_public - : R.id.export_google_fusion_tables_private); // Setup exportExternalStorageOptions setExternalStorageOption( @@ -164,100 +124,26 @@ public class ExportDialogFragment extends AbstractMyTracksDialogFragment { PreferencesUtils.EXPORT_EXTERNAL_STORAGE_FORMAT_DEFAULT)); exportExternalStorageOptions.check(getExternalStorageFormatId(trackFileFormat)); - // Setup accountSpinner - AccountUtils.setupAccountSpinner(fragmentActivity, accountSpinner, accounts); - - return new AlertDialog.Builder(fragmentActivity).setNegativeButton( - R.string.generic_cancel, null) - .setPositiveButton(R.string.menu_export, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FragmentActivity context = getActivity(); - ExportType type = exportTypeOptionsList.get( - exportTypeOptions.getSelectedItemPosition()); - TrackFileFormat format = null; + return new AlertDialog.Builder(fragmentActivity) + .setNegativeButton(R.string.generic_cancel, null) + .setPositiveButton(R.string.menu_export, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FragmentActivity context = getActivity(); + ExportType type = exportTypeOptionsList.get( + exportTypeOptions.getSelectedItemPosition()); + TrackFileFormat format = null; - PreferencesUtils.setString(context, R.string.export_type_key, type.name()); - if (type == ExportType.GOOGLE_MAPS) { - PreferencesUtils.setBoolean(context, R.string.export_google_maps_public_key, - exportGoogleMapsOptions.getCheckedRadioButtonId() - == R.id.export_google_maps_public); - } else if (type == ExportType.GOOGLE_FUSION_TABLES) { - PreferencesUtils.setBoolean(context, R.string.export_google_fusion_tables_public_key, - exportGoogleFusionTablesOptions.getCheckedRadioButtonId() - == R.id.export_google_fusion_tables_public); - } else if (type == ExportType.EXTERNAL_STORAGE) { - format = getTrackFileFormat(exportExternalStorageOptions.getCheckedRadioButtonId()); - PreferencesUtils.setString( - context, R.string.export_external_storage_format_key, format.name()); - } - Account account; - if (accounts.length == 0) { - account = null; - } else if (accounts.length == 1) { - account = accounts[0]; - } else { - account = accounts[accountSpinner.getSelectedItemPosition()]; - } - AccountUtils.updateShareTrackAccountPreference(context, account); - caller.onExportDone(type, format, account); - } - }).setTitle(R.string.export_title).setView(view).create(); - } - - private void setupExportTypeOptions(FragmentActivity fragmentActivity) { - boolean hideDrive = getArguments().getBoolean(KEY_HIDE_DRIVE); - ExportType exportType = ExportType.valueOf(PreferencesUtils.getString( - fragmentActivity, R.string.export_type_key, PreferencesUtils.EXPORT_TYPE_DEFAULT)); - - if (hideDrive && exportType == ExportType.GOOGLE_DRIVE) { - exportType = ExportType.GOOGLE_MAPS; - } - - exportTypeOptionsList = new ArrayList(); - ArrayAdapter adapter = new ArrayAdapter( - getActivity(), android.R.layout.simple_spinner_item); - if (accounts.length > 0) { - if (!hideDrive) { - exportTypeOptionsList.add(ExportType.GOOGLE_DRIVE); - } - exportTypeOptionsList.add(ExportType.GOOGLE_MAPS); - exportTypeOptionsList.add(ExportType.GOOGLE_FUSION_TABLES); - exportTypeOptionsList.add(ExportType.GOOGLE_SPREADSHEET); - } - exportTypeOptionsList.add(ExportType.EXTERNAL_STORAGE); - - int selection = 0; - for (int i = 0; i < exportTypeOptionsList.size(); i++) { - ExportType type = exportTypeOptionsList.get(i); - adapter.add(getString(type.resId)); - if (type == exportType) { - selection = i; - } - } - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - exportTypeOptions.setAdapter(adapter); - exportTypeOptions.setSelection(selection); - exportTypeOptions.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - ExportType type = exportTypeOptionsList.get(position); - exportGoogleMapsOptions.setVisibility( - type == ExportType.GOOGLE_MAPS ? View.VISIBLE : View.GONE); - exportGoogleFusionTablesOptions.setVisibility( - type == ExportType.GOOGLE_FUSION_TABLES ? View.VISIBLE : View.GONE); - exportExternalStorageOptions.setVisibility( - type == ExportType.EXTERNAL_STORAGE ? View.VISIBLE : View.GONE); - accountSpinner.setVisibility( - accounts.length > 1 && type != ExportType.EXTERNAL_STORAGE ? View.VISIBLE : View.GONE); - } - - @Override - public void onNothingSelected(AdapterView parent) { - // Safely ignore - } - }); + PreferencesUtils.setString(context, R.string.export_type_key, type.name()); + if (type == ExportType.EXTERNAL_STORAGE) { + format = getTrackFileFormat(exportExternalStorageOptions.getCheckedRadioButtonId()); + PreferencesUtils.setString( + context, R.string.export_external_storage_format_key, format.name()); + } + caller.onExportDone(type, format); + } + }) + .setTitle(R.string.export_title).setView(view).create(); } /** diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/InstallEarthDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/InstallEarthDialogFragment.java deleted file mode 100644 index b18c39267..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/InstallEarthDialogFragment.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2012 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.fragments; - -import com.google.android.apps.mytracks.util.GoogleEarthUtils; -import com.google.android.maps.mytracks.R; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.ActivityNotFoundException; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.widget.Toast; - -/** - * A DialogFragment to install Google Earth. - * - * @author Jimmy Shih - */ -public class InstallEarthDialogFragment extends AbstractMyTracksDialogFragment { - - public static final String INSTALL_EARTH_DIALOG_TAG = "installEarthDialog"; - - @Override - protected Dialog createDialog() { - return new AlertDialog.Builder(getActivity()).setMessage( - R.string.track_detail_install_earth_message).setNegativeButton(R.string.generic_no, null) - .setPositiveButton(R.string.generic_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent().setData( - Uri.parse(GoogleEarthUtils.GOOGLE_EARTH_MARKET_URL)); - try { - startActivity(intent); - } catch (ActivityNotFoundException e) { - Toast.makeText( - getActivity(), R.string.track_detail_install_earth_error, Toast.LENGTH_LONG) - .show(); - } - } - }).setTitle(R.string.track_detail_install_earth_title).create(); - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/MapLayerDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/MapLayerDialogFragment.java deleted file mode 100644 index 6d04c5b37..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/MapLayerDialogFragment.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2014 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.fragments; - -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.maps.mytracks.R; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; - -/** - * A DialogFragment to select a map layer. - * - * @author Jimmy Shih - */ -public class MapLayerDialogFragment extends AbstractMyTracksDialogFragment { - - public static final String MAP_LAYER_DIALOG_TAG = "mapLayer"; - - private static final int[] LAYERS = { R.string.menu_map, R.string.menu_satellite, - R.string.menu_satellite_with_streets, R.string.menu_terrain }; - private static final int[] MAP_TYPES = { GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_SATELLITE, - GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_TERRAIN }; - - @Override - protected Dialog createDialog() { - String[] choices = new String[LAYERS.length]; - for (int i = 0; i < LAYERS.length; i++) { - choices[i] = getString(LAYERS[i]); - } - - int mapType = PreferencesUtils.getInt( - getActivity(), R.string.map_type_key, PreferencesUtils.MAP_TYPE_DEFAUlT); - - return new AlertDialog.Builder(getActivity()).setNegativeButton(R.string.generic_cancel, null) - .setPositiveButton(R.string.generic_ok, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); - PreferencesUtils.setInt(getActivity(), R.string.map_type_key, MAP_TYPES[position]); - } - }).setSingleChoiceItems(choices, getPositionFromMapType(mapType), null) - .setTitle(R.string.menu_map_layer).create(); - } - - private int getPositionFromMapType(int mapType) { - for (int i = 0; i < MAP_TYPES.length; i++) { - if (MAP_TYPES[i] == mapType) { - return i; - } - } - return 0; - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/PlayMultipleDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/PlayMultipleDialogFragment.java deleted file mode 100644 index a1fd908d9..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/PlayMultipleDialogFragment.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2013 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.fragments; - -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.Track; -import com.google.android.apps.mytracks.util.TrackUtils; -import com.google.android.maps.mytracks.R; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.database.Cursor; -import android.os.Bundle; -import android.util.SparseBooleanArray; - -import java.util.ArrayList; - -/** - * A DialogFragment to play multiple tracks. - * - * @author Jimmy Shih - */ -public class PlayMultipleDialogFragment extends AbstractMyTracksDialogFragment { - - public static final String PLAY_MULTIPLE_DIALOG_TAG = "playMultipleDialog"; - - /** - * Interface for caller of this dialog fragment. - * - * @author Jimmy Shih - */ - public interface PlayMultipleCaller { - - /** - * Called when play multiple is done. - */ - public void onPlayMultipleDone(long[] trackIds); - } - - private static final String KEY_TRACK_ID = "trackId"; - - public static PlayMultipleDialogFragment newInstance(long trackId) { - Bundle bundle = new Bundle(); - bundle.putLong(KEY_TRACK_ID, trackId); - - PlayMultipleDialogFragment fragment = new PlayMultipleDialogFragment(); - fragment.setArguments(bundle); - return fragment; - } - - private PlayMultipleCaller caller; - private String[] items; - private boolean[] checkedItems; - private long[] trackIds; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - caller = (PlayMultipleCaller) activity; - } catch (ClassCastException e) { - throw new ClassCastException( - activity.toString() + " must implement " + PlayMultipleCaller.class.getSimpleName()); - } - } - - @Override - protected Dialog createDialog() { - loadData(); - return new AlertDialog.Builder(getActivity()).setMultiChoiceItems(items, checkedItems, null) - .setNegativeButton(R.string.generic_cancel, null) - .setPositiveButton(R.string.menu_play, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SparseBooleanArray array = ((AlertDialog) dialog).getListView() - .getCheckedItemPositions(); - caller.onPlayMultipleDone(getChecked(array)); - } - }).setTitle(R.string.menu_play_multiple).create(); - } - - private long[] getChecked(SparseBooleanArray array) { - ArrayList checked = new ArrayList(); - for (int i = 0; i < array.size(); i++) { - int key = array.keyAt(i); - if (array.get(key)) { - checked.add(trackIds[key]); - } - } - long[] result = new long[checked.size()]; - for (int i = 0; i < checked.size(); i++) { - result[i] = checked.get(i).longValue(); - } - return result; - } - - private void loadData() { - long trackId = getArguments().getLong(KEY_TRACK_ID); - MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get(getActivity()); - Cursor cursor = myTracksProviderUtils.getTrackCursor(null, null, TrackUtils.TRACK_SORT_ORDER); - - if (cursor == null) { - items = new String[] {}; - checkedItems = new boolean[] {}; - trackIds = new long[] {}; - } else { - int count = cursor.getCount(); - items = new String[count]; - checkedItems = new boolean[count]; - trackIds = new long[count]; - for (int i = 0; i < count; i++) { - cursor.moveToPosition(i); - Track track = myTracksProviderUtils.createTrack(cursor); - items[i] = track.getName(); - checkedItems[i] = trackId != -1L && track.getId() == trackId; - trackIds[i] = track.getId(); - } - } - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ShareTrackDialogFragment.java b/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ShareTrackDialogFragment.java deleted file mode 100644 index d21e47348..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/fragments/ShareTrackDialogFragment.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2013 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.fragments; - -import com.google.android.apps.mytracks.Constants; -import com.google.android.apps.mytracks.util.AccountUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.provider.ContactsContract; -import android.support.v4.app.FragmentActivity; -import android.support.v4.widget.SimpleCursorAdapter; -import android.view.View; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.FilterQueryProvider; -import android.widget.MultiAutoCompleteTextView; -import android.widget.Spinner; -import android.widget.Toast; - -/** - * A DialogFragment to share a track. - * - * @author Jimmy Shih - */ -public class ShareTrackDialogFragment extends AbstractMyTracksDialogFragment { - - /** - * Interface for caller of this dialog fragment. - * - * @author Jimmy Shih - */ - public interface ShareTrackCaller { - - /** - * Called when share track is done. - * - * @param trackId the track id - * @param makePublic true to make the track public - * @param emails the emails to share the track with - * @param account the google drive account - */ - public void onShareTrackDone(long trackId, boolean makePublic, String emails, Account account); - } - - public static final String SHARE_TRACK_DIALOG_TAG = "shareTrackDialog"; - - private static final String KEY_TRACK_ID = "trackId"; - - public static ShareTrackDialogFragment newInstance(long trackId) { - Bundle bundle = new Bundle(); - bundle.putLong(KEY_TRACK_ID, trackId); - - ShareTrackDialogFragment shareleTrackDialogFragment = new ShareTrackDialogFragment(); - shareleTrackDialogFragment.setArguments(bundle); - return shareleTrackDialogFragment; - } - - private ShareTrackCaller caller; - private Account[] accounts; - - // UI elements - private CheckBox publicCheckBox; - private CheckBox inviteCheckBox; - private MultiAutoCompleteTextView multiAutoCompleteTextView; - private Spinner accountSpinner; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - caller = (ShareTrackCaller) activity; - } catch (ClassCastException e) { - throw new ClassCastException( - activity.toString() + " must implement " + ShareTrackCaller.class.getSimpleName()); - } - } - - @Override - protected Dialog createDialog() { - FragmentActivity fragmentActivity = getActivity(); - accounts = AccountManager.get(fragmentActivity).getAccountsByType(Constants.ACCOUNT_TYPE); - - if (accounts.length == 0) { - return new AlertDialog.Builder(fragmentActivity).setMessage( - R.string.send_google_no_account_message).setTitle(R.string.send_google_no_account_title) - .setPositiveButton(R.string.generic_ok, null).create(); - } - - // Get all the views - View view = fragmentActivity.getLayoutInflater().inflate(R.layout.share_track, null); - publicCheckBox = (CheckBox) view.findViewById(R.id.share_track_public); - inviteCheckBox = (CheckBox) view.findViewById(R.id.share_track_invite); - multiAutoCompleteTextView = (MultiAutoCompleteTextView) view.findViewById( - R.id.share_track_emails); - accountSpinner = (Spinner) view.findViewById(R.id.share_track_account); - - // Setup publicCheckBox - publicCheckBox.setChecked(PreferencesUtils.getBoolean( - fragmentActivity, R.string.share_track_public_key, - PreferencesUtils.SHARE_TRACK_PUBLIC_DEFAULT)); - - // Setup inviteCheckBox - inviteCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - multiAutoCompleteTextView.setVisibility(isChecked ? View.VISIBLE : View.GONE); - } - }); - inviteCheckBox.setChecked(PreferencesUtils.getBoolean( - fragmentActivity, R.string.share_track_invite_key, - PreferencesUtils.SHARE_TRACK_INVITE_DEFAULT)); - - // Setup multiAutoCompleteTextView - multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); - SimpleCursorAdapter adapter = new SimpleCursorAdapter(fragmentActivity, - R.layout.add_emails_item, getAutoCompleteCursor(fragmentActivity, null), new String[] { - ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Email.DATA }, - new int[] { android.R.id.text1, android.R.id.text2 }, 0); - adapter.setCursorToStringConverter(new SimpleCursorAdapter.CursorToStringConverter() { - @Override - public CharSequence convertToString(Cursor cursor) { - int index = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); - return cursor.getString(index).trim(); - } - }); - adapter.setFilterQueryProvider(new FilterQueryProvider() { - @Override - public Cursor runQuery(CharSequence constraint) { - return getAutoCompleteCursor(getActivity(), constraint); - } - }); - multiAutoCompleteTextView.setAdapter(adapter); - - // Setup accountSpinner - accountSpinner.setVisibility(accounts.length > 1 ? View.VISIBLE : View.GONE); - AccountUtils.setupAccountSpinner(fragmentActivity, accountSpinner, accounts); - - return new AlertDialog.Builder(fragmentActivity).setNegativeButton( - R.string.generic_cancel, null) - .setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FragmentActivity context = getActivity(); - if (!publicCheckBox.isChecked() && !inviteCheckBox.isChecked()) { - Toast.makeText(context, R.string.share_track_no_selection, Toast.LENGTH_LONG).show(); - return; - } - String acl = multiAutoCompleteTextView.getText().toString().trim(); - if (!publicCheckBox.isChecked() && acl.equals("")) { - Toast.makeText(context, R.string.share_track_no_emails, Toast.LENGTH_LONG).show(); - return; - } - PreferencesUtils.setBoolean( - context, R.string.share_track_public_key, publicCheckBox.isChecked()); - PreferencesUtils.setBoolean( - context, R.string.share_track_invite_key, inviteCheckBox.isChecked()); - Account account = accounts.length > 1 ? accounts[accountSpinner - .getSelectedItemPosition()] - : accounts[0]; - AccountUtils.updateShareTrackAccountPreference(context, account); - caller.onShareTrackDone( - getArguments().getLong(KEY_TRACK_ID), publicCheckBox.isChecked(), acl, account); - } - }).setTitle(R.string.share_track_title).setView(view).create(); - } - - /** - * Gets the auto complete cursor. - * - * @param constraint the constraint - */ - private Cursor getAutoCompleteCursor(FragmentActivity fragmentActivity, CharSequence constraint) { - String order = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; - String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'"; - if (constraint != null) { - selection += " AND (" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE '%" + constraint - + "%' OR " + ContactsContract.CommonDataKinds.Email.DATA + " LIKE '%" + constraint - + "%' )"; - } - String[] projection = new String[] { ContactsContract.Contacts._ID, - ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Email.DATA }; - Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI; - return fragmentActivity.getContentResolver().query(uri, projection, selection, null, order); - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java index 21d281f7f..5d586e8ea 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/KmlTrackWriter.java @@ -15,6 +15,12 @@ */ package com.google.android.apps.mytracks.io.file.exporter; +import android.content.Context; +import android.database.Cursor; +import android.location.Location; +import android.net.Uri; +import android.support.annotation.VisibleForTesting; + import com.google.android.apps.mytracks.content.DescriptionGenerator; import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl; import com.google.android.apps.mytracks.content.MyTracksLocation; @@ -26,15 +32,8 @@ import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; import com.google.android.apps.mytracks.io.file.TrackFileFormat; -import com.google.android.apps.mytracks.util.GoogleEarthUtils; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.content.Context; -import android.database.Cursor; -import android.location.Location; -import android.net.Uri; import java.io.File; import java.io.OutputStream; @@ -188,7 +187,7 @@ public class KmlTrackWriter implements TrackWriter { @Override public void writeBeginTracks() { if (printWriter != null && multiple) { - printWriter.println(""); + printWriter.println(""); printWriter.println("" + context.getString(R.string.generic_tracks) + ""); printWriter.println("1"); } @@ -206,12 +205,7 @@ public class KmlTrackWriter implements TrackWriter { if (printWriter != null) { String name = context.getString(R.string.marker_label_start, track.getName()); writePlacemark(name, "", "", START_STYLE, startLocation); - if (multiple) { - // No need to add TOUR_FEATURE_ID_VALUE - printWriter.println(""); - } else { - printWriter.println(""); - } + printWriter.println(""); printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); printWriter.println( "" + StringUtils.formatCData(track.getDescription()) + ""); diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/SaveActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/SaveActivity.java index 3b557edf3..e1c079407 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/SaveActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/exporter/SaveActivity.java @@ -19,7 +19,6 @@ package com.google.android.apps.mytracks.io.file.exporter; import com.google.android.apps.mytracks.io.file.TrackFileFormat; import com.google.android.apps.mytracks.util.DialogUtils; import com.google.android.apps.mytracks.util.FileUtils; -import com.google.android.apps.mytracks.util.GoogleEarthUtils; import com.google.android.apps.mytracks.util.IntentUtils; import com.google.android.maps.mytracks.R; @@ -200,12 +199,7 @@ public class SaveActivity extends Activity { totalCount = aTotalCount; savedPath = aSavedPath; removeDialog(DIALOG_PROGRESS_ID); - if (playTrack && successCount == 1 && totalCount == 1 && savedPath != null) { - startActivity(GoogleEarthUtils.getPlayInEarthIntent(this, savedPath)); - finish(); - } else { - showDialog(DIALOG_RESULT_ID); - } + showDialog(DIALOG_RESULT_ID); } /** diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/GpxFileTrackImporter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/GpxFileTrackImporter.java index 2c56a1a11..9275a0871 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/GpxFileTrackImporter.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/GpxFileTrackImporter.java @@ -16,12 +16,12 @@ package com.google.android.apps.mytracks.io.file.importer; -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.Waypoint.WaypointType; -import com.google.common.annotations.VisibleForTesting; - import android.content.Context; import android.location.Location; +import android.support.annotation.VisibleForTesting; + +import com.google.android.apps.mytracks.content.MyTracksProviderUtils; +import com.google.android.apps.mytracks.content.Waypoint.WaypointType; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java index 4e225b680..281c17807 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/io/file/importer/KmlFileTrackImporter.java @@ -21,11 +21,11 @@ import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Sensor; import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; -import com.google.common.annotations.VisibleForTesting; import android.content.Context; import android.location.Location; import android.net.Uri; +import android.support.annotation.VisibleForTesting; import java.util.ArrayList; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncAdapter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncAdapter.java deleted file mode 100644 index f96f15602..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncAdapter.java +++ /dev/null @@ -1,604 +0,0 @@ -/* - * Copyright 2013 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.io.sync; - -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.content.Track; -import com.google.android.apps.mytracks.io.file.exporter.KmzTrackExporter; -import com.google.android.apps.mytracks.io.file.importer.KmlFileTrackImporter; -import com.google.android.apps.mytracks.io.file.importer.KmzTrackImporter; -import com.google.android.apps.mytracks.io.file.importer.TrackImporter; -import com.google.android.apps.mytracks.util.FileUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.gms.auth.GoogleAuthException; -import com.google.android.gms.auth.UserRecoverableAuthException; -import com.google.android.maps.mytracks.R; -import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; -import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; -import com.google.api.client.http.GenericUrl; -import com.google.api.client.http.HttpResponse; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.Drive.Changes; -import com.google.api.services.drive.Drive.Files; -import com.google.api.services.drive.model.About; -import com.google.api.services.drive.model.Change; -import com.google.api.services.drive.model.ChangeList; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; - -import android.accounts.Account; -import android.content.AbstractThreadedSyncAdapter; -import android.content.ContentProviderClient; -import android.content.Context; -import android.content.SyncResult; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -/** - * SyncAdapter to sync tracks with Google Drive. - * - * @author Jimmy Shih - */ -public class SyncAdapter extends AbstractThreadedSyncAdapter { - - private static final String TAG = SyncAdapter.class.getSimpleName(); - - // drive.about.get fields. Contains one field, largestChangeId - private static final String ABOUT_GET_FIELDS = "largestChangeId"; - - private final Context context; - private final MyTracksProviderUtils myTracksProviderUtils; - private Drive drive; - private String driveAccountName; // the account name associated with the drive - private String folderId; - - public SyncAdapter(Context context) { - super(context, true); - this.context = context; - this.myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); - } - - @Override - public void onPerformSync(Account account, Bundle extras, String authority, - ContentProviderClient provider, SyncResult syncResult) { - if (!PreferencesUtils.getBoolean( - context, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT)) { - return; - } - - if (account == null) { - return; - } - } - - /** - * Gets the folder id.. - */ - private String getFolderId() throws IOException { - File folder = SyncUtils.getMyTracksFolder(context, drive); - if (folder == null) { - throw new IOException("folder is null"); - } - String id = folder.getId(); - if (id == null) { - throw new IOException("folder id is null"); - } - return id; - } - - /** - * Performs initial sync. - */ - private void performInitialSync() throws IOException { - - // Get the largest change id first to avoid race conditions - About about = drive.about().get().setFields(ABOUT_GET_FIELDS).execute(); - long largestChangeId = about.getLargestChangeId(); - - // Get all the KML/KMZ files in the "My Drive:/My Tracks" folder - Files.List myTracksFolderRequest = drive.files() - .list().setQ(String.format(Locale.US, SyncUtils.MY_TRACKS_FOLDER_FILES_QUERY, folderId)); - Map myTracksFolderMap = getFiles(myTracksFolderRequest, true); - - // Handle tracks that are already uploaded to Google Drive - Set syncedDriveIds = updateSyncedTracks(); - for (String driveId : syncedDriveIds) { - myTracksFolderMap.remove(driveId); - } - - // Get all the KML/KMZ files in the "Shared with me:/" folder - Files.List sharedWithMeRequest = drive.files() - .list().setQ(SyncUtils.SHARED_WITH_ME_FILES_QUERY); - Map sharedWithMeMap = getFiles(sharedWithMeRequest, false); - - try { - insertNewTracks(myTracksFolderMap.values()); - insertNewTracks(sharedWithMeMap.values()); - PreferencesUtils.setLong(context, R.string.drive_largest_change_id_key, largestChangeId); - } catch (IOException e) { - - // Remove all imported tracks - Cursor cursor = null; - try { - cursor = myTracksProviderUtils.getTrackCursor(SyncUtils.DRIVE_ID_TRACKS_QUERY, null, null); - if (cursor != null && cursor.moveToFirst()) { - do { - Track track = myTracksProviderUtils.createTrack(cursor); - if (!syncedDriveIds.contains(track.getDriveId())) { - myTracksProviderUtils.deleteTrack(context, track.getId()); - } - } while (cursor.moveToNext()); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - throw e; - } - } - - /** - * Updates synced tracks. - * - * @return drive ids of the synced tracks - */ - private Set updateSyncedTracks() throws IOException { - Set result = new HashSet(); - Cursor cursor = null; - try { - cursor = myTracksProviderUtils.getTrackCursor(SyncUtils.DRIVE_ID_TRACKS_QUERY, null, null); - if (cursor != null && cursor.moveToFirst()) { - do { - Track track = myTracksProviderUtils.createTrack(cursor); - String driveId = track.getDriveId(); - if (driveId != null && !driveId.equals("")) { - if (!track.isSharedWithMe()) { - File driveFile = drive.files().get(driveId).execute(); - if (SyncUtils.isInMyTracksAndValid(driveFile, folderId)) { - merge(track, driveFile); - result.add(driveId); - } else { - /* - * Track has a drive id, but the drive id is no longer valid. - * E.g., the file is moved to another folder. Clear the drive - * id. - */ - SyncUtils.updateTrack(myTracksProviderUtils, track, null); - } - } - } - } while (cursor.moveToNext()); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - return result; - } - - /** - * Performs incremental sync. - * - * @param largestChangeId the largest change id - */ - private void performIncrementalSync(long largestChangeId) throws IOException { - - // Handle deleted tracks - String driveDeletedList = PreferencesUtils.getString( - context, R.string.drive_deleted_list_key, PreferencesUtils.DRIVE_DELETED_LIST_DEFAULT); - if (!PreferencesUtils.DRIVE_DELETED_LIST_DEFAULT.equals(driveDeletedList)) { - String deletedIds[] = TextUtils.split(driveDeletedList, ";"); - for (String driveId : deletedIds) { - deleteDriveFile(driveId, true); - } - PreferencesUtils.setString( - context, R.string.drive_deleted_list_key, PreferencesUtils.DRIVE_DELETED_LIST_DEFAULT); - } - - // Handle edited tracks - String driveEditedList = PreferencesUtils.getString( - context, R.string.drive_edited_list_key, PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT); - if (!PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT.equals(driveEditedList)) { - String editedIds[] = TextUtils.split(driveEditedList, ";"); - for (String id : editedIds) { - Track track = myTracksProviderUtils.getTrack(Long.valueOf(id)); - if (track == null) { - continue; - } - if (track.isSharedWithMe()) { - continue; - } - String driveId = track.getDriveId(); - if (driveId == null || driveId.equals("")) { - continue; - } - File driveFile = drive.files().get(driveId).execute(); - if (SyncUtils.isInMyTracksAndValid(driveFile, folderId)) { - merge(track, driveFile); - } - } - PreferencesUtils.setString( - context, R.string.drive_edited_list_key, PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT); - } - - // Handle changes from Google Drive - Map changes = new HashMap(); - long newLargestChangeId = getDriveChangesInfo(largestChangeId, changes); - if (newLargestChangeId != largestChangeId) { - Cursor cursor = null; - try { - // Get all the local tracks with drive file id - cursor = myTracksProviderUtils.getTrackCursor(SyncUtils.DRIVE_ID_TRACKS_QUERY, null, null); - if (cursor != null && cursor.moveToFirst()) { - do { - Track track = myTracksProviderUtils.createTrack(cursor); - String driveId = track.getDriveId(); - - if (changes.containsKey(driveId)) { - - // Track has changed - File driveFile = changes.get(driveId); - if (driveFile == null) { - Log.d(TAG, "Delete local track " + track.getName()); - myTracksProviderUtils.deleteTrack(context, track.getId()); - } else { - if (SyncUtils.isInMyTracksAndValid(driveFile, folderId) - || SyncUtils.isInSharedWithMe(driveFile)) { - merge(track, driveFile); - } else { - SyncUtils.updateTrack(myTracksProviderUtils, track, null); - } - } - changes.remove(driveId); - } - } while (cursor.moveToNext()); - } - - // Insert valid new drive file changes as new tracks - Iterator iterator = changes.keySet().iterator(); - - while (iterator.hasNext()) { - String driveId = iterator.next(); - File file = changes.get(driveId); - if (!SyncUtils.isInMyTracksAndValid(file, folderId) - && !SyncUtils.isInSharedWithMeAndValid(file)) { - iterator.remove(); - } - } - - insertNewTracks(changes.values()); - PreferencesUtils.setLong(context, R.string.drive_largest_change_id_key, newLargestChangeId); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - } - - /** - * Inserts new drive files from tracks without a drive id. - */ - private void insertNewDriveFiles() throws IOException { - Cursor cursor = null; - try { - cursor = myTracksProviderUtils.getTrackCursor(SyncUtils.NO_DRIVE_ID_TRACKS_QUERY, null, null); - long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); - - if (cursor != null && cursor.moveToFirst()) { - do { - Track track = myTracksProviderUtils.createTrack(cursor); - if (track.getId() == recordingTrackId) { - continue; - } - // If not successful, the next sync will retry again - SyncUtils.insertDriveFile( - drive, folderId, context, myTracksProviderUtils, track, true, true); - } while (cursor.moveToNext()); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - - /** - * Inserts new tracks from a collection of drive files. - * - * @param driveFiles the drive files - */ - private void insertNewTracks(Collection driveFiles) throws IOException { - for (File driveFile : driveFiles) { - if (driveFile == null) { - return; - } - updateTrack(-1L, driveFile); - } - } - - /** - * Gets all the files from a request. - * - * @param request the request - * @param excludeSharedWithMe true to exclude shared with me files - * @return a map of file id to file - */ - private Map getFiles(Files.List request, boolean excludeSharedWithMe) - throws IOException { - Map idToFileMap = new HashMap(); - do { - FileList files = request.execute(); - - for (File file : files.getItems()) { - if (excludeSharedWithMe && file.getSharedWithMeDate() != null) { - continue; - } - idToFileMap.put(file.getId(), file); - } - request.setPageToken(files.getNextPageToken()); - } while (request.getPageToken() != null && request.getPageToken().length() > 0); - return idToFileMap; - } - - /** - * Gets the drive changes info in the My Tracks folder, including deleted - * files. - * - * @param changeId the largest change id - * @param changes a map of drive id to file for the changes - * @return an updated largest change id - */ - private long getDriveChangesInfo(long changeId, Map changes) throws IOException { - Changes.List request = drive.changes().list().setStartChangeId(changeId + 1); - do { - ChangeList changeList = request.execute(); - long newId = changeList.getLargestChangeId().longValue(); - - for (Change change : changeList.getItems()) { - if (change.getDeleted()) { - changes.put(change.getFileId(), null); - } else { - File file = change.getFile(); - if (file.getLabels().getTrashed()) { - changes.put(change.getFileId(), null); - } else { - changes.put(change.getFileId(), file); - } - } - } - if (newId > changeId) { - changeId = newId; - } - request.setPageToken(changeList.getNextPageToken()); - } while (request.getPageToken() != null && request.getPageToken().length() > 0); - Log.d(TAG, "Got drive changes: " + changes.size() + " " + changeId); - return changeId; - } - - /** - * Merges a track with a drive file. - * - * @param track the track - * @param driveFile the drive file - */ - private void merge(Track track, File driveFile) throws IOException { - long modifiedTime = track.getModifiedTime(); - long driveModifiedTime = driveFile.getModifiedDate().getValue(); - if (modifiedTime > driveModifiedTime) { - Log.d(TAG, "Updating track change for track " + track.getName() + " and drive file " - + driveFile.getTitle()); - if (!SyncUtils.updateDriveFile( - drive, driveFile, context, myTracksProviderUtils, track, true)) { - Log.e(TAG, "Unable to update drive file"); - track.setModifiedTime(driveModifiedTime); - myTracksProviderUtils.updateTrack(track); - } - } else if (modifiedTime < driveModifiedTime) { - Log.d(TAG, "Updating drive change for track " + track.getName() + " and drive file " - + driveFile.getTitle()); - if (!updateTrack(track.getId(), driveFile)) { - Log.e(TAG, "Unable to update drive change"); - // The track could have been deleted in the unsuccessful update - track = myTracksProviderUtils.getTrack(track.getId()); - if (track != null) { - track.setModifiedTime(driveModifiedTime); - myTracksProviderUtils.updateTrack(track); - } - } - } - } - - /** - * Updates a track based on a drive file. Returns true if successful. - * - * @param trackId the track id. -1L to insert a new track - * @param driveFile the drive file - */ - private boolean updateTrack(final long trackId, File driveFile) throws IOException { - Track track = null; - boolean success = false; - try { - track = importDriveFile(trackId, driveFile); - if (track == null) { - return false; - } - File updatedDriveFile; - String trackName = FileUtils.getName(driveFile.getTitle()); - if (SyncUtils.isInMyTracks(driveFile, folderId) && !track.getName().equals(trackName)) { - track.setName(trackName); - - /* - * The drive file title and the track name inside the drive file do not - * match, update the drive file. - */ - java.io.File file = null; - try { - file = SyncUtils.getTempFile(context, myTracksProviderUtils, track, true); - updatedDriveFile = SyncUtils.updateDriveFile( - drive, driveFile, trackName + "." + KmzTrackExporter.KMZ_EXTENSION, file, true); - - if (updatedDriveFile == null) { - Log.e(TAG, "Unable to update drive file"); - return false; - } - } finally { - if (file != null) { - file.delete(); - } - } - } else { - updatedDriveFile = driveFile; - } - - SyncUtils.updateTrack(myTracksProviderUtils, track, updatedDriveFile); - success = true; - return true; - } finally { - if (!success) { - // if the track is new, delete it - if (trackId == -1L && track != null) { - myTracksProviderUtils.deleteTrack(context, track.getId()); - } - } - } - } - - /** - * Imports drive file to track. - * - * @param trackId the track id. -1L to insert a new track - * @param driveFile the drive file - */ - private Track importDriveFile(long trackId, File driveFile) throws IOException { - InputStream inputStream = null; - try { - inputStream = downloadDriveFile(driveFile, true); - if (inputStream == null) { - Log.e(TAG, "Unable to import drive file. Input stream is null."); - return null; - } - - TrackImporter trackImporter; - boolean useKmz = KmzTrackExporter.KMZ_EXTENSION.equals(driveFile.getFileExtension()); - if (useKmz) { - if (trackId == -1L) { - Uri uri = myTracksProviderUtils.insertTrack(new Track()); - trackId = Long.parseLong(uri.getLastPathSegment()); - } - trackImporter = new KmzTrackImporter(context, trackId); - } else { - trackImporter = new KmlFileTrackImporter(context, trackId); - } - - long importedId = trackImporter.importFile(inputStream); - if (importedId == -1L) { - Log.e(TAG, "Unable to import drive file. Imported id is -1L."); - return null; - } - Track track = myTracksProviderUtils.getTrack(importedId); - if (track == null) { - Log.e(TAG, "Unable to import drive file. Imported track is null."); - return null; - } else { - return track; - } - } catch (IOException e) { - Log.e(TAG, "Unable to import drive file.", e); - return null; - } finally { - if (inputStream != null) { - inputStream.close(); - } - } - } - - /** - * Deletes a drive file. - * - * @param driveId the drive id - * @param canRetry true if can retry the request - * @throws IOException - */ - private void deleteDriveFile(String driveId, boolean canRetry) throws IOException { - try { - File driveFile = drive.files().get(driveId).execute(); - if (SyncUtils.isInMyTracks(driveFile, folderId)) { - if (!driveFile.getLabels().getTrashed()) { - drive.files().trash(driveId).execute(); - } - // if trashed, ignore - } else if (SyncUtils.isInSharedWithMe(driveFile)) { - if (!driveFile.getLabels().getTrashed()) { - drive.files().delete(driveId).execute(); - } - // if trashed, ignore - } - } catch (UserRecoverableAuthIOException e) { - throw e; - } catch (IOException e) { - if (canRetry) { - deleteDriveFile(driveId, false); - return; - } - Log.e(TAG, "Unable to delete Drive file for " + driveId, e); - } - } - - /** - * Downloads a drive file. - * - * @param driveFile the drive file - */ - private InputStream downloadDriveFile(File driveFile, boolean canRetry) throws IOException { - if (driveFile.getDownloadUrl() == null || driveFile.getDownloadUrl().length() == 0) { - Log.d(TAG, "Drive file download url doesn't exist: " + driveFile.getTitle()); - return null; - } - try { - HttpResponse httpResponse = drive.getRequestFactory() - .buildGetRequest(new GenericUrl(driveFile.getDownloadUrl())).execute(); - if (httpResponse == null) { - Log.e(TAG, "http response is null"); - return null; - } - return httpResponse.getContent(); - } catch (UserRecoverableAuthIOException e) { - throw e; - } catch (IOException e) { - if (canRetry) { - return downloadDriveFile(driveFile, false); - } - throw e; - } - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncService.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncService.java deleted file mode 100644 index 74d1e64c0..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2013 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.io.sync; - -import android.app.Service; -import android.content.Intent; -import android.os.IBinder; - -/** - * Service to sync with Google Drive. - * - * @author Jimmy Shih - */ -public class SyncService extends Service { - - private static final Object lock = new Object(); - - private static SyncAdapter syncAdapter = null; - - @Override - public void onCreate() { - synchronized (lock) { - if (syncAdapter == null) { - syncAdapter = new SyncAdapter(getApplicationContext()); - } - } - } - - @Override - public IBinder onBind(Intent intent) { - return syncAdapter.getSyncAdapterBinder(); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncUtils.java deleted file mode 100644 index c5da30f3a..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/io/sync/SyncUtils.java +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright 2013 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.io.sync; - -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.io.file.TrackFileFormat; -import com.google.android.apps.mytracks.io.file.exporter.FileTrackExporter; -import com.google.android.apps.mytracks.io.file.exporter.KmzTrackExporter; -import com.google.android.apps.mytracks.io.file.exporter.TrackExporter; -import com.google.android.apps.mytracks.util.FileUtils; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; -import com.google.api.client.extensions.android.http.AndroidHttp; -import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; -import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; -import com.google.api.client.http.FileContent; -import com.google.api.client.json.gson.GsonFactory; -import com.google.api.services.drive.Drive; -import com.google.api.services.drive.Drive.Files.List; -import com.google.api.services.drive.model.File; -import com.google.api.services.drive.model.FileList; -import com.google.api.services.drive.model.ParentReference; -import com.google.common.annotations.VisibleForTesting; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.os.Bundle; -import android.util.Log; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Locale; - -/** - * Utilities for Google Drive sync. - * - * @author Jimmy Shih - */ -public class SyncUtils { - - // Get tracks with drive id - public static final String DRIVE_ID_TRACKS_QUERY = TracksColumns.DRIVEID + " IS NOT NULL AND " - + TracksColumns.DRIVEID + "!=''"; - - // Get tracks without drive id - public static final String NO_DRIVE_ID_TRACKS_QUERY = TracksColumns.DRIVEID + " IS NULL OR " - + TracksColumns.DRIVEID + "=''"; - - // KML mime type - public static final String KML_MIME_TYPE = "application/vnd.google-earth.kml+xml"; - - // KMZ mime type - public static final String KMZ_MIME_TYPE = "application/vnd.google-earth.kmz"; - - // KML and KMZ mime types - private static final String KML_KMZ_MINE_TYPES = "not (mimeType != '" + KML_MIME_TYPE - + "' and mimeType != '" + KMZ_MIME_TYPE + "')"; - - // Get KML/KMZ files in the My Tracks folder - public static final String MY_TRACKS_FOLDER_FILES_QUERY = "'%s' in parents and " - + KML_KMZ_MINE_TYPES + " and trashed = false"; - - // Get shared with me KML/KMZ files - public static final String SHARED_WITH_ME_FILES_QUERY = "sharedWithMe and " + KML_KMZ_MINE_TYPES - + " and trashed = false"; - - // Folder mime type - private static final String FOLDER_MIME_TYPE = "application/vnd.google-apps.folder"; - - // Get My Tracks folder - @VisibleForTesting - public static final String MY_TRACKS_FOLDER_QUERY = - "'root' in parents and title = '%s' and mimeType = '" + FOLDER_MIME_TYPE - + "' and trashed = false"; - - private static final String TAG = SyncUtils.class.getSimpleName(); - private static final String SYNC_AUTHORITY = "com.google.android.maps.mytracks"; - - private SyncUtils() {} - - /** - * Syncs now for the current account. - * - * @param context the context - */ - public static void syncNow(Context context) { - Account[] accounts = AccountManager.get(context).getAccountsByType(Constants.ACCOUNT_TYPE); - String googleAccount = PreferencesUtils.getString( - context, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - for (Account account : accounts) { - if (account.name.equals(googleAccount)) { - ContentResolver.cancelSync(account, SYNC_AUTHORITY); - ContentResolver.requestSync(account, SYNC_AUTHORITY, new Bundle()); - break; - } - } - } - - /** - * Disables sync. - * - * @param context the context - */ - public static void disableSync(Context context) { - // Set preference - PreferencesUtils.setBoolean( - context, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); - - // Disable sync for all accounts - disableSyncForAll(context); - - // Clear sync state - clearSyncState(context); - } - - /** - * Disables sync for all accounts. - * - * @param context the context - */ - private static void disableSyncForAll(Context context) { - Account[] accounts = AccountManager.get(context).getAccountsByType(Constants.ACCOUNT_TYPE); - for (Account account : accounts) { - ContentResolver.cancelSync(account, SYNC_AUTHORITY); - ContentResolver.setIsSyncable(account, SYNC_AUTHORITY, 0); - ContentResolver.setSyncAutomatically(account, SYNC_AUTHORITY, false); - } - } - - /** - * Returns true if sync is active. - * - * @param context the context - */ - public static boolean isSyncActive(Context context) { - Account[] accounts = AccountManager.get(context).getAccountsByType(Constants.ACCOUNT_TYPE); - for (Account account : accounts) { - if (ContentResolver.isSyncActive(account, SYNC_AUTHORITY)) { - return true; - } - } - return false; - } - - /** - * Enables sync. - * - * @param context the context - */ - public static void enableSync(Context context) { - // Set preference - PreferencesUtils.setBoolean(context, R.string.drive_sync_key, true); - - // Disable sync for all accounts - disableSyncForAll(context); - - // Turn on sync - ContentResolver.setMasterSyncAutomatically(true); - - // Enable sync for account - String googleAccount = PreferencesUtils.getString( - context, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - enableSyncForAccount(new Account(googleAccount, Constants.ACCOUNT_TYPE)); - - } - - /** - * Enables sync for an account. - * - * @param account the account - */ - private static void enableSyncForAccount(Account account) { - ContentResolver.setIsSyncable(account, SYNC_AUTHORITY, 1); - ContentResolver.setSyncAutomatically(account, SYNC_AUTHORITY, true); - ContentResolver.requestSync(account, SYNC_AUTHORITY, new Bundle()); - } - - /** - * Clears the sync state. Assumes sync is turned off. Do not want clearing the - * sync state to cause sync activities. - */ - private static void clearSyncState(Context context) { - MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); - Cursor cursor = null; - try { - cursor = myTracksProviderUtils.getTrackCursor(SyncUtils.DRIVE_ID_TRACKS_QUERY, null, null); - if (cursor != null && cursor.moveToFirst()) { - do { - Track track = myTracksProviderUtils.createTrack(cursor); - if (track.isSharedWithMe()) { - myTracksProviderUtils.deleteTrack(context, track.getId()); - } else { - SyncUtils.updateTrack(myTracksProviderUtils, track, null); - } - } while (cursor.moveToNext()); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - PreferencesUtils.setLong(context, R.string.drive_largest_change_id_key, - PreferencesUtils.DRIVE_LARGEST_CHANGE_ID_DEFAULT); - - PreferencesUtils.setString( - context, R.string.drive_edited_list_key, PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT); - - // Clear the drive_deleted_list_key last - PreferencesUtils.setString( - context, R.string.drive_deleted_list_key, PreferencesUtils.DRIVE_DELETED_LIST_DEFAULT); - } - - /** - * Gets the drive service. - * - * @param credential the credential - */ - public static Drive getDriveService(GoogleAccountCredential credential) { - return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential) - .build(); - } - - /** - * Gets the My Tracks folder. Creates one if necessary. - * - * @param context the context - * @param drive the drive - */ - public static File getMyTracksFolder(Context context, Drive drive) throws IOException { - String folderName = context.getString(R.string.my_tracks_app_name); - List list = drive.files() - .list().setQ(String.format(Locale.US, MY_TRACKS_FOLDER_QUERY, folderName)); - FileList result = list.execute(); - for (File file : result.getItems()) { - if (file.getSharedWithMeDate() == null) { - return file; - } - } - File file = new File(); - file.setTitle(folderName); - file.setMimeType(FOLDER_MIME_TYPE); - return drive.files().insert(file).execute(); - } - - /** - * Returns true if a drive file is a KML or KMZ file in the My Tracks folder. - * - * @param driveFile the drive file - * @param folderId the My Tracks folder id - */ - public static boolean isInMyTracks(File driveFile, String folderId) { - if (driveFile == null) { - return false; - } - String mimeType = driveFile.getMimeType(); - if (!SyncUtils.KML_MIME_TYPE.equals(mimeType) && !SyncUtils.KMZ_MIME_TYPE.equals(mimeType)) { - return false; - } - if (driveFile.getSharedWithMeDate() != null) { - return false; - } - for (ParentReference parentReference : driveFile.getParents()) { - String id = parentReference.getId(); - if (id != null && id.equals(folderId)) { - return true; - } - } - return false; - } - - /** - * Returns true if a drive file is a KML or KMZ file in the My Tracks folder - * and not trashed. - * - * @param driveFile the drive file - * @param folderId the My Tracks folder id - */ - public static boolean isInMyTracksAndValid(File driveFile, String folderId) { - return isInMyTracks(driveFile, folderId) && !driveFile.getLabels().getTrashed(); - } - - /** - * Returns true if a drive file is a KML or KMZ file in the Shared with me - * directory. - * - * @param driveFile the drive file - */ - public static boolean isInSharedWithMe(File driveFile) { - if (driveFile == null) { - return false; - } - String mimeType = driveFile.getMimeType(); - if (!SyncUtils.KML_MIME_TYPE.equals(mimeType) && !SyncUtils.KMZ_MIME_TYPE.equals(mimeType)) { - return false; - } - return driveFile.getSharedWithMeDate() != null; - } - - /** - * Returns true if a drive file is a KML or KMZ file in the Shared with me - * directory and is not trashed. - * - * @param driveFile the drive file - */ - public static boolean isInSharedWithMeAndValid(File driveFile) { - return isInSharedWithMe(driveFile) && !driveFile.getLabels().getTrashed(); - } - - /** - * Inserts a drive file using info from a track. - * - * @param drive the drive - * @param folderId the folder id - * @param context the context - * @param myTracksProviderUtils the myTracksProviderUtils - * @param track the track - * @param canRetry true if can retry - * @param updateTrack true to update track - * @return the added drive file or null. - */ - public static File insertDriveFile(Drive drive, String folderId, Context context, - MyTracksProviderUtils myTracksProviderUtils, Track track, boolean canRetry, boolean updateTrack) - throws IOException { - java.io.File file = null; - try { - file = getTempFile(context, myTracksProviderUtils, track, true); - - if (file == null) { - Log.e(TAG, "Unable to add Drive file. File is null for track " + track.getName()); - return null; - } - - Log.d(TAG, "Add Drive file for track " + track.getName()); - File uploadedFile = insertDriveFile(drive, folderId, track.getName(), file, canRetry); - if (uploadedFile == null) { - Log.e(TAG, "Unable to add Drive file. Uploaded file is null for track " + track.getName()); - return null; - } - if (updateTrack) { - SyncUtils.updateTrack(myTracksProviderUtils, track, uploadedFile); - } - return uploadedFile; - } finally { - if (file != null) { - file.delete(); - } - } - } - - /** - * Inserts a drive file using info from a track file. - * - * @param drive the drive - * @param folderId the folder id - * @param trackName the track name - * @param file the track file - * @param canRetry true if can retry - */ - private static File insertDriveFile( - Drive drive, String folderId, String trackName, java.io.File file, boolean canRetry) - throws IOException { - try { - // file's parent - ParentReference parentReference = new ParentReference(); - parentReference.setId(folderId); - ArrayList parents = new ArrayList(); - parents.add(parentReference); - - // file's metadata - File newMetaData = new File(); - newMetaData.setTitle(trackName + "." + KmzTrackExporter.KMZ_EXTENSION); - newMetaData.setMimeType(KMZ_MIME_TYPE); - newMetaData.setParents(parents); - - FileContent fileContent = new FileContent(KMZ_MIME_TYPE, file); - return drive.files().insert(newMetaData, fileContent).execute(); - } catch (UserRecoverableAuthIOException e) { - throw e; - } catch (IOException e) { - if (canRetry) { - return insertDriveFile(drive, folderId, trackName, file, false); - } - throw e; - } - } - - /** - * Updates a drive file using info from a track. Returns true if successful. - * - * @param drive the drive - * @param driveFile the drive file - * @param context the context - * @param myTracksProviderUtils the myTracksProviderUtils - * @param track the track - * @param canRetry true if can retry - */ - public static boolean updateDriveFile(Drive drive, File driveFile, Context context, - MyTracksProviderUtils myTracksProviderUtils, Track track, boolean canRetry) - throws IOException { - Log.d(TAG, "Update drive file for track " + track.getName()); - java.io.File file = null; - - try { - file = SyncUtils.getTempFile(context, myTracksProviderUtils, track, true); - if (file == null) { - Log.e(TAG, "Unable to update drive file. File is null for track " + track.getName()); - return false; - } - - String title = track.getName() + "." + KmzTrackExporter.KMZ_EXTENSION; - File updatedFile = updateDriveFile(drive, driveFile, title, file, canRetry); - - if (updatedFile == null) { - Log.e( - TAG, "Unable to update drive file. Updated file is null for track " + track.getName()); - return false; - } - long modifiedTime = updatedFile.getModifiedDate().getValue(); - if (track.getModifiedTime() != modifiedTime) { - track.setModifiedTime(modifiedTime); - myTracksProviderUtils.updateTrack(track); - } - return true; - } finally { - if (file != null) { - file.delete(); - } - } - } - - /** - * Updates a drive file using a track file. - * - * @param drive the drive - * @param driveFile the drive file - * @param driveTitle the drive title - * @param file the track file. If null, just update the driveFile meta data - * @param canRetry true if can retry - */ - public static File updateDriveFile( - Drive drive, File driveFile, String driveTitle, java.io.File file, boolean canRetry) - throws IOException { - try { - driveFile.setTitle(driveTitle); - driveFile.setMimeType(KMZ_MIME_TYPE); - - if (file != null) { - FileContent fileContent = new FileContent(KMZ_MIME_TYPE, file); - return drive.files().update(driveFile.getId(), driveFile, fileContent).execute(); - } else { - return drive.files().update(driveFile.getId(), driveFile).execute(); - } - } catch (UserRecoverableAuthIOException e) { - throw e; - } catch (IOException e) { - if (canRetry) { - return updateDriveFile(drive, driveFile, driveTitle, file, false); - } - throw e; - } - } - - /** - * Gets a temporary file for a track. - * - * @param context the context - * @param myTracksProviderUtils the myMyTracksProviderUtils - * @param track the track - * @param useKmz true to output kmz - */ - public static java.io.File getTempFile( - Context context, MyTracksProviderUtils myTracksProviderUtils, Track track, boolean useKmz) - throws FileNotFoundException { - java.io.File directory = new java.io.File(context.getCacheDir(), FileUtils.TEMP_FILES_DIR); - - if (!FileUtils.ensureDirectoryExists(directory)) { - Log.d(TAG, "Unable to create " + directory.getAbsolutePath()); - return null; - } - - for (java.io.File file : directory.listFiles()) { - file.delete(); - } - - Track[] tracks = new Track[] { track }; - String extension = useKmz ? KmzTrackExporter.KMZ_EXTENSION : TrackFileFormat.KML.getExtension(); - java.io.File file = new java.io.File( - directory, FileUtils.buildUniqueFileName(directory, track.getName(), extension)); - FileTrackExporter fileTrackExporter = new FileTrackExporter(myTracksProviderUtils, tracks, - TrackFileFormat.KML.newTrackWriter(context, false, false), null); - TrackExporter trackExporter = useKmz ? new KmzTrackExporter( - myTracksProviderUtils, fileTrackExporter, tracks, context) - : fileTrackExporter; - - FileOutputStream fileOutputStream = null; - try { - fileOutputStream = new FileOutputStream(file); - if (trackExporter.writeTrack(fileOutputStream)) { - return file; - } else { - if (!file.delete()) { - Log.d(TAG, "Unable to delete file for track " + track.getName()); - } - Log.d(TAG, "Unable to get file for track " + track.getName()); - return null; - } - } finally { - if (fileOutputStream != null) { - try { - fileOutputStream.close(); - } catch (IOException e) { - Log.e(TAG, "Unable to close file output stream", e); - } - } - } - } - - /** - * Updates a track with info from a drive file. - * - * @param myTracksProviderUtils the myTracksProviderUtils - * @param track the track - * @param driveFile the drive file - */ - public static void updateTrack( - MyTracksProviderUtils myTracksProviderUtils, Track track, File driveFile) { - track.setDriveId(driveFile != null ? driveFile.getId() : ""); - track.setModifiedTime(driveFile != null ? driveFile.getModifiedDate().getValue() : -1L); - track.setSharedWithMe(driveFile != null ? driveFile.getSharedWithMeDate() != null : false); - track.setSharedOwner(driveFile != null && driveFile.getSharedWithMeDate() != null - && driveFile.getOwnerNames().size() > 0 ? driveFile.getOwnerNames().get(0) - : ""); - myTracksProviderUtils.updateTrack(track); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/maps/DynamicSpeedTrackPathDescriptor.java b/myTracks/src/main/java/com/google/android/apps/mytracks/maps/DynamicSpeedTrackPathDescriptor.java index abc8e2300..f82f4ef01 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/maps/DynamicSpeedTrackPathDescriptor.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/maps/DynamicSpeedTrackPathDescriptor.java @@ -16,16 +16,16 @@ package com.google.android.apps.mytracks.maps; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.support.annotation.VisibleForTesting; + import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; /** * A dynamic speed path descriptor. diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/maps/MultiColorTrackPath.java b/myTracks/src/main/java/com/google/android/apps/mytracks/maps/MultiColorTrackPath.java index 9367932c2..b79e82a6d 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/maps/MultiColorTrackPath.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/maps/MultiColorTrackPath.java @@ -15,15 +15,15 @@ */ package com.google.android.apps.mytracks.maps; +import android.content.Context; +import android.support.annotation.VisibleForTesting; + import com.google.android.apps.mytracks.MapOverlay.CachedLocation; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Polyline; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.content.Context; import java.util.ArrayList; import java.util.List; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/ControlRecordingService.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/ControlRecordingService.java index 3108caf7b..1143ce298 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/ControlRecordingService.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/ControlRecordingService.java @@ -16,18 +16,18 @@ package com.google.android.apps.mytracks.services; -import com.google.android.apps.mytracks.widgets.TrackWidgetProvider; -import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - import android.app.IntentService; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; +import android.support.annotation.VisibleForTesting; import android.util.Log; +import com.google.android.apps.mytracks.widgets.TrackWidgetProvider; +import com.google.android.maps.mytracks.R; + /** * A service to control starting and stopping of a recording. This service, * through the AndroidManifest.xml, is configured to only allow components of diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java index 23554f851..e54cefc3e 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -27,12 +27,11 @@ import android.location.Location; import android.location.LocationManager; import android.net.Uri; import android.os.Binder; -import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager.WakeLock; import android.os.Process; -import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import android.util.Log; @@ -67,15 +66,10 @@ import com.google.android.apps.mytracks.util.SystemUtils; import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackNameUtils; import com.google.android.apps.mytracks.util.UnitConversions; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; -import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; -import com.google.android.gms.location.ActivityRecognitionClient; import com.google.android.gms.location.DetectedActivity; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationResult; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java index 48e648949..30a20ccf2 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java @@ -16,22 +16,22 @@ package com.google.android.apps.mytracks.services.tasks; +import android.content.Context; +import android.media.AudioManager; +import android.speech.tts.TextToSpeech; +import android.speech.tts.TextToSpeech.OnInitListener; +import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; +import android.support.annotation.VisibleForTesting; +import android.telephony.PhoneStateListener; +import android.telephony.TelephonyManager; +import android.util.Log; + import com.google.android.apps.mytracks.services.TrackRecordingService; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.content.Context; -import android.media.AudioManager; -import android.speech.tts.TextToSpeech; -import android.speech.tts.TextToSpeech.OnInitListener; -import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; -import android.telephony.PhoneStateListener; -import android.telephony.TelephonyManager; -import android.util.Log; import java.util.HashMap; import java.util.Locale; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/CheckPermissionAsyncTask.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/CheckPermissionAsyncTask.java deleted file mode 100644 index 604616a8a..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/tasks/CheckPermissionAsyncTask.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2013 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.services.tasks; - -import com.google.android.gms.auth.GoogleAuthException; -import com.google.android.gms.auth.UserRecoverableAuthException; -import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; - -import android.app.Activity; -import android.content.Intent; -import android.os.AsyncTask; -import android.util.Log; - -import java.io.IOException; - -/** - * An async task to check permission. - * - * @author Jimmy Shih - */ -public class CheckPermissionAsyncTask extends AsyncTask { - - public interface CheckPermissionCaller { - public void onCheckPermissionDone(String scope, boolean success, Intent userRecoverableIntent); - } - - private static final String TAG = CheckPermissionAsyncTask.class.getSimpleName(); - - private Activity activity; - private final String accountName; - private final String scope; - - /** - * True if the AsyncTask result is success. - */ - private boolean success; - - /** - * User recoverable intent if failed. - */ - private Intent userRecoverableIntent; - - /** - * True if the AsyncTask has completed. - */ - private boolean completed; - - /** - * True if can retry the AsyncTask. - */ - private boolean canRetry; - - public CheckPermissionAsyncTask(Activity activity, String accountName, String scope) { - this.activity = activity; - this.accountName = accountName; - this.scope = scope; - success = false; - userRecoverableIntent = null; - completed = false; - canRetry = true; - } - - public void setActivity(Activity activity) { - this.activity = activity; - if (completed && activity != null) { - ((CheckPermissionCaller) activity).onCheckPermissionDone( - scope, success, userRecoverableIntent); - } - } - - @Override - protected Boolean doInBackground(Void... params) { - return null; - } - - @Override - protected void onPostExecute(Boolean result) { - success = result; - completed = true; - if (activity != null) { - ((CheckPermissionCaller) activity).onCheckPermissionDone( - scope, success, userRecoverableIntent); - } - } -} \ No newline at end of file diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java index a61bc4ee8..5debceaab 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java @@ -17,7 +17,6 @@ package com.google.android.apps.mytracks.settings; import com.google.android.apps.mytracks.Constants; -import com.google.android.apps.mytracks.io.sync.SyncUtils; import com.google.android.apps.mytracks.util.DialogUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; @@ -198,8 +197,6 @@ public class AdvancedSettingsActivity extends AbstractSettingsActivity { // Actually wipe preferences and save synchronously sharedPreferences.edit().clear().commit(); - SyncUtils.disableSync(AdvancedSettingsActivity.this); - // Give UI feedback in the UI thread runOnUiThread(new Runnable() { @Override diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SettingsActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SettingsActivity.java index 56f7b1a71..7d6c7319b 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SettingsActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SettingsActivity.java @@ -16,88 +16,33 @@ package com.google.android.apps.mytracks.settings; -import com.google.android.apps.mytracks.Constants; -import com.google.android.apps.mytracks.io.sync.SyncUtils; -import com.google.android.apps.mytracks.services.tasks.CheckPermissionAsyncTask; -import com.google.android.apps.mytracks.services.tasks.CheckPermissionAsyncTask.CheckPermissionCaller; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; + import com.google.android.apps.mytracks.util.DialogUtils; import com.google.android.apps.mytracks.util.IntentUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.Preference.OnPreferenceClickListener; -import android.widget.Toast; - /** * An activity for accessing settings. * * @author Jimmy Shih */ -public class SettingsActivity extends AbstractSettingsActivity implements CheckPermissionCaller { - - private static final int DIALOG_NO_ACCOUNT = 0; - private static final int DIALOG_CHOOSE_ACCOUNT = 1; - private static final int DIALOG_CONFIRM_DRIVE_SYNC_ON = 2; - - private static final int DRIVE_REQUEST_CODE = 0; - - private CheckBoxPreference syncDrivePreference; - private CheckPermissionAsyncTask syncDriveAsyncTask; +public class SettingsActivity extends AbstractSettingsActivity { @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - Object retained = getLastNonConfigurationInstance(); - if (retained instanceof CheckPermissionAsyncTask) { - syncDriveAsyncTask = (CheckPermissionAsyncTask) retained; - syncDriveAsyncTask.setActivity(this); - } - addPreferencesFromResource(R.xml.settings); - syncDrivePreference = (CheckBoxPreference) findPreference(getString(R.string.drive_sync_key)); - syncDrivePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if ((Boolean) newValue) { - Account[] accounts = AccountManager.get(SettingsActivity.this) - .getAccountsByType(Constants.ACCOUNT_TYPE); - if (accounts.length == 0) { - PreferencesUtils.setString(SettingsActivity.this, R.string.google_account_key, - PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - handleSync(false); - showDialog(DIALOG_NO_ACCOUNT); - } else if (accounts.length == 1) { - PreferencesUtils.setString( - SettingsActivity.this, R.string.google_account_key, accounts[0].name); - showDialog(DIALOG_CONFIRM_DRIVE_SYNC_ON); - } else { - showDialog(DIALOG_CHOOSE_ACCOUNT); - } - } else { - PreferencesUtils.setString(SettingsActivity.this, R.string.google_account_key, - PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - handleSync(false); - } - return false; - } - }); - updateSyncDriveSummary(); - configPreference(R.string.settings_map_key, MapSettingsActivity.class); configPreference(R.string.settings_chart_key, ChartSettingsActivity.class); configPreference(R.string.settings_stats_key, StatsSettingsActivity.class); @@ -106,100 +51,6 @@ public class SettingsActivity extends AbstractSettingsActivity implements CheckP configPreference(R.string.settings_advanced_key, AdvancedSettingsActivity.class); } - @Deprecated - public Object onRetainNonConfigurationInstance() { - if (syncDriveAsyncTask != null) { - syncDriveAsyncTask.setActivity(null); - } - return syncDriveAsyncTask; - } - - @Override - protected Dialog onCreateDialog(int id, Bundle bundle) { - final Dialog dialog; - switch (id) { - case DIALOG_NO_ACCOUNT: - dialog = new AlertDialog.Builder(this).setMessage(R.string.send_google_no_account_message) - .setTitle(R.string.send_google_no_account_title) - .setPositiveButton(R.string.generic_ok, null).create(); - dialog.setOnShowListener(new DialogInterface.OnShowListener() { - - @Override - public void onShow(DialogInterface dialogInterface) { - DialogUtils.setDialogTitleDivider(SettingsActivity.this, dialog); - } - }); - break; - default: - dialog = null; - } - return dialog; - } - - @SuppressWarnings("deprecation") - @Override - protected void onPrepareDialog(int id, Dialog dialog, Bundle bundle) { - if (id == DIALOG_CONFIRM_DRIVE_SYNC_ON) { - AlertDialog alertDialog = (AlertDialog) dialog; - String googleAccount = PreferencesUtils.getString( - this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - alertDialog.setMessage(getString(R.string.sync_drive_confirm_message, googleAccount, - getString(R.string.my_tracks_app_name))); - } - super.onPrepareDialog(id, dialog, bundle); - } - - @Override - public void onCheckPermissionDone(String scope, boolean success, Intent userRecoverableIntent) { - syncDriveAsyncTask = null; - if (success) { - onDrivePermissionSuccess(); - } else { - if (userRecoverableIntent != null) { - startActivityForResult(userRecoverableIntent, DRIVE_REQUEST_CODE); - } else { - onDrivePermissionFailure(); - } - } - } - - private void onDrivePermissionSuccess() { - handleSync(true); - } - - private void onDrivePermissionFailure() { - Toast.makeText( - SettingsActivity.this, R.string.send_google_no_account_permission, Toast.LENGTH_LONG) - .show(); - } - - /** - * Handles sync. - * - * @param value true to sync - */ - private void handleSync(boolean value) { - syncDrivePreference.setChecked(value); - updateSyncDriveSummary(); - - if (value) { - SyncUtils.enableSync(this); - } else { - SyncUtils.disableSync(this); - } - } - - /** - * Updates UI by account. - */ - private void updateSyncDriveSummary() { - String googleAccount = PreferencesUtils.getString( - this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - boolean hasAccount = !PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT.equals(googleAccount); - syncDrivePreference.setSummaryOn( - hasAccount ? getString(R.string.settings_google_drive_sync_summary_on, googleAccount) : ""); - } - /** * Configures a preference by starting a new activity when it is clicked. * diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/stats/TripStatisticsUpdater.java b/myTracks/src/main/java/com/google/android/apps/mytracks/stats/TripStatisticsUpdater.java index 2ac24d5ed..33af428c7 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/stats/TripStatisticsUpdater.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/stats/TripStatisticsUpdater.java @@ -16,16 +16,16 @@ package com.google.android.apps.mytracks.stats; -import static com.google.android.apps.mytracks.services.TrackRecordingService.MAX_NO_MOVEMENT_SPEED; -import static com.google.android.apps.mytracks.services.TrackRecordingService.PAUSE_LATITUDE; +import android.location.Location; +import android.support.annotation.VisibleForTesting; +import android.util.Log; import com.google.android.apps.mytracks.util.CalorieUtils; import com.google.android.apps.mytracks.util.CalorieUtils.ActivityType; import com.google.android.apps.mytracks.util.LocationUtils; -import com.google.common.annotations.VisibleForTesting; -import android.location.Location; -import android.util.Log; +import static com.google.android.apps.mytracks.services.TrackRecordingService.MAX_NO_MOVEMENT_SPEED; +import static com.google.android.apps.mytracks.services.TrackRecordingService.PAUSE_LATITUDE; /** * Updater for {@link TripStatistics}. For updating track trip statistics as new diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/AccountUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/AccountUtils.java deleted file mode 100644 index 8fdc82d0c..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/AccountUtils.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2013 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.util; - -import com.google.android.maps.mytracks.R; - -import android.accounts.Account; -import android.content.Context; -import android.support.v4.app.FragmentActivity; -import android.widget.ArrayAdapter; -import android.widget.Spinner; - -/** - * Utilities for account. - * - * @author Jimmy Shih - */ -public class AccountUtils { - - private AccountUtils() {} - - /** - * Sets up account spinner. - * - * @param fragmentActivity tyhe fragment activity - * @param spinner the spinner - * @param accounts the accounts - */ - public static void setupAccountSpinner( - FragmentActivity fragmentActivity, Spinner spinner, Account[] accounts) { - if (accounts.length > 1) { - String shareTrackAccount = PreferencesUtils.getString(fragmentActivity, - R.string.share_track_account_key, PreferencesUtils.SHARE_TRACK_ACCOUNT_DEFAULT); - ArrayAdapter adapter = new ArrayAdapter( - fragmentActivity, R.layout.account_spinner_item); - int selection = 0; - for (int i = 0; i < accounts.length; i++) { - String name = accounts[i].name; - adapter.add(name); - if (name.equals(shareTrackAccount)) { - selection = i; - } - } - adapter.setDropDownViewResource(R.layout.account_spinner_dropdown_item); - spinner.setAdapter(adapter); - spinner.setSelection(selection); - } - } - - /** - * Updates the share track account preference. - * - * @param context the context - * @param account the account - */ - public static void updateShareTrackAccountPreference(Context context, Account account) { - if (account != null) { - PreferencesUtils.setString(context, R.string.share_track_account_key, account.name); - } - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/ChartURLGenerator.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/ChartURLGenerator.java index 1b1ab121b..295194318 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/ChartURLGenerator.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/util/ChartURLGenerator.java @@ -16,12 +16,12 @@ package com.google.android.apps.mytracks.util; +import android.content.Context; +import android.support.annotation.VisibleForTesting; + import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - -import android.content.Context; import java.util.Vector; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/EulaUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/EulaUtils.java deleted file mode 100644 index ec03559d0..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/EulaUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2008 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.util; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; - -/** - * Utilities for EULA. - * - * @author Jimmy Shih - */ -public class EulaUtils { - - private static final String EULA_PREFERENCE_FILE = "eula"; - - // Accepting Google mobile terms of service - private static final String ACCEPTED_EULA_PREFERENCE_KEY = "eula.google_mobile_tos_accepted"; - private static final String SHOW_ENABLE_SYNC_PREFERENCE_KEY = "showEnableSync"; - - private EulaUtils() {} - - /** - * Returns true if has accepted eula. - * - * @param context the context - */ - public static boolean hasAcceptedEula(Context context) { - return getValue(context, ACCEPTED_EULA_PREFERENCE_KEY, false); - } - - /** - * Sets to true accepted eula. - * - * @param context the context - */ - public static void setAcceptedEula(Context context) { - setValue(context, ACCEPTED_EULA_PREFERENCE_KEY, true); - } - - /** - * Returns true if should show enable sync. - * - * @param context the context - */ - public static boolean showEnableSync(Context context) { - return getValue(context, SHOW_ENABLE_SYNC_PREFERENCE_KEY, true); - } - - /** - * Sets to false show enable sync. - * - * @param context the context - */ - public static void setShowEnableSync(Context context) { - setValue(context, SHOW_ENABLE_SYNC_PREFERENCE_KEY, false); - } - - private static boolean getValue(Context context, String key, boolean defaultValue) { - SharedPreferences sharedPreferences = context.getSharedPreferences( - EULA_PREFERENCE_FILE, Context.MODE_PRIVATE); - return sharedPreferences.getBoolean(key, defaultValue); - } - - @SuppressLint("CommitPrefEdits") - private static void setValue(Context context, String key, boolean value) { - SharedPreferences sharedPreferences = context.getSharedPreferences( - EULA_PREFERENCE_FILE, Context.MODE_PRIVATE); - Editor editor = sharedPreferences.edit(); - editor.putBoolean(key, value); - ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleEarthUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleEarthUtils.java deleted file mode 100644 index 19ac1844b..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleEarthUtils.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2013 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.util; - -import com.google.android.apps.mytracks.content.MyTracksProviderUtils; -import com.google.android.apps.mytracks.io.sync.SyncUtils; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo; -import android.net.Uri; -import android.util.Log; - -import java.util.List; - -/** - * Utilities for Google Earth. - * - * @author Jimmy Shih - */ -public class GoogleEarthUtils { - - private static final String TAG = GoogleEarthUtils.class.getSimpleName(); - - private static final String GOOGLE_EARTH_CLASS = "com.google.earth.EarthActivity"; - private static final int GOOGLE_EARTH_MIN_VERSION_CODE = 13246120; - private static final String GOOGLE_EARTH_PACKAGE = "com.google.earth"; - private static final String - GOOGLE_EARTH_TOUR_FEATURE_ID = "com.google.earth.EXTRA.tour_feature_id"; - - public static final String GOOGLE_EARTH_MARKET_URL = "market://details?id=" - + GOOGLE_EARTH_PACKAGE; - - public static final String TOUR_FEATURE_ID_VALUE = "tour"; - - private GoogleEarthUtils() {} - - /** - * Returns true if Google Earth is installed. - * - * @param context the context - */ - public static boolean isEarthInstalled(Context context) { - List infos = context.getPackageManager().queryIntentActivities( - new Intent().setType(SyncUtils.KMZ_MIME_TYPE), PackageManager.MATCH_DEFAULT_ONLY); - for (ResolveInfo info : infos) { - if (info.activityInfo != null && info.activityInfo.packageName != null - && info.activityInfo.packageName.equals(GOOGLE_EARTH_PACKAGE)) { - try { - PackageInfo packageInfo = context.getPackageManager() - .getPackageInfo(info.activityInfo.packageName, 0); - return packageInfo.versionCode >= GOOGLE_EARTH_MIN_VERSION_CODE; - } catch (NameNotFoundException e) { - Log.e(TAG, "Unable to get google earth package info", e); - return false; - } - } - } - return false; - } - - /** - * Gets an intent to play a kml file in Google Earth. - * - * @param kmlFilePath the kml file path - */ - public static Intent getPlayInEarthIntent(Context context, String kmlFilePath) { - Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(MyTracksProviderUtils.AUTHORITY).path(kmlFilePath).build(); - context.grantUriPermission(GOOGLE_EARTH_PACKAGE, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); - return new Intent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_GRANT_READ_URI_PERMISSION) - .putExtra(GOOGLE_EARTH_TOUR_FEATURE_ID, TOUR_FEATURE_ID_VALUE) - .setClassName(GOOGLE_EARTH_PACKAGE, GOOGLE_EARTH_CLASS) - .setDataAndType(uri, SyncUtils.KMZ_MIME_TYPE); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java deleted file mode 100644 index 3b140ac31..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2013 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.util; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.Binder; -import android.os.IBinder; -import android.os.Parcel; -import android.os.RemoteException; -import android.util.Log; - -/** - * Utilities for Google Feedback. - * - * @author Jimmy Shih - */ -public class GoogleFeedbackUtils { - - private static final String TAG = GoogleFeedbackUtils.class.getSimpleName(); - - private GoogleFeedbackUtils() {} - - /** - * Binds the Google Feedback service. - * - * @param context the context - */ - public static void bindFeedback(Context context) { - Intent intent = new Intent(Intent.ACTION_BUG_REPORT); - ServiceConnection serviceConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - try { - service.transact(Binder.FIRST_CALL_TRANSACTION, Parcel.obtain(), null, 0); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException", e); - } - } - - @Override - public void onServiceDisconnected(ComponentName name) {} - }; - // Bind to the service after creating it if necessary - context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/PreferencesUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/PreferencesUtils.java index 580285b30..caa27dc73 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/PreferencesUtils.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/util/PreferencesUtils.java @@ -61,20 +61,11 @@ public class PreferencesUtils { public static final String DEFAULT_ACTIVITY_DEFAULT = ""; - public static final String DRIVE_DELETED_LIST_DEFAULT = ""; - public static final String DRIVE_EDITED_LIST_DEFAULT = ""; - public static final long DRIVE_LARGEST_CHANGE_ID_DEFAULT = -1L; - public static final boolean DRIVE_SYNC_DEFAULT = false; - public static final String EXPORT_EXTERNAL_STORAGE_FORMAT_DEFAULT = TrackFileFormat.KML.name(); - public static final boolean EXPORT_GOOGLE_FUSION_TABLES_PUBLIC_DEFAULT = false; - public static final boolean EXPORT_GOOGLE_MAPS_PUBLIC_DEFAULT = false; - public static final String EXPORT_TYPE_DEFAULT = ExportType.GOOGLE_DRIVE.name(); - + // Value for split_frequency_key and voice_frequency_key public static final int FREQUENCY_OFF = 0; - public static final String GOOGLE_ACCOUNT_DEFAULT = ""; public static final int MAP_TYPE_DEFAUlT = 1; public static final int MAX_RECORDING_DISTANCE_DEFAULT = 200; @@ -93,14 +84,8 @@ public class PreferencesUtils { public static final long RECORDING_TRACK_ID_DEFAULT = -1L; public static final boolean RECORDING_TRACK_PAUSED_DEFAULT = true; - public static final long SELECTED_TRACK_ID_DEFAULT = -1L; public static final String SENSOR_TYPE_DEFAULT = "NONE"; - // Share track - public static final String SHARE_TRACK_ACCOUNT_DEFAULT = ""; - public static final boolean SHARE_TRACK_INVITE_DEFAULT = false; - public static final boolean SHARE_TRACK_PUBLIC_DEFAULT = false; - public static final int SPLIT_FREQUENCY_DEFAULT = 0; // Stats diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackNameUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackNameUtils.java index fe9804092..23b6457d8 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackNameUtils.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackNameUtils.java @@ -16,13 +16,13 @@ package com.google.android.apps.mytracks.util; -import com.google.android.maps.mytracks.R; -import com.google.common.annotations.VisibleForTesting; - import android.content.Context; import android.location.Address; import android.location.Geocoder; import android.location.Location; +import android.support.annotation.VisibleForTesting; + +import com.google.android.maps.mytracks.R; import java.io.IOException; import java.text.SimpleDateFormat; diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackUtils.java b/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackUtils.java index c1a96955c..9c95d4c8e 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackUtils.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/util/TrackUtils.java @@ -63,12 +63,5 @@ public class TrackUtils { CalorieUtils.updateTrackCalorie(context, track); } } - - boolean driveSync = PreferencesUtils.getBoolean( - context, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); - if (driveSync) { - PreferencesUtils.addToList(context, R.string.drive_edited_list_key, - PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT, String.valueOf(track.getId())); - } } } diff --git a/myTracks/src/main/res/layout/account_spinner_item.xml b/myTracks/src/main/res/layout/account_spinner_item.xml deleted file mode 100644 index 6c1dff2b8..000000000 --- a/myTracks/src/main/res/layout/account_spinner_item.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/myTracks/src/main/res/layout/help.xml b/myTracks/src/main/res/layout/help.xml deleted file mode 100644 index d2cad60c8..000000000 --- a/myTracks/src/main/res/layout/help.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - -