diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index ab73e4872cedf..a17b5e273127d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14723,6 +14723,15 @@ public class ActivityManagerService extends IActivityManager.Stub mCurBroadcastStats.addBackgroundCheckViolation(action, targetPackage); } + final void notifyBroadcastFinishedLocked(@NonNull BroadcastRecord original) { + final ApplicationInfo info = original.callerApp != null ? original.callerApp.info : null; + final String callerPackage = info != null ? info.packageName : original.callerPackage; + if (callerPackage != null) { + mHandler.obtainMessage(ActivityManagerService.DISPATCH_SENDING_BROADCAST_EVENT, + original.callingUid, 0, callerPackage).sendToTarget(); + } + } + final Intent verifyBroadcastLocked(Intent intent) { // Refuse possible leaked file descriptors if (intent != null && intent.hasFileDescriptors() == true) { diff --git a/services/core/java/com/android/server/am/BroadcastQueueImpl.java b/services/core/java/com/android/server/am/BroadcastQueueImpl.java index ffc54d90aec6e..454b28402ced7 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueImpl.java @@ -1690,13 +1690,7 @@ public class BroadcastQueueImpl extends BroadcastQueue { System.identityHashCode(original)); } - final ApplicationInfo info = original.callerApp != null ? original.callerApp.info : null; - final String callerPackage = info != null ? info.packageName : original.callerPackage; - if (callerPackage != null) { - mService.mHandler.obtainMessage(ActivityManagerService.DISPATCH_SENDING_BROADCAST_EVENT, - original.callingUid, 0, callerPackage).sendToTarget(); - } - + mService.notifyBroadcastFinishedLocked(original); mHistory.addBroadcastToHistoryLocked(original); } diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index b38a3e0796dae..fdad729e5005e 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -1403,6 +1403,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { final boolean recordFinished = (r.terminalCount == r.receivers.size()); if (recordFinished) { + mService.notifyBroadcastFinishedLocked(r); mHistory.addBroadcastToHistoryLocked(r); r.finishTime = SystemClock.uptimeMillis(); diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index 881fcd9271b3a..fd605f7796251 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -1639,4 +1639,22 @@ public class BroadcastQueueTest { waitForIdle(); verify(mAms, never()).enqueueOomAdjTargetLocked(any()); } + + /** + * Verify that expected events are triggered when a broadcast is finished. + */ + @Test + public void testNotifyFinished() throws Exception { + final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED); + + final Intent intent = new Intent(Intent.ACTION_TIMEZONE_CHANGED); + final BroadcastRecord record = makeBroadcastRecord(intent, callerApp, + List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN))); + enqueueBroadcast(record); + + waitForIdle(); + verify(mAms).notifyBroadcastFinishedLocked(eq(record)); + verify(mAms).addBroadcastStatLocked(eq(Intent.ACTION_TIMEZONE_CHANGED), eq(PACKAGE_RED), + eq(1), eq(0), anyLong()); + } }