Loading src/com/android/settings/media/MediaDeviceUpdateWorker.java +14 −0 Original line number Diff line number Diff line Loading @@ -26,11 +26,14 @@ import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.net.Uri; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.Utils; import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; Loading Loading @@ -214,6 +217,17 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker return mPackageName; } boolean hasAdjustVolumeUserRestriction() { if (RestrictedLockUtilsInternal.checkIfRestrictionEnforced( mContext, UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId()) != null) { return true; } final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); return um.hasBaseUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.of(UserHandle.myUserId())); } private class DevicesChangedBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Loading src/com/android/settings/media/MediaOutputGroupSlice.java +5 −2 Original line number Diff line number Diff line Loading @@ -95,7 +95,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { GROUP_DEVICES.hashCode() + ACTION_MEDIA_SESSION_OPERATION, ACTION_MEDIA_SESSION_OPERATION), IconCompat.createWithBitmap(emptyBitmap), ListBuilder.ICON_IMAGE, ""); if (maxVolume > 0) { // Add InputRange row if (maxVolume > 0 && !getWorker().hasAdjustVolumeUserRestriction()) { // Add InputRange row listBuilder.addInputRange(new ListBuilder.InputRangeBuilder() .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .addEndItem(endItemAction) Loading @@ -119,6 +120,7 @@ public class MediaOutputGroupSlice implements CustomSliceable { } private void addRow(ListBuilder listBuilder, List<MediaDevice> mediaDevices, boolean selected) { final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction(); for (MediaDevice device : mediaDevices) { final int maxVolume = device.getMaxVolume(); final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon()); Loading @@ -133,7 +135,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { IconCompat.createWithResource(mContext, R.drawable.ic_check_box_anim), "", selected); if (maxVolume > 0) { // Add InputRange row if (maxVolume > 0 && !adjustVolumeUserRestriction) { // Add InputRange row final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder() .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .setTitle(title) Loading src/com/android/settings/media/MediaOutputSlice.java +25 −4 Original line number Diff line number Diff line Loading @@ -96,7 +96,11 @@ public class MediaOutputSlice implements CustomSliceable { if (worker.getSelectedMediaDevice().size() > 1) { // Insert group item to the first when it is available listBuilder.addInputRange(getGroupRow()); if (worker.getSessionVolumeMax() > 0 && !worker.hasAdjustVolumeUserRestriction()) { listBuilder.addInputRange(getGroupSliderRow()); } else { listBuilder.addRow(getGroupRow()); } // Add all other devices for (MediaDevice device : devices) { addRow(device, null /* connectedDevice */, listBuilder); Loading Loading @@ -150,7 +154,7 @@ public class MediaOutputSlice implements CustomSliceable { return builder; } private ListBuilder.InputRangeBuilder getGroupRow() { private ListBuilder.InputRangeBuilder getGroupSliderRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); final CharSequence sessionName = getWorker().getSessionName(); Loading @@ -172,6 +176,24 @@ public class MediaOutputSlice implements CustomSliceable { return builder; } private ListBuilder.RowBuilder getGroupRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); final CharSequence sessionName = getWorker().getSessionName(); final CharSequence title = TextUtils.isEmpty(sessionName) ? mContext.getString(R.string.media_output_group) : sessionName; final PendingIntent broadcastAction = getBroadcastIntent(mContext, MEDIA_GROUP_DEVICE, MEDIA_GROUP_DEVICE.hashCode()); final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon, ListBuilder.ICON_IMAGE, title); final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) .setPrimaryAction(primarySliceAction) .addEndItem(getEndItemSliceAction()); return builder; } private void addRow(MediaDevice device, MediaDevice connectedDevice, ListBuilder listBuilder) { if (connectedDevice != null && TextUtils.equals(device.getId(), connectedDevice.getId())) { final String title = device.getName(); Loading @@ -182,7 +204,7 @@ public class MediaOutputSlice implements CustomSliceable { final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon, ListBuilder.ICON_IMAGE, title); if (device.getMaxVolume() > 0) { if (device.getMaxVolume() > 0 && !getWorker().hasAdjustVolumeUserRestriction()) { final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) Loading Loading @@ -368,6 +390,5 @@ public class MediaOutputSlice implements CustomSliceable { return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 0; } } Loading
src/com/android/settings/media/MediaDeviceUpdateWorker.java +14 −0 Original line number Diff line number Diff line Loading @@ -26,11 +26,14 @@ import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.net.Uri; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.Utils; import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; Loading Loading @@ -214,6 +217,17 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker return mPackageName; } boolean hasAdjustVolumeUserRestriction() { if (RestrictedLockUtilsInternal.checkIfRestrictionEnforced( mContext, UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId()) != null) { return true; } final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); return um.hasBaseUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.of(UserHandle.myUserId())); } private class DevicesChangedBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Loading
src/com/android/settings/media/MediaOutputGroupSlice.java +5 −2 Original line number Diff line number Diff line Loading @@ -95,7 +95,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { GROUP_DEVICES.hashCode() + ACTION_MEDIA_SESSION_OPERATION, ACTION_MEDIA_SESSION_OPERATION), IconCompat.createWithBitmap(emptyBitmap), ListBuilder.ICON_IMAGE, ""); if (maxVolume > 0) { // Add InputRange row if (maxVolume > 0 && !getWorker().hasAdjustVolumeUserRestriction()) { // Add InputRange row listBuilder.addInputRange(new ListBuilder.InputRangeBuilder() .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .addEndItem(endItemAction) Loading @@ -119,6 +120,7 @@ public class MediaOutputGroupSlice implements CustomSliceable { } private void addRow(ListBuilder listBuilder, List<MediaDevice> mediaDevices, boolean selected) { final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction(); for (MediaDevice device : mediaDevices) { final int maxVolume = device.getMaxVolume(); final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon()); Loading @@ -133,7 +135,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { IconCompat.createWithResource(mContext, R.drawable.ic_check_box_anim), "", selected); if (maxVolume > 0) { // Add InputRange row if (maxVolume > 0 && !adjustVolumeUserRestriction) { // Add InputRange row final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder() .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .setTitle(title) Loading
src/com/android/settings/media/MediaOutputSlice.java +25 −4 Original line number Diff line number Diff line Loading @@ -96,7 +96,11 @@ public class MediaOutputSlice implements CustomSliceable { if (worker.getSelectedMediaDevice().size() > 1) { // Insert group item to the first when it is available listBuilder.addInputRange(getGroupRow()); if (worker.getSessionVolumeMax() > 0 && !worker.hasAdjustVolumeUserRestriction()) { listBuilder.addInputRange(getGroupSliderRow()); } else { listBuilder.addRow(getGroupRow()); } // Add all other devices for (MediaDevice device : devices) { addRow(device, null /* connectedDevice */, listBuilder); Loading Loading @@ -150,7 +154,7 @@ public class MediaOutputSlice implements CustomSliceable { return builder; } private ListBuilder.InputRangeBuilder getGroupRow() { private ListBuilder.InputRangeBuilder getGroupSliderRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); final CharSequence sessionName = getWorker().getSessionName(); Loading @@ -172,6 +176,24 @@ public class MediaOutputSlice implements CustomSliceable { return builder; } private ListBuilder.RowBuilder getGroupRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); final CharSequence sessionName = getWorker().getSessionName(); final CharSequence title = TextUtils.isEmpty(sessionName) ? mContext.getString(R.string.media_output_group) : sessionName; final PendingIntent broadcastAction = getBroadcastIntent(mContext, MEDIA_GROUP_DEVICE, MEDIA_GROUP_DEVICE.hashCode()); final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon, ListBuilder.ICON_IMAGE, title); final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) .setPrimaryAction(primarySliceAction) .addEndItem(getEndItemSliceAction()); return builder; } private void addRow(MediaDevice device, MediaDevice connectedDevice, ListBuilder listBuilder) { if (connectedDevice != null && TextUtils.equals(device.getId(), connectedDevice.getId())) { final String title = device.getName(); Loading @@ -182,7 +204,7 @@ public class MediaOutputSlice implements CustomSliceable { final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon, ListBuilder.ICON_IMAGE, title); if (device.getMaxVolume() > 0) { if (device.getMaxVolume() > 0 && !getWorker().hasAdjustVolumeUserRestriction()) { final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) Loading Loading @@ -368,6 +390,5 @@ public class MediaOutputSlice implements CustomSliceable { return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 0; } }