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

Commit 0989586c authored by Tim Peng's avatar Tim Peng Committed by Hugh Chen
Browse files

[ANR] Settings froze

-To handle getActiveLocalMediaController() in a background thread
-To update test cases for waiting LocalMediaManager initial in
 background thread

Bug: 157522889
Test: make -j42 RunSettingsRoboTests
Change-Id: I27cd282a89ac9cfb6a098843f7282d5b94d98402
parent 946e3ade
Loading
Loading
Loading
Loading
+20 −15
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.utils.ThreadUtils;

import com.google.common.annotations.VisibleForTesting;

@@ -81,6 +82,7 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
        mContext.registerReceiver(mReceiver, intentFilter);
        mLocalBluetoothManager.getEventManager().registerCallback(this);

        ThreadUtils.postOnBackgroundThread(() -> {
            final MediaController controller = getActiveLocalMediaController();
            if (controller == null) {
                mPackageName = null;
@@ -94,12 +96,15 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
            }
            mLocalMediaManager.registerCallback(this);
            mLocalMediaManager.startScan();
        });
    }

    @Override
    protected void onSliceUnpinned() {
        if (mLocalMediaManager != null) {
            mLocalMediaManager.unregisterCallback(this);
            mLocalMediaManager.stopScan();
        }

        if (mLocalBluetoothManager == null) {
            Log.e(TAG, "Bluetooth is not supported on this device");
+31 −0
Original line number Diff line number Diff line
@@ -103,7 +103,13 @@ public class MediaOutputIndicatorWorkerTest {
    @Test
    public void onSlicePinned_registerCallback() {
        mMediaOutputIndicatorWorker.mLocalMediaManager = mLocalMediaManager;
        initPlayback();
        when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo);
        when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState);
        when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
        when(mLocalMediaManager.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
        mMediaOutputIndicatorWorker.onSlicePinned();
        waitForLocalMediaManagerInit();

        verify(mBluetoothEventManager).registerCallback(mMediaOutputIndicatorWorker);
        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
@@ -119,11 +125,14 @@ public class MediaOutputIndicatorWorkerTest {
        when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);

        mMediaOutputIndicatorWorker.onSlicePinned();
        waitForLocalMediaManagerInit();
        assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).matches(
                TEST_PACKAGE_NAME);

        when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME2);
        mMediaOutputIndicatorWorker.mLocalMediaManager = null;
        mMediaOutputIndicatorWorker.onSlicePinned();
        waitForLocalMediaManagerInit();

        assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).matches(
                TEST_PACKAGE_NAME2);
@@ -134,14 +143,35 @@ public class MediaOutputIndicatorWorkerTest {
        mMediaControllers.clear();

        mMediaOutputIndicatorWorker.onSlicePinned();
        waitForLocalMediaManagerInit();

        assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).isNull();
    }

    private void waitForLocalMediaManagerInit() {
        for (int i = 0; i < 20; i++) {
            if (mMediaOutputIndicatorWorker.mLocalMediaManager != null) {
                return;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void onSliceUnpinned_unRegisterCallback() {
        mMediaOutputIndicatorWorker.mLocalMediaManager = mLocalMediaManager;
        initPlayback();
        when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo);
        when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState);
        when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
        when(mLocalMediaManager.getPackageName()).thenReturn(TEST_PACKAGE_NAME);

        mMediaOutputIndicatorWorker.onSlicePinned();
        waitForLocalMediaManagerInit();
        mMediaOutputIndicatorWorker.onSliceUnpinned();

        verify(mBluetoothEventManager).unregisterCallback(mMediaOutputIndicatorWorker);
@@ -153,6 +183,7 @@ public class MediaOutputIndicatorWorkerTest {
    @Test
    public void onReceive_shouldNotifyChange() {
        mMediaOutputIndicatorWorker.onSlicePinned();
        waitForLocalMediaManagerInit();
        // onSlicePinned will registerCallback() and get first callback. Callback triggers this at
        // the first time.
        verify(mResolver, times(1)).notifyChange(URI, null);