Merge "Include all accounts in dumpsys." into jb-mr1-dev

This commit is contained in:
Jeff Sharkey
2012-10-10 14:29:31 -07:00
committed by Android (Google) Code Review
2 changed files with 57 additions and 18 deletions

View File

@@ -35,6 +35,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.RegisteredServicesCache; import android.content.pm.RegisteredServicesCache;
import android.content.pm.RegisteredServicesCacheListener; import android.content.pm.RegisteredServicesCacheListener;
import android.content.pm.UserInfo;
import android.database.Cursor; import android.database.Cursor;
import android.database.DatabaseUtils; import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
@@ -54,6 +55,7 @@ import android.os.UserManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import com.android.internal.R; import com.android.internal.R;
@@ -70,6 +72,7 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@@ -261,8 +264,7 @@ public class AccountManagerService
accounts = new UserAccounts(mContext, userId); accounts = new UserAccounts(mContext, userId);
mUsers.append(userId, accounts); mUsers.append(userId, accounts);
purgeOldGrants(accounts); purgeOldGrants(accounts);
mAuthenticatorCache.invalidateCache(accounts.userId); validateAccountsInternal(accounts, true /* invalidateAuthenticatorCache */);
validateAccountsAndPopulateCache(accounts);
} }
return accounts; return accounts;
} }
@@ -300,7 +302,28 @@ public class AccountManagerService
} }
} }
private void validateAccountsAndPopulateCache(UserAccounts accounts) { /**
* Validate internal set of accounts against installed authenticators for
* given user. Clears cached authenticators before validating.
*/
public void validateAccounts(int userId) {
final UserAccounts accounts = getUserAccounts(userId);
// Invalidate user-specific cache to make sure we catch any
// removed authenticators.
validateAccountsInternal(accounts, true /* invalidateAuthenticatorCache */);
}
/**
* Validate internal set of accounts against installed authenticators for
* given user. Clear cached authenticators before validating when requested.
*/
private void validateAccountsInternal(
UserAccounts accounts, boolean invalidateAuthenticatorCache) {
if (invalidateAuthenticatorCache) {
mAuthenticatorCache.invalidateCache(accounts.userId);
}
final HashSet<AuthenticatorDescription> knownAuth = Sets.newHashSet(); final HashSet<AuthenticatorDescription> knownAuth = Sets.newHashSet();
for (RegisteredServicesCache.ServiceInfo<AuthenticatorDescription> service : for (RegisteredServicesCache.ServiceInfo<AuthenticatorDescription> service :
mAuthenticatorCache.getAllServices(accounts.userId)) { mAuthenticatorCache.getAllServices(accounts.userId)) {
@@ -323,7 +346,7 @@ public class AccountManagerService
final String accountName = cursor.getString(2); final String accountName = cursor.getString(2);
if (!knownAuth.contains(AuthenticatorDescription.newKey(accountType))) { if (!knownAuth.contains(AuthenticatorDescription.newKey(accountType))) {
Log.d(TAG, "deleting account " + accountName + " because type " Slog.w(TAG, "deleting account " + accountName + " because type "
+ accountType + " no longer has a registered authenticator"); + accountType + " no longer has a registered authenticator");
db.delete(TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null); db.delete(TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null);
accountDeleted = true; accountDeleted = true;
@@ -399,7 +422,8 @@ public class AccountManagerService
@Override @Override
public void onServiceChanged(AuthenticatorDescription desc, int userId, boolean removed) { public void onServiceChanged(AuthenticatorDescription desc, int userId, boolean removed) {
validateAccountsAndPopulateCache(getUserAccounts(userId)); Slog.d(TAG, "onServiceChanged() for userId " + userId);
validateAccountsInternal(getUserAccounts(userId), false /* invalidateAuthenticatorCache */);
} }
public String getPassword(Account account) { public String getPassword(Account account) {
@@ -1493,10 +1517,23 @@ public class AccountManagerService
// Running in system_server; should never happen // Running in system_server; should never happen
throw new RuntimeException(e); throw new RuntimeException(e);
} }
return getAccounts(runningUserIds);
}
/** {@hide} */
public AccountAndUser[] getAllAccounts() {
final List<UserInfo> users = getUserManager().getUsers();
final int[] userIds = new int[users.size()];
for (int i = 0; i < userIds.length; i++) {
userIds[i] = users.get(i).id;
}
return getAccounts(userIds);
}
private AccountAndUser[] getAccounts(int[] userIds) {
final ArrayList<AccountAndUser> runningAccounts = Lists.newArrayList(); final ArrayList<AccountAndUser> runningAccounts = Lists.newArrayList();
synchronized (mUsers) { synchronized (mUsers) {
for (int userId : runningUserIds) { for (int userId : userIds) {
UserAccounts userAccounts = getUserAccounts(userId); UserAccounts userAccounts = getUserAccounts(userId);
if (userAccounts == null) continue; if (userAccounts == null) continue;
synchronized (userAccounts.cacheLock) { synchronized (userAccounts.cacheLock) {
@@ -2006,6 +2043,7 @@ public class AccountManagerService
return false; return false;
} }
@Override
protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
!= PackageManager.PERMISSION_GRANTED) { != PackageManager.PERMISSION_GRANTED) {
@@ -2015,17 +2053,15 @@ public class AccountManagerService
return; return;
} }
final boolean isCheckinRequest = scanArgs(args, "--checkin") || scanArgs(args, "-c"); final boolean isCheckinRequest = scanArgs(args, "--checkin") || scanArgs(args, "-c");
final IndentingPrintWriter ipw = new IndentingPrintWriter(fout, " ");
fout = new IndentingPrintWriter(fout, " "); final List<UserInfo> users = getUserManager().getUsers();
int size = mUsers.size(); for (UserInfo user : users) {
for (int i = 0; i < size; i++) { ipw.println("User " + user + ":");
fout.println("User " + mUsers.keyAt(i) + ":"); ipw.increaseIndent();
((IndentingPrintWriter) fout).increaseIndent(); dumpUser(getUserAccounts(user.id), fd, ipw, args, isCheckinRequest);
dumpUser(mUsers.valueAt(i), fd, fout, args, isCheckinRequest); ipw.println();
((IndentingPrintWriter) fout).decreaseIndent(); ipw.decreaseIndent();
if (i < size - 1) {
fout.println();
}
} }
} }

View File

@@ -889,6 +889,9 @@ public class SyncManager {
} }
private void onUserStarting(int userId) { private void onUserStarting(int userId) {
// Make sure that accounts we're about to use are valid
AccountManagerService.getSingleton().validateAccounts(userId);
mSyncAdapters.invalidateCache(userId); mSyncAdapters.invalidateCache(userId);
updateRunningAccounts(); updateRunningAccounts();
@@ -1078,9 +1081,9 @@ public class SyncManager {
} }
pw.print("memory low: "); pw.println(mStorageIsLow); pw.print("memory low: "); pw.println(mStorageIsLow);
final AccountAndUser[] accounts = mRunningAccounts; final AccountAndUser[] accounts = AccountManagerService.getSingleton().getAllAccounts();
pw.print("running accounts: "); pw.print("accounts: ");
if (accounts != INITIAL_ACCOUNTS_ARRAY) { if (accounts != INITIAL_ACCOUNTS_ARRAY) {
pw.println(accounts.length); pw.println(accounts.length);
} else { } else {