summaryrefslogtreecommitdiffstats
path: root/core/java/android/accounts
diff options
context:
space:
mode:
authorAlexandra Gherghina <alexgherghina@google.com>2014-07-03 11:40:08 +0100
committerAlexandra Gherghina <alexgherghina@google.com>2014-07-17 17:08:49 +0000
commit999d394adee533c55fce38bd632ffd4f1af91362 (patch)
treed53e3c50e09778874f11407d92be5d376b1c9fe7 /core/java/android/accounts
parent3f4f2fbcd0557e32464e393cb9acc28c2328614e (diff)
downloadframeworks_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')
-rw-r--r--core/java/android/accounts/AccountManager.java65
-rw-r--r--core/java/android/accounts/AccountManagerFuture.java3
-rw-r--r--core/java/android/accounts/CantAddAccountActivity.java16
-rw-r--r--core/java/android/accounts/IAccountManager.aidl4
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,