diff options
| -rw-r--r-- | services/core/java/com/android/server/accounts/AccountManagerService.java | 5 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java | 39 | 
2 files changed, 44 insertions, 0 deletions
| diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 586b09517e92..603a95c31e5b 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -897,6 +897,11 @@ public class AccountManagerService                          }                      }                      for (String packageNameToNotify : accountRemovedReceivers) { +                        int currentVisibility = +                                resolveAccountVisibility(account, packageNameToNotify, accounts); +                        if (isVisible(currentVisibility)) { +                            continue; +                        }                          sendAccountRemovedBroadcast(                                  account,                                  packageNameToNotify, diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java index e0a99b016da9..e18909879934 100644 --- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java @@ -3156,6 +3156,39 @@ public class AccountManagerServiceTest extends AndroidTestCase {      }      @SmallTest +    public void testAccountRemovedBroadcastMarkedAccountAsVisibleTwice() throws Exception { +        unlockSystemUser(); + +        HashMap<String, Integer> visibility = new HashMap<>(); +        visibility.put("testpackage1", AccountManager.VISIBILITY_USER_MANAGED_VISIBLE); + +        addAccountRemovedReceiver("testpackage1"); +        mAms.registerAccountListener( +                new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1}, +                "testpackage1"); +        mAms.addAccountExplicitlyWithVisibility( +                AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, +                /* password= */ "p11", +                /* extras= */ null, +                visibility, +                /* callerPackage= */ null); + +        updateBroadcastCounters(2); +        assertEquals(mVisibleAccountsChangedBroadcasts, 1); +        assertEquals(mLoginAccountsChangedBroadcasts, 1); +        assertEquals(mAccountRemovedBroadcasts, 0); + +        mAms.setAccountVisibility(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, +                "testpackage1", +                AccountManager.VISIBILITY_VISIBLE); + +        updateBroadcastCounters(3); +        assertEquals(mVisibleAccountsChangedBroadcasts, 1); // visibility was not changed +        assertEquals(mLoginAccountsChangedBroadcasts, 2); +        assertEquals(mAccountRemovedBroadcasts, 0); +    } + +    @SmallTest      public void testRegisterAccountListenerCredentialsUpdate() throws Exception {          unlockSystemUser();          mAms.registerAccountListener( @@ -3493,6 +3526,12 @@ public class AccountManagerServiceTest extends AndroidTestCase {          }          @Override +        public boolean bindServiceAsUser(Intent service, ServiceConnection conn, +                Context.BindServiceFlags flags, UserHandle user) { +            return mTestContext.bindServiceAsUser(service, conn, flags, user); +        } + +        @Override          public void unbindService(ServiceConnection conn) {              mTestContext.unbindService(conn);          } |