diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/drive/SendDriveAsyncTask.java b/MyTracks/src/com/google/android/apps/mytracks/io/drive/SendDriveAsyncTask.java index 0ac432444..eca7a6a30 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/drive/SendDriveAsyncTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/drive/SendDriveAsyncTask.java @@ -20,14 +20,16 @@ import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.io.sendtogoogle.AbstractSendAsyncTask; import com.google.android.apps.mytracks.io.sync.SyncUtils; +import com.google.android.gms.auth.GoogleAuthException; +import com.google.android.gms.auth.UserRecoverableAuthException; 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.services.drive.Drive; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.Permission; import android.accounts.Account; import android.content.Context; -import android.util.Log; import java.io.IOException; @@ -38,12 +40,10 @@ import java.io.IOException; */ public class SendDriveAsyncTask extends AbstractSendAsyncTask { - private static final String TAG = SendDriveAsyncTask.class.getSimpleName(); - private final long trackId; private final Account account; - private final Context context; private final String[] acl; + private final Context context; private final MyTracksProviderUtils myTracksProviderUtils; public SendDriveAsyncTask(SendDriveActivity activity, long trackId, Account account, String acl) { @@ -68,18 +68,18 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask { @Override protected boolean performTask() { - GoogleAccountCredential credential = SyncUtils.getCredential(context, account.name); - if (credential == null) { - return false; - } - - Drive drive = SyncUtils.getDriveService(credential); - String folderId = SyncUtils.getMyTracksFolder(context, drive); - if (folderId == null) { - return false; - } - try { + GoogleAccountCredential credential = SyncUtils.getGoogleAccountCredential( + context, account.name); + if (credential == null) { + return false; + } + Drive drive = SyncUtils.getDriveService(credential); + String folderId = SyncUtils.getMyTracksFolder(context, drive); + if (folderId == null) { + return false; + } + Track track = myTracksProviderUtils.getTrack(trackId); String driveId = track.getDriveId(); if (driveId != null && !driveId.equals("")) { @@ -91,6 +91,7 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask { } track.setDriveId(""); track.setModifiedTime(-1L); + track.setSharedWithMe(false); myTracksProviderUtils.updateTrack(track); } @@ -100,9 +101,16 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask { } addPermission(drive, id); return true; - } catch (IOException e) { - Log.e(TAG, "IOException", e); + } catch (UserRecoverableAuthIOException e) { + SyncUtils.sendNotification(context, account.name, e.getIntent()); return false; + } catch (IOException e) { + return retryTask(); + } catch (UserRecoverableAuthException e) { + SyncUtils.sendNotification(context, account.name, e.getIntent()); + return false; + } catch (GoogleAuthException e) { + return retryTask(); } } @@ -110,7 +118,7 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask { protected void invalidateToken() {} /** - * Adds permision. + * Adds permission. * * @param drive the drive * @param driveId the drive id 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 f3d9ffac2..9ac0c555b 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 @@ -104,12 +104,11 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { driveAccountName = account.name; } - String folderId = SyncUtils.getMyTracksFolder(context, drive); - if (folderId == null) { - return; - } - try { + String folderId = SyncUtils.getMyTracksFolder(context, drive); + if (folderId == null) { + return; + } long largestChangeId = PreferencesUtils.getLong( context, R.string.drive_largest_change_id_key); if (largestChangeId == PreferencesUtils.DRIVE_LARGEST_CHANGE_ID_DEFAULT) { 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 48197c972..bc207702c 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 @@ -30,6 +30,7 @@ import com.google.android.gms.auth.UserRecoverableAuthException; 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; @@ -98,7 +99,7 @@ public class SyncUtils { @VisibleForTesting public static final String MY_TRACKS_FOLDER_QUERY = "'root' in parents and title = '%s' and mimeType = '" + FOLDER_MIME_TYPE - + "' and trashed = false and not sharedWithMe"; + + "' and trashed = false"; private static final String TAG = SyncUtils.class.getSimpleName(); private static final String SYNC_AUTHORITY = "com.google.android.maps.mytracks"; @@ -129,16 +130,18 @@ public class SyncUtils { }); } catch (UserRecoverableAuthException e) { activity.startActivityForResult(e.getIntent(), DRIVE_PERMISSION_REQUEST_CODE); - } catch (IOException e) { - Log.e(TAG, "IOException", e); + } catch (GoogleAuthException e) { + Log.e(TAG, "GoogleAuthException", e); activity.runOnUiThread(new Runnable() { @Override public void run() { permissionCallback.onFailure(); } }); - } catch (GoogleAuthException e) { - Log.e(TAG, "GoogleAuthException", e); + } catch (UserRecoverableAuthIOException e) { + activity.startActivityForResult(e.getIntent(), DRIVE_PERMISSION_REQUEST_CODE); + } catch (IOException e) { + Log.e(TAG, "IOException", e); activity.runOnUiThread(new Runnable() { @Override public void run() { @@ -161,25 +164,14 @@ public class SyncUtils { try { return getGoogleAccountCredential(context, accountName); } catch (UserRecoverableAuthException e) { - Intent intent = e.getIntent(); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_FROM_BACKGROUND); - - PendingIntent pendingIntent = PendingIntent.getActivity( - context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setAutoCancel( - true).setContentIntent(pendingIntent) - .setContentText(context.getString(R.string.permission_request_message, accountName)) - .setContentTitle(context.getString(R.string.permission_request_title)) - .setSmallIcon(android.R.drawable.ic_dialog_alert) - .setTicker(context.getString(R.string.permission_request_title)); - NotificationManager notificationManager = (NotificationManager) context.getSystemService( - Context.NOTIFICATION_SERVICE); - notificationManager.notify(NOTIFICATION_ID, builder.build()); - } catch (IOException e) { - Log.e(TAG, "IOException", e); + sendNotification(context, accountName, e.getIntent()); } catch (GoogleAuthException e) { Log.e(TAG, "GoogleAuthException", e); - } + } catch (UserRecoverableAuthIOException e) { + sendNotification(context, accountName, e.getIntent()); + } catch (IOException e) { + Log.e(TAG, "IOException", e); + } return null; } @@ -250,25 +242,20 @@ public class SyncUtils { * @param context the context * @param drive the drive */ - public static String getMyTracksFolder(Context context, Drive drive) { - try { - 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.getTitle().equals(folderName)) { - return file.getId(); - } + public static String 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.getTitle().equals(folderName)) { + return file.getId(); } - File file = new File(); - file.setTitle(folderName); - file.setMimeType(FOLDER_MIME_TYPE); - return drive.files().insert(file).execute().getId(); - } catch (IOException e) { - Log.e(TAG, "IOException", e); - return null; } + File file = new File(); + file.setTitle(folderName); + file.setMimeType(FOLDER_MIME_TYPE); + return drive.files().insert(file).execute().getId(); } /** @@ -364,6 +351,7 @@ public class SyncUtils { String id = uploadedFile.getId(); track.setDriveId(id); track.setModifiedTime(uploadedFile.getModifiedDate().getValue()); + track.setSharedWithMe(false); myTracksProviderUtils.updateTrack(track); return id; } finally { @@ -417,7 +405,7 @@ public class SyncUtils { * @param context the context * @param accountName the account name */ - private static GoogleAccountCredential getGoogleAccountCredential( + public static GoogleAccountCredential getGoogleAccountCredential( Context context, String accountName) throws IOException, GoogleAuthException { GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2( context, DriveScopes.DRIVE); @@ -426,6 +414,29 @@ public class SyncUtils { return credential; } + /** + * Sends a notification to request permission. + * + * @param context the context + * @param accountName the account name + * @param intent the intent + */ + public static void sendNotification(Context context, String accountName, Intent intent) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_FROM_BACKGROUND); + + PendingIntent pendingIntent = PendingIntent.getActivity( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setAutoCancel( + true).setContentIntent(pendingIntent) + .setContentText(context.getString(R.string.permission_request_message, accountName)) + .setContentTitle(context.getString(R.string.permission_request_title)) + .setSmallIcon(android.R.drawable.ic_dialog_alert) + .setTicker(context.getString(R.string.permission_request_title)); + NotificationManager notificationManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + notificationManager.notify(NOTIFICATION_ID, builder.build()); + } + /** * Gets a file from a track. *