[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
This commit is contained in:
shaoweishen
2022-08-24 09:01:51 +00:00
committed by Shaowei Shen
parent 4c31889176
commit eebc3a56bd
3 changed files with 28 additions and 8 deletions

View File

@@ -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<MediaRoute2Info> getAvailableRoutes(String packageName) {
private synchronized List<MediaRoute2Info> getAvailableRoutes(String packageName) {
final List<MediaRoute2Info> 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();
}
}
}

View File

@@ -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<MediaRoute2Info> 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

View File

@@ -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;
}
};