diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index f7aa9f089..5b61e6890 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -2129,12 +2129,13 @@ limitations under the License. - This will allow you to view your tracks in Google Drive and view the tracks shared with you. All - tracks synced to Google Drive will be private by default. + Do you want to sync your tracks to Google Drive? This will allow you to view your tracks in + Google Drive and view the tracks shared with you. All tracks synced to Google Drive will be + private by default. - Sync with Google Drive? + Track Saved diff --git a/MyTracks/src/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java b/MyTracks/src/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java index 78f9fef38..c2fc994d1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java @@ -197,7 +197,7 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv sendRequest.setAccount(account); onConfirmSyncDone(true); } - + /** * Sends a request to Google. * @@ -210,7 +210,7 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv } @Override - public void onChooseAccountDone() { + public void onChooseAccountDone(String account) { String googleAccount = PreferencesUtils.getString( this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); if (googleAccount == null || googleAccount.equals(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT)) { diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java index 004092c2c..79cf66157 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackEditActivity.java @@ -18,14 +18,28 @@ 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.sendtogoogle.SendToGoogleUtils; +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.accounts.Account; +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; @@ -37,15 +51,16 @@ 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 * data such as track name, activity type, and track description. - * + * * @author Leif Hendrik Wilden */ -public class TrackEditActivity extends AbstractMyTracksActivity - implements ChooseActivityTypeCaller { +public class TrackEditActivity extends AbstractMyTracksActivity implements ChooseActivityTypeCaller, + EnableSyncCaller, ChooseAccountCaller, CheckPermissionCaller { public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_NEW_TRACK = "new_track"; @@ -53,6 +68,8 @@ public class TrackEditActivity extends AbstractMyTracksActivity private static final String TAG = TrackEditActivity.class.getSimpleName(); private static final String ICON_VALUE_KEY = "icon_value_key"; + private static final int DRIVE_REQUEST_CODE = 0; + private Long trackId; private TrackRecordingServiceConnection trackRecordingServiceConnection; private MyTracksProviderUtils myTracksProviderUtils; @@ -63,13 +80,21 @@ public class TrackEditActivity extends AbstractMyTracksActivity private AutoCompleteTextView activityType; private Spinner activityTypeIcon; private EditText description; - + 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) { @@ -155,7 +180,19 @@ public class TrackEditActivity extends AbstractMyTracksActivity TrackUtils.updateTrack(TrackEditActivity.this, track, name.getText().toString(), activityType.getText().toString(), description.getText().toString(), myTracksProviderUtils, trackRecordingServiceConnection, newWeight); - finish(); + + if (EulaUtils.hasShowEnableSync(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(); + } } }); @@ -166,7 +203,7 @@ public class TrackEditActivity extends AbstractMyTracksActivity } else { setTitle(R.string.menu_edit); cancel.setOnClickListener(new View.OnClickListener() { - @Override + @Override public void onClick(View v) { finish(); } @@ -174,13 +211,35 @@ public class TrackEditActivity extends AbstractMyTracksActivity cancel.setVisibility(View.VISIBLE); } } - + + @Override + public Object onRetainCustomNonConfigurationInstance() { + if (syncDriveAsyncTask != null) { + syncDriveAsyncTask.setActivity(null); + } + return syncDriveAsyncTask; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == DRIVE_REQUEST_CODE) { + SendToGoogleUtils.cancelNotification(this, SendToGoogleUtils.DRIVE_NOTIFICATION_ID); + if (resultCode == Activity.RESULT_OK) { + onDrivePermissionSuccess(); + } else { + onPermissionFailure(); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + @Override protected void onStart() { super.onStart(); TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); } - + @Override protected void onStop() { super.onStop(); @@ -197,7 +256,7 @@ public class TrackEditActivity extends AbstractMyTracksActivity protected int getLayoutResId() { return R.layout.track_edit; } - + private void setActivityTypeIcon(String value) { iconValue = value; TrackIconUtils.setIconSpinner(activityTypeIcon, value); @@ -211,4 +270,61 @@ public class TrackEditActivity extends AbstractMyTracksActivity 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) { + PreferencesUtils.setString(this, R.string.google_account_key, account); + if (PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT.equals(account)) { + finish(); + } else { + syncDriveAsyncTask = new CheckPermissionAsyncTask(this, account, SendToGoogleUtils.DRIVE_SCOPE); + syncDriveAsyncTask.execute(); + } + } + + @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 { + onPermissionFailure(); + } + } + } + + private void onDrivePermissionSuccess() { + PreferencesUtils.setBoolean(this, R.string.drive_sync_key, true); + + // Turn off everything + SyncUtils.disableSync(this); + + // Turn on sync + ContentResolver.setMasterSyncAutomatically(true); + + // Enable sync for account + String googleAccount = PreferencesUtils.getString( + this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); + Account account = new Account(googleAccount, Constants.ACCOUNT_TYPE); + SyncUtils.enableSync(account); + finish(); + } + + private void onPermissionFailure() { + Toast.makeText(this, R.string.send_google_no_account_permission, Toast.LENGTH_LONG).show(); + finish(); + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 875f1e3b4..39bc8e987 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -19,8 +19,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.EnableSyncDialogFragment; -import com.google.android.apps.mytracks.fragments.EnableSyncDialogFragment.EnableSyncCaller; 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; @@ -92,7 +90,7 @@ import java.util.Locale; * @author Leif Hendrik Wilden */ public class TrackListActivity extends AbstractSendToGoogleActivity - implements EulaCaller, EnableSyncCaller, FileTypeCaller, PlayMultipleCaller { + implements EulaCaller, FileTypeCaller, PlayMultipleCaller { private static final String TAG = TrackListActivity.class.getSimpleName(); private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME, @@ -701,29 +699,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity return; } } - showEnableSync(); - } - - private void showEnableSync() { - if (EulaUtils.hasShowEnableSync(this)) { - Fragment fragment = getSupportFragmentManager() - .findFragmentByTag(EnableSyncDialogFragment.ENABLE_SYNC_DIALOG_TAG); - if (fragment == null) { - new EnableSyncDialogFragment().show( - getSupportFragmentManager(), EnableSyncDialogFragment.ENABLE_SYNC_DIALOG_TAG); - } - } - } - - @Override - public void onEnableSyncDone(boolean enable) { - EulaUtils.setShowEnableSync(this); - if (enable) { - SendRequest sendRequest = new SendRequest(-1L); - sendRequest.setSendDrive(true); - sendRequest.setDriveSync(true); - sendToGoogle(sendRequest); - } } /** diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java index ab6586fc0..fd48631d9 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ChooseAccountDialogFragment.java @@ -46,8 +46,10 @@ public class ChooseAccountDialogFragment extends AbstractMyTracksDialogFragment /** * Called when choose account is done. + * + * @param account the account chosen */ - public void onChooseAccountDone(); + public void onChooseAccountDone(String account); } public static final String CHOOSE_ACCOUNT_DIALOG_TAG = "chooseAccount"; @@ -73,21 +75,10 @@ public class ChooseAccountDialogFragment extends AbstractMyTracksDialogFragment accounts = AccountManager.get(fragmentActivity).getAccountsByType(Constants.ACCOUNT_TYPE); if (accounts.length == 1) { - PreferencesUtils.setString(fragmentActivity, R.string.google_account_key, accounts[0].name); dismiss(); - caller.onChooseAccountDone(); + caller.onChooseAccountDone(accounts[0].name); return; } - - String googleAccount = PreferencesUtils.getString( - fragmentActivity, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); - for (int i = 0; i < accounts.length; i++) { - if (accounts[i].name.equals(googleAccount)) { - dismiss(); - caller.onChooseAccountDone(); - return; - } - } } @Override @@ -95,23 +86,38 @@ public class ChooseAccountDialogFragment extends AbstractMyTracksDialogFragment 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, null).create(); + .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, null) - .setPositiveButton(R.string.generic_ok, new OnClickListener() { + R.string.generic_cancel, new OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { - int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); - PreferencesUtils.setString( - getActivity(), R.string.google_account_key, accounts[position].name); - caller.onChooseAccountDone(); + caller.onChooseAccountDone(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); + } - }).setSingleChoiceItems(choices, 0, null) - .setTitle(R.string.send_google_choose_account_title).create(); + }).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/com/google/android/apps/mytracks/fragments/EnableSyncDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/EnableSyncDialogFragment.java index 5f419c974..70625f0a1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/EnableSyncDialogFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/EnableSyncDialogFragment.java @@ -16,7 +16,6 @@ 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; @@ -24,7 +23,6 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; -import android.os.Bundle; /** * A DialogFrament to enable sync to Google Drive. @@ -61,17 +59,6 @@ public class EnableSyncDialogFragment extends AbstractMyTracksDialogFragment { } } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (PreferencesUtils.getBoolean( - getActivity(), R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT)) { - dismiss(); - caller.onEnableSyncDone(false); - return; - } - } - @Override protected Dialog createDialog() { return new AlertDialog.Builder(getActivity()).setMessage(R.string.sync_drive_enable_message)