summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java23
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java23
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java4
3 files changed, 36 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index a16b122771ef..6d565d2157e1 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -679,6 +679,8 @@ public class NotificationManagerService extends SystemService {
WorkerHandler mHandler;
private final HandlerThread mRankingThread = new HandlerThread("ranker",
Process.THREAD_PRIORITY_BACKGROUND);
+ @FlaggedApi(Flags.FLAG_NM_BINDER_PERF_THROTTLE_EFFECTS_SUPPRESSOR_BROADCAST)
+ private Handler mBroadcastsHandler;
private final SparseArray<ArraySet<ComponentName>> mListenersDisablingEffects =
new SparseArray<>();
@@ -2682,7 +2684,7 @@ public class NotificationManagerService extends SystemService {
// TODO: All tests should use this init instead of the one-off setters above.
@VisibleForTesting
- void init(WorkerHandler handler, RankingHandler rankingHandler,
+ void init(WorkerHandler handler, RankingHandler rankingHandler, Handler broadcastsHandler,
IPackageManager packageManager, PackageManager packageManagerClient,
LightsManager lightsManager, NotificationListeners notificationListeners,
NotificationAssistants notificationAssistants, ConditionProviders conditionProviders,
@@ -2702,6 +2704,9 @@ public class NotificationManagerService extends SystemService {
ConnectivityManager connectivityManager,
PostNotificationTrackerFactory postNotificationTrackerFactory) {
mHandler = handler;
+ if (Flags.nmBinderPerfThrottleEffectsSuppressorBroadcast()) {
+ mBroadcastsHandler = broadcastsHandler;
+ }
Resources resources = getContext().getResources();
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
@@ -3045,13 +3050,22 @@ public class NotificationManagerService extends SystemService {
WorkerHandler handler = new WorkerHandler(Looper.myLooper());
+ Handler broadcastsHandler;
+ if (Flags.nmBinderPerfThrottleEffectsSuppressorBroadcast()) {
+ HandlerThread broadcastsThread = new HandlerThread("NMS Broadcasts");
+ broadcastsThread.start();
+ broadcastsHandler = new Handler(broadcastsThread.getLooper());
+ } else {
+ broadcastsHandler = null;
+ }
+
mShowReviewPermissionsNotification = getContext().getResources().getBoolean(
R.bool.config_notificationReviewPermissions);
mDefaultUnsupportedAdjustments = getContext().getResources().getStringArray(
R.array.config_notificationDefaultUnsupportedAdjustments);
- init(handler, new RankingHandlerWorker(mRankingThread.getLooper()),
+ init(handler, new RankingHandlerWorker(mRankingThread.getLooper()), broadcastsHandler,
AppGlobals.getPackageManager(), getContext().getPackageManager(),
getLocalService(LightsManager.class),
new NotificationListeners(getContext(), mNotificationLock, mUserProfiles,
@@ -3297,10 +3311,11 @@ public class NotificationManagerService extends SystemService {
* so that e.g. rapidly changing some value A -> B -> C will only produce a broadcast for C
* (instead of every time because the extras are different).
*/
+ @FlaggedApi(Flags.FLAG_NM_BINDER_PERF_THROTTLE_EFFECTS_SUPPRESSOR_BROADCAST)
private void sendZenBroadcastWithDelay(Intent intent) {
String token = "zen_broadcast:" + intent.getAction();
- mHandler.removeCallbacksAndEqualMessages(token);
- mHandler.postDelayed(() -> sendRegisteredOnlyBroadcast(intent), token,
+ mBroadcastsHandler.removeCallbacksAndEqualMessages(token);
+ mBroadcastsHandler.postDelayed(() -> sendRegisteredOnlyBroadcast(intent), token,
ZEN_BROADCAST_DELAY.toMillis());
}
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 c1c8211d6cbd..445c746d7f59 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -262,6 +262,7 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Parcel;
@@ -577,6 +578,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
NetworkCapabilities mWifiNetworkCapabilities;
private NotificationManagerService.WorkerHandler mWorkerHandler;
+ private Handler mBroadcastsHandler;
private class TestableToastCallback extends ITransientNotification.Stub {
@Override
@@ -814,14 +816,16 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
when(mUmInternal.isUserInitialized(anyInt())).thenReturn(true);
mWorkerHandler = spy(mService.new WorkerHandler(mTestableLooper.getLooper()));
- mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient,
- mLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr,
- mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper, mAm, mAtm,
- mAppUsageStats, mDevicePolicyManager, mUgm, mUgmInternal,
- mAppOpsManager, mUm, mHistoryManager, mStatsManager,
- mAmi, mToastRateLimiter, mPermissionHelper, mock(UsageStatsManagerInternal.class),
- mTelecomManager, mLogger, mTestFlagResolver, mPermissionManager,
- mPowerManager, mConnectivityManager, mPostNotificationTrackerFactory);
+ mBroadcastsHandler = new Handler(mTestableLooper.getLooper());
+
+ mService.init(mWorkerHandler, mRankingHandler, mBroadcastsHandler, mPackageManager,
+ mPackageManagerClient, mLightsManager, mListeners, mAssistants, mConditionProviders,
+ mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager,
+ mGroupHelper, mAm, mAtm, mAppUsageStats, mDevicePolicyManager, mUgm, mUgmInternal,
+ mAppOpsManager, mUm, mHistoryManager, mStatsManager, mAmi, mToastRateLimiter,
+ mPermissionHelper, mock(UsageStatsManagerInternal.class), mTelecomManager, mLogger,
+ mTestFlagResolver, mPermissionManager, mPowerManager, mConnectivityManager,
+ mPostNotificationTrackerFactory);
mService.setAttentionHelper(mAttentionHelper);
mService.setLockPatternUtils(mock(LockPatternUtils.class));
@@ -998,6 +1002,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// problematic interactions with mocks when they're no longer working as expected).
mWorkerHandler.removeCallbacksAndMessages(null);
}
+ if (mBroadcastsHandler != null) {
+ mBroadcastsHandler.removeCallbacksAndMessages(null);
+ }
if (mTestableLooper != null) {
// Must remove static reference to this test object to prevent leak (b/261039202)
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 82d87d40031a..ad900fe6e376 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
@@ -48,13 +48,13 @@ import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
+import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.permission.PermissionManager;
import android.telecom.TelecomManager;
-import android.telephony.TelephonyManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -152,7 +152,7 @@ public class RoleObserverTest extends UiServiceTestCase {
try {
mService.init(mService.new WorkerHandler(mTestableLooper.getLooper()),
- mock(RankingHandler.class),
+ mock(RankingHandler.class), new Handler(mTestableLooper.getLooper()),
mock(IPackageManager.class), mock(PackageManager.class),
mock(LightsManager.class),
mock(NotificationListeners.class), mock(NotificationAssistants.class),