diff options
author | Alexandra Gherghina <alexgherghina@google.com> | 2014-07-03 11:40:08 +0100 |
---|---|---|
committer | Alexandra Gherghina <alexgherghina@google.com> | 2014-07-17 17:08:49 +0000 |
commit | 999d394adee533c55fce38bd632ffd4f1af91362 (patch) | |
tree | d53e3c50e09778874f11407d92be5d376b1c9fe7 /core/java/android/accounts | |
parent | 3f4f2fbcd0557e32464e393cb9acc28c2328614e (diff) | |
download | frameworks_base-999d394adee533c55fce38bd632ffd4f1af91362.zip frameworks_base-999d394adee533c55fce38bd632ffd4f1af91362.tar.gz frameworks_base-999d394adee533c55fce38bd632ffd4f1af91362.tar.bz2 |
Ads per-user APIs to manage accounts through the AccountManager
Bug: 16056552
Bug: 14642886
Change-Id: I17ff6c2515285e63c84cecf2f861d10666c393c5
Diffstat (limited to 'core/java/android/accounts')
4 files changed, 81 insertions, 7 deletions
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 806a55b..aab6e80 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -155,6 +155,8 @@ public class AccountManager { /** @hide */ public static final int ERROR_CODE_USER_RESTRICTED = 100; + /** @hide */ + public static final int ERROR_CODE_MANAGEMENT_DISABLED_FOR_ACCOUNT_TYPE = 101; /** * Bundle key used for the {@link String} account name in results @@ -678,8 +680,7 @@ public class AccountManager { * @param handler {@link Handler} identifying the callback thread, * null for the main thread * @return An {@link AccountManagerFuture} which resolves to a Boolean, - * true if the account has been successfully removed, - * false if the authenticator forbids deleting this account. + * true if the account has been successfully removed */ public AccountManagerFuture<Boolean> removeAccount(final Account account, AccountManagerCallback<Boolean> callback, Handler handler) { @@ -698,6 +699,28 @@ public class AccountManager { } /** + * @see #removeAccount(Account, AccountManagerCallback, Handler) + * @hide + */ + public AccountManagerFuture<Boolean> removeAccountAsUser(final Account account, + AccountManagerCallback<Boolean> callback, Handler handler, + final UserHandle userHandle) { + if (account == null) throw new IllegalArgumentException("account is null"); + if (userHandle == null) throw new IllegalArgumentException("userHandle is null"); + return new Future2Task<Boolean>(handler, callback) { + public void doWork() throws RemoteException { + mService.removeAccountAsUser(mResponse, account, userHandle.getIdentifier()); + } + public Boolean bundleToResult(Bundle bundle) throws AuthenticatorException { + if (!bundle.containsKey(KEY_BOOLEAN_RESULT)) { + throw new AuthenticatorException("no result in response"); + } + return bundle.getBoolean(KEY_BOOLEAN_RESULT); + } + }.start(); + } + + /** * Removes an auth token from the AccountManager's cache. Does nothing if * the auth token is not currently in the cache. Applications must call this * method when the auth token is found to have expired or otherwise become @@ -1183,7 +1206,8 @@ public class AccountManager { * <li> {@link AuthenticatorException} if no authenticator was registered for * this account type or the authenticator failed to respond * <li> {@link OperationCanceledException} if the operation was canceled for - * any reason, including the user canceling the creation process + * any reason, including the user canceling the creation process or adding accounts + * (of this type) has been disabled by policy * <li> {@link IOException} if the authenticator experienced an I/O problem * creating a new account, usually because of network trouble * </ul> @@ -1208,6 +1232,30 @@ public class AccountManager { } /** + * @see #addAccount(String, String, String[], Bundle, Activity, AccountManagerCallback, Handler) + * @hide + */ + public AccountManagerFuture<Bundle> addAccountAsUser(final String accountType, + final String authTokenType, final String[] requiredFeatures, + final Bundle addAccountOptions, final Activity activity, + AccountManagerCallback<Bundle> callback, Handler handler, final UserHandle userHandle) { + if (accountType == null) throw new IllegalArgumentException("accountType is null"); + if (userHandle == null) throw new IllegalArgumentException("userHandle is null"); + final Bundle optionsIn = new Bundle(); + if (addAccountOptions != null) { + optionsIn.putAll(addAccountOptions); + } + optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName()); + + return new AmsTask(activity, handler, callback) { + public void doWork() throws RemoteException { + mService.addAccountAsUser(mResponse, accountType, authTokenType, + requiredFeatures, activity != null, optionsIn, userHandle.getIdentifier()); + } + }.start(); + } + + /** * Adds a shared account from the primary user to a secondary user. Adding the shared account * doesn't take effect immediately. When the target user starts up, any pending shared accounts * are attempted to be copied to the target user from the primary via calls to the @@ -1608,8 +1656,10 @@ public class AccountManager { } public void onError(int code, String message) { - if (code == ERROR_CODE_CANCELED || code == ERROR_CODE_USER_RESTRICTED) { - // the authenticator indicated that this request was canceled, do so now + if (code == ERROR_CODE_CANCELED || code == ERROR_CODE_USER_RESTRICTED + || code == ERROR_CODE_MANAGEMENT_DISABLED_FOR_ACCOUNT_TYPE) { + // the authenticator indicated that this request was canceled or we were + // forbidden to fulfill; cancel now cancel(true /* mayInterruptIfRunning */); return; } @@ -1668,7 +1718,10 @@ public class AccountManager { } public void onError(int code, String message) { - if (code == ERROR_CODE_CANCELED) { + if (code == ERROR_CODE_CANCELED || code == ERROR_CODE_USER_RESTRICTED + || code == ERROR_CODE_MANAGEMENT_DISABLED_FOR_ACCOUNT_TYPE) { + // the authenticator indicated that this request was canceled or we were + // forbidden to fulfill; cancel now cancel(true /* mayInterruptIfRunning */); return; } diff --git a/core/java/android/accounts/AccountManagerFuture.java b/core/java/android/accounts/AccountManagerFuture.java index af00a08..77670d9 100644 --- a/core/java/android/accounts/AccountManagerFuture.java +++ b/core/java/android/accounts/AccountManagerFuture.java @@ -84,7 +84,8 @@ public interface AccountManagerFuture<V> { * will be thrown rather than the call returning normally. * @return the actual result * @throws android.accounts.OperationCanceledException if the request was canceled for any - * reason + * reason (including if it is forbidden + * by policy to modify an account (of that type)) * @throws android.accounts.AuthenticatorException if there was an error communicating with * the authenticator or if the authenticator returned an invalid response * @throws java.io.IOException if the authenticator returned an error response that indicates diff --git a/core/java/android/accounts/CantAddAccountActivity.java b/core/java/android/accounts/CantAddAccountActivity.java index e1717a6..4ac2beb 100644 --- a/core/java/android/accounts/CantAddAccountActivity.java +++ b/core/java/android/accounts/CantAddAccountActivity.java @@ -19,6 +19,7 @@ package android.accounts; import android.app.Activity; import android.os.Bundle; import android.view.View; +import android.widget.TextView; import com.android.internal.R; @@ -27,11 +28,26 @@ import com.android.internal.R; * Just shows an error message about the account restrictions for the limited user. */ public class CantAddAccountActivity extends Activity { + public static final String EXTRA_ERROR_CODE = "android.accounts.extra.ERROR_CODE"; + public static final int MISSING = -1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.app_not_authorized); + + int errorCode = getIntent().getIntExtra(EXTRA_ERROR_CODE, MISSING); + if (errorCode != MISSING) { + TextView errorText = (TextView) findViewById(R.id.description); + switch (errorCode) { + case AccountManager.ERROR_CODE_USER_RESTRICTED: + errorText.setText(R.string.app_no_restricted_accounts); + break; + default: + // TODO: Get better message. See: http://b/14642886 + errorText.setText(R.string.error_message_title); + } + } } public void onCancelButtonClicked(View view) { diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl index 1373dc8..a04875d 100644 --- a/core/java/android/accounts/IAccountManager.aidl +++ b/core/java/android/accounts/IAccountManager.aidl @@ -38,6 +38,7 @@ interface IAccountManager { void getAccountsByFeatures(in IAccountManagerResponse response, String accountType, in String[] features); boolean addAccountExplicitly(in Account account, String password, in Bundle extras); void removeAccount(in IAccountManagerResponse response, in Account account); + void removeAccountAsUser(in IAccountManagerResponse response, in Account account, int userId); void invalidateAuthToken(String accountType, String authToken); String peekAuthToken(in Account account, String authTokenType); void setAuthToken(in Account account, String authTokenType, String authToken); @@ -52,6 +53,9 @@ interface IAccountManager { void addAccount(in IAccountManagerResponse response, String accountType, String authTokenType, in String[] requiredFeatures, boolean expectActivityLaunch, in Bundle options); + void addAccountAsUser(in IAccountManagerResponse response, String accountType, + String authTokenType, in String[] requiredFeatures, boolean expectActivityLaunch, + in Bundle options, int userId); void updateCredentials(in IAccountManagerResponse response, in Account account, String authTokenType, boolean expectActivityLaunch, in Bundle options); void editProperties(in IAccountManagerResponse response, String accountType, |