Loading core/java/android/service/notification/NotificationAssistantService.java +18 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.service.notification; import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Handler; Loading @@ -34,6 +36,22 @@ import java.util.List; /** * A service that helps the user manage notifications. * <p> * Only one notification assistant can be active at a time. Unlike notification listener services, * assistant services can additionally modify certain aspects about notifications * (see {@link Adjustment}) before they are posted. *<p> * A note about managed profiles: Unlike {@link NotificationListenerService listener services}, * NotificationAssistantServices are allowed to run in managed profiles * (see {@link DevicePolicyManager#isManagedProfile(ComponentName)}), so they can access the * information they need to create good {@link Adjustment adjustments}. To maintain the contract * with {@link NotificationListenerService}, an assistant service will receive all of the * callbacks from {@link NotificationListenerService} for the current user, managed profiles of * that user, and ones that affect all users. However, * {@link #onNotificationEnqueued(StatusBarNotification)} will only be called for notifications * sent to the current user, and {@link Adjustment adjuments} will only be accepted for the * current user. * * @hide */ @SystemApi Loading services/core/java/com/android/server/notification/ManagedServices.java +16 −0 Original line number Diff line number Diff line Loading @@ -629,6 +629,15 @@ abstract public class ManagedServices { + service + " " + service.getClass()); } public boolean isSameUser(IInterface service, int userId) { checkNotNull(service); ManagedServiceInfo info = getServiceFromTokenLocked(service); if (info != null) { return info.isSameUser(userId); } return false; } public void unregisterService(IInterface service, int userid) { checkNotNull(service); // no need to check permissions; if your service binder is in the list, Loading Loading @@ -1205,6 +1214,13 @@ abstract public class ManagedServices { proto.end(token); } public boolean isSameUser(int userId) { if (!isEnabledForCurrentProfiles()) { return false; } return this.userid == userId; } public boolean enabledAndUserMatches(int nid) { if (!isEnabledForCurrentProfiles()) { return false; Loading services/core/java/com/android/server/notification/NotificationManagerService.java +16 −16 Original line number Diff line number Diff line Loading @@ -3450,7 +3450,8 @@ public class NotificationManagerService extends SystemService { for (int i = 0; i < N; i++) { final NotificationRecord r = mEnqueuedNotifications.get(i); if (Objects.equals(adjustment.getKey(), r.getKey()) && Objects.equals(adjustment.getUser(), r.getUserId())) { && Objects.equals(adjustment.getUser(), r.getUserId()) && mAssistants.isSameUser(token, r.getUserId())) { applyAdjustment(r, adjustment); r.applyAdjustments(); foundEnqueued = true; Loading @@ -3470,17 +3471,9 @@ public class NotificationManagerService extends SystemService { @Override public void applyAdjustmentFromAssistant(INotificationListener token, Adjustment adjustment) { final long identity = Binder.clearCallingIdentity(); try { synchronized (mNotificationLock) { mAssistants.checkServiceTokenLocked(token); NotificationRecord n = mNotificationsByKey.get(adjustment.getKey()); applyAdjustment(n, adjustment); } mRankingHandler.requestSort(); } finally { Binder.restoreCallingIdentity(identity); } List<Adjustment> adjustments = new ArrayList<>(); adjustments.add(adjustment); applyAdjustmentsFromAssistant(token, adjustments); } @Override Loading @@ -3489,14 +3482,20 @@ public class NotificationManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { boolean appliedAdjustment = false; synchronized (mNotificationLock) { mAssistants.checkServiceTokenLocked(token); for (Adjustment adjustment : adjustments) { NotificationRecord n = mNotificationsByKey.get(adjustment.getKey()); applyAdjustment(n, adjustment); NotificationRecord r = mNotificationsByKey.get(adjustment.getKey()); if (r != null && mAssistants.isSameUser(token, r.getUserId())) { applyAdjustment(r, adjustment); appliedAdjustment = true; } } } if (appliedAdjustment) { mRankingHandler.requestSort(); } } finally { Binder.restoreCallingIdentity(identity); } Loading Loading @@ -6468,7 +6467,8 @@ public class NotificationManagerService extends SystemService { // There should be only one, but it's a list, so while we enforce // singularity elsewhere, we keep it general here, to avoid surprises. for (final ManagedServiceInfo info : NotificationAssistants.this.getServices()) { boolean sbnVisible = isVisibleToListener(sbn, info); boolean sbnVisible = isVisibleToListener(sbn, info) && info.isSameUser(r.getUserId()); if (!sbnVisible) { continue; } Loading services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +15 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading Loading @@ -693,6 +694,20 @@ public class ManagedServicesTest extends UiServiceTestCase { } } @Test public void testIsSameUser() { IInterface service = mock(IInterface.class); when(service.asBinder()).thenReturn(mock(IBinder.class)); ManagedServices services = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm, APPROVAL_BY_PACKAGE); services.registerService(service, null, 10); ManagedServices.ManagedServiceInfo info = services.checkServiceTokenLocked(service); info.isSystem = true; assertFalse(services.isSameUser(service, 0)); assertTrue(services.isSameUser(service, 10)); } private void loadXml(ManagedServices service) throws Exception { final StringBuffer xml = new StringBuffer(); xml.append("<" + service.getConfig().xmlTag + ">\n"); Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +75 −7 Original line number Diff line number Diff line Loading @@ -36,6 +36,10 @@ import static android.content.pm.PackageManager.FEATURE_WATCH; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.os.Build.VERSION_CODES.O_MR1; import static android.os.Build.VERSION_CODES.P; import static android.service.notification.NotificationListenerService.Ranking .USER_SENTIMENT_NEGATIVE; import static android.service.notification.NotificationListenerService.Ranking .USER_SENTIMENT_NEUTRAL; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; Loading @@ -50,7 +54,6 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading Loading @@ -84,7 +87,6 @@ import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.res.Resources; import android.graphics.Color; import android.media.AudioAttributes; import android.media.AudioManager; import android.net.Uri; import android.os.Binder; Loading @@ -97,7 +99,6 @@ import android.os.UserHandle; import android.provider.MediaStore; import android.provider.Settings.Secure; import android.service.notification.Adjustment; import android.service.notification.INotificationListener; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; import android.service.notification.NotifyingApp; Loading Loading @@ -2395,6 +2396,70 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(NotificationStats.DISMISSAL_AOD, r.getStats().getDismissalSurface()); } @Test public void testApplyAdjustmentMultiUser() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addNotification(r); NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(false); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyAdjustmentFromAssistant(null, adjustment); waitForIdle(); verify(handler, timeout(300).times(0)).scheduleSendRankingUpdate(); } @Test public void testApplyEnqueuedAdjustmentFromAssistant_singleUser() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addEnqueuedNotification(r); NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); assertEquals(USER_SENTIMENT_NEGATIVE, r.getUserSentiment()); } @Test public void testApplyEnqueuedAdjustmentFromAssistant_crossUser() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addEnqueuedNotification(r); NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(false); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); assertEquals(USER_SENTIMENT_NEUTRAL, r.getUserSentiment()); waitForIdle(); verify(handler, timeout(300).times(0)).scheduleSendRankingUpdate(); } @Test public void testUserSentimentChangeTriggersUpdate() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); Loading @@ -2402,10 +2467,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE); USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyAdjustmentFromAssistant(null, adjustment); Loading @@ -2422,10 +2488,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE); USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); Loading @@ -2442,15 +2509,16 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE); USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); assertEquals(NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE, assertEquals(USER_SENTIMENT_NEGATIVE, r.getUserSentiment()); } Loading Loading
core/java/android/service/notification/NotificationAssistantService.java +18 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.service.notification; import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Handler; Loading @@ -34,6 +36,22 @@ import java.util.List; /** * A service that helps the user manage notifications. * <p> * Only one notification assistant can be active at a time. Unlike notification listener services, * assistant services can additionally modify certain aspects about notifications * (see {@link Adjustment}) before they are posted. *<p> * A note about managed profiles: Unlike {@link NotificationListenerService listener services}, * NotificationAssistantServices are allowed to run in managed profiles * (see {@link DevicePolicyManager#isManagedProfile(ComponentName)}), so they can access the * information they need to create good {@link Adjustment adjustments}. To maintain the contract * with {@link NotificationListenerService}, an assistant service will receive all of the * callbacks from {@link NotificationListenerService} for the current user, managed profiles of * that user, and ones that affect all users. However, * {@link #onNotificationEnqueued(StatusBarNotification)} will only be called for notifications * sent to the current user, and {@link Adjustment adjuments} will only be accepted for the * current user. * * @hide */ @SystemApi Loading
services/core/java/com/android/server/notification/ManagedServices.java +16 −0 Original line number Diff line number Diff line Loading @@ -629,6 +629,15 @@ abstract public class ManagedServices { + service + " " + service.getClass()); } public boolean isSameUser(IInterface service, int userId) { checkNotNull(service); ManagedServiceInfo info = getServiceFromTokenLocked(service); if (info != null) { return info.isSameUser(userId); } return false; } public void unregisterService(IInterface service, int userid) { checkNotNull(service); // no need to check permissions; if your service binder is in the list, Loading Loading @@ -1205,6 +1214,13 @@ abstract public class ManagedServices { proto.end(token); } public boolean isSameUser(int userId) { if (!isEnabledForCurrentProfiles()) { return false; } return this.userid == userId; } public boolean enabledAndUserMatches(int nid) { if (!isEnabledForCurrentProfiles()) { return false; Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +16 −16 Original line number Diff line number Diff line Loading @@ -3450,7 +3450,8 @@ public class NotificationManagerService extends SystemService { for (int i = 0; i < N; i++) { final NotificationRecord r = mEnqueuedNotifications.get(i); if (Objects.equals(adjustment.getKey(), r.getKey()) && Objects.equals(adjustment.getUser(), r.getUserId())) { && Objects.equals(adjustment.getUser(), r.getUserId()) && mAssistants.isSameUser(token, r.getUserId())) { applyAdjustment(r, adjustment); r.applyAdjustments(); foundEnqueued = true; Loading @@ -3470,17 +3471,9 @@ public class NotificationManagerService extends SystemService { @Override public void applyAdjustmentFromAssistant(INotificationListener token, Adjustment adjustment) { final long identity = Binder.clearCallingIdentity(); try { synchronized (mNotificationLock) { mAssistants.checkServiceTokenLocked(token); NotificationRecord n = mNotificationsByKey.get(adjustment.getKey()); applyAdjustment(n, adjustment); } mRankingHandler.requestSort(); } finally { Binder.restoreCallingIdentity(identity); } List<Adjustment> adjustments = new ArrayList<>(); adjustments.add(adjustment); applyAdjustmentsFromAssistant(token, adjustments); } @Override Loading @@ -3489,14 +3482,20 @@ public class NotificationManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { boolean appliedAdjustment = false; synchronized (mNotificationLock) { mAssistants.checkServiceTokenLocked(token); for (Adjustment adjustment : adjustments) { NotificationRecord n = mNotificationsByKey.get(adjustment.getKey()); applyAdjustment(n, adjustment); NotificationRecord r = mNotificationsByKey.get(adjustment.getKey()); if (r != null && mAssistants.isSameUser(token, r.getUserId())) { applyAdjustment(r, adjustment); appliedAdjustment = true; } } } if (appliedAdjustment) { mRankingHandler.requestSort(); } } finally { Binder.restoreCallingIdentity(identity); } Loading Loading @@ -6468,7 +6467,8 @@ public class NotificationManagerService extends SystemService { // There should be only one, but it's a list, so while we enforce // singularity elsewhere, we keep it general here, to avoid surprises. for (final ManagedServiceInfo info : NotificationAssistants.this.getServices()) { boolean sbnVisible = isVisibleToListener(sbn, info); boolean sbnVisible = isVisibleToListener(sbn, info) && info.isSameUser(r.getUserId()); if (!sbnVisible) { continue; } Loading
services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +15 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading Loading @@ -693,6 +694,20 @@ public class ManagedServicesTest extends UiServiceTestCase { } } @Test public void testIsSameUser() { IInterface service = mock(IInterface.class); when(service.asBinder()).thenReturn(mock(IBinder.class)); ManagedServices services = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm, APPROVAL_BY_PACKAGE); services.registerService(service, null, 10); ManagedServices.ManagedServiceInfo info = services.checkServiceTokenLocked(service); info.isSystem = true; assertFalse(services.isSameUser(service, 0)); assertTrue(services.isSameUser(service, 10)); } private void loadXml(ManagedServices service) throws Exception { final StringBuffer xml = new StringBuffer(); xml.append("<" + service.getConfig().xmlTag + ">\n"); Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +75 −7 Original line number Diff line number Diff line Loading @@ -36,6 +36,10 @@ import static android.content.pm.PackageManager.FEATURE_WATCH; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.os.Build.VERSION_CODES.O_MR1; import static android.os.Build.VERSION_CODES.P; import static android.service.notification.NotificationListenerService.Ranking .USER_SENTIMENT_NEGATIVE; import static android.service.notification.NotificationListenerService.Ranking .USER_SENTIMENT_NEUTRAL; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; Loading @@ -50,7 +54,6 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading Loading @@ -84,7 +87,6 @@ import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.res.Resources; import android.graphics.Color; import android.media.AudioAttributes; import android.media.AudioManager; import android.net.Uri; import android.os.Binder; Loading @@ -97,7 +99,6 @@ import android.os.UserHandle; import android.provider.MediaStore; import android.provider.Settings.Secure; import android.service.notification.Adjustment; import android.service.notification.INotificationListener; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; import android.service.notification.NotifyingApp; Loading Loading @@ -2395,6 +2396,70 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(NotificationStats.DISMISSAL_AOD, r.getStats().getDismissalSurface()); } @Test public void testApplyAdjustmentMultiUser() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addNotification(r); NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(false); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyAdjustmentFromAssistant(null, adjustment); waitForIdle(); verify(handler, timeout(300).times(0)).scheduleSendRankingUpdate(); } @Test public void testApplyEnqueuedAdjustmentFromAssistant_singleUser() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addEnqueuedNotification(r); NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); assertEquals(USER_SENTIMENT_NEGATIVE, r.getUserSentiment()); } @Test public void testApplyEnqueuedAdjustmentFromAssistant_crossUser() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addEnqueuedNotification(r); NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(false); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); assertEquals(USER_SENTIMENT_NEUTRAL, r.getUserSentiment()); waitForIdle(); verify(handler, timeout(300).times(0)).scheduleSendRankingUpdate(); } @Test public void testUserSentimentChangeTriggersUpdate() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); Loading @@ -2402,10 +2467,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE); USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyAdjustmentFromAssistant(null, adjustment); Loading @@ -2422,10 +2488,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE); USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); Loading @@ -2442,15 +2509,16 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationManagerService.WorkerHandler handler = mock( NotificationManagerService.WorkerHandler.class); mService.setHandler(handler); when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true); Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE); USER_SENTIMENT_NEGATIVE); Adjustment adjustment = new Adjustment( r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier()); mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment); assertEquals(NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE, assertEquals(USER_SENTIMENT_NEGATIVE, r.getUserSentiment()); } Loading