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;
-    }
-}