diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesAsyncTask.java b/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesAsyncTask.java index a13a61922..d079cfa77 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesAsyncTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesAsyncTask.java @@ -54,7 +54,6 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask { private static final String APP_NAME_PREFIX = "Google-MyTracks-"; private static final String SQL_KEY = "sql="; private static final String CONTENT_TYPE = "application/x-www-form-urlencoded"; - private static final String SERVICE_ID = "fusiontables"; private static final String FUSION_TABLES_BASE_URL = "https://www.google.com/fusiontables/api/query"; private static final int MAX_POINTS_PER_UPLOAD = 2048; @@ -121,7 +120,8 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask { currentSegment = 1; try { - authToken = AccountManager.get(context).blockingGetAuthToken(account, SERVICE_ID, false); + authToken = AccountManager.get(context).blockingGetAuthToken( + account, SendFusionTablesUtils.SERVICE, false); } catch (OperationCanceledException e) { Log.d(TAG, "Unable to get auth token", e); return retryTask(); @@ -170,7 +170,7 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask { @Override protected void invalidateToken() { - AccountManager.get(context).invalidateAuthToken(SERVICE_ID, authToken); + AccountManager.get(context).invalidateAuthToken(SendFusionTablesUtils.SERVICE, authToken); } /** diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtils.java b/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtils.java index 44eb97bc6..aaea51691 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/fusiontables/SendFusionTablesUtils.java @@ -36,6 +36,7 @@ import java.util.Locale; */ public class SendFusionTablesUtils { + public static final String SERVICE = "fusiontables"; private static final String UTF8 = "UTF8"; private static final String TABLE_ID = "tableid"; private static final String MAP_URL = "https://www.google.com/fusiontables/embedviz?" diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/DocumentsClient.java b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/DocumentsClient.java index fbdb98522..946a9d2fd 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/DocumentsClient.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/DocumentsClient.java @@ -25,7 +25,7 @@ import com.google.wireless.gdata.client.GDataServiceClient; */ public class DocumentsClient extends GDataServiceClient { /** The name of the service, dictated to be 'wise' by the protocol. */ - private static final String SERVICE = "writely"; + public static final String SERVICE = "writely"; /** * Creates a new DocumentsClient. diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/SpreadsheetsClient.java b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/SpreadsheetsClient.java index 78f8c295a..2b2e11b80 100755 --- a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/SpreadsheetsClient.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/docs/SpreadsheetsClient.java @@ -41,7 +41,7 @@ import java.io.InputStream; */ public class SpreadsheetsClient extends GDataServiceClient { /** The name of the service, dictated to be 'wise' by the protocol. */ - private static final String SERVICE = "wise"; + public static final String SERVICE = "wise"; /** Standard base feed url for spreadsheets. */ public static final String SPREADSHEETS_BASE_FEED_URL = diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java b/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java index cedfd06e9..25871fad2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java @@ -47,7 +47,7 @@ public class ChooseMapActivity extends Activity { private static final int PROGRESS_DIALOG = 1; private static final int ERROR_DIALOG = 2; - + private SendRequest sendRequest; private ChooseMapAsyncTask asyncTask; private ProgressDialog progressDialog; diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/AccountChooserActivity.java b/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/AccountChooserActivity.java index 67c47d6f6..3de566876 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/AccountChooserActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/AccountChooserActivity.java @@ -18,6 +18,10 @@ package com.google.android.apps.mytracks.io.sendtogoogle; import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.io.docs.SendDocsActivity; import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesActivity; +import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesUtils; +import com.google.android.apps.mytracks.io.gdata.docs.DocumentsClient; +import com.google.android.apps.mytracks.io.gdata.docs.SpreadsheetsClient; +import com.google.android.apps.mytracks.io.gdata.maps.MapsConstants; import com.google.android.apps.mytracks.io.maps.ChooseMapActivity; import com.google.android.apps.mytracks.io.maps.SendMapsActivity; import com.google.android.apps.mytracks.util.ApiAdapterFactory; @@ -25,6 +29,10 @@ import com.google.android.maps.mytracks.R; import android.accounts.Account; import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -34,6 +42,9 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; +import android.util.Log; + +import java.io.IOException; /** * A chooser to select an account. @@ -42,9 +53,29 @@ import android.os.Bundle; */ public class AccountChooserActivity extends Activity { + private static final String TAG = AccountChooserActivity.class.getSimpleName(); + private static final int NO_ACCOUNT_DIALOG = 1; private static final int CHOOSE_ACCOUNT_DIALOG = 2; + /** + * A callback after getting the permission to access a Google service. + * + * @author Jimmy Shih + */ + private interface PermissionCallback { + + /** + * To be invoked when the permission is granted. + */ + public void onSuccess(); + + /** + * To be invoked when the permission is not granted. + */ + public void onFailure(); + } + private SendRequest sendRequest; private Account[] accounts; private int selectedAccountIndex; @@ -56,7 +87,8 @@ public class AccountChooserActivity extends Activity { accounts = AccountManager.get(this).getAccountsByType(Constants.ACCOUNT_TYPE); if (accounts.length == 1) { - startNextActivity(accounts[0]); + sendRequest.setAccount(accounts[0]); + getPermission(MapsConstants.SERVICE_NAME, sendRequest.isSendMaps(), mapsCallback); return; } @@ -138,7 +170,9 @@ public class AccountChooserActivity extends Activity { Editor editor = prefs.edit(); editor.putString(getString(R.string.preferred_account_key), account.name); ApiAdapterFactory.getApiAdapter().applyPreferenceChanges(editor); - startNextActivity(account); + + sendRequest.setAccount(account); + getPermission(MapsConstants.SERVICE_NAME, sendRequest.isSendMaps(), mapsCallback); } }); return builder.create(); @@ -146,6 +180,89 @@ public class AccountChooserActivity extends Activity { return null; } } + + private PermissionCallback spreadsheetsCallback = new PermissionCallback() { + @Override + public void onSuccess() { + startNextActivity(); + } + @Override + public void onFailure() { + finish(); + } + }; + + private PermissionCallback docsCallback = new PermissionCallback() { + @Override + public void onSuccess() { + getPermission(SpreadsheetsClient.SERVICE, sendRequest.isSendDocs(), spreadsheetsCallback); + } + @Override + public void onFailure() { + finish(); + } + }; + + private PermissionCallback fusionTablesCallback = new PermissionCallback() { + @Override + public void onSuccess() { + getPermission(DocumentsClient.SERVICE, sendRequest.isSendDocs(), docsCallback); + } + @Override + public void onFailure() { + finish(); + } + }; + + private PermissionCallback mapsCallback = new PermissionCallback() { + @Override + public void onSuccess() { + getPermission( + SendFusionTablesUtils.SERVICE, sendRequest.isSendFusionTables(), fusionTablesCallback); + } + @Override + public void onFailure() { + finish(); + } + }; + + /** + * Gets the user permission to access a service. + * + * @param authTokenType the auth token type of the service + * @param needPermission true if need the permission + * @param callback callback after getting the permission + */ + private void getPermission( + String authTokenType, boolean needPermission, final PermissionCallback callback) { + if (needPermission) { + AccountManager.get(this).getAuthToken(sendRequest.getAccount(), authTokenType, null, this, + new AccountManagerCallback() { + @Override + public void run(AccountManagerFuture future) { + try { + if (future.getResult().getString(AccountManager.KEY_AUTHTOKEN) != null) { + callback.onSuccess(); + } else { + Log.d(TAG, "auth token is null"); + callback.onFailure(); + } + } catch (OperationCanceledException e) { + Log.d(TAG, "Unable to get auth token", e); + callback.onFailure(); + } catch (AuthenticatorException e) { + Log.d(TAG, "Unable to get auth token", e); + callback.onFailure(); + } catch (IOException e) { + Log.d(TAG, "Unable to get auth token", e); + callback.onFailure(); + } + } + }, null); + } else { + callback.onSuccess(); + } + } /** * Starts the next activity. If @@ -160,11 +277,8 @@ public class AccountChooserActivity extends Activity { *

* !sendMaps && !sendFusionTables && !sendDocs -> {@link UploadResultActivity} * - * @param account the chosen account */ - private void startNextActivity(Account account) { - sendRequest.setAccount(account); - + private void startNextActivity() { Class next; if (sendRequest.isSendMaps()) { next = sendRequest.isNewMap() ? SendMapsActivity.class : ChooseMapActivity.class;