Prioritize delivering broadcasts to apps with fg activities.

Bug: 275594411
Bug: 275767820
Test: atest FrameworksMockingServicesTests:BroadcastQueueTest
Test: atest FrameworksMockingServicesTests:BroadcastQueueModernImplTest
Change-Id: I13444844307e2e36fbb1a38aa609121b4c2b7b81
This commit is contained in:
Sudheer Shanka
2023-03-30 11:51:01 +00:00
parent 2428df9bc7
commit 9acb9d97ef
2 changed files with 13 additions and 0 deletions

View File

@@ -860,6 +860,7 @@ class BroadcastProcessQueue {
static final int REASON_CONTAINS_RESULT_TO = 15;
static final int REASON_CONTAINS_INSTRUMENTED = 16;
static final int REASON_CONTAINS_MANIFEST = 17;
static final int REASON_FOREGROUND_ACTIVITIES = 18;
@IntDef(flag = false, prefix = { "REASON_" }, value = {
REASON_EMPTY,
@@ -879,6 +880,7 @@ class BroadcastProcessQueue {
REASON_CONTAINS_RESULT_TO,
REASON_CONTAINS_INSTRUMENTED,
REASON_CONTAINS_MANIFEST,
REASON_FOREGROUND_ACTIVITIES,
})
@Retention(RetentionPolicy.SOURCE)
public @interface Reason {}
@@ -902,6 +904,7 @@ class BroadcastProcessQueue {
case REASON_CONTAINS_RESULT_TO: return "CONTAINS_RESULT_TO";
case REASON_CONTAINS_INSTRUMENTED: return "CONTAINS_INSTRUMENTED";
case REASON_CONTAINS_MANIFEST: return "CONTAINS_MANIFEST";
case REASON_FOREGROUND_ACTIVITIES: return "FOREGROUND_ACTIVITIES";
default: return Integer.toString(reason);
}
}
@@ -959,6 +962,11 @@ class BroadcastProcessQueue {
} else if (mProcessInstrumented) {
mRunnableAt = runnableAt + constants.DELAY_URGENT_MILLIS;
mRunnableAtReason = REASON_INSTRUMENTED;
} else if (app != null && app.hasForegroundActivities()) {
// TODO: Listen for uid state changes to check when an uid goes in and out of
// the TOP state.
mRunnableAt = runnableAt + constants.DELAY_URGENT_MILLIS;
mRunnableAtReason = REASON_FOREGROUND_ACTIVITIES;
} else if (mCountOrdered > 0) {
mRunnableAt = runnableAt;
mRunnableAtReason = REASON_CONTAINS_ORDERED;

View File

@@ -1050,6 +1050,11 @@ class ProcessRecord implements WindowProcessListener {
return mState.isCached();
}
@GuardedBy(anyOf = {"mService", "mProcLock"})
public boolean hasForegroundActivities() {
return mState.hasForegroundActivities();
}
boolean hasActivities() {
return mWindowProcessController.hasActivities();
}