summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--[-rwxr-xr-x]services/core/java/com/android/server/notification/NotificationManagerService.java114
-rw-r--r--services/tests/uiservicestests/AndroidManifest.xml1
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java135
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java64
4 files changed, 6 insertions, 308 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 3e77d86f42d9..819c111b4f0b 100755..100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -204,7 +204,6 @@ import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.SparseBooleanArray;
import android.util.StatsLog;
import android.util.Xml;
import android.util.proto.ProtoOutputStream;
@@ -230,7 +229,6 @@ import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.internal.util.function.TriPredicate;
-import com.android.internal.widget.LockPatternUtils;
import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
import com.android.server.IoThread;
@@ -1493,54 +1491,6 @@ public class NotificationManagerService extends SystemService {
return out;
}
- protected class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker {
-
- SparseBooleanArray mUserInLockDownMode = new SparseBooleanArray();
- boolean mIsInLockDownMode = false;
-
- StrongAuthTracker(Context context) {
- super(context);
- }
-
- private boolean containsFlag(int haystack, int needle) {
- return (haystack & needle) != 0;
- }
-
- public boolean isInLockDownMode() {
- return mIsInLockDownMode;
- }
-
- @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) {
- return;
- }
-
- if (isInLockDownModeNext) {
- cancelNotificationsWhenEnterLockDownMode();
- }
-
- // 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;
-
- if (!isInLockDownModeNext) {
- postNotificationsWhenExitLockDownMode();
- }
- }
- }
-
- private LockPatternUtils mLockPatternUtils;
- private StrongAuthTracker mStrongAuthTracker;
-
public NotificationManagerService(Context context) {
super(context);
Notification.processWhitelistToken = WHITELIST_TOKEN;
@@ -1553,16 +1503,6 @@ public class NotificationManagerService extends SystemService {
}
@VisibleForTesting
- void setStrongAuthTracker(StrongAuthTracker strongAuthTracker) {
- mStrongAuthTracker = strongAuthTracker;
- }
-
- @VisibleForTesting
- void setKeyguardManager(KeyguardManager keyguardManager) {
- mKeyguardManager = keyguardManager;
- }
-
- @VisibleForTesting
void setHints(int hints) {
mListenerHints = hints;
}
@@ -1732,8 +1672,6 @@ public class NotificationManagerService extends SystemService {
mHandler = new WorkerHandler(looper);
mRankingThread.start();
- mLockPatternUtils = new LockPatternUtils(getContext());
- mStrongAuthTracker = new StrongAuthTracker(getContext());
String[] extractorNames;
try {
extractorNames = resources.getStringArray(R.array.config_notificationSignalExtractors);
@@ -1876,8 +1814,7 @@ public class NotificationManagerService extends SystemService {
init(Looper.myLooper(),
AppGlobals.getPackageManager(), getContext().getPackageManager(),
getLocalService(LightsManager.class),
- new NotificationListeners(getContext(), mNotificationLock, mUserProfiles,
- AppGlobals.getPackageManager()),
+ new NotificationListeners(AppGlobals.getPackageManager()),
new NotificationAssistants(getContext(), mNotificationLock, mUserProfiles,
AppGlobals.getPackageManager()),
new ConditionProviders(getContext(), mUserProfiles, AppGlobals.getPackageManager()),
@@ -2020,7 +1957,6 @@ public class NotificationManagerService extends SystemService {
mRoleObserver = new RoleObserver(getContext().getSystemService(RoleManager.class),
mPackageManager, getContext().getMainExecutor());
mRoleObserver.init();
- mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker);
} else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
// This observer will force an update when observe is called, causing us to
// bind to listener services.
@@ -7414,29 +7350,6 @@ public class NotificationManagerService extends SystemService {
}
}
- private void cancelNotificationsWhenEnterLockDownMode() {
- synchronized (mNotificationLock) {
- int numNotifications = mNotificationList.size();
- for (int i = 0; i < numNotifications; i++) {
- NotificationRecord rec = mNotificationList.get(i);
- mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL,
- rec.getStats());
- }
-
- }
- }
-
- private void postNotificationsWhenExitLockDownMode() {
- synchronized (mNotificationLock) {
- int numNotifications = mNotificationList.size();
- for (int i = 0; i < numNotifications; i++) {
- NotificationRecord rec = mNotificationList.get(i);
- mListeners.notifyPostedLocked(rec, rec);
- }
-
- }
- }
-
private void updateNotificationPulse() {
synchronized (mNotificationLock) {
updateLightsLocked();
@@ -7647,10 +7560,6 @@ public class NotificationManagerService extends SystemService {
rankings.toArray(new NotificationListenerService.Ranking[0]));
}
- boolean isInLockDownMode() {
- return mStrongAuthTracker.isInLockDownMode();
- }
-
boolean hasCompanionDevice(ManagedServiceInfo info) {
if (mCompanionManager == null) {
mCompanionManager = getCompanionManager();
@@ -8170,9 +8079,9 @@ public class NotificationManagerService extends SystemService {
private final ArraySet<ManagedServiceInfo> mLightTrimListeners = new ArraySet<>();
- public NotificationListeners(Context context, Object lock, UserProfiles userProfiles,
- IPackageManager pm) {
- super(context, lock, userProfiles, pm);
+ public NotificationListeners(IPackageManager pm) {
+ super(getContext(), mNotificationLock, mUserProfiles, pm);
+
}
@Override
@@ -8281,12 +8190,8 @@ public class NotificationManagerService extends SystemService {
* targetting <= O_MR1
*/
@GuardedBy("mNotificationLock")
- void notifyPostedLocked(NotificationRecord r, NotificationRecord old,
+ private void notifyPostedLocked(NotificationRecord r, NotificationRecord old,
boolean notifyAllListeners) {
- if (isInLockDownMode()) {
- return;
- }
-
// Lazily initialized snapshots of the notification.
StatusBarNotification sbn = r.sbn;
StatusBarNotification oldSbn = (old != null) ? old.sbn : null;
@@ -8349,11 +8254,8 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
public void notifyRemovedLocked(NotificationRecord r, int reason,
NotificationStats notificationStats) {
- if (isInLockDownMode()) {
- return;
- }
-
final StatusBarNotification sbn = r.sbn;
+
// make a copy in case changes are made to the underlying Notification object
// NOTE: this copy is lightweight: it doesn't include heavyweight parts of the
// notification
@@ -8404,10 +8306,6 @@ public class NotificationManagerService extends SystemService {
*/
@GuardedBy("mNotificationLock")
public void notifyRankingUpdateLocked(List<NotificationRecord> changedHiddenNotifications) {
- if (isInLockDownMode()) {
- return;
- }
-
boolean isHiddenRankingUpdate = changedHiddenNotifications != null
&& changedHiddenNotifications.size() > 0;
diff --git a/services/tests/uiservicestests/AndroidManifest.xml b/services/tests/uiservicestests/AndroidManifest.xml
index 5b926e041b42..7453c489ecc8 100644
--- a/services/tests/uiservicestests/AndroidManifest.xml
+++ b/services/tests/uiservicestests/AndroidManifest.xml
@@ -31,7 +31,6 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS" />
<uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT"/>
- <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
<application android:debuggable="true">
<uses-library android:name="android.test.runner" />
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java
deleted file mode 100644
index 793739bfe8f5..000000000000
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.server.notification;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.INotificationManager;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.service.notification.NotificationStats;
-import android.service.notification.StatusBarNotification;
-import android.testing.TestableContext;
-
-import com.android.server.UiServiceTestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.internal.util.reflection.FieldSetter;
-
-import java.util.List;
-
-public class NotificationListenersTest extends UiServiceTestCase {
-
- @Mock
- private PackageManager mPm;
- @Mock
- private IPackageManager miPm;
-
- @Mock
- NotificationManagerService mNm;
- @Mock
- private INotificationManager mINm;
- private TestableContext mContext = spy(getContext());
-
- NotificationManagerService.NotificationListeners mListeners;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- getContext().setMockPackageManager(mPm);
- doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any());
-
- mListeners = spy(mNm.new NotificationListeners(
- mContext, new Object(), mock(ManagedServices.UserProfiles.class), miPm));
- when(mNm.getBinderService()).thenReturn(mINm);
- }
-
- @Test
- public void testNotifyPostedLockedInLockdownMode() {
- NotificationRecord r = mock(NotificationRecord.class);
- NotificationRecord old = mock(NotificationRecord.class);
-
- // before the lockdown mode
- when(mNm.isInLockDownMode()).thenReturn(false);
- mListeners.notifyPostedLocked(r, old, true);
- mListeners.notifyPostedLocked(r, old, false);
- verify(mListeners, times(2)).getServices();
-
- // in the lockdown mode
- reset(r);
- reset(old);
- reset(mListeners);
- when(mNm.isInLockDownMode()).thenReturn(true);
- mListeners.notifyPostedLocked(r, old, true);
- mListeners.notifyPostedLocked(r, old, false);
- verify(mListeners, never()).getServices();
- }
-
- @Test
- public void testnotifyRankingUpdateLockedInLockdownMode() {
- List chn = mock(List.class);
-
- // before the lockdown mode
- when(mNm.isInLockDownMode()).thenReturn(false);
- mListeners.notifyRankingUpdateLocked(chn);
- verify(chn, times(1)).size();
-
- // in the lockdown mode
- reset(chn);
- when(mNm.isInLockDownMode()).thenReturn(true);
- mListeners.notifyRankingUpdateLocked(chn);
- verify(chn, never()).size();
- }
-
- @Test
- public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException {
- StatusBarNotification sbn = mock(StatusBarNotification.class);
- NotificationRecord r = mock(NotificationRecord.class);
- NotificationStats rs = mock(NotificationStats.class);
- FieldSetter.setField(r,
- NotificationRecord.class.getDeclaredField("sbn"),
- sbn);
- FieldSetter.setField(mNm,
- NotificationManagerService.class.getDeclaredField("mHandler"),
- mock(NotificationManagerService.WorkerHandler.class));
-
- // before the lockdown mode
- when(mNm.isInLockDownMode()).thenReturn(false);
- mListeners.notifyRemovedLocked(r, 0, rs);
- mListeners.notifyRemovedLocked(r, 0, rs);
- verify(sbn, times(2)).cloneLight();
-
- // in the lockdown mode
- reset(sbn);
- reset(r);
- reset(rs);
- when(mNm.isInLockDownMode()).thenReturn(true);
- mListeners.notifyRemovedLocked(r, 0, rs);
- mListeners.notifyRemovedLocked(r, 0, rs);
- verify(sbn, never()).cloneLight();
- }
-}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index c2cef6f52c1c..ad8317c9aad4 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -46,12 +46,9 @@ import static android.os.Build.VERSION_CODES.O_MR1;
import static android.os.Build.VERSION_CODES.P;
import static android.service.notification.Adjustment.KEY_IMPORTANCE;
import static android.service.notification.Adjustment.KEY_USER_SENTIMENT;
-import static android.service.notification.NotificationListenerService.REASON_CANCEL_ALL;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
-
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
@@ -320,26 +317,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// Tests for this not being true are in CTS NotificationManagerTest
return true;
}
-
- class StrongAuthTrackerFake extends NotificationManagerService.StrongAuthTracker {
- private int mGetStrongAuthForUserReturnValue = 0;
- StrongAuthTrackerFake(Context context) {
- super(context);
- }
-
- public void setGetStrongAuthForUserReturnValue(int val) {
- mGetStrongAuthForUserReturnValue = val;
- }
-
- @Override
- public int getStrongAuthForUser(int userId) {
- return mGetStrongAuthForUserReturnValue;
- }
- }
}
- TestableNotificationManagerService.StrongAuthTrackerFake mStrongAuthTracker;
-
private class TestableToastCallback extends ITransientNotification.Stub {
@Override
public void show(IBinder windowToken) {
@@ -426,9 +405,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mService.setAudioManager(mAudioManager);
- mStrongAuthTracker = mService.new StrongAuthTrackerFake(mContext);
- mService.setStrongAuthTracker(mStrongAuthTracker);
-
// Tests call directly into the Binder.
mBinderService = mService.getBinderService();
mInternalService = mService.getInternalService();
@@ -5396,44 +5372,4 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
assertEquals(1, notifsAfter.length);
}
-
- @Test
- public void testStrongAuthTracker_isInLockDownMode() {
- mStrongAuthTracker.setGetStrongAuthForUserReturnValue(
- STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN);
- mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId());
- assertTrue(mStrongAuthTracker.isInLockDownMode());
- mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0);
- mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId());
- assertFalse(mStrongAuthTracker.isInLockDownMode());
- }
-
- @Test
- public void testCancelAndPostNotificationsWhenEnterAndExitLockDownMode() {
- // post 2 notifications from 2 packages
- NotificationRecord pkgA = new NotificationRecord(mContext,
- generateSbn("a", 1000, 9, 0), mTestNotificationChannel);
- mService.addNotification(pkgA);
- NotificationRecord pkgB = new NotificationRecord(mContext,
- generateSbn("b", 1001, 9, 0), mTestNotificationChannel);
- mService.addNotification(pkgB);
-
- // when entering the lockdown mode, cancel the 2 notifications.
- mStrongAuthTracker.setGetStrongAuthForUserReturnValue(
- STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN);
- mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId());
- assertTrue(mStrongAuthTracker.isInLockDownMode());
-
- // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN.
- ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
- verify(mListeners, times(2)).notifyRemovedLocked(any(), captor.capture(), any());
- assertEquals(REASON_CANCEL_ALL, captor.getValue().intValue());
-
- // exit lockdown mode.
- mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0);
- mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId());
-
- // the notifyPostedLocked function is called twice.
- verify(mListeners, times(2)).notifyPostedLocked(any(), any());
- }
}