Prompt user to sync to drive after first recording

This commit is contained in:
Jimmy Shih
2014-01-08 11:32:04 -08:00
parent 5efd745562
commit 68685828ca
6 changed files with 160 additions and 75 deletions
+4 -3
View File
@@ -2129,12 +2129,13 @@ limitations under the License.
</string> </string>
<string name="sync_drive_enable_message" <string name="sync_drive_enable_message"
translation_description="The dialog message to enable sync to Google Drive."> translation_description="The dialog message to enable sync to Google Drive.">
This will allow you to view your tracks in Google Drive and view the tracks shared with you. All Do you want to sync your tracks to Google Drive? This will allow you to view your tracks in
tracks synced to Google Drive will be private by default. Google Drive and view the tracks shared with you. All tracks synced to Google Drive will be
private by default.
</string> </string>
<string name="sync_drive_title" <string name="sync_drive_title"
translation_description="The dialog title to sync to Google Drive."> translation_description="The dialog title to sync to Google Drive.">
Sync with Google Drive? Track Saved
</string> </string>
<!-- Track --> <!-- Track -->
@@ -210,7 +210,7 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
} }
@Override @Override
public void onChooseAccountDone() { public void onChooseAccountDone(String account) {
String googleAccount = PreferencesUtils.getString( String googleAccount = PreferencesUtils.getString(
this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT); this, R.string.google_account_key, PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT);
if (googleAccount == null || googleAccount.equals(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT)) { if (googleAccount == null || googleAccount.equals(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT)) {
@@ -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.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track; 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;
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller; 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.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.TrackIconUtils;
import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils;
import com.google.android.apps.mytracks.util.TrackUtils; import com.google.android.apps.mytracks.util.TrackUtils;
import com.google.android.maps.mytracks.R; 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.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
@@ -37,6 +51,7 @@ import android.widget.AutoCompleteTextView;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Toast;
/** /**
* An activity that let's the user see and edit the user editable track meta * An activity that let's the user see and edit the user editable track meta
@@ -44,8 +59,8 @@ import android.widget.Spinner;
* *
* @author Leif Hendrik Wilden * @author Leif Hendrik Wilden
*/ */
public class TrackEditActivity extends AbstractMyTracksActivity public class TrackEditActivity extends AbstractMyTracksActivity implements ChooseActivityTypeCaller,
implements ChooseActivityTypeCaller { EnableSyncCaller, ChooseAccountCaller, CheckPermissionCaller {
public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_TRACK_ID = "track_id";
public static final String EXTRA_NEW_TRACK = "new_track"; 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 TAG = TrackEditActivity.class.getSimpleName();
private static final String ICON_VALUE_KEY = "icon_value_key"; private static final String ICON_VALUE_KEY = "icon_value_key";
private static final int DRIVE_REQUEST_CODE = 0;
private Long trackId; private Long trackId;
private TrackRecordingServiceConnection trackRecordingServiceConnection; private TrackRecordingServiceConnection trackRecordingServiceConnection;
private MyTracksProviderUtils myTracksProviderUtils; private MyTracksProviderUtils myTracksProviderUtils;
@@ -66,10 +83,18 @@ public class TrackEditActivity extends AbstractMyTracksActivity
private boolean newWeight = false; private boolean newWeight = false;
private CheckPermissionAsyncTask syncDriveAsyncTask;
@Override @Override
protected void onCreate(Bundle bundle) { protected void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
Object retained = getLastCustomNonConfigurationInstance();
if (retained instanceof CheckPermissionAsyncTask) {
syncDriveAsyncTask = (CheckPermissionAsyncTask) retained;
syncDriveAsyncTask.setActivity(this);
}
trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null); trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null);
trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L); trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L);
if (trackId == -1L) { if (trackId == -1L) {
@@ -155,7 +180,19 @@ public class TrackEditActivity extends AbstractMyTracksActivity
TrackUtils.updateTrack(TrackEditActivity.this, track, name.getText().toString(), TrackUtils.updateTrack(TrackEditActivity.this, track, name.getText().toString(),
activityType.getText().toString(), description.getText().toString(), activityType.getText().toString(), description.getText().toString(),
myTracksProviderUtils, trackRecordingServiceConnection, newWeight); 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 { } else {
setTitle(R.string.menu_edit); setTitle(R.string.menu_edit);
cancel.setOnClickListener(new View.OnClickListener() { cancel.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
finish(); finish();
} }
@@ -175,6 +212,28 @@ public class TrackEditActivity extends AbstractMyTracksActivity
} }
} }
@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 @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
@@ -211,4 +270,61 @@ public class TrackEditActivity extends AbstractMyTracksActivity
setActivityTypeIcon(value); setActivityTypeIcon(value);
activityType.setText(getString(TrackIconUtils.getIconActivityType(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();
}
} }
@@ -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.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.TracksColumns; 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;
import com.google.android.apps.mytracks.fragments.EulaDialogFragment.EulaCaller; 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;
@@ -92,7 +90,7 @@ import java.util.Locale;
* @author Leif Hendrik Wilden * @author Leif Hendrik Wilden
*/ */
public class TrackListActivity extends AbstractSendToGoogleActivity 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 TAG = TrackListActivity.class.getSimpleName();
private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME, private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME,
@@ -701,29 +699,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
return; 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);
}
} }
/** /**
@@ -46,8 +46,10 @@ public class ChooseAccountDialogFragment extends AbstractMyTracksDialogFragment
/** /**
* Called when choose account is done. * 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"; 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); accounts = AccountManager.get(fragmentActivity).getAccountsByType(Constants.ACCOUNT_TYPE);
if (accounts.length == 1) { if (accounts.length == 1) {
PreferencesUtils.setString(fragmentActivity, R.string.google_account_key, accounts[0].name);
dismiss(); dismiss();
caller.onChooseAccountDone(); caller.onChooseAccountDone(accounts[0].name);
return; 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 @Override
@@ -95,23 +86,38 @@ public class ChooseAccountDialogFragment extends AbstractMyTracksDialogFragment
if (accounts.length == 0) { if (accounts.length == 0) {
return new AlertDialog.Builder(getActivity()).setMessage( return new AlertDialog.Builder(getActivity()).setMessage(
R.string.send_google_no_account_message).setTitle(R.string.send_google_no_account_title) 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]; String[] choices = new String[accounts.length];
for (int i = 0; i < accounts.length; i++) { for (int i = 0; i < accounts.length; i++) {
choices[i] = accounts[i].name; choices[i] = accounts[i].name;
} }
return new AlertDialog.Builder(getActivity()).setNegativeButton( return new AlertDialog.Builder(getActivity()).setNegativeButton(
R.string.generic_cancel, null) R.string.generic_cancel, new OnClickListener() {
.setPositiveButton(R.string.generic_ok, new OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); caller.onChooseAccountDone(PreferencesUtils.GOOGLE_ACCOUNT_DEFAULT);
PreferencesUtils.setString(
getActivity(), R.string.google_account_key, accounts[position].name);
caller.onChooseAccountDone();
} }
}).setSingleChoiceItems(choices, 0, null) }).setPositiveButton(R.string.generic_ok, new OnClickListener() {
.setTitle(R.string.send_google_choose_account_title).create(); @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);
} }
} }
@@ -16,7 +16,6 @@
package com.google.android.apps.mytracks.fragments; package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.app.Activity; import android.app.Activity;
@@ -24,7 +23,6 @@ import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
/** /**
* A DialogFrament to enable sync to Google Drive. * 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 @Override
protected Dialog createDialog() { protected Dialog createDialog() {
return new AlertDialog.Builder(getActivity()).setMessage(R.string.sync_drive_enable_message) return new AlertDialog.Builder(getActivity()).setMessage(R.string.sync_drive_enable_message)