From eebc3a56bdadabfcb87f2f740e68dc302b04025f Mon Sep 17 00:00:00 2001 From: shaoweishen Date: Wed, 24 Aug 2022 09:01:51 +0000 Subject: [PATCH] [Output Switcher] Improvement for seekbar volume control 1. dispatchDataChanged will not build devices again, we need to do that to update volume quicker. 2. dismiss dialog only when Media change to pause or stop. Bug: 243759774 Test: verified on device Change-Id: I9b93c7e21c899f011418ee51cec3be08c30004fa --- .../settingslib/media/InfoMediaManager.java | 8 ++++---- .../settingslib/media/InfoMediaManagerTest.java | 14 ++++++++++++-- .../media/dialog/MediaOutputController.java | 14 ++++++++++++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index a72f311e55edb..58c15eb8073cb 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -422,7 +422,7 @@ public class InfoMediaManager extends MediaManager { || sessionInfo.getSelectedRoutes().size() <= 1; } - private void refreshDevices() { + private synchronized void refreshDevices() { mMediaDevices.clear(); mCurrentConnectedDevice = null; if (TextUtils.isEmpty(mPackageName)) { @@ -452,7 +452,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 : " @@ -462,7 +462,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) { @@ -596,7 +596,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 ee7b7d6b180ff..d04d85a708588 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 8dd843a6f9218..6b8a9997edcdb 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; @@ -204,6 +205,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; } @@ -994,10 +998,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; } };