diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 766c036d521c6..7353cc0393c55 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -407,7 +407,7 @@ public class InfoMediaManager extends MediaManager { || sessionInfo.getVolumeHandling() != MediaRoute2Info.PLAYBACK_VOLUME_FIXED; } - private void refreshDevices() { + private synchronized void refreshDevices() { mMediaDevices.clear(); mCurrentConnectedDevice = null; if (TextUtils.isEmpty(mPackageName)) { @@ -437,7 +437,7 @@ public class InfoMediaManager extends MediaManager { return infos; } - private void buildAvailableRoutes() { + private synchronized void buildAvailableRoutes() { for (MediaRoute2Info route : getAvailableRoutes(mPackageName)) { if (DEBUG) { Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : " @@ -447,7 +447,7 @@ public class InfoMediaManager extends MediaManager { } } - private List getAvailableRoutes(String packageName) { + private synchronized List getAvailableRoutes(String packageName) { final List infos = new ArrayList<>(); RoutingSessionInfo routingSessionInfo = getRoutingSessionInfo(packageName); if (routingSessionInfo != null) { @@ -571,7 +571,7 @@ public class InfoMediaManager extends MediaManager { @Override public void onSessionUpdated(RoutingSessionInfo sessionInfo) { - dispatchDataChanged(); + refreshDevices(); } } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index f4af6e852580e..33fb91d2252c3 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -666,12 +666,22 @@ public class InfoMediaManagerTest { } @Test - public void onSessionUpdated_shouldDispatchDataChanged() { + public void onSessionUpdated_shouldDispatchDeviceListAdded() { + final MediaRoute2Info info = mock(MediaRoute2Info.class); + when(info.getId()).thenReturn(TEST_ID); + when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME); + when(info.isSystemRoute()).thenReturn(true); + + final List routes = new ArrayList<>(); + routes.add(info); + mShadowRouter2Manager.setAllRoutes(routes); + + mInfoMediaManager.mPackageName = ""; mInfoMediaManager.registerCallback(mCallback); mInfoMediaManager.mMediaRouterCallback.onSessionUpdated(mock(RoutingSessionInfo.class)); - verify(mCallback).onDeviceAttributesChanged(); + verify(mCallback).onDeviceListAdded(any()); } @Test diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index 837614eab43e9..f040e067bc6d9 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -133,6 +133,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, @VisibleForTesting LocalMediaManager mLocalMediaManager; private MediaOutputMetricLogger mMetricLogger; + private int mCurrentState; private int mColorItemContent; private int mColorSeekbarProgress; @@ -207,6 +208,9 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, if (TextUtils.equals(controller.getPackageName(), mPackageName)) { mMediaController = controller; mMediaController.unregisterCallback(mCb); + if (mMediaController.getPlaybackState() != null) { + mCurrentState = mMediaController.getPlaybackState().getState(); + } mMediaController.registerCallback(mCb); break; } @@ -985,10 +989,16 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, @Override public void onPlaybackStateChanged(PlaybackState playbackState) { - final int state = playbackState.getState(); - if (state == PlaybackState.STATE_STOPPED || state == PlaybackState.STATE_PAUSED) { + final int newState = + playbackState == null ? PlaybackState.STATE_STOPPED : playbackState.getState(); + if (mCurrentState == newState) { + return; + } + + if (newState == PlaybackState.STATE_STOPPED || newState == PlaybackState.STATE_PAUSED) { mCallback.onMediaStoppedOrPaused(); } + mCurrentState = newState; } };