Merge "Add ACTION_ACCOUNT_REMOVED to Account Manager." into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-14 03:53:48 +00:00
committed by Android (Google) Code Review
7 changed files with 37 additions and 5 deletions

View File

@ -2999,6 +2999,7 @@ package android.accounts {
method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
field public static final java.lang.String ACTION_ACCOUNT_REMOVED = "android.accounts.action.ACCOUNT_REMOVED";
field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator"; field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator";
field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator"; field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator"; field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator";

View File

@ -3123,6 +3123,7 @@ package android.accounts {
method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
field public static final java.lang.String ACTION_ACCOUNT_REMOVED = "android.accounts.action.ACCOUNT_REMOVED";
field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator"; field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator";
field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator"; field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator"; field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator";

View File

@ -2999,6 +2999,7 @@ package android.accounts {
method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> startAddAccountSession(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> startUpdateCredentialsSession(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler); method public android.accounts.AccountManagerFuture<android.os.Bundle> updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
field public static final java.lang.String ACTION_ACCOUNT_REMOVED = "android.accounts.action.ACCOUNT_REMOVED";
field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator"; field public static final java.lang.String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator";
field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator"; field public static final java.lang.String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator"; field public static final java.lang.String AUTHENTICATOR_META_DATA_NAME = "android.accounts.AccountAuthenticator";

View File

@ -335,6 +335,7 @@ public class AccountManager {
* are removed, or an account's credentials (saved password, etc) are changed. * are removed, or an account's credentials (saved password, etc) are changed.
* *
* @see #addOnAccountsUpdatedListener * @see #addOnAccountsUpdatedListener
* @see #ACTION_ACCOUNT_REMOVED
* *
* @deprecated use {@link #addOnAccountsUpdatedListener} to get account updates in runtime. * @deprecated use {@link #addOnAccountsUpdatedListener} to get account updates in runtime.
*/ */
@ -343,6 +344,14 @@ public class AccountManager {
public static final String LOGIN_ACCOUNTS_CHANGED_ACTION = public static final String LOGIN_ACCOUNTS_CHANGED_ACTION =
"android.accounts.LOGIN_ACCOUNTS_CHANGED"; "android.accounts.LOGIN_ACCOUNTS_CHANGED";
/**
* Action sent as a broadcast Intent by the AccountsService when any account is removed.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
@BroadcastBehavior(includeBackground = true)
public static final String ACTION_ACCOUNT_REMOVED =
"android.accounts.action.ACCOUNT_REMOVED";
/** /**
* Action sent as a broadcast Intent to specific package by the AccountsService * Action sent as a broadcast Intent to specific package by the AccountsService
* when account visibility or account's credentials (saved password, etc) are changed. * when account visibility or account's credentials (saved password, etc) are changed.

View File

@ -492,7 +492,9 @@
<protected-broadcast android:name="android.intent.action.ACTION_RADIO_OFF" /> <protected-broadcast android:name="android.intent.action.ACTION_RADIO_OFF" />
<protected-broadcast android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" /> <protected-broadcast android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
<protected-broadcast android:name="android.accounts.action.ACCOUNT_REMOVED" />
<protected-broadcast android:name="android.accounts.action.VISIBLE_ACCOUNTS_CHANGED" /> <protected-broadcast android:name="android.accounts.action.VISIBLE_ACCOUNTS_CHANGED" />
<protected-broadcast android:name="com.android.sync.SYNC_CONN_STATUS_CHANGED" /> <protected-broadcast android:name="com.android.sync.SYNC_CONN_STATUS_CHANGED" />
<protected-broadcast android:name="com.android.phone.SIP_INCOMING_CALL" /> <protected-broadcast android:name="com.android.phone.SIP_INCOMING_CALL" />

View File

@ -959,6 +959,12 @@ public class AccountManagerService
mContext.sendBroadcastAsUser(ACCOUNTS_CHANGED_INTENT, new UserHandle(userId)); mContext.sendBroadcastAsUser(ACCOUNTS_CHANGED_INTENT, new UserHandle(userId));
} }
private void sendAccountRemovedBroadcast(int userId) {
Intent intent = new Intent(AccountManager.ACTION_ACCOUNT_REMOVED);
intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
mContext.sendBroadcastAsUser(intent, new UserHandle(userId));
}
@Override @Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException { throws RemoteException {
@ -1111,6 +1117,7 @@ public class AccountManagerService
notifyPackage(packageToVisibility.getKey(), accounts); notifyPackage(packageToVisibility.getKey(), accounts);
} }
} }
sendAccountRemovedBroadcast(accounts.userId);
} else { } else {
ArrayList<String> accountNames = accountNamesByType.get(account.type); ArrayList<String> accountNames = accountNamesByType.get(account.type);
if (accountNames == null) { if (accountNames == null) {
@ -1971,6 +1978,7 @@ public class AccountManagerService
sendNotificationAccountUpdated(resultAccount, accounts); sendNotificationAccountUpdated(resultAccount, accounts);
sendAccountsChangedBroadcast(accounts.userId); sendAccountsChangedBroadcast(accounts.userId);
sendAccountRemovedBroadcast(accounts.userId);
} }
} }
return resultAccount; return resultAccount;
@ -2206,6 +2214,7 @@ public class AccountManagerService
// Only broadcast LOGIN_ACCOUNTS_CHANGED if a change occurred. // Only broadcast LOGIN_ACCOUNTS_CHANGED if a change occurred.
sendAccountsChangedBroadcast(accounts.userId); sendAccountsChangedBroadcast(accounts.userId);
sendAccountRemovedBroadcast(accounts.userId);
String action = userUnlocked ? AccountsDb.DEBUG_ACTION_ACCOUNT_REMOVE String action = userUnlocked ? AccountsDb.DEBUG_ACTION_ACCOUNT_REMOVE
: AccountsDb.DEBUG_ACTION_ACCOUNT_REMOVE_DE; : AccountsDb.DEBUG_ACTION_ACCOUNT_REMOVE_DE;
logRecord(action, AccountsDb.TABLE_ACCOUNTS, accountId, accounts); logRecord(action, AccountsDb.TABLE_ACCOUNTS, accountId, accounts);

View File

@ -117,6 +117,7 @@ public class AccountManagerServiceTest extends AndroidTestCase {
@Captor private ArgumentCaptor<Bundle> mBundleCaptor; @Captor private ArgumentCaptor<Bundle> mBundleCaptor;
private int mVisibleAccountsChangedBroadcasts; private int mVisibleAccountsChangedBroadcasts;
private int mLoginAccountsChangedBroadcasts; private int mLoginAccountsChangedBroadcasts;
private int mAccountRemovedBroadcasts;
private static final int LATCH_TIMEOUT_MS = 500; private static final int LATCH_TIMEOUT_MS = 500;
private static final String PREN_DB = "pren.db"; private static final String PREN_DB = "pren.db";
@ -2510,6 +2511,7 @@ public class AccountManagerServiceTest extends AndroidTestCase {
updateBroadcastCounters(2); updateBroadcastCounters(2);
assertEquals(mVisibleAccountsChangedBroadcasts, 0); // broadcast was not sent assertEquals(mVisibleAccountsChangedBroadcasts, 0); // broadcast was not sent
assertEquals(mLoginAccountsChangedBroadcasts, 2); assertEquals(mLoginAccountsChangedBroadcasts, 2);
assertEquals(mAccountRemovedBroadcasts, 0);
} }
@SmallTest @SmallTest
@ -2533,9 +2535,10 @@ public class AccountManagerServiceTest extends AndroidTestCase {
mAms.registerAccountListener( null /* accountTypes */, "testpackage"); mAms.registerAccountListener( null /* accountTypes */, "testpackage");
mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_INTERVENE); mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_INTERVENE);
updateBroadcastCounters(6); updateBroadcastCounters(8);
assertEquals(mVisibleAccountsChangedBroadcasts, 2); assertEquals(mVisibleAccountsChangedBroadcasts, 2);
assertEquals(mLoginAccountsChangedBroadcasts, 4); assertEquals(mLoginAccountsChangedBroadcasts, 4);
assertEquals(mAccountRemovedBroadcasts, 2);
} }
@SmallTest @SmallTest
@ -2560,17 +2563,19 @@ public class AccountManagerServiceTest extends AndroidTestCase {
"testpackage3"); // opPackageName "testpackage3"); // opPackageName
// Remove account with 2 active listeners. // Remove account with 2 active listeners.
mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS); mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS);
updateBroadcastCounters(7); updateBroadcastCounters(8);
assertEquals(mVisibleAccountsChangedBroadcasts, 5); assertEquals(mVisibleAccountsChangedBroadcasts, 5);
assertEquals(mLoginAccountsChangedBroadcasts, 2); // 3 add, 2 remove assertEquals(mLoginAccountsChangedBroadcasts, 2); // 3 add, 2 remove
assertEquals(mAccountRemovedBroadcasts, 1);
// Add account of another type. // Add account of another type.
mAms.addAccountExplicitly( mAms.addAccountExplicitly(
AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS_TYPE_2, "p11", null); AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS_TYPE_2, "p11", null);
updateBroadcastCounters(8); updateBroadcastCounters(9);
assertEquals(mVisibleAccountsChangedBroadcasts, 5); assertEquals(mVisibleAccountsChangedBroadcasts, 5);
assertEquals(mLoginAccountsChangedBroadcasts, 3); assertEquals(mLoginAccountsChangedBroadcasts, 3);
assertEquals(mAccountRemovedBroadcasts, 1);
} }
@SmallTest @SmallTest
@ -2602,16 +2607,20 @@ public class AccountManagerServiceTest extends AndroidTestCase {
private void updateBroadcastCounters (int expectedBroadcasts){ private void updateBroadcastCounters (int expectedBroadcasts){
mVisibleAccountsChangedBroadcasts = 0; mVisibleAccountsChangedBroadcasts = 0;
mLoginAccountsChangedBroadcasts = 0; mLoginAccountsChangedBroadcasts = 0;
mAccountRemovedBroadcasts = 0;
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
verify(mMockContext, times(expectedBroadcasts)).sendBroadcastAsUser(captor.capture(), verify(mMockContext, times(expectedBroadcasts)).sendBroadcastAsUser(captor.capture(),
any(UserHandle.class)); any(UserHandle.class));
for (Intent intent : captor.getAllValues()) { for (Intent intent : captor.getAllValues()) {
if (AccountManager.ACTION_VISIBLE_ACCOUNTS_CHANGED. equals(intent.getAction())) { if (AccountManager.ACTION_VISIBLE_ACCOUNTS_CHANGED.equals(intent.getAction())) {
mVisibleAccountsChangedBroadcasts++; mVisibleAccountsChangedBroadcasts++;
} }
if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION. equals(intent.getAction())) { if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(intent.getAction())) {
mLoginAccountsChangedBroadcasts++; mLoginAccountsChangedBroadcasts++;
} }
if (AccountManager.ACTION_ACCOUNT_REMOVED.equals(intent.getAction())) {
mAccountRemovedBroadcasts++;
}
} }
} }