diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java index b800c179859..c7682577063 100644 --- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java +++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java @@ -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; @@ -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) { diff --git a/src/com/android/settings/media/MediaOutputGroupSlice.java b/src/com/android/settings/media/MediaOutputGroupSlice.java index d60ae225e9e..402eb6bb7cf 100644 --- a/src/com/android/settings/media/MediaOutputGroupSlice.java +++ b/src/com/android/settings/media/MediaOutputGroupSlice.java @@ -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) @@ -119,6 +120,7 @@ public class MediaOutputGroupSlice implements CustomSliceable { } private void addRow(ListBuilder listBuilder, List mediaDevices, boolean selected) { + final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction(); for (MediaDevice device : mediaDevices) { final int maxVolume = device.getMaxVolume(); final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon()); @@ -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) diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java index 27960e123ea..df9538b5773 100644 --- a/src/com/android/settings/media/MediaOutputSlice.java +++ b/src/com/android/settings/media/MediaOutputSlice.java @@ -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); @@ -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(); @@ -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(); @@ -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) @@ -368,6 +390,5 @@ public class MediaOutputSlice implements CustomSliceable { return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 0; - } }