From 75c58c556af47972b6101a184b22e81cb18ff8c7 Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Mon, 14 Oct 2013 14:51:26 -0700 Subject: [PATCH] Reduce number of Google Drive api calls by using a list to keep track of the edits --- MyTracks/res/values/keys.xml | 1 + .../apps/mytracks/MarkerEditActivity.java | 13 +++++++ .../apps/mytracks/TrackEditActivity.java | 7 ++++ .../io/backup/PreferenceBackupHelper.java | 1 + .../apps/mytracks/io/sync/SyncAdapter.java | 36 +++++++++++++------ .../apps/mytracks/io/sync/SyncUtils.java | 3 ++ .../apps/mytracks/util/PreferencesUtils.java | 25 +++++++++++++ 7 files changed, 76 insertions(+), 10 deletions(-) diff --git a/MyTracks/res/values/keys.xml b/MyTracks/res/values/keys.xml index 6de0c7dd0..4259acde6 100644 --- a/MyTracks/res/values/keys.xml +++ b/MyTracks/res/values/keys.xml @@ -63,6 +63,7 @@ limitations under the License. autoResumeTrackCurrentRetry bluetoothSensor driveDeletedList + driveEditedList driveLargestChangeId driveSync googleAccount diff --git a/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java index 2846df0f8..222702515 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MarkerEditActivity.java @@ -17,10 +17,12 @@ 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.Waypoint; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; import com.google.android.apps.mytracks.content.WaypointCreationRequest; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; +import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.maps.mytracks.R; @@ -123,6 +125,17 @@ 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/com/google/android/apps/mytracks/TrackEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java index 0a479b78e..f938edc68 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java @@ -23,6 +23,7 @@ import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragme import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.util.ApiAdapterFactory; import com.google.android.apps.mytracks.util.CalorieUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackNameUtils; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; @@ -199,6 +200,12 @@ public class TrackEditActivity extends AbstractMyTracksActivity track.setDescription(description.getText().toString()); track.setModifiedTime(System.currentTimeMillis()); myTracksProviderUtils.updateTrack(track); + boolean driveSync = PreferencesUtils.getBoolean( + TrackEditActivity.this, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT); + if (driveSync) { + PreferencesUtils.addToList(TrackEditActivity.this, R.string.drive_edited_list_key, + PreferencesUtils.DRIVE_EDITED_LIST_DEFAULT, String.valueOf(track.getId())); + } finish(); } }); diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelper.java b/MyTracks/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelper.java index 5e88d1309..158518cb9 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelper.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelper.java @@ -52,6 +52,7 @@ public class PreferenceBackupHelper { doNotBackup.add(context.getString(R.string.auto_resume_track_current_retry_key)); doNotBackup.add(context.getString(R.string.bluetooth_sensor_key)); doNotBackup.add(context.getString(R.string.drive_deleted_list_key)); + doNotBackup.add(context.getString(R.string.drive_edited_list_key)); doNotBackup.add(context.getString(R.string.drive_largest_change_id_key)); doNotBackup.add(context.getString(R.string.drive_sync_key)); doNotBackup.add(context.getString(R.string.google_account_key)); diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncAdapter.java index 2b282e5eb..a58fcac1b 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncAdapter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncAdapter.java @@ -251,6 +251,7 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { */ private void performIncrementalSync(String folderId, long largestChangeId) throws IOException { + // Handle deleted tracks String driveDeletedList = PreferencesUtils.getString( context, R.string.drive_deleted_list_key, PreferencesUtils.DRIVE_DELETED_LIST_DEFAULT); String deletedIds[] = TextUtils.split(driveDeletedList, ";"); @@ -260,9 +261,33 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { 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); + 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); + Map changes = new HashMap(); largestChangeId = getDriveChangesInfo(largestChangeId, changes); - + Cursor cursor = null; try { // Get all the local tracks with drive file id @@ -288,15 +313,6 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { } } changes.remove(driveId); - } else { - if (!track.isSharedWithMe()) { - - // Handle the case the track has changed - File driveFile = drive.files().get(driveId).execute(); - if (SyncUtils.isInMyTracksAndValid(driveFile, folderId)) { - merge(track, driveFile); - } - } } } while (cursor.moveToNext()); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java b/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java index a4c7631c0..b28dd7a33 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java @@ -185,6 +185,9 @@ public class SyncUtils { 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); diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java index 602aa3799..6f1d6cff4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java @@ -26,6 +26,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; +import android.text.TextUtils; /** * Utilities to access preferences stored in {@link SharedPreferences}. @@ -60,6 +61,7 @@ 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; @@ -278,4 +280,27 @@ public class PreferencesUtils { return PreferencesUtils.CHART_X_AXIS_DEFAULT.equals( getString(context, R.string.chart_x_axis_key, PreferencesUtils.CHART_X_AXIS_DEFAULT)); } + + /** + * Adds a value to a list. + * + * @param context the context + * @param keyId the key id + * @param defaultValue the default value + * @param value the value + */ + public static void addToList(Context context, int keyId, String defaultValue, String value) { + String list = getString(context, keyId, defaultValue); + if (defaultValue.equals(list)) { + setString(context, keyId, value); + return; + } + String[] items = TextUtils.split(list, ";"); + for (String item : items) { + if (value.equals(item)) { + return; + } + } + setString(context, keyId, list + ";" + value); + } }