From 20a47d5ed062f4a61c0efe4b1e2687ed507a39cd Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 7 Apr 2022 10:54:47 -0400 Subject: [PATCH] Allow registered call notifications to always appear Even if the app's notifications are disabled. Test: NotificationManagerServiceTest Test: NotificationInfoTest Test: manually call device Fixes: 227456870 Change-Id: Ib218e57d585a6066ddbc713d2d3a8445ac959ad2 --- .../android/app/INotificationManager.aidl | 1 + packages/SystemUI/AndroidManifest.xml | 1 + .../SystemUI/res/layout/notification_info.xml | 9 ++ packages/SystemUI/res/values/strings.xml | 3 + .../row/ExpandableNotificationRow.java | 15 ++- .../notification/row/NotificationInfo.java | 16 +++- .../row/NotificationInfoTest.java | 95 ++++++++++++++++++- .../NotificationManagerService.java | 34 ++++++- .../NotificationManagerServiceTest.java | 54 ++++++++++- .../NotificationPermissionMigrationTest.java | 3 +- .../server/notification/RoleObserverTest.java | 3 +- 11 files changed, 224 insertions(+), 10 deletions(-) diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 4fbe232556ede..df9f2a3cbb252 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -57,6 +57,7 @@ interface INotificationManager @UnsupportedAppUsage void cancelNotificationWithTag(String pkg, String opPkg, String tag, int id, int userId); + boolean isInCall(String pkg, int uid); void setShowBadge(String pkg, int uid, boolean showBadge); boolean canShowBadge(String pkg, int uid); boolean hasSentValidMsg(String pkg, int uid); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index eb7fea3eb89ac..6d7172ec0fbe9 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -224,6 +224,7 @@ + diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 7e8112a8885b8..4f7d09963fc64 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -135,6 +135,15 @@ asked for it --> android:layout_height="wrap_content" style="@*android:style/TextAppearance.DeviceDefault.Notification" /> + + + These notifications can\'t be modified. + + Call notifications can\'t be modified. + This group of notifications cannot be configured here 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 5bf75c796fc9c..efb46b9689d3a 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 @@ -32,6 +32,7 @@ import android.annotation.Nullable; import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationChannel; +import android.app.role.RoleManager; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -380,12 +381,22 @@ public class ExpandableNotificationRow extends ActivatableNotificationView Settings.Secure.NOTIFICATION_PERMISSION_ENABLED, 0, USER_SYSTEM) == 1) { INotificationManager iNm = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + + boolean isSystem = false; try { - return iNm.isPermissionFixed(sbn.getPackageName(), sbn.getUserId()); + isSystem = iNm.isPermissionFixed(sbn.getPackageName(), sbn.getUserId()); } catch (RemoteException e) { Log.e(TAG, "cannot reach NMS"); } - return false; + RoleManager rm = context.getSystemService(RoleManager.class); + List fixedRoleHolders = new ArrayList<>(); + fixedRoleHolders.addAll(rm.getRoleHolders(RoleManager.ROLE_DIALER)); + fixedRoleHolders.addAll(rm.getRoleHolders(RoleManager.ROLE_EMERGENCY)); + if (fixedRoleHolders.contains(sbn.getPackageName())) { + isSystem = true; + } + + return isSystem; } else { PackageManager packageManager = CentralSurfaces.getPackageManagerForUser( context, sbn.getUser().getIdentifier()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 59a78ed6f4ea1..8b01a4790f3c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -124,6 +124,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private NotificationEntry mEntry; private StatusBarNotification mSbn; private boolean mIsDeviceProvisioned; + private boolean mIsSystemRegisteredCall; private OnSettingsClickListener mOnSettingsClickListener; private OnAppSettingsClickListener mAppSettingsClickListener; @@ -229,6 +230,9 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G mShowAutomaticSetting = mAssistantFeedbackController.isFeedbackEnabled(); mUiEventLogger = uiEventLogger; + mIsSystemRegisteredCall = mSbn.getNotification().isStyle(Notification.CallStyle.class) + && mINotificationManager.isInCall(mSbn.getPackageName(), mSbn.getUid()); + int numTotalChannels = mINotificationManager.getNumNotificationChannelsForPackage( pkg, mAppUid, false /* includeDeleted */); if (mNumUniqueChannelsInRow == 0) { @@ -252,17 +256,27 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } private void bindInlineControls() { - if (mIsNonblockable) { + if (mIsSystemRegisteredCall) { + findViewById(R.id.non_configurable_call_text).setVisibility(VISIBLE); + findViewById(R.id.non_configurable_text).setVisibility(GONE); + findViewById(R.id.non_configurable_multichannel_text).setVisibility(GONE); + findViewById(R.id.interruptiveness_settings).setVisibility(GONE); + ((TextView) findViewById(R.id.done)).setText(R.string.inline_done_button); + findViewById(R.id.turn_off_notifications).setVisibility(GONE); + } else if (mIsNonblockable) { findViewById(R.id.non_configurable_text).setVisibility(VISIBLE); + findViewById(R.id.non_configurable_call_text).setVisibility(GONE); findViewById(R.id.non_configurable_multichannel_text).setVisibility(GONE); findViewById(R.id.interruptiveness_settings).setVisibility(GONE); ((TextView) findViewById(R.id.done)).setText(R.string.inline_done_button); findViewById(R.id.turn_off_notifications).setVisibility(GONE); } else if (mNumUniqueChannelsInRow > 1) { + findViewById(R.id.non_configurable_call_text).setVisibility(GONE); findViewById(R.id.non_configurable_text).setVisibility(GONE); findViewById(R.id.interruptiveness_settings).setVisibility(GONE); findViewById(R.id.non_configurable_multichannel_text).setVisibility(VISIBLE); } else { + findViewById(R.id.non_configurable_call_text).setVisibility(GONE); findViewById(R.id.non_configurable_text).setVisibility(GONE); findViewById(R.id.non_configurable_multichannel_text).setVisibility(GONE); findViewById(R.id.interruptiveness_settings).setVisibility(VISIBLE); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java index 324f0ac08fadf..b1f10751119e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java @@ -44,12 +44,15 @@ import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; +import android.app.PendingIntent; +import android.app.Person; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.service.notification.StatusBarNotification; +import android.telecom.TelecomManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -116,11 +119,15 @@ public class NotificationInfoTest extends SysuiTestCase { private ChannelEditorDialogController mChannelEditorDialogController; @Mock private AssistantFeedbackController mAssistantFeedbackController; + @Mock + private TelecomManager mTelecomManager; @Before public void setUp() throws Exception { mTestableLooper = TestableLooper.get(this); + mContext.addMockSystemService(TelecomManager.class, mTelecomManager); + mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper()); mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger); // Inflate the layout @@ -161,7 +168,7 @@ public class NotificationInfoTest extends SysuiTestCase { IMPORTANCE_LOW); mDefaultNotificationChannelSet.add(mDefaultNotificationChannel); mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0, - new Notification(), UserHandle.CURRENT, null, 0); + new Notification(), UserHandle.getUserHandleForUid(TEST_UID), null, 0); mEntry = new NotificationEntryBuilder().setSbn(mSbn).build(); when(mAssistantFeedbackController.isFeedbackEnabled()).thenReturn(false); when(mAssistantFeedbackController.getInlineDescriptionResource(any())) @@ -631,6 +638,92 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationInfo.findViewById(R.id.interruptiveness_settings).getVisibility()); } + @Test + public void testBindNotification_whenCurrentlyInCall() throws Exception { + when(mMockINotificationManager.isInCall(anyString(), anyInt())).thenReturn(true); + + Person person = new Person.Builder() + .setName("caller") + .build(); + Notification.Builder nb = new Notification.Builder( + mContext, mNotificationChannel.getId()) + .setContentTitle("foo") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setStyle(Notification.CallStyle.forOngoingCall( + person, mock(PendingIntent.class))) + .setFullScreenIntent(mock(PendingIntent.class), true) + .addAction(new Notification.Action.Builder(null, "test", null).build()); + + mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0, + nb.build(), UserHandle.getUserHandleForUid(TEST_UID), null, 0); + mEntry.setSbn(mSbn); + mNotificationInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + mOnUserInteractionCallback, + mChannelEditorDialogController, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + null, + mUiEventLogger, + true, + false, + true, + mAssistantFeedbackController); + final TextView view = mNotificationInfo.findViewById(R.id.non_configurable_call_text); + assertEquals(View.VISIBLE, view.getVisibility()); + assertEquals(mContext.getString(R.string.notification_unblockable_call_desc), + view.getText()); + assertEquals(GONE, + mNotificationInfo.findViewById(R.id.interruptiveness_settings).getVisibility()); + assertEquals(GONE, + mNotificationInfo.findViewById(R.id.non_configurable_text).getVisibility()); + } + + @Test + public void testBindNotification_whenCurrentlyInCall_notCall() throws Exception { + when(mMockINotificationManager.isInCall(anyString(), anyInt())).thenReturn(true); + + Person person = new Person.Builder() + .setName("caller") + .build(); + Notification.Builder nb = new Notification.Builder( + mContext, mNotificationChannel.getId()) + .setContentTitle("foo") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setFullScreenIntent(mock(PendingIntent.class), true) + .addAction(new Notification.Action.Builder(null, "test", null).build()); + + mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0, + nb.build(), UserHandle.getUserHandleForUid(TEST_UID), null, 0); + mEntry.setSbn(mSbn); + mNotificationInfo.bindNotification( + mMockPackageManager, + mMockINotificationManager, + mOnUserInteractionCallback, + mChannelEditorDialogController, + TEST_PACKAGE_NAME, + mNotificationChannel, + mNotificationChannelSet, + mEntry, + null, + null, + mUiEventLogger, + true, + false, + true, + mAssistantFeedbackController); + assertEquals(GONE, + mNotificationInfo.findViewById(R.id.non_configurable_call_text).getVisibility()); + assertEquals(VISIBLE, + mNotificationInfo.findViewById(R.id.interruptiveness_settings).getVisibility()); + assertEquals(GONE, + mNotificationInfo.findViewById(R.id.non_configurable_text).getVisibility()); + } + @Test public void testBindNotification_automaticIsVisible() throws Exception { when(mAssistantFeedbackController.isFeedbackEnabled()).thenReturn(true); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index f42e734b96ecc..8ed145c8d1b1c 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -240,6 +240,7 @@ import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeProto; +import android.telecom.TelecomManager; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -509,6 +510,7 @@ public class NotificationManagerService extends SystemService { private ShortcutHelper mShortcutHelper; private PermissionHelper mPermissionHelper; private UsageStatsManagerInternal mUsageStatsManagerInternal; + private TelecomManager mTelecomManager; final IBinder mForegroundToken = new Binder(); private WorkerHandler mHandler; @@ -2100,7 +2102,8 @@ public class NotificationManagerService extends SystemService { NotificationHistoryManager historyManager, StatsManager statsManager, TelephonyManager telephonyManager, ActivityManagerInternal ami, MultiRateLimiter toastRateLimiter, PermissionHelper permissionHelper, - UsageStatsManagerInternal usageStatsManagerInternal) { + UsageStatsManagerInternal usageStatsManagerInternal, + TelecomManager telecomManager) { mHandler = handler; Resources resources = getContext().getResources(); mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(), @@ -2129,6 +2132,7 @@ public class NotificationManagerService extends SystemService { mDeviceIdleManager = getContext().getSystemService(DeviceIdleManager.class); mDpm = dpm; mUm = userManager; + mTelecomManager = telecomManager; mPlatformCompat = IPlatformCompat.Stub.asInterface( ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE)); @@ -2420,7 +2424,8 @@ public class NotificationManagerService extends SystemService { PermissionManagerServiceInternal.class), AppGlobals.getPackageManager(), AppGlobals.getPermissionManager(), mEnableAppSettingMigration, mForceUserSetOnUpgrade), - LocalServices.getService(UsageStatsManagerInternal.class)); + LocalServices.getService(UsageStatsManagerInternal.class), + getContext().getSystemService(TelecomManager.class)); publishBinderService(Context.NOTIFICATION_SERVICE, mService, /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL); @@ -5534,6 +5539,12 @@ public class NotificationManagerService extends SystemService { return new ParceledListSlice<>(groups); } + @Override + public boolean isInCall(String pkg, int uid) { + checkCallerIsSystemOrSystemUiOrShell(); + return isCallNotification(pkg, uid); + } + @Override public void setPrivateNotificationsAllowed(boolean allow) { if (PackageManager.PERMISSION_GRANTED @@ -6846,7 +6857,7 @@ public class NotificationManagerService extends SystemService { synchronized (mNotificationLock) { isBlocked |= isRecordBlockedLocked(r); } - if (isBlocked && !n.isMediaNotification()) { + if (isBlocked && !(n.isMediaNotification() || isCallNotification(pkg, uid, n))) { if (DBG) { Slog.e(TAG, "Suppressing notification from package " + r.getSbn().getPackageName() + " by user request."); @@ -6858,6 +6869,23 @@ public class NotificationManagerService extends SystemService { return true; } + private boolean isCallNotification(String pkg, int uid, Notification n) { + if (n.isStyle(Notification.CallStyle.class)) { + return isCallNotification(pkg, uid); + } + return false; + } + + private boolean isCallNotification(String pkg, int uid) { + final long identity = Binder.clearCallingIdentity(); + try { + return mTelecomManager.isInManagedCall() || mTelecomManager.isInSelfManagedCall( + pkg, UserHandle.getUserHandleForUid(uid)); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + private boolean areNotificationsEnabledForPackageInt(String pkg, int uid) { if (mEnableAppSettingMigration) { return mPermissionHelper.hasPermission(uid); 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 1cf96972c2256..b987c692bddb8 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -170,6 +170,7 @@ import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; import android.service.notification.StatusBarNotification; import android.service.notification.ZenPolicy; +import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; @@ -290,6 +291,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Mock ActivityManager mActivityManager; @Mock + TelecomManager mTelecomManager; + @Mock Resources mResources; @Mock RankingHandler mRankingHandler; @@ -494,7 +497,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, mAppOpsManager, mAppOpsService, mUm, mHistoryManager, mStatsManager, mock(TelephonyManager.class), - mAmi, mToastRateLimiter, mPermissionHelper, mock(UsageStatsManagerInternal.class)); + mAmi, mToastRateLimiter, mPermissionHelper, mock(UsageStatsManagerInternal.class), + mTelecomManager); // Return first true for RoleObserver main-thread check when(mMainLooper.isCurrentThread()).thenReturn(true).thenReturn(false); mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY, mMainLooper); @@ -9126,6 +9130,54 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { r.getSbn().getId(), r.getSbn().getTag(), r, false)).isTrue(); } + @Test + public void testCallNotificationsBypassBlock() throws Exception { + when(mAmi.getPendingIntentFlags(any(IIntentSender.class))) + .thenReturn(FLAG_MUTABLE | FLAG_ONE_SHOT); + when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true); + + Notification.Builder nb = new Notification.Builder( + mContext, mTestNotificationChannel.getId()) + .setContentTitle("foo") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .addAction(new Notification.Action.Builder(null, "test", null).build()); + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, + nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0); + NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel); + + mBinderService.setNotificationsEnabledForPackage( + r.getSbn().getPackageName(), r.getUid(), false); + + // normal blocked notifications - blocked + assertThat(mService.checkDisqualifyingFeatures(r.getUserId(), r.getUid(), + r.getSbn().getId(), r.getSbn().getTag(), r, false)).isFalse(); + + // just using the style - blocked + Person person = new Person.Builder() + .setName("caller") + .build(); + nb.setStyle(Notification.CallStyle.forOngoingCall( + person, mock(PendingIntent.class))); + nb.setFullScreenIntent(mock(PendingIntent.class), true); + sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, + nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0); + r = new NotificationRecord(mContext, sbn, mTestNotificationChannel); + + assertThat(mService.checkDisqualifyingFeatures(r.getUserId(), r.getUid(), + r.getSbn().getId(), r.getSbn().getTag(), r, false)).isFalse(); + + // style + managed call - bypasses block + when(mTelecomManager.isInManagedCall()).thenReturn(true); + assertThat(mService.checkDisqualifyingFeatures(r.getUserId(), r.getUid(), + r.getSbn().getId(), r.getSbn().getTag(), r, false)).isTrue(); + + // style + self managed call - bypasses block + when(mTelecomManager.isInSelfManagedCall( + r.getSbn().getPackageName(), r.getUser())).thenReturn(true); + assertThat(mService.checkDisqualifyingFeatures(r.getUserId(), r.getUid(), + r.getSbn().getId(), r.getSbn().getTag(), r, false)).isTrue(); + } + @Test public void testGetAllUsersNotificationPermissions_migrationNotEnabled() { // make sure we don't bother if the migration is not enabled diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java index 0f6d5a56c6677..b751c7fc73ea4 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java @@ -97,6 +97,7 @@ import android.os.UserManager; import android.provider.Settings; import android.service.notification.NotificationListenerFilter; import android.service.notification.StatusBarNotification; +import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; @@ -379,7 +380,7 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase { mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, mAppOpsManager, mock(IAppOpsService.class), mUm, mHistoryManager, mStatsManager, mock(TelephonyManager.class), mAmi, mToastRateLimiter, mPermissionHelper, - mock(UsageStatsManagerInternal.class)); + mock(UsageStatsManagerInternal.class), mock(TelecomManager.class)); // Return first true for RoleObserver main-thread check when(mMainLooper.isCurrentThread()).thenReturn(true).thenReturn(false); mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY, mMainLooper); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java index 1d25b54207c4f..0bfd2020622fe 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java @@ -52,6 +52,7 @@ import android.content.pm.PackageManagerInternal; import android.os.Looper; import android.os.UserHandle; import android.os.UserManager; +import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; @@ -167,7 +168,7 @@ public class RoleObserverTest extends UiServiceTestCase { mock(StatsManager.class), mock(TelephonyManager.class), mock(ActivityManagerInternal.class), mock(MultiRateLimiter.class), mock(PermissionHelper.class), - mock(UsageStatsManagerInternal.class)); + mock(UsageStatsManagerInternal.class), mock (TelecomManager.class)); } catch (SecurityException e) { if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { throw e;