From 907b47105be2bea44ca3d67f7613e59ea87a698e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Mon, 11 Dec 2023 18:06:28 +0100 Subject: [PATCH] Tag Zen operations from Settings as coming from the user Bug: 308670715 Test: atest ApprovalPreferenceControllerTest Change-Id: Id118f867e84f3d742db6b12eab0f34df1357d178 --- .../ApprovalPreferenceController.java | 6 ++- .../zenaccess/ZenAccessController.java | 8 +++- .../DndConditionCardController.java | 8 +++- .../notification/zen/ZenModeBackend.java | 47 ++++++++++++++----- .../notification/zen/ZenModeSliceBuilder.java | 8 +++- .../zen/ZenOnboardingActivity.java | 7 ++- .../ApprovalPreferenceControllerTest.java | 12 ++++- 7 files changed, 76 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java b/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java index fb78e3eb077..00f06258ee0 100644 --- a/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java +++ b/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java @@ -139,7 +139,11 @@ public class ApprovalPreferenceController extends BasePreferenceController { AsyncTask.execute(() -> { if (!mNm.isNotificationPolicyAccessGrantedForPackage( cn.getPackageName())) { - mNm.removeAutomaticZenRules(cn.getPackageName()); + if (android.app.Flags.modesApi()) { + mNm.removeAutomaticZenRules(cn.getPackageName(), /* fromUser= */ true); + } else { + mNm.removeAutomaticZenRules(cn.getPackageName()); + } } }); } diff --git a/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java b/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java index b4a0c88d950..6f4137c224a 100644 --- a/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java +++ b/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java @@ -101,8 +101,12 @@ public class ZenAccessController extends BasePreferenceController { } public static void deleteRules(final Context context, final String pkg) { - final NotificationManager mgr = context.getSystemService(NotificationManager.class); - mgr.removeAutomaticZenRules(pkg); + final NotificationManager mgr = context.getSystemService(NotificationManager.class); + if (android.app.Flags.modesApi()) { + mgr.removeAutomaticZenRules(pkg, /* fromUser= */ true); + } else { + mgr.removeAutomaticZenRules(pkg); + } } @VisibleForTesting diff --git a/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java b/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java index 4d79a013f7f..e69a336edd5 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java @@ -16,6 +16,7 @@ package com.android.settings.homepage.contextualcards.conditional; +import android.app.Flags; import android.app.NotificationManager; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; @@ -86,7 +87,12 @@ public class DndConditionCardController implements ConditionalCardController { @Override public void onActionClick() { - mNotificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG); + if (Flags.modesApi()) { + mNotificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG, + /* fromUser= */ true); + } else { + mNotificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG); + } } @Override diff --git a/src/com/android/settings/notification/zen/ZenModeBackend.java b/src/com/android/settings/notification/zen/ZenModeBackend.java index 10798652e68..c290c83f5d2 100644 --- a/src/com/android/settings/notification/zen/ZenModeBackend.java +++ b/src/com/android/settings/notification/zen/ZenModeBackend.java @@ -56,7 +56,6 @@ public class ZenModeBackend { @VisibleForTesting protected static final String ZEN_MODE_FROM_NONE = "zen_mode_from_none"; protected static final int SOURCE_NONE = -1; - private static List mDefaultRuleIds; private static ZenModeBackend sInstance; @@ -65,7 +64,7 @@ public class ZenModeBackend { protected NotificationManager.Policy mPolicy; private final NotificationManager mNotificationManager; - private String TAG = "ZenModeSettingsBackend"; + private static final String TAG = "ZenModeSettingsBackend"; private final Context mContext; public static ZenModeBackend getInstance(Context context) { @@ -95,19 +94,32 @@ public class ZenModeBackend { } protected boolean updateZenRule(String id, AutomaticZenRule rule) { - return NotificationManager.from(mContext).updateAutomaticZenRule(id, rule); + if (android.app.Flags.modesApi()) { + return mNotificationManager.updateAutomaticZenRule(id, rule, /* fromUser= */ true); + } else { + return NotificationManager.from(mContext).updateAutomaticZenRule(id, rule); + } } protected void setZenMode(int zenMode) { - NotificationManager.from(mContext).setZenMode(zenMode, null, TAG); + if (android.app.Flags.modesApi()) { + mNotificationManager.setZenMode(zenMode, null, TAG, /* fromUser= */ true); + } else { + NotificationManager.from(mContext).setZenMode(zenMode, null, TAG); + } mZenMode = getZenMode(); } protected void setZenModeForDuration(int minutes) { Uri conditionId = ZenModeConfig.toTimeCondition(mContext, minutes, ActivityManager.getCurrentUser(), true).id; - mNotificationManager.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, - conditionId, TAG); + if (android.app.Flags.modesApi()) { + mNotificationManager.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, + conditionId, TAG, /* fromUser= */ true); + } else { + mNotificationManager.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, + conditionId, TAG); + } mZenMode = getZenMode(); } @@ -180,7 +192,11 @@ public class ZenModeBackend { int priorityConversationSenders) { mPolicy = new NotificationManager.Policy(priorityCategories, priorityCallSenders, priorityMessageSenders, suppressedVisualEffects, priorityConversationSenders); - mNotificationManager.setNotificationPolicy(mPolicy); + if (android.app.Flags.modesApi()) { + mNotificationManager.setNotificationPolicy(mPolicy, /* fromUser= */ true); + } else { + mNotificationManager.setNotificationPolicy(mPolicy); + } } @@ -357,7 +373,11 @@ public class ZenModeBackend { } public boolean removeZenRule(String ruleId) { - return NotificationManager.from(mContext).removeAutomaticZenRule(ruleId); + if (android.app.Flags.modesApi()) { + return mNotificationManager.removeAutomaticZenRule(ruleId, /* fromUser= */ true); + } else { + return NotificationManager.from(mContext).removeAutomaticZenRule(ruleId); + } } public NotificationManager.Policy getConsolidatedPolicy() { @@ -366,7 +386,11 @@ public class ZenModeBackend { protected String addZenRule(AutomaticZenRule rule) { try { - return NotificationManager.from(mContext).addAutomaticZenRule(rule); + if (android.app.Flags.modesApi()) { + return mNotificationManager.addAutomaticZenRule(rule, /* fromUser= */ true); + } else { + return NotificationManager.from(mContext).addAutomaticZenRule(rule); + } } catch (Exception e) { return null; } @@ -429,10 +453,7 @@ public class ZenModeBackend { } private static List getDefaultRuleIds() { - if (mDefaultRuleIds == null) { - mDefaultRuleIds = ZenModeConfig.DEFAULT_RULE_IDS; - } - return mDefaultRuleIds; + return ZenModeConfig.DEFAULT_RULE_IDS; } NotificationManager.Policy toNotificationPolicy(ZenPolicy policy) { diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java index 8082bcdc046..4f6f0587b46 100644 --- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java +++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java @@ -19,6 +19,7 @@ package com.android.settings.notification.zen; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import android.annotation.ColorInt; +import android.app.Flags; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.settings.SettingsEnums; @@ -116,7 +117,12 @@ public class ZenModeSliceBuilder { } else { zenMode = Settings.Global.ZEN_MODE_OFF; } - NotificationManager.from(context).setZenMode(zenMode, null /* conditionId */, TAG); + if (Flags.modesApi()) { + NotificationManager.from(context).setZenMode(zenMode, /* conditionId= */ null, TAG, + /* fromUser= */ true); + } else { + NotificationManager.from(context).setZenMode(zenMode, null /* conditionId */, TAG); + } // Do not notifyChange on Uri. The service takes longer to update the current value than it // does for the Slice to check the current value again. Let {@link SliceBroadcastRelay} // handle it. diff --git a/src/com/android/settings/notification/zen/ZenOnboardingActivity.java b/src/com/android/settings/notification/zen/ZenOnboardingActivity.java index 23c388bf5cd..a6e78eb2068 100644 --- a/src/com/android/settings/notification/zen/ZenOnboardingActivity.java +++ b/src/com/android/settings/notification/zen/ZenOnboardingActivity.java @@ -17,6 +17,7 @@ package com.android.settings.notification.zen; import android.app.Activity; +import android.app.Flags; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.app.settings.SettingsEnums; @@ -129,7 +130,11 @@ public class ZenOnboardingActivity extends Activity { Policy.PRIORITY_SENDERS_STARRED, policy.priorityMessageSenders, NotificationManager.Policy.getAllSuppressedVisualEffects()); - mNm.setNotificationPolicy(newPolicy); + if (Flags.modesApi()) { + mNm.setNotificationPolicy(newPolicy, /* fromUser= */ true); + } else { + mNm.setNotificationPolicy(newPolicy); + } mMetrics.action(SettingsEnums.ACTION_ZEN_ONBOARDING_OK); } else { mMetrics.action(SettingsEnums.ACTION_ZEN_ONBOARDING_KEEP_CURRENT_SETTINGS); diff --git a/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java index 4601a1cfbaa..fa5af6d4f9e 100644 --- a/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -27,12 +28,15 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.app.Flags; import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -42,6 +46,7 @@ import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -50,6 +55,10 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class ApprovalPreferenceControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule( + SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT); + private Context mContext; private FakeFeatureFactory mFeatureFactory; @Mock @@ -80,7 +89,6 @@ public class ApprovalPreferenceControllerTest { mController.setNm(mNm); mController.setParent(mFragment); mController.setPkgInfo(mPkgInfo); - } @Test @@ -165,6 +173,7 @@ public class ApprovalPreferenceControllerTest { } @Test + @EnableFlags(Flags.FLAG_MODES_API) public void disable() { mController.disable(mCn); verify(mFeatureFactory.metricsFeatureProvider).action( @@ -172,6 +181,7 @@ public class ApprovalPreferenceControllerTest { MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW, "a"); + verify(mNm).removeAutomaticZenRules(eq(mCn.getPackageName()), eq(true)); verify(mNm).setNotificationListenerAccessGranted(mCn, false); } }