From 45d9e390b2a2b0ab1e447c46c0290870a5c401c5 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Fri, 7 Jul 2023 19:51:36 +0800 Subject: [PATCH] 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 --- .../notification/zen/ZenModeSliceBuilder.java | 15 ++++++++++- .../zen/ZenModeSliceBuilderTest.java | 26 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java index 1f553a26e94..8082bcdc046 100644 --- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java +++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java @@ -26,6 +26,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; 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.SliceBroadcastReceiver; import com.android.settings.slices.SliceBuilderUtils; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedLockUtilsInternal; public class ZenModeSliceBuilder { @@ -84,8 +88,11 @@ public class ZenModeSliceBuilder { isZenModeEnabled); final RowBuilder rowBuilder = new RowBuilder() .setTitle(title) - .addEndItem(toggleSliceAction) .setPrimaryAction(primarySliceAction); + if (!isManagedByAdmin(context)) { + rowBuilder.addEndItem(toggleSliceAction); + } + if (!Utils.isSettingsIntelligence(context)) { rowBuilder.setSubtitle(subtitle); } @@ -152,4 +159,10 @@ public class ZenModeSliceBuilder { return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, 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; + } } diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeSliceBuilderTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeSliceBuilderTest.java index 400543cb724..71f896df7c9 100644 --- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeSliceBuilderTest.java +++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeSliceBuilderTest.java @@ -32,9 +32,10 @@ import androidx.slice.core.SliceAction; import androidx.slice.widget.SliceLiveData; 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.ShadowRestrictedLockUtilsInternal; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -44,7 +45,7 @@ import org.robolectric.annotation.Config; import java.util.List; -@Config(shadows = ShadowNotificationManager.class) +@Config(shadows = {ShadowNotificationManager.class, ShadowRestrictedLockUtilsInternal.class}) @RunWith(RobolectricTestRunner.class) public class ZenModeSliceBuilderTest { @@ -58,6 +59,11 @@ public class ZenModeSliceBuilderTest { SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } + @After + public void tearDown() { + ShadowRestrictedLockUtilsInternal.reset(); + } + @Test public void getZenModeSlice_correctSliceContent() { final Slice dndSlice = ZenModeSliceBuilder.getSlice(mContext); @@ -73,6 +79,22 @@ public class ZenModeSliceBuilderTest { 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 toggles = metadata.getToggles(); + assertThat(toggles).hasSize(0); + + final SliceAction primaryAction = metadata.getPrimaryAction(); + assertThat(primaryAction.getIcon()).isNull(); + } + @Test public void handleUriChange_turnOn_zenModeTurnsOn() { final Intent intent = new Intent();