Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2d48355 authored by Tony Mak's avatar Tony Mak
Browse files

Handle USER_REMOVED action in DefaultDialerCache

When a user is removed, its entry sticks around in the dialer cache.
This causes a lot of logspam during CTS. This change removes a user from
the default dialer cache when its USER_REMOVED broadcast is sent.

Change-Id: I4c86957fae21e37b213bbf13d26c21df74d85b0a
Fixes: 38161359
Test: manual and unit
parent a8478233
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -91,6 +91,22 @@ public class DefaultDialerCache {
        }
    };

    private final BroadcastReceiver mUserRemovedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_USER_REMOVED.equals(intent.getAction())) {
                int removedUser = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
                    UserHandle.USER_NULL);
                if (removedUser == UserHandle.USER_NULL) {
                    Log.w(LOG_TAG, "Expected EXTRA_USER_HANDLE with ACTION_USER_REMOVED");
                } else {
                    removeUserFromCache(removedUser);
                    Log.i(LOG_TAG, "Removing user %s", removedUser);
                }
            }
        }
    };

    private final Handler mHandler = new Handler(Looper.getMainLooper());
    private final ContentObserver mDefaultDialerObserver = new ContentObserver(mHandler) {
        @Override
@@ -137,6 +153,8 @@ public class DefaultDialerCache {
        IntentFilter bootIntentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
        context.registerReceiverAsUser(mReceiver, UserHandle.ALL, bootIntentFilter, null, null);

        IntentFilter userRemovedFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
        context.registerReceiver(mUserRemovedReceiver, userRemovedFilter);

        Uri defaultDialerSetting =
                Settings.Secure.getUriFor(Settings.Secure.DIALER_DEFAULT_APPLICATION);
@@ -221,6 +239,12 @@ public class DefaultDialerCache {
        }
    }

    private void removeUserFromCache(int userId) {
        synchronized (mLock) {
            mCurrentDefaultDialerPerUser.remove(userId);
        }
    }

    /**
     * registerContentObserver is really hard to mock out, so here is a getter method for the
     * content observer for testing instead.
+29 −3
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ public class DefaultDialerCacheTest extends TelecomTestCase {
    private DefaultDialerCache mDefaultDialerCache;
    private ContentObserver mDefaultDialerSettingObserver;
    private BroadcastReceiver mPackageChangeReceiver;
    private BroadcastReceiver mUserRemovedReceiver;

    @Mock private DefaultDialerCache.DefaultDialerManagerAdapter mMockDefaultDialerManager;

@@ -58,17 +59,24 @@ public class DefaultDialerCacheTest extends TelecomTestCase {
        super.setUp();
        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();

        ArgumentCaptor<BroadcastReceiver> receiverCaptor =
        ArgumentCaptor<BroadcastReceiver> packageReceiverCaptor =
                ArgumentCaptor.forClass(BroadcastReceiver.class);

        mDefaultDialerCache = new DefaultDialerCache(
                mContext, mMockDefaultDialerManager, new TelecomSystem.SyncRoot() { });

        verify(mContext, times(2)).registerReceiverAsUser(
                receiverCaptor.capture(), eq(UserHandle.ALL), any(IntentFilter.class),
            packageReceiverCaptor.capture(), eq(UserHandle.ALL), any(IntentFilter.class),
                isNull(String.class), isNull(Handler.class));
        // Receive the first receiver that was captured, the package change receiver.
        mPackageChangeReceiver = receiverCaptor.getAllValues().get(0);
        mPackageChangeReceiver = packageReceiverCaptor.getAllValues().get(0);

        ArgumentCaptor<BroadcastReceiver> userRemovedReceiverCaptor =
            ArgumentCaptor.forClass(BroadcastReceiver.class);
        verify(mContext).registerReceiver(
            userRemovedReceiverCaptor.capture(), any(IntentFilter.class));
        mUserRemovedReceiver = userRemovedReceiverCaptor.getAllValues().get(0);

        mDefaultDialerSettingObserver = mDefaultDialerCache.getContentObserver();

        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
@@ -137,6 +145,24 @@ public class DefaultDialerCacheTest extends TelecomTestCase {
                .getDefaultDialerApplication(any(Context.class), eq(USER2));
    }

    @SmallTest
    public void testUserRemoved() {
        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);

        Intent userRemovalIntent = new Intent(Intent.ACTION_USER_REMOVED);
        userRemovalIntent.putExtra(Intent.EXTRA_USER_HANDLE, USER0);
        mUserRemovedReceiver.onReceive(mContext, userRemovalIntent);

        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);

        verify(mMockDefaultDialerManager, times(2))
                .getDefaultDialerApplication(any(Context.class), eq(USER0));
        verify(mMockDefaultDialerManager, times(1))
                .getDefaultDialerApplication(any(Context.class), eq(USER1));
    }

    @SmallTest
    public void testPackageRemovedWithoutReplace() {
        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);