Loading packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +35 −27 Original line number Diff line number Diff line Loading @@ -127,7 +127,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, private final ActivityStarter mActivityStarter; private final DialogLaunchAnimator mDialogLaunchAnimator; private final CommonNotifCollection mNotifCollection; private final Object mMediaDevicesLock = new Object(); protected final Object mMediaDevicesLock = new Object(); @VisibleForTesting final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>(); final List<MediaDevice> mCachedMediaDevices = new CopyOnWriteArrayList<>(); Loading Loading @@ -222,7 +222,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, R.dimen.media_output_dialog_selectable_margin_end); } void start(@NonNull Callback cb) { protected void start(@NonNull Callback cb) { synchronized (mMediaDevicesLock) { mCachedMediaDevices.clear(); mMediaItemList.clear(); Loading Loading @@ -256,15 +256,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return false; } boolean isRefreshing() { public boolean isRefreshing() { return mIsRefreshing; } void setRefreshing(boolean refreshing) { public void setRefreshing(boolean refreshing) { mIsRefreshing = refreshing; } void stop() { protected void stop() { if (mMediaController != null) { mMediaController.unregisterCallback(mCb); } Loading Loading @@ -551,7 +551,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } } void refreshDataSetIfNeeded() { public void refreshDataSetIfNeeded() { if (mNeedRefresh) { buildMediaItems(mCachedMediaDevices); mCallback.onDeviceListChanged(); Loading Loading @@ -604,6 +604,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } private void buildMediaItems(List<MediaDevice> devices) { synchronized (mMediaDevicesLock) { List<MediaItem> updatedMediaItems = buildMediaItems(mMediaItemList, devices); mMediaItemList.clear(); mMediaItemList.addAll(updatedMediaItems); } } protected List<MediaItem> buildMediaItems(List<MediaItem> oldMediaItems, List<MediaDevice> devices) { synchronized (mMediaDevicesLock) { if (!mLocalMediaManager.isPreferenceRouteListingExist()) { attachRangeInfo(devices); Loading @@ -616,22 +625,20 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, final MediaDevice connectedMediaDevice = needToHandleMutingExpectedDevice ? null : getCurrentConnectedMediaDevice(); if (mMediaItemList.isEmpty()) { if (oldMediaItems.isEmpty()) { if (connectedMediaDevice == null) { if (DEBUG) { Log.d(TAG, "No connected media device or muting expected device exist."); } categorizeMediaItems(null, devices, needToHandleMutingExpectedDevice); return; return categorizeMediaItems(null, devices, needToHandleMutingExpectedDevice); } // selected device exist categorizeMediaItems(connectedMediaDevice, devices, false); return; return categorizeMediaItems(connectedMediaDevice, devices, false); } // To keep the same list order final List<MediaDevice> targetMediaDevices = new ArrayList<>(); final Map<Integer, MediaItem> dividerItems = new HashMap<>(); for (MediaItem originalMediaItem : mMediaItemList) { for (MediaItem originalMediaItem : oldMediaItems) { for (MediaDevice newDevice : devices) { if (originalMediaItem.getMediaDevice().isPresent() && TextUtils.equals(originalMediaItem.getMediaDevice().get().getId(), Loading @@ -642,7 +649,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } if (originalMediaItem.getMediaItemType() == MediaItem.MediaItemType.TYPE_GROUP_DIVIDER) { dividerItems.put(mMediaItemList.indexOf(originalMediaItem), originalMediaItem); dividerItems.put(oldMediaItems.indexOf(originalMediaItem), originalMediaItem); } } if (targetMediaDevices.size() != devices.size()) { Loading @@ -651,16 +658,18 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } List<MediaItem> finalMediaItems = targetMediaDevices.stream().map( MediaItem::new).collect(Collectors.toList()); dividerItems.forEach((key, item) -> { finalMediaItems.add(key, item); }); dividerItems.forEach(finalMediaItems::add); attachConnectNewDeviceItemIfNeeded(finalMediaItems); mMediaItemList.clear(); mMediaItemList.addAll(finalMediaItems); return finalMediaItems; } } private void categorizeMediaItems(MediaDevice connectedMediaDevice, List<MediaDevice> devices, /** * Initial categorization of current devices, will not be called for updates to the devices * list. */ private List<MediaItem> categorizeMediaItems(MediaDevice connectedMediaDevice, List<MediaDevice> devices, boolean needToHandleMutingExpectedDevice) { synchronized (mMediaDevicesLock) { List<MediaItem> finalMediaItems = new ArrayList<>(); Loading Loading @@ -691,8 +700,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } } attachConnectNewDeviceItemIfNeeded(finalMediaItems); mMediaItemList.clear(); mMediaItemList.addAll(finalMediaItems); return finalMediaItems; } } Loading Loading @@ -765,7 +773,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, mGroupMediaDevices.clear(); } void connectDevice(MediaDevice device) { protected void connectDevice(MediaDevice device) { mMetricLogger.updateOutputEndPoints(getCurrentConnectedMediaDevice(), device); ThreadUtils.postOnBackgroundThread(() -> { Loading @@ -777,7 +785,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return mMediaItemList; } MediaDevice getCurrentConnectedMediaDevice() { public MediaDevice getCurrentConnectedMediaDevice() { return mLocalMediaManager.getCurrentConnectedDevice(); } Loading @@ -794,7 +802,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return mLocalMediaManager.getSelectableMediaDevice(); } List<MediaDevice> getSelectedMediaDevice() { public List<MediaDevice> getSelectedMediaDevice() { return mLocalMediaManager.getSelectedMediaDevice(); } Loading Loading @@ -859,7 +867,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, UserHandle.of(UserHandle.myUserId())); } boolean isAnyDeviceTransferring() { public boolean isAnyDeviceTransferring() { synchronized (mMediaDevicesLock) { for (MediaItem mediaItem : mMediaItemList) { if (mediaItem.getMediaDevice().isPresent() Loading Loading @@ -976,7 +984,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, broadcast.setBroadcastCode(broadcastCode.getBytes(StandardCharsets.UTF_8)); } void setTemporaryAllowListExceptionIfNeeded(MediaDevice targetDevice) { protected void setTemporaryAllowListExceptionIfNeeded(MediaDevice targetDevice) { if (mPowerExemptionManager == null || mPackageName == null) { Log.w(TAG, "powerExemptionManager or package name is null"); return; Loading Loading @@ -1221,7 +1229,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } }; interface Callback { public interface Callback { /** * Override to handle the media content updating. */ Loading packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt +3 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ import javax.inject.Inject /** * Factory to create [MediaOutputDialog] objects. */ class MediaOutputDialogFactory @Inject constructor( open class MediaOutputDialogFactory @Inject constructor( private val context: Context, private val mediaSessionManager: MediaSessionManager, private val lbm: LocalBluetoothManager?, Loading @@ -60,7 +60,7 @@ class MediaOutputDialogFactory @Inject constructor( } /** Creates a [MediaOutputDialog] for the given package. */ fun create(packageName: String, aboveStatusBar: Boolean, view: View? = null) { open fun create(packageName: String, aboveStatusBar: Boolean, view: View? = null) { // Dismiss the previous dialog, if any. mediaOutputDialog?.dismiss() Loading Loading @@ -89,7 +89,7 @@ class MediaOutputDialogFactory @Inject constructor( } /** dismiss [MediaOutputDialog] if exist. */ fun dismiss() { open fun dismiss() { mediaOutputDialog?.dismiss() mediaOutputDialog = null } Loading Loading
packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +35 −27 Original line number Diff line number Diff line Loading @@ -127,7 +127,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, private final ActivityStarter mActivityStarter; private final DialogLaunchAnimator mDialogLaunchAnimator; private final CommonNotifCollection mNotifCollection; private final Object mMediaDevicesLock = new Object(); protected final Object mMediaDevicesLock = new Object(); @VisibleForTesting final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>(); final List<MediaDevice> mCachedMediaDevices = new CopyOnWriteArrayList<>(); Loading Loading @@ -222,7 +222,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, R.dimen.media_output_dialog_selectable_margin_end); } void start(@NonNull Callback cb) { protected void start(@NonNull Callback cb) { synchronized (mMediaDevicesLock) { mCachedMediaDevices.clear(); mMediaItemList.clear(); Loading Loading @@ -256,15 +256,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return false; } boolean isRefreshing() { public boolean isRefreshing() { return mIsRefreshing; } void setRefreshing(boolean refreshing) { public void setRefreshing(boolean refreshing) { mIsRefreshing = refreshing; } void stop() { protected void stop() { if (mMediaController != null) { mMediaController.unregisterCallback(mCb); } Loading Loading @@ -551,7 +551,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } } void refreshDataSetIfNeeded() { public void refreshDataSetIfNeeded() { if (mNeedRefresh) { buildMediaItems(mCachedMediaDevices); mCallback.onDeviceListChanged(); Loading Loading @@ -604,6 +604,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } private void buildMediaItems(List<MediaDevice> devices) { synchronized (mMediaDevicesLock) { List<MediaItem> updatedMediaItems = buildMediaItems(mMediaItemList, devices); mMediaItemList.clear(); mMediaItemList.addAll(updatedMediaItems); } } protected List<MediaItem> buildMediaItems(List<MediaItem> oldMediaItems, List<MediaDevice> devices) { synchronized (mMediaDevicesLock) { if (!mLocalMediaManager.isPreferenceRouteListingExist()) { attachRangeInfo(devices); Loading @@ -616,22 +625,20 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, final MediaDevice connectedMediaDevice = needToHandleMutingExpectedDevice ? null : getCurrentConnectedMediaDevice(); if (mMediaItemList.isEmpty()) { if (oldMediaItems.isEmpty()) { if (connectedMediaDevice == null) { if (DEBUG) { Log.d(TAG, "No connected media device or muting expected device exist."); } categorizeMediaItems(null, devices, needToHandleMutingExpectedDevice); return; return categorizeMediaItems(null, devices, needToHandleMutingExpectedDevice); } // selected device exist categorizeMediaItems(connectedMediaDevice, devices, false); return; return categorizeMediaItems(connectedMediaDevice, devices, false); } // To keep the same list order final List<MediaDevice> targetMediaDevices = new ArrayList<>(); final Map<Integer, MediaItem> dividerItems = new HashMap<>(); for (MediaItem originalMediaItem : mMediaItemList) { for (MediaItem originalMediaItem : oldMediaItems) { for (MediaDevice newDevice : devices) { if (originalMediaItem.getMediaDevice().isPresent() && TextUtils.equals(originalMediaItem.getMediaDevice().get().getId(), Loading @@ -642,7 +649,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } if (originalMediaItem.getMediaItemType() == MediaItem.MediaItemType.TYPE_GROUP_DIVIDER) { dividerItems.put(mMediaItemList.indexOf(originalMediaItem), originalMediaItem); dividerItems.put(oldMediaItems.indexOf(originalMediaItem), originalMediaItem); } } if (targetMediaDevices.size() != devices.size()) { Loading @@ -651,16 +658,18 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } List<MediaItem> finalMediaItems = targetMediaDevices.stream().map( MediaItem::new).collect(Collectors.toList()); dividerItems.forEach((key, item) -> { finalMediaItems.add(key, item); }); dividerItems.forEach(finalMediaItems::add); attachConnectNewDeviceItemIfNeeded(finalMediaItems); mMediaItemList.clear(); mMediaItemList.addAll(finalMediaItems); return finalMediaItems; } } private void categorizeMediaItems(MediaDevice connectedMediaDevice, List<MediaDevice> devices, /** * Initial categorization of current devices, will not be called for updates to the devices * list. */ private List<MediaItem> categorizeMediaItems(MediaDevice connectedMediaDevice, List<MediaDevice> devices, boolean needToHandleMutingExpectedDevice) { synchronized (mMediaDevicesLock) { List<MediaItem> finalMediaItems = new ArrayList<>(); Loading Loading @@ -691,8 +700,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } } attachConnectNewDeviceItemIfNeeded(finalMediaItems); mMediaItemList.clear(); mMediaItemList.addAll(finalMediaItems); return finalMediaItems; } } Loading Loading @@ -765,7 +773,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, mGroupMediaDevices.clear(); } void connectDevice(MediaDevice device) { protected void connectDevice(MediaDevice device) { mMetricLogger.updateOutputEndPoints(getCurrentConnectedMediaDevice(), device); ThreadUtils.postOnBackgroundThread(() -> { Loading @@ -777,7 +785,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return mMediaItemList; } MediaDevice getCurrentConnectedMediaDevice() { public MediaDevice getCurrentConnectedMediaDevice() { return mLocalMediaManager.getCurrentConnectedDevice(); } Loading @@ -794,7 +802,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return mLocalMediaManager.getSelectableMediaDevice(); } List<MediaDevice> getSelectedMediaDevice() { public List<MediaDevice> getSelectedMediaDevice() { return mLocalMediaManager.getSelectedMediaDevice(); } Loading Loading @@ -859,7 +867,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, UserHandle.of(UserHandle.myUserId())); } boolean isAnyDeviceTransferring() { public boolean isAnyDeviceTransferring() { synchronized (mMediaDevicesLock) { for (MediaItem mediaItem : mMediaItemList) { if (mediaItem.getMediaDevice().isPresent() Loading Loading @@ -976,7 +984,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, broadcast.setBroadcastCode(broadcastCode.getBytes(StandardCharsets.UTF_8)); } void setTemporaryAllowListExceptionIfNeeded(MediaDevice targetDevice) { protected void setTemporaryAllowListExceptionIfNeeded(MediaDevice targetDevice) { if (mPowerExemptionManager == null || mPackageName == null) { Log.w(TAG, "powerExemptionManager or package name is null"); return; Loading Loading @@ -1221,7 +1229,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } }; interface Callback { public interface Callback { /** * Override to handle the media content updating. */ Loading
packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt +3 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ import javax.inject.Inject /** * Factory to create [MediaOutputDialog] objects. */ class MediaOutputDialogFactory @Inject constructor( open class MediaOutputDialogFactory @Inject constructor( private val context: Context, private val mediaSessionManager: MediaSessionManager, private val lbm: LocalBluetoothManager?, Loading @@ -60,7 +60,7 @@ class MediaOutputDialogFactory @Inject constructor( } /** Creates a [MediaOutputDialog] for the given package. */ fun create(packageName: String, aboveStatusBar: Boolean, view: View? = null) { open fun create(packageName: String, aboveStatusBar: Boolean, view: View? = null) { // Dismiss the previous dialog, if any. mediaOutputDialog?.dismiss() Loading Loading @@ -89,7 +89,7 @@ class MediaOutputDialogFactory @Inject constructor( } /** dismiss [MediaOutputDialog] if exist. */ fun dismiss() { open fun dismiss() { mediaOutputDialog?.dismiss() mediaOutputDialog = null } Loading