Merge "[ANR] Settings froze" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-05-29 06:37:53 +00:00
committed by Android (Google) Code Review
2 changed files with 51 additions and 15 deletions

View File

@@ -38,6 +38,7 @@ import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice; import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.utils.ThreadUtils;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
@@ -81,6 +82,7 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
mContext.registerReceiver(mReceiver, intentFilter); mContext.registerReceiver(mReceiver, intentFilter);
mLocalBluetoothManager.getEventManager().registerCallback(this); mLocalBluetoothManager.getEventManager().registerCallback(this);
ThreadUtils.postOnBackgroundThread(() -> {
final MediaController controller = getActiveLocalMediaController(); final MediaController controller = getActiveLocalMediaController();
if (controller == null) { if (controller == null) {
mPackageName = null; mPackageName = null;
@@ -94,12 +96,15 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
} }
mLocalMediaManager.registerCallback(this); mLocalMediaManager.registerCallback(this);
mLocalMediaManager.startScan(); mLocalMediaManager.startScan();
});
} }
@Override @Override
protected void onSliceUnpinned() { protected void onSliceUnpinned() {
if (mLocalMediaManager != null) {
mLocalMediaManager.unregisterCallback(this); mLocalMediaManager.unregisterCallback(this);
mLocalMediaManager.stopScan(); mLocalMediaManager.stopScan();
}
if (mLocalBluetoothManager == null) { if (mLocalBluetoothManager == null) {
Log.e(TAG, "Bluetooth is not supported on this device"); Log.e(TAG, "Bluetooth is not supported on this device");

View File

@@ -103,7 +103,13 @@ public class MediaOutputIndicatorWorkerTest {
@Test @Test
public void onSlicePinned_registerCallback() { public void onSlicePinned_registerCallback() {
mMediaOutputIndicatorWorker.mLocalMediaManager = mLocalMediaManager; 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(); mMediaOutputIndicatorWorker.onSlicePinned();
waitForLocalMediaManagerInit();
verify(mBluetoothEventManager).registerCallback(mMediaOutputIndicatorWorker); verify(mBluetoothEventManager).registerCallback(mMediaOutputIndicatorWorker);
verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
@@ -119,11 +125,14 @@ public class MediaOutputIndicatorWorkerTest {
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME); when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
mMediaOutputIndicatorWorker.onSlicePinned(); mMediaOutputIndicatorWorker.onSlicePinned();
waitForLocalMediaManagerInit();
assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).matches( assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).matches(
TEST_PACKAGE_NAME); TEST_PACKAGE_NAME);
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME2); when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME2);
mMediaOutputIndicatorWorker.mLocalMediaManager = null;
mMediaOutputIndicatorWorker.onSlicePinned(); mMediaOutputIndicatorWorker.onSlicePinned();
waitForLocalMediaManagerInit();
assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).matches( assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).matches(
TEST_PACKAGE_NAME2); TEST_PACKAGE_NAME2);
@@ -134,14 +143,35 @@ public class MediaOutputIndicatorWorkerTest {
mMediaControllers.clear(); mMediaControllers.clear();
mMediaOutputIndicatorWorker.onSlicePinned(); mMediaOutputIndicatorWorker.onSlicePinned();
waitForLocalMediaManagerInit();
assertThat(mMediaOutputIndicatorWorker.mLocalMediaManager.getPackageName()).isNull(); 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 @Test
public void onSliceUnpinned_unRegisterCallback() { public void onSliceUnpinned_unRegisterCallback() {
mMediaOutputIndicatorWorker.mLocalMediaManager = mLocalMediaManager; 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(); mMediaOutputIndicatorWorker.onSlicePinned();
waitForLocalMediaManagerInit();
mMediaOutputIndicatorWorker.onSliceUnpinned(); mMediaOutputIndicatorWorker.onSliceUnpinned();
verify(mBluetoothEventManager).unregisterCallback(mMediaOutputIndicatorWorker); verify(mBluetoothEventManager).unregisterCallback(mMediaOutputIndicatorWorker);
@@ -153,6 +183,7 @@ public class MediaOutputIndicatorWorkerTest {
@Test @Test
public void onReceive_shouldNotifyChange() { public void onReceive_shouldNotifyChange() {
mMediaOutputIndicatorWorker.onSlicePinned(); mMediaOutputIndicatorWorker.onSlicePinned();
waitForLocalMediaManagerInit();
// onSlicePinned will registerCallback() and get first callback. Callback triggers this at // onSlicePinned will registerCallback() and get first callback. Callback triggers this at
// the first time. // the first time.
verify(mResolver, times(1)).notifyChange(URI, null); verify(mResolver, times(1)).notifyChange(URI, null);