Ads per-user APIs to manage accounts through the AccountManager
Bug: 16056552
Bug: 14642886
Change-Id: I17ff6c2515285e63c84cecf2f861d10666c393c5
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 @@
/** @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 @@
* @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 @@
}
/**
+ * @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 @@
* <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 @@
}
/**
+ * @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 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 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;
}