summaryrefslogtreecommitdiffstats
path: root/services/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com')
-rw-r--r--services/java/com/android/server/accounts/AccountManagerService.java45
1 files changed, 43 insertions, 2 deletions
diff --git a/services/java/com/android/server/accounts/AccountManagerService.java b/services/java/com/android/server/accounts/AccountManagerService.java
index 5009793..eb144ab 100644
--- a/services/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/java/com/android/server/accounts/AccountManagerService.java
@@ -116,6 +116,7 @@ public class AccountManagerService
// Messages that can be sent on mHandler
private static final int MESSAGE_TIMED_OUT = 3;
+ private static final int MESSAGE_COPY_SHARED_ACCOUNT = 4;
private final IAccountAuthenticatorCache mAuthenticatorCache;
@@ -619,7 +620,17 @@ public class AccountManagerService
}
public void run() throws RemoteException {
- mAuthenticator.addAccountFromCredentials(this, account, result);
+ // Confirm that the owner's account still exists before this step.
+ UserAccounts owner = getUserAccounts(UserHandle.USER_OWNER);
+ synchronized (owner.cacheLock) {
+ Account[] ownerAccounts = getAccounts(UserHandle.USER_OWNER);
+ for (Account acc : ownerAccounts) {
+ if (acc.equals(account)) {
+ mAuthenticator.addAccountFromCredentials(this, account, result);
+ break;
+ }
+ }
+ }
}
public void onResult(Bundle result) {
@@ -692,7 +703,33 @@ public class AccountManagerService
db.endTransaction();
}
sendAccountsChangedBroadcast(accounts.userId);
- return true;
+ }
+ if (accounts.userId == UserHandle.USER_OWNER) {
+ addAccountToLimitedUsers(account);
+ }
+ return true;
+ }
+
+ /**
+ * Adds the account to all limited users as shared accounts. If the user is currently
+ * running, then clone the account too.
+ * @param account the account to share with limited users
+ */
+ private void addAccountToLimitedUsers(Account account) {
+ List<UserInfo> users = mUserManager.getUsers();
+ for (UserInfo user : users) {
+ if (user.isRestricted()) {
+ addSharedAccountAsUser(account, user.id);
+ try {
+ if (ActivityManagerNative.getDefault().isUserRunning(user.id, false)) {
+ mMessageHandler.sendMessage(mMessageHandler.obtainMessage(
+ MESSAGE_COPY_SHARED_ACCOUNT, UserHandle.USER_OWNER, user.id,
+ account));
+ }
+ } catch (RemoteException re) {
+ // Shouldn't happen
+ }
+ }
}
}
@@ -2161,6 +2198,10 @@ public class AccountManagerService
session.onTimedOut();
break;
+ case MESSAGE_COPY_SHARED_ACCOUNT:
+ copyAccountToUser((Account) msg.obj, msg.arg1, msg.arg2);
+ break;
+
default:
throw new IllegalStateException("unhandled message: " + msg.what);
}