Merge "[ANR] Settings froze" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
dd356c5653
@@ -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,25 +82,29 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
|
|||||||
mContext.registerReceiver(mReceiver, intentFilter);
|
mContext.registerReceiver(mReceiver, intentFilter);
|
||||||
mLocalBluetoothManager.getEventManager().registerCallback(this);
|
mLocalBluetoothManager.getEventManager().registerCallback(this);
|
||||||
|
|
||||||
final MediaController controller = getActiveLocalMediaController();
|
ThreadUtils.postOnBackgroundThread(() -> {
|
||||||
if (controller == null) {
|
final MediaController controller = getActiveLocalMediaController();
|
||||||
mPackageName = null;
|
if (controller == null) {
|
||||||
} else {
|
mPackageName = null;
|
||||||
mPackageName = controller.getPackageName();
|
} else {
|
||||||
}
|
mPackageName = controller.getPackageName();
|
||||||
if (mLocalMediaManager == null || !TextUtils.equals(mPackageName,
|
}
|
||||||
mLocalMediaManager.getPackageName())) {
|
if (mLocalMediaManager == null || !TextUtils.equals(mPackageName,
|
||||||
mLocalMediaManager = new LocalMediaManager(mContext, mPackageName,
|
mLocalMediaManager.getPackageName())) {
|
||||||
null /* notification */);
|
mLocalMediaManager = new LocalMediaManager(mContext, mPackageName,
|
||||||
}
|
null /* notification */);
|
||||||
mLocalMediaManager.registerCallback(this);
|
}
|
||||||
mLocalMediaManager.startScan();
|
mLocalMediaManager.registerCallback(this);
|
||||||
|
mLocalMediaManager.startScan();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onSliceUnpinned() {
|
protected void onSliceUnpinned() {
|
||||||
mLocalMediaManager.unregisterCallback(this);
|
if (mLocalMediaManager != null) {
|
||||||
mLocalMediaManager.stopScan();
|
mLocalMediaManager.unregisterCallback(this);
|
||||||
|
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");
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user