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)