mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-14 10:24:32 -05:00
082bc48c32
https://review.lineageos.org/q/topic:P_asb_2022-05 https://review.lineageos.org/q/topic:P_asb_2022-06 https://review.lineageos.org/q/topic:P_asb_2022-07 https://review.lineageos.org/q/topic:P_asb_2022-08 https://review.lineageos.org/q/topic:P_asb_2022-09 https://review.lineageos.org/q/topic:P_asb_2022-10 https://review.lineageos.org/q/topic:P_asb_2022-11 https://review.lineageos.org/q/topic:P_asb_2022-12 https://review.lineageos.org/q/topic:P_asb_2023-01 https://review.lineageos.org/q/topic:P_asb_2023-02 https://review.lineageos.org/q/topic:P_asb_2023-03 https://review.lineageos.org/q/topic:P_asb_2023-04 https://review.lineageos.org/q/topic:P_asb_2023-05 https://review.lineageos.org/q/topic:P_asb_2023-06 https://review.lineageos.org/q/topic:P_asb_2023-07 accounted for via manifest change: https://review.lineageos.org/c/LineageOS/android_external_freetype/+/361250 https://review.lineageos.org/q/topic:P_asb_2023-08 accounted for via manifest change: https://review.lineageos.org/c/LineageOS/android_external_freetype/+/364606 accounted for via patches: https://review.lineageos.org/c/LineageOS/android_system_ca-certificates/+/365328 https://review.lineageos.org/q/topic:P_asb_2023-09 https://review.lineageos.org/q/topic:P_asb_2023-10 https://review.lineageos.org/q/topic:P_asb_2023-11 accounted for via patches: https://review.lineageos.org/c/LineageOS/android_system_ca-certificates/+/374916 https://review.lineageos.org/q/topic:P_asb_2023-12 https://review.lineageos.org/q/topic:P_asb_2024-01 https://review.lineageos.org/q/topic:P_asb_2024-02 https://review.lineageos.org/q/topic:P_asb_2024-03 https://review.lineageos.org/q/topic:P_asb_2024-04 Signed-off-by: Tavi <tavi@divested.dev>
213 lines
9.6 KiB
Diff
213 lines
9.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
From: Wenhao Wang <wenhaowang@google.com>
|
||
Date: Tue, 30 Aug 2022 11:09:46 -0700
|
||
Subject: [PATCH] Enable user graularity for lockdown mode
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker
|
||
to observe the StrongAuth changes of every user.
|
||
More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag.
|
||
Via this flag, NotificationManagerService can perform the following operations
|
||
when the user enter or exit lockdown mode:
|
||
|
||
Enter lockdown:
|
||
1. Remove all the notifications belonging to the user.
|
||
2. Set the local flag to indicate the lockdown is on for the user.
|
||
The local flag will suppress the user's notifications on the
|
||
post, remove and update functions.
|
||
|
||
Exit lockdown:
|
||
1. Clear the local flag to indicate the lockdown is off for the user.
|
||
2. Repost the user’s notifications (suppressed during lockdown mode).
|
||
|
||
The CL also updates corresponding tests.
|
||
|
||
Bug: 173721373
|
||
Bug: 250743174
|
||
Test: atest NotificationManagerServiceTest
|
||
Test: atest NotificationListenersTest
|
||
Ignore-AOSP-First: pending fix for a security issue.
|
||
|
||
Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d
|
||
Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d
|
||
(cherry picked from commit de3b12fca23178d8c821058261572449b67d5967)
|
||
(cherry picked from commit 5e40f39f5bd4ae769d79ce022a64f1345512b65d)
|
||
Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d
|
||
---
|
||
.../NotificationManagerService.java | 75 ++++++++++++-------
|
||
1 file changed, 46 insertions(+), 29 deletions(-)
|
||
|
||
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
|
||
index bcb657b5a8e2..0ac51524a648 100755
|
||
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
|
||
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
|
||
@@ -1287,34 +1287,39 @@ public class NotificationManagerService extends SystemService {
|
||
return (haystack & needle) != 0;
|
||
}
|
||
|
||
- public boolean isInLockDownMode() {
|
||
- return mIsInLockDownMode;
|
||
+ // Return whether the user is in lockdown mode.
|
||
+ // If the flag is not set, we assume the user is not in lockdown.
|
||
+ public boolean isInLockDownMode(int userId) {
|
||
+ return mUserInLockDownMode.get(userId, false);
|
||
}
|
||
|
||
@Override
|
||
public synchronized void onStrongAuthRequiredChanged(int userId) {
|
||
boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId),
|
||
STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN);
|
||
- mUserInLockDownMode.put(userId, userInLockDownModeNext);
|
||
- boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1;
|
||
|
||
- if (mIsInLockDownMode == isInLockDownModeNext) {
|
||
+ // Nothing happens if the lockdown mode of userId keeps the same.
|
||
+ if (userInLockDownModeNext == isInLockDownMode(userId)) {
|
||
return;
|
||
}
|
||
|
||
- if (isInLockDownModeNext) {
|
||
- cancelNotificationsWhenEnterLockDownMode();
|
||
+ // When the lockdown mode is changed, we perform the following steps.
|
||
+ // If the userInLockDownModeNext is true, all the function calls to
|
||
+ // notifyPostedLocked and notifyRemovedLocked will not be executed.
|
||
+ // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked
|
||
+ // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked.
|
||
+ // So we shall call cancelNotificationsWhenEnterLockDownMode before
|
||
+ // we set mUserInLockDownMode as true.
|
||
+ // On the other hand, if the userInLockDownModeNext is false, we shall call
|
||
+ // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode
|
||
+ if (userInLockDownModeNext) {
|
||
+ cancelNotificationsWhenEnterLockDownMode(userId);
|
||
}
|
||
|
||
- // When the mIsInLockDownMode is true, both notifyPostedLocked and
|
||
- // notifyRemovedLocked will be dismissed. So we shall call
|
||
- // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode
|
||
- // as true and call postNotificationsWhenExitLockDownMode after we set
|
||
- // mIsInLockDownMode as false.
|
||
- mIsInLockDownMode = isInLockDownModeNext;
|
||
+ mUserInLockDownMode.put(userId, userInLockDownModeNext);
|
||
|
||
- if (!isInLockDownModeNext) {
|
||
- postNotificationsWhenExitLockDownMode();
|
||
+ if (!userInLockDownModeNext) {
|
||
+ postNotificationsWhenExitLockDownMode(userId);
|
||
}
|
||
}
|
||
}
|
||
@@ -6417,11 +6422,14 @@ public class NotificationManagerService extends SystemService {
|
||
}
|
||
}
|
||
|
||
- private void cancelNotificationsWhenEnterLockDownMode() {
|
||
+ private void cancelNotificationsWhenEnterLockDownMode(int userId) {
|
||
synchronized (mNotificationLock) {
|
||
int numNotifications = mNotificationList.size();
|
||
for (int i = 0; i < numNotifications; i++) {
|
||
NotificationRecord rec = mNotificationList.get(i);
|
||
+ if (rec.getUser().getIdentifier() != userId) {
|
||
+ continue;
|
||
+ }
|
||
mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL,
|
||
rec.getStats());
|
||
}
|
||
@@ -6429,14 +6437,23 @@ public class NotificationManagerService extends SystemService {
|
||
}
|
||
}
|
||
|
||
- private void postNotificationsWhenExitLockDownMode() {
|
||
+ private void postNotificationsWhenExitLockDownMode(int userId) {
|
||
synchronized (mNotificationLock) {
|
||
int numNotifications = mNotificationList.size();
|
||
+ // Set the delay to spread out the burst of notifications.
|
||
+ long delay = 0;
|
||
for (int i = 0; i < numNotifications; i++) {
|
||
NotificationRecord rec = mNotificationList.get(i);
|
||
- mListeners.notifyPostedLocked(rec, rec);
|
||
+ if (rec.getUser().getIdentifier() != userId) {
|
||
+ continue;
|
||
+ }
|
||
+ mHandler.postDelayed(() -> {
|
||
+ synchronized (mNotificationLock) {
|
||
+ mListeners.notifyPostedLocked(rec, rec);
|
||
+ }
|
||
+ }, delay);
|
||
+ delay += 20;
|
||
}
|
||
-
|
||
}
|
||
}
|
||
|
||
@@ -6545,7 +6562,7 @@ public class NotificationManagerService extends SystemService {
|
||
* notifications visible to the given listener.
|
||
*/
|
||
@GuardedBy("mNotificationLock")
|
||
- private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) {
|
||
+ NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) {
|
||
final int N = mNotificationList.size();
|
||
ArrayList<String> keys = new ArrayList<String>(N);
|
||
ArrayList<String> interceptedKeys = new ArrayList<String>(N);
|
||
@@ -6562,6 +6579,9 @@ public class NotificationManagerService extends SystemService {
|
||
Bundle hidden = new Bundle();
|
||
for (int i = 0; i < N; i++) {
|
||
NotificationRecord record = mNotificationList.get(i);
|
||
+ if (isInLockDownMode(record.getUser().getIdentifier())) {
|
||
+ continue;
|
||
+ }
|
||
if (!isVisibleToListener(record.sbn, info)) {
|
||
continue;
|
||
}
|
||
@@ -6600,8 +6620,8 @@ public class NotificationManagerService extends SystemService {
|
||
channels, overridePeople, snoozeCriteria, showBadge, userSentiment, hidden);
|
||
}
|
||
|
||
- boolean isInLockDownMode() {
|
||
- return mStrongAuthTracker.isInLockDownMode();
|
||
+ boolean isInLockDownMode(int userId) {
|
||
+ return mStrongAuthTracker.isInLockDownMode(userId);
|
||
}
|
||
|
||
boolean hasCompanionDevice(ManagedServiceInfo info) {
|
||
@@ -6636,7 +6656,8 @@ public class NotificationManagerService extends SystemService {
|
||
ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE));
|
||
}
|
||
|
||
- private boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) {
|
||
+ @VisibleForTesting
|
||
+ boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) {
|
||
if (!listener.enabledAndUserMatches(sbn.getUserId())) {
|
||
return false;
|
||
}
|
||
@@ -6926,7 +6947,7 @@ public class NotificationManagerService extends SystemService {
|
||
@GuardedBy("mNotificationLock")
|
||
void notifyPostedLocked(NotificationRecord r, NotificationRecord old,
|
||
boolean notifyAllListeners) {
|
||
- if (isInLockDownMode()) {
|
||
+ if (isInLockDownMode(r.getUser().getIdentifier())) {
|
||
return;
|
||
}
|
||
|
||
@@ -6992,7 +7013,7 @@ public class NotificationManagerService extends SystemService {
|
||
@GuardedBy("mNotificationLock")
|
||
public void notifyRemovedLocked(NotificationRecord r, int reason,
|
||
NotificationStats notificationStats) {
|
||
- if (isInLockDownMode()) {
|
||
+ if (isInLockDownMode(r.getUser().getIdentifier())) {
|
||
return;
|
||
}
|
||
|
||
@@ -7047,10 +7068,6 @@ public class NotificationManagerService extends SystemService {
|
||
*/
|
||
@GuardedBy("mNotificationLock")
|
||
public void notifyRankingUpdateLocked(List<NotificationRecord> changedHiddenNotifications) {
|
||
- if (isInLockDownMode()) {
|
||
- return;
|
||
- }
|
||
-
|
||
boolean isHiddenRankingUpdate = changedHiddenNotifications != null
|
||
&& changedHiddenNotifications.size() > 0;
|
||
|