Fix do not disturb bypass user restriction

Do not disturb search result can still switch on/off when users are
restricted by DISALLOW_ADJUST_VOLUME. The DND search result is presented
by slice and there was no user restriction check when creating DND
slice, which caused DND search result can access. To prevent DND from
being access if user restriction is enabled, adding user restriction
check during creating the DND slice.

Bug: 242846154
Test: robotest pass and manual test
Change-Id: I897a99e9dda2f9f84365d96841a4c4f4cf975331
This commit is contained in:
Mill Chen
2023-07-07 19:51:36 +08:00
parent b3b27451a3
commit 45d9e390b2
2 changed files with 38 additions and 3 deletions

View File

@@ -26,6 +26,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.Uri; import android.net.Uri;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.IconCompat;
@@ -40,6 +42,8 @@ import com.android.settings.Utils;
import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceRegistry;
import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settings.slices.SliceBuilderUtils; import com.android.settings.slices.SliceBuilderUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedLockUtilsInternal;
public class ZenModeSliceBuilder { public class ZenModeSliceBuilder {
@@ -84,8 +88,11 @@ public class ZenModeSliceBuilder {
isZenModeEnabled); isZenModeEnabled);
final RowBuilder rowBuilder = new RowBuilder() final RowBuilder rowBuilder = new RowBuilder()
.setTitle(title) .setTitle(title)
.addEndItem(toggleSliceAction)
.setPrimaryAction(primarySliceAction); .setPrimaryAction(primarySliceAction);
if (!isManagedByAdmin(context)) {
rowBuilder.addEndItem(toggleSliceAction);
}
if (!Utils.isSettingsIntelligence(context)) { if (!Utils.isSettingsIntelligence(context)) {
rowBuilder.setSubtitle(subtitle); rowBuilder.setSubtitle(subtitle);
} }
@@ -152,4 +159,10 @@ public class ZenModeSliceBuilder {
return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE); PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
} }
private static boolean isManagedByAdmin(Context context) {
EnforcedAdmin enforcedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
context, UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId());
return enforcedAdmin != null;
}
} }

View File

@@ -32,9 +32,10 @@ import androidx.slice.core.SliceAction;
import androidx.slice.widget.SliceLiveData; import androidx.slice.widget.SliceLiveData;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.notification.zen.ZenModeSliceBuilder;
import com.android.settings.testutils.shadow.ShadowNotificationManager; import com.android.settings.testutils.shadow.ShadowNotificationManager;
import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -44,7 +45,7 @@ import org.robolectric.annotation.Config;
import java.util.List; import java.util.List;
@Config(shadows = ShadowNotificationManager.class) @Config(shadows = {ShadowNotificationManager.class, ShadowRestrictedLockUtilsInternal.class})
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class ZenModeSliceBuilderTest { public class ZenModeSliceBuilderTest {
@@ -58,6 +59,11 @@ public class ZenModeSliceBuilderTest {
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
} }
@After
public void tearDown() {
ShadowRestrictedLockUtilsInternal.reset();
}
@Test @Test
public void getZenModeSlice_correctSliceContent() { public void getZenModeSlice_correctSliceContent() {
final Slice dndSlice = ZenModeSliceBuilder.getSlice(mContext); final Slice dndSlice = ZenModeSliceBuilder.getSlice(mContext);
@@ -73,6 +79,22 @@ public class ZenModeSliceBuilderTest {
assertThat(primaryAction.getIcon()).isNull(); assertThat(primaryAction.getIcon()).isNull();
} }
@Test
public void getZenModeSlice_managedByAdmin_shouldNotHaveToggle() {
ShadowRestrictedLockUtilsInternal.setRestricted(true);
final Slice dndSlice = ZenModeSliceBuilder.getSlice(mContext);
final SliceMetadata metadata = SliceMetadata.from(mContext, dndSlice);
assertThat(metadata.getTitle()).isEqualTo(
mContext.getString(R.string.zen_mode_settings_title));
final List<SliceAction> toggles = metadata.getToggles();
assertThat(toggles).hasSize(0);
final SliceAction primaryAction = metadata.getPrimaryAction();
assertThat(primaryAction.getIcon()).isNull();
}
@Test @Test
public void handleUriChange_turnOn_zenModeTurnsOn() { public void handleUriChange_turnOn_zenModeTurnsOn() {
final Intent intent = new Intent(); final Intent intent = new Intent();