Merge cherrypicks of ['googleplex-android-review.googlesource.com/36447328'] into security-aosp-tm-release.
Change-Id: Ia2549336f237ed9c6d4eda97545fac1a621ef57b
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 6489101..d8cd4ba 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1314,9 +1314,7 @@
// don't abort if the callingUid has a visible window or is a persistent system process
final int callingUidProcState = mService.mActiveUids.getUidState(callingUid);
- final boolean callingUidHasAnyVisibleWindow =
- mService.mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(callingUid)
- || mService.mActiveUids.hasNonAppVisibleWindow(callingUid);
+ final boolean callingUidHasAnyVisibleWindow = mService.hasActiveVisibleWindow(callingUid);
final boolean isCallingUidForeground = callingUidHasAnyVisibleWindow
|| callingUidProcState == ActivityManager.PROCESS_STATE_TOP
|| callingUidProcState == ActivityManager.PROCESS_STATE_BOUND_TOP;
@@ -1345,9 +1343,7 @@
: mService.mActiveUids.getUidState(realCallingUid);
final boolean realCallingUidHasAnyVisibleWindow = (callingUid == realCallingUid)
? callingUidHasAnyVisibleWindow
- : mService.mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(
- realCallingUid)
- || mService.mActiveUids.hasNonAppVisibleWindow(realCallingUid);
+ : mService.hasActiveVisibleWindow(realCallingUid);
final boolean isRealCallingUidForeground = (callingUid == realCallingUid)
? isCallingUidForeground
: realCallingUidHasAnyVisibleWindow
diff --git a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
index dfc21d3..0af8dfe 100644
--- a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
+++ b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java
@@ -21,7 +21,7 @@
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.ActivityTaskManagerService.ACTIVITY_BG_START_GRACE_PERIOD_MS;
import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_ALLOW;
-import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_DISALLOW;
+import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_FG_ONLY;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -75,8 +75,7 @@
boolean areBackgroundActivityStartsAllowed(int pid, int uid, String packageName,
int appSwitchState, boolean isCheckingForFgsStart,
- boolean hasActivityInVisibleTask, boolean inPinnedWindow,
- boolean hasBackgroundActivityStartPrivileges,
+ boolean hasActivityInVisibleTask, boolean hasBackgroundActivityStartPrivileges,
long lastStopAppSwitchesTime, long lastActivityLaunchTime,
long lastActivityFinishTime) {
// If app switching is not allowed, we ignore all the start activity grace period
@@ -116,8 +115,8 @@
return true;
}
// Allow if the caller has an activity in any foreground task.
- if ((isCheckingForFgsStart || !inPinnedWindow)
- && hasActivityInVisibleTask && appSwitchState != APP_SWITCH_DISALLOW) {
+ if (hasActivityInVisibleTask
+ && (appSwitchState == APP_SWITCH_ALLOW || appSwitchState == APP_SWITCH_FG_ONLY)) {
if (DEBUG_ACTIVITY_STARTS) {
Slog.d(TAG, "[Process(" + pid
+ ")] Activity start allowed: process has activity in foreground task");
diff --git a/services/core/java/com/android/server/wm/VisibleActivityProcessTracker.java b/services/core/java/com/android/server/wm/VisibleActivityProcessTracker.java
index 3bb094b..0e2b71c 100644
--- a/services/core/java/com/android/server/wm/VisibleActivityProcessTracker.java
+++ b/services/core/java/com/android/server/wm/VisibleActivityProcessTracker.java
@@ -30,7 +30,6 @@
* host process with foreground (resumed) activity.
*/
class VisibleActivityProcessTracker {
- private static final Predicate<WindowProcessController> ALWAYS_TRUE = wpc -> true;
@GuardedBy("mProcMap")
private final ArrayMap<WindowProcessController, CpuTimeRecord> mProcMap = new ArrayMap<>();
final Executor mBgExecutor = BackgroundThread.getExecutor();
@@ -81,22 +80,14 @@
* {@link ActivityRecord#mVisibleRequested} or {@link ActivityRecord#isVisible()} is true.
*/
boolean hasVisibleActivity(int uid) {
- return match(uid, ALWAYS_TRUE);
- }
-
- /**
- * Returns {@code true} if the uid has a process that contains an activity with
- * {@link ActivityRecord#mVisibleRequested} or {@link ActivityRecord#isVisible()} is true.
- */
- boolean hasVisibleNotPinnedActivity(int uid) {
- return match(uid, wpc -> !wpc.inPinnedWindowingMode());
+ return match(uid, null /* predicate */);
}
private boolean match(int uid, Predicate<WindowProcessController> predicate) {
synchronized (mProcMap) {
for (int i = mProcMap.size() - 1; i >= 0; i--) {
final WindowProcessController wpc = mProcMap.keyAt(i);
- if (wpc.mUid == uid && predicate.test(wpc)) {
+ if (wpc.mUid == uid && (predicate == null || predicate.test(wpc))) {
return true;
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 8999e9b..22280cd 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -525,7 +525,6 @@
boolean isCheckingForFgsStart) {
return mBgLaunchController.areBackgroundActivityStartsAllowed(mPid, mUid, mInfo.packageName,
appSwitchState, isCheckingForFgsStart, hasActivityInVisibleTask(),
- inPinnedWindowingMode(),
mInstrumentingWithBackgroundActivityStartPrivileges,
mAtm.getLastStopAppSwitchesTime(),
mLastActivityLaunchTime, mLastActivityFinishTime);
diff --git a/services/tests/wmtests/src/com/android/server/wm/VisibleActivityProcessTrackerTests.java b/services/tests/wmtests/src/com/android/server/wm/VisibleActivityProcessTrackerTests.java
deleted file mode 100644
index 10629b2..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/VisibleActivityProcessTrackerTests.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-
-import android.app.IApplicationThread;
-import android.app.WindowConfiguration;
-import android.content.pm.ApplicationInfo;
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-
-/**
- * Tests for the {@link com.android.server.wm.VisibleActivityProcessTracker} class.
- *
- * Build/Install/Run:
- * atest WmTests:VisibleActivityProcessTrackerTests
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class VisibleActivityProcessTrackerTests extends WindowTestsBase {
-
- private VisibleActivityProcessTracker mTracker;
-
- @Before
- public void setup() {
- mTracker = mAtm.mVisibleActivityProcessTracker;
- }
-
- @Test
- public void testVisibleActivity() {
- WindowProcessController wpc = createWindowProcessController();
- assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isFalse();
- mTracker.onAnyActivityVisible(wpc);
- assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isTrue();
- mTracker.onAllActivitiesInvisible(wpc);
- assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isFalse();
- }
-
- @Test
- public void testVisibleNotPinnedActivity() {
- WindowProcessController wpc = createWindowProcessController();
- assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
- mTracker.onAnyActivityVisible(wpc);
- assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isTrue();
- mTracker.onAllActivitiesInvisible(wpc);
- assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
- }
-
- @Test
- public void testVisiblePinnedActivity() {
- WindowProcessController wpc = createWindowProcessController();
- wpc.getConfiguration().windowConfiguration.setWindowingMode(
- WindowConfiguration.WINDOWING_MODE_PINNED);
- assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
- mTracker.onAnyActivityVisible(wpc);
- assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isTrue();
- assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
- mTracker.onAllActivitiesInvisible(wpc);
- assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
- }
-
- WindowProcessController createWindowProcessController() {
- WindowProcessListener mMockListener = mock(WindowProcessListener.class);
- ApplicationInfo info = mock(ApplicationInfo.class);
- info.packageName = "test.package.name";
- WindowProcessController mWpc = new WindowProcessController(
- mAtm, info, null, 0, -1, null, mMockListener);
- mWpc.setThread(mock(IApplicationThread.class));
- return mWpc;
- }
-}