Hide volume slider in Output Switcher when volume adjustment is restricted
-Check UserManager.DISALLOW_ADJUST_VOLUME -Hide slider when unsupported Bug: 153922342 Test: 1.Open CTS-V app > Device Owner Tests 2.install CtsEmptyDeviceOwner.apk -"adb install -r -t CtsEmptyDeviceOwner.apk" 3.enter the command "adb shell dpm set-device-owner com.android.cts.emptydeviceowner/.EmptyDeviceAdmin" 4.push Check device owner button 5.open Policy transparency test and go to Disallow adjust volume > Enable the switch > Open settings. Change-Id: Iac2793ead6d93d4eaada19c4eec33885d4b97138
This commit is contained in:
@@ -26,11 +26,14 @@ import android.content.Intent;
|
|||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
import android.os.UserManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
import com.android.settings.slices.SliceBackgroundWorker;
|
import com.android.settings.slices.SliceBackgroundWorker;
|
||||||
|
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||||
import com.android.settingslib.Utils;
|
import com.android.settingslib.Utils;
|
||||||
import com.android.settingslib.media.LocalMediaManager;
|
import com.android.settingslib.media.LocalMediaManager;
|
||||||
import com.android.settingslib.media.MediaDevice;
|
import com.android.settingslib.media.MediaDevice;
|
||||||
@@ -214,6 +217,17 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
|
|||||||
return mPackageName;
|
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 {
|
private class DevicesChangedBroadcastReceiver extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
@@ -95,7 +95,8 @@ public class MediaOutputGroupSlice implements CustomSliceable {
|
|||||||
GROUP_DEVICES.hashCode() + ACTION_MEDIA_SESSION_OPERATION,
|
GROUP_DEVICES.hashCode() + ACTION_MEDIA_SESSION_OPERATION,
|
||||||
ACTION_MEDIA_SESSION_OPERATION),
|
ACTION_MEDIA_SESSION_OPERATION),
|
||||||
IconCompat.createWithBitmap(emptyBitmap), ListBuilder.ICON_IMAGE, "");
|
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()
|
listBuilder.addInputRange(new ListBuilder.InputRangeBuilder()
|
||||||
.setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
|
.setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
|
||||||
.addEndItem(endItemAction)
|
.addEndItem(endItemAction)
|
||||||
@@ -119,6 +120,7 @@ public class MediaOutputGroupSlice implements CustomSliceable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addRow(ListBuilder listBuilder, List<MediaDevice> mediaDevices, boolean selected) {
|
private void addRow(ListBuilder listBuilder, List<MediaDevice> mediaDevices, boolean selected) {
|
||||||
|
final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction();
|
||||||
for (MediaDevice device : mediaDevices) {
|
for (MediaDevice device : mediaDevices) {
|
||||||
final int maxVolume = device.getMaxVolume();
|
final int maxVolume = device.getMaxVolume();
|
||||||
final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon());
|
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),
|
IconCompat.createWithResource(mContext, R.drawable.ic_check_box_anim),
|
||||||
"",
|
"",
|
||||||
selected);
|
selected);
|
||||||
if (maxVolume > 0) { // Add InputRange row
|
if (maxVolume > 0 && !adjustVolumeUserRestriction) {
|
||||||
|
// Add InputRange row
|
||||||
final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
|
final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
|
||||||
.setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
|
.setTitleItem(titleIcon, ListBuilder.ICON_IMAGE)
|
||||||
.setTitle(title)
|
.setTitle(title)
|
||||||
|
@@ -96,7 +96,11 @@ public class MediaOutputSlice implements CustomSliceable {
|
|||||||
|
|
||||||
if (worker.getSelectedMediaDevice().size() > 1) {
|
if (worker.getSelectedMediaDevice().size() > 1) {
|
||||||
// Insert group item to the first when it is available
|
// 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
|
// Add all other devices
|
||||||
for (MediaDevice device : devices) {
|
for (MediaDevice device : devices) {
|
||||||
addRow(device, null /* connectedDevice */, listBuilder);
|
addRow(device, null /* connectedDevice */, listBuilder);
|
||||||
@@ -150,7 +154,7 @@ public class MediaOutputSlice implements CustomSliceable {
|
|||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListBuilder.InputRangeBuilder getGroupRow() {
|
private ListBuilder.InputRangeBuilder getGroupSliderRow() {
|
||||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||||
R.drawable.ic_speaker_group_black_24dp);
|
R.drawable.ic_speaker_group_black_24dp);
|
||||||
final CharSequence sessionName = getWorker().getSessionName();
|
final CharSequence sessionName = getWorker().getSessionName();
|
||||||
@@ -172,6 +176,24 @@ public class MediaOutputSlice implements CustomSliceable {
|
|||||||
return builder;
|
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) {
|
private void addRow(MediaDevice device, MediaDevice connectedDevice, ListBuilder listBuilder) {
|
||||||
if (connectedDevice != null && TextUtils.equals(device.getId(), connectedDevice.getId())) {
|
if (connectedDevice != null && TextUtils.equals(device.getId(), connectedDevice.getId())) {
|
||||||
final String title = device.getName();
|
final String title = device.getName();
|
||||||
@@ -182,7 +204,7 @@ public class MediaOutputSlice implements CustomSliceable {
|
|||||||
final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon,
|
final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon,
|
||||||
ListBuilder.ICON_IMAGE, title);
|
ListBuilder.ICON_IMAGE, title);
|
||||||
|
|
||||||
if (device.getMaxVolume() > 0) {
|
if (device.getMaxVolume() > 0 && !getWorker().hasAdjustVolumeUserRestriction()) {
|
||||||
final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
|
final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
|
||||||
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
||||||
.setTitle(title)
|
.setTitle(title)
|
||||||
@@ -368,6 +390,5 @@ public class MediaOutputSlice implements CustomSliceable {
|
|||||||
return getWorker() != null
|
return getWorker() != null
|
||||||
&& !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext)
|
&& !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext)
|
||||||
&& getWorker().getMediaDevices().size() > 0;
|
&& getWorker().getMediaDevices().size() > 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user