diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 99de72480110b..cc9c3299fd0fe 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -5754,8 +5754,8 @@ public class Notification implements Parcelable private boolean isSnoozeSettingEnabled() { try { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.SHOW_NOTIFICATION_SNOOZE, 0) == 1; + return Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.SHOW_NOTIFICATION_SNOOZE, 0, UserHandle.USER_CURRENT) == 1; } catch (SecurityException ex) { // Most 3p apps can't access this snooze setting, so their NotificationListeners // would be unable to create notification views if we propagated this exception. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java index d2db6224ef529..6500ff7fa210b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -359,7 +359,8 @@ public class PreparationCoordinator implements Coordinator { } NotifInflater.Params getInflaterParams(NotifUiAdjustment adjustment, String reason) { - return new NotifInflater.Params(adjustment.isMinimized(), reason); + return new NotifInflater.Params(adjustment.isMinimized(), reason, + adjustment.isSnoozeEnabled()); } private void abortInflation(NotificationEntry entry, String reason) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt index 08e21e8f668ee..4483599d68572 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifInflater.kt @@ -61,5 +61,5 @@ interface NotifInflater { /** * A class holding parameters used when inflating the notification row */ - class Params(val isLowPriority: Boolean, val reason: String) + class Params(val isLowPriority: Boolean, val reason: String, val showSnooze: Boolean) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt index 745d6fe1d6246..0d9a654fa4855 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt @@ -16,12 +16,15 @@ package com.android.systemui.statusbar.notification.collection.inflation +import android.content.Context import android.database.ContentObserver import android.os.Handler +import android.os.HandlerExecutor import android.os.UserHandle import android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry @@ -39,11 +42,25 @@ class NotifUiAdjustmentProvider @Inject constructor( @Main private val handler: Handler, private val secureSettings: SecureSettings, private val lockscreenUserManager: NotificationLockscreenUserManager, - private val sectionStyleProvider: SectionStyleProvider + private val sectionStyleProvider: SectionStyleProvider, + private val userTracker: UserTracker ) { private val dirtyListeners = ListenerSet() private var isSnoozeEnabled = false + /** + * Update the snooze enabled value on user switch + */ + private val userTrackerCallback = object : UserTracker.Callback { + override fun onUserChanged(newUser: Int, userContext: Context) { + updateSnoozeEnabled() + } + } + + init { + userTracker.addCallback(userTrackerCallback, HandlerExecutor(handler)) + } + fun addDirtyListener(listener: Runnable) { if (dirtyListeners.isEmpty()) { lockscreenUserManager.addNotificationStateChangedListener(notifStateChangedListener) @@ -78,7 +95,8 @@ class NotifUiAdjustmentProvider @Inject constructor( } private fun updateSnoozeEnabled() { - isSnoozeEnabled = secureSettings.getInt(SHOW_NOTIFICATION_SNOOZE, 0) == 1 + isSnoozeEnabled = + secureSettings.getIntForUser(SHOW_NOTIFICATION_SNOOZE, 0, UserHandle.USER_CURRENT) == 1 } private fun isEntryMinimized(entry: NotificationEntry): Boolean { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java index 56eb4b13dcde0..611edf88bffb4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java @@ -212,6 +212,9 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { mMessagingUtil.isImportantMessaging(entry.getSbn(), entry.getImportance()); final boolean isLowPriority = inflaterParams.isLowPriority(); + // Set show snooze action + row.setShowSnooze(inflaterParams.getShowSnooze()); + RowContentBindParams params = mRowContentBindStage.getStageParams(entry); params.requireContentViews(FLAG_CONTENT_VIEW_CONTRACTED); params.requireContentViews(FLAG_CONTENT_VIEW_EXPANDED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index a529da54fc4ef..f5326c3840cbb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -147,6 +147,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView // the background on first content update just in case it happens to be during a theme change. private boolean mUpdateSelfBackgroundOnUpdate = true; private boolean mIsSnoozed; + private boolean mShowSnooze = false; private boolean mIsFaded; private boolean mAnimatePinnedRoundness = false; @@ -3728,4 +3729,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView updateBaseRoundness(); } } + + /** Set whether this notification may show a snooze action. */ + public void setShowSnooze(boolean showSnooze) { + mShowSnooze = showSnooze; + } + + /** Whether this notification may show a snooze action. */ + public boolean getShowSnooze() { + return mShowSnooze; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 78392f78428f5..451d837b63a0a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -26,7 +26,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.RemoteException; -import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; import android.util.AttributeSet; @@ -1440,11 +1439,9 @@ public class NotificationContentView extends FrameLayout implements Notification if (snoozeButton == null || actionContainer == null) { return; } - final boolean showSnooze = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.SHOW_NOTIFICATION_SNOOZE, 0) == 1; // Notification.Builder can 'disable' the snooze button to prevent it from being shown here boolean snoozeDisabled = !snoozeButton.isEnabled(); - if (!showSnooze || snoozeDisabled) { + if (!mContainingNotification.getShowSnooze() || snoozeDisabled) { snoozeButton.setVisibility(GONE); return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index d0fb416bf96a6..bafc474d7123a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE; import static android.view.HapticFeedbackConstants.CLOCK_TICK; import static com.android.systemui.SwipeHelper.SWIPED_FAR_ENOUGH_SIZE_FRACTION; @@ -253,9 +252,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl mLeftMenuItems.clear(); mRightMenuItems.clear(); - boolean showSnooze = Settings.Secure.getInt(mContext.getContentResolver(), - SHOW_NOTIFICATION_SNOOZE, 0) == 1; - + final boolean showSnooze = mParent.getShowSnooze(); // Construct the menu items based on the notification if (showSnooze) { // Only show snooze for non-foreground notifications, and if the setting is on diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java index b6b0b77389970..9b6d29310d0b4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java @@ -41,6 +41,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.SysuiTestCase; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.notification.collection.GroupEntry; @@ -103,6 +104,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Mock private SecureSettings mSecureSettings; @Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater(); private final SectionStyleProvider mSectionStyleProvider = new SectionStyleProvider(); + @Mock private UserTracker mUserTracker; private NotifUiAdjustmentProvider mAdjustmentProvider; @@ -118,7 +120,8 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mHandler, mSecureSettings, mLockscreenUserManager, - mSectionStyleProvider); + mSectionStyleProvider, + mUserTracker); mEntry = getNotificationEntryBuilder().setParent(ROOT_ENTRY).build(); mInflationError = new Exception(TEST_MESSAGE); mErrorManager = new NotifInflationErrorManager(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt index 246943e3088e4..f9f8d8a2cfc67 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt @@ -22,6 +22,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder @@ -53,6 +54,7 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { private val secureSettings: SecureSettings = mock() private val uri = FakeSettings().getUriFor(SHOW_NOTIFICATION_SNOOZE) private val dirtyListener: Runnable = mock() + private val userTracker: UserTracker = mock() private val section = NotifSection(mock(), 0) private val entry = NotificationEntryBuilder() @@ -67,13 +69,14 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { secureSettings, lockscreenUserManager, sectionStyleProvider, + userTracker ) @Before fun setup() { verifyNoMoreInteractions(secureSettings) adjustmentProvider.addDirtyListener(dirtyListener) - verify(secureSettings).getInt(eq(SHOW_NOTIFICATION_SNOOZE), any()) + verify(secureSettings).getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any()) contentObserver = withArgCaptor { verify(secureSettings).registerContentObserverForUser( eq(SHOW_NOTIFICATION_SNOOZE), capture(), any() @@ -105,18 +108,20 @@ class NotifUiAdjustmentProviderTest : SysuiTestCase() { fun onChangeWillQueryThenNotifyDirty() { contentObserver.onChange(false, listOf(uri), 0, 0) with(inOrder(secureSettings, dirtyListener)) { - verify(secureSettings).getInt(eq(SHOW_NOTIFICATION_SNOOZE), any()) + verify(secureSettings).getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any()) verify(dirtyListener).run() } } @Test fun changingSnoozeChangesProvidedAdjustment() { - whenever(secureSettings.getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())).thenReturn(0) + whenever(secureSettings.getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any())) + .thenReturn(0) val original = adjustmentProvider.calculateAdjustment(entry) assertThat(original.isSnoozeEnabled).isFalse() - whenever(secureSettings.getInt(eq(SHOW_NOTIFICATION_SNOOZE), any())).thenReturn(1) + whenever(secureSettings.getIntForUser(eq(SHOW_NOTIFICATION_SNOOZE), any(), any())) + .thenReturn(1) contentObserver.onChange(false, listOf(uri), 0, 0) val withSnoozing = adjustmentProvider.calculateAdjustment(entry) assertThat(withSnoozing.isSnoozeEnabled).isTrue() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java index e3516f97e827e..e9290289f7f2e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java @@ -15,7 +15,6 @@ package com.android.systemui.statusbar.notification.row; import static android.provider.Settings.Global.SHOW_NEW_NOTIF_DISMISS; -import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE; import static android.view.HapticFeedbackConstants.CLOCK_TICK; import static junit.framework.Assert.assertEquals; @@ -100,7 +99,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testNoAppOpsInSlowSwipe() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 0); + when(mRow.getShowSnooze()).thenReturn(false); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 0); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); @@ -113,7 +112,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testNoSnoozeInSlowSwipe() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 0); + when(mRow.getShowSnooze()).thenReturn(false); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 0); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); @@ -126,7 +125,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testSnoozeInSlowSwipe() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 1); + when(mRow.getShowSnooze()).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 0); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier); @@ -139,7 +138,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testSlowSwipe_newDismiss() { - Settings.Secure.putInt(mContext.getContentResolver(), SHOW_NOTIFICATION_SNOOZE, 1); + when(mRow.getShowSnooze()).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 1); NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier);