Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5a3093c authored by Achim Thesmann's avatar Achim Thesmann Committed by Michael Bestas
Browse files

Revert "Ignore pinned Windows"

Partial Revert of submission 32704936-b406880479

This only reverts the parts in BackgroundActivityStartController, BackgroundLaunchProcessController and relevant tests.

Reason for revert: app compat issue

Reverted changes: /q/submissionid:32704936-b406880479

Bug: 406880479
Flag: EXEMPT BUGFIX
Test: atest BackgroundActivityLaunchTest
Test: atest BackgroundProcessLaunchControllerTest
Test: atest BackgroundActivityStartControllerExemptionTests
Test: atest BackgroundActivityStartControllerTests
Test: atest BackgroundActivityStartControllerLogTests
Cherrypick-From: https://googleplex-android-review.googlesource.com/q/commit:02ce98a2cc32bbb621fc5ea893ddd8d39d672209
Merged-In: Iba3b8ab8e70200e0e8641a4e1210cf09c9205256
Change-Id: Iba3b8ab8e70200e0e8641a4e1210cf09c9205256
parent fe89b249
Loading
Loading
Loading
Loading
+4 −19
Original line number Diff line number Diff line
@@ -332,7 +332,6 @@ public class BackgroundActivityStartController {
        private final int mCallingPid;
        private final @ActivityTaskManagerService.AppSwitchState int mAppSwitchState;
        private final boolean mCallingUidHasVisibleActivity;
        private final boolean mCallingUidHasVisibleNotPinnedActivity;
        private final boolean mCallingUidHasNonAppVisibleWindow;
        private final @ActivityManager.ProcessState int mCallingUidProcState;
        private final boolean mIsCallingUidPersistentSystemProcess;
@@ -342,7 +341,6 @@ public class BackgroundActivityStartController {
        private final int mRealCallingUid;
        private final int mRealCallingPid;
        private final boolean mRealCallingUidHasVisibleActivity;
        private final boolean mRealCallingUidHasVisibleNotPinnedActivity;
        private final boolean mRealCallingUidHasNonAppVisibleWindow;
        private final @ActivityManager.ProcessState int mRealCallingUidProcState;
        private final boolean mIsRealCallingUidPersistentSystemProcess;
@@ -433,8 +431,6 @@ public class BackgroundActivityStartController {
                    mCallingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI;
            mCallingUidHasVisibleActivity =
                    getService().mVisibleActivityProcessTracker.hasVisibleActivity(callingUid);
            mCallingUidHasVisibleNotPinnedActivity = getService().mVisibleActivityProcessTracker
                    .hasVisibleNotPinnedActivity(callingUid);
            mCallingUidHasNonAppVisibleWindow = getService().mActiveUids.hasNonAppVisibleWindow(
                    callingUid);
            if (realCallingUid == NO_PROCESS_UID) {
@@ -442,13 +438,11 @@ public class BackgroundActivityStartController {
                mRealCallingUidProcState = PROCESS_STATE_NONEXISTENT;
                mRealCallingUidHasVisibleActivity = false;
                mRealCallingUidHasNonAppVisibleWindow = false;
                mRealCallingUidHasVisibleNotPinnedActivity = false;
                mRealCallerApp = null;
                mIsRealCallingUidPersistentSystemProcess = false;
            } else if (callingUid == realCallingUid) {
                mRealCallingUidProcState = mCallingUidProcState;
                mRealCallingUidHasVisibleActivity = mCallingUidHasVisibleActivity;
                mRealCallingUidHasVisibleNotPinnedActivity = mCallingUidHasVisibleNotPinnedActivity;
                mRealCallingUidHasNonAppVisibleWindow = mCallingUidHasNonAppVisibleWindow;
                // In the PendingIntent case callerApp is not passed in, so resolve it ourselves.
                mRealCallerApp = callerApp == null
@@ -460,9 +454,6 @@ public class BackgroundActivityStartController {
                mRealCallingUidHasVisibleActivity =
                        getService().mVisibleActivityProcessTracker.hasVisibleActivity(
                                realCallingUid);
                mRealCallingUidHasVisibleNotPinnedActivity =
                        getService().mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(
                                realCallingUid);
                mRealCallingUidHasNonAppVisibleWindow =
                        getService().mActiveUids.hasNonAppVisibleWindow(realCallingUid);
                mRealCallerApp = getService().getProcessController(realCallingPid, realCallingUid);
@@ -596,8 +587,6 @@ public class BackgroundActivityStartController {
            sb.append("; callingPid: ").append(mCallingPid);
            sb.append("; appSwitchState: ").append(mAppSwitchState);
            sb.append("; callingUidHasVisibleActivity: ").append(mCallingUidHasVisibleActivity);
            sb.append("; callingUidHasVisibleNotPinnedActivity: ")
                    .append(mCallingUidHasVisibleNotPinnedActivity);
            sb.append("; callingUidHasNonAppVisibleWindow: ").append(
                    mCallingUidHasNonAppVisibleWindow);
            sb.append("; callingUidProcState: ").append(DebugUtils.valueToString(
@@ -632,8 +621,6 @@ public class BackgroundActivityStartController {
                sb.append("; realCallingPid: ").append(mRealCallingPid);
                sb.append("; realCallingUidHasVisibleActivity: ")
                        .append(mRealCallingUidHasVisibleActivity);
                sb.append("; realCallingUidHasVisibleNotPinnedActivity: ")
                        .append(mRealCallingUidHasVisibleNotPinnedActivity);
                sb.append("; realCallingUidHasNonAppVisibleWindow: ")
                        .append(mRealCallingUidHasNonAppVisibleWindow);
                sb.append("; realCallingUidProcState: ").append(DebugUtils.valueToString(
@@ -1167,9 +1154,8 @@ public class BackgroundActivityStartController {
        final boolean appSwitchAllowedOrFg = state.mAppSwitchState == APP_SWITCH_ALLOW
                || state.mAppSwitchState == APP_SWITCH_FG_ONLY
                || isHomeApp(state.mCallingUid, state.mCallingPackage);
        if (appSwitchAllowedOrFg && state.mCallingUidHasVisibleNotPinnedActivity) {
            return new BalVerdict(BAL_ALLOW_VISIBLE_WINDOW,
                    "callingUid has visible non-pinned window")
        if (appSwitchAllowedOrFg && state.mCallingUidHasVisibleActivity) {
            return new BalVerdict(BAL_ALLOW_VISIBLE_WINDOW, "callingUid has visible window")
                    .allowNewTask().setVisibleOrForeground();
        }
        return BalVerdict.BLOCK;
@@ -1327,9 +1313,8 @@ public class BackgroundActivityStartController {
        final boolean appSwitchAllowedOrFg = state.mAppSwitchState == APP_SWITCH_ALLOW
                || state.mAppSwitchState == APP_SWITCH_FG_ONLY
                || isHomeApp(state.mRealCallingUid, state.mRealCallingPackage);
        if (appSwitchAllowedOrFg && state.mRealCallingUidHasVisibleNotPinnedActivity) {
            return new BalVerdict(BAL_ALLOW_VISIBLE_WINDOW,
                    "realCallingUid has visible non-pinned window")
        if (appSwitchAllowedOrFg && state.mRealCallingUidHasVisibleActivity) {
            return new BalVerdict(BAL_ALLOW_VISIBLE_WINDOW, "realCallingUid has visible window")
                    .allowNewTask().setVisibleOrForeground();
        }
        return BalVerdict.BLOCK;
+3 −5
Original line number Diff line number Diff line
@@ -144,11 +144,9 @@ class BackgroundLaunchProcessController {
            return new BalVerdict(BAL_ALLOW_BOUND_BY_FOREGROUND, "process bound by foreground uid")
                    .allowNewTask().setVisibleOrForeground();
        }
        // Allow if the caller has an activity in any foreground task, unless it's a pinned window
        // and not a foreground service start.
        if ((checkConfiguration.isCheckingForFgsStart || !inPinnedWindow)
                && checkConfiguration.checkOtherExemptions
                && hasActivityInVisibleTask && appSwitchState != APP_SWITCH_DISALLOW) {
        // Allow if the caller has an activity in any foreground task.
        if (checkConfiguration.checkOtherExemptions && hasActivityInVisibleTask
                && appSwitchState != APP_SWITCH_DISALLOW) {
            return new BalVerdict(BAL_ALLOW_FOREGROUND, /*background*/
                    "process has activity in foreground task").setVisibleOrForeground();
        }
+8 −70
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@ import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
import android.util.Pair;
import android.view.WindowManager;
@@ -68,7 +67,6 @@ import com.android.window.flags.Flags;

import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -93,10 +91,6 @@ import java.util.Set;
@RunWith(JUnit4.class)
public class BackgroundActivityStartControllerExemptionTests {

    @ClassRule
    public static final SetFlagsRule.ClassRule mClassRule = new SetFlagsRule.ClassRule();
    @Rule public final SetFlagsRule mSetFlagsRule = mClassRule.createSetFlagsRule();

    private static final int REGULAR_UID_1 = 10100;
    private static final int REGULAR_UID_2 = 10200;
    private static final int NO_UID = -1;
@@ -274,8 +268,6 @@ public class BackgroundActivityStartControllerExemptionTests {

        // setup state
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(callingUid))).thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(eq(callingUid)))
                .thenReturn(false);
        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);

        // prepare call
@@ -288,7 +280,6 @@ public class BackgroundActivityStartControllerExemptionTests {
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("callingUidHasVisibleActivity: true");
        assertThat(balState.toString()).contains("callingUidHasVisibleNotPinnedActivity: false");
        assertThat(balState.toString()).contains("callingUidHasNonAppVisibleWindow: false");

        // call
@@ -297,9 +288,8 @@ public class BackgroundActivityStartControllerExemptionTests {
        balState.setResultForCaller(callerVerdict);

        // assertions
        assertWithMessage(balState + " -> " + callerVerdict)
                .that(callerVerdict.getCode())
                .isEqualTo(BAL_BLOCK);
        assertWithMessage(balState.toString()).that(callerVerdict.getCode()).isEqualTo(
                BAL_ALLOW_VISIBLE_WINDOW);
    }

    @Test
@@ -329,7 +319,6 @@ public class BackgroundActivityStartControllerExemptionTests {
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("callingUidHasVisibleActivity: false");
        assertThat(balState.toString()).contains("callingUidHasVisibleNotPinnedActivity: false");
        assertThat(balState.toString()).contains("callingUidHasNonAppVisibleWindow: false");

        // call
@@ -366,7 +355,6 @@ public class BackgroundActivityStartControllerExemptionTests {
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("callingUidHasVisibleActivity: true");
        assertThat(balState.toString()).contains("callingUidHasVisibleNotPinnedActivity: true");
        assertThat(balState.toString()).contains("callingUidHasNonAppVisibleWindow: false");

        // call
@@ -389,50 +377,8 @@ public class BackgroundActivityStartControllerExemptionTests {
        int realCallingPid = REGULAR_PID_2;

        // setup state
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(realCallingUid)))
                .thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(eq(realCallingUid)))
                .thenReturn(false);
        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);

        // prepare call
        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
        boolean allowBalExemptionForSystemProcess = false;
        Intent intent = TEST_INTENT;
        ActivityOptions checkedOptions = mCheckedOptions;
        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
                callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp,
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("realCallingUidHasVisibleActivity: true");
        assertThat(balState.toString())
                .contains("realCallingUidHasVisibleNotPinnedActivity: false");
        assertThat(balState.toString()).contains("realCallingUidHasNonAppVisibleWindow: false");

        // call
        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedByRealCaller(
                balState);
        balState.setResultForRealCaller(realCallerVerdict);

        // assertions
        assertWithMessage(balState + " -> " + realCallerVerdict)
                .that(realCallerVerdict.getCode())
                .isEqualTo(BAL_BLOCK);
    }

    @Test
    public void testRealCaller_appHasNotPinnedVisibleWindow() {
        int callingUid = REGULAR_UID_1;
        int callingPid = REGULAR_PID_1;
        final String callingPackage = REGULAR_PACKAGE_1;
        int realCallingUid = REGULAR_UID_2;
        int realCallingPid = REGULAR_PID_2;

        // setup state
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(realCallingUid)))
                .thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(eq(realCallingUid)))
                .thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(realCallingUid))).thenReturn(
                true);
        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);

        // prepare call
@@ -445,7 +391,6 @@ public class BackgroundActivityStartControllerExemptionTests {
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("realCallingUidHasVisibleActivity: true");
        assertThat(balState.toString()).contains("realCallingUidHasVisibleNotPinnedActivity: true");
        assertThat(balState.toString()).contains("realCallingUidHasNonAppVisibleWindow: false");

        // call
@@ -454,9 +399,8 @@ public class BackgroundActivityStartControllerExemptionTests {
        balState.setResultForRealCaller(realCallerVerdict);

        // assertions
        assertWithMessage(balState + " -> " + realCallerVerdict)
                .that(realCallerVerdict.getCode())
                .isEqualTo(BAL_ALLOW_VISIBLE_WINDOW);
        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
                BAL_ALLOW_VISIBLE_WINDOW);
    }

    @Test
@@ -610,8 +554,6 @@ public class BackgroundActivityStartControllerExemptionTests {

        // setup state
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(callingUid))).thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(eq(callingUid)))
                .thenReturn(true);
        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);

        // prepare call
@@ -626,7 +568,6 @@ public class BackgroundActivityStartControllerExemptionTests {
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("callingUidHasVisibleActivity: true");
        assertThat(balState.toString()).contains("callingUidHasVisibleNotPinnedActivity: true");
        assertThat(balState.toString()).contains("callingUidHasNonAppVisibleWindow: false");

        // call
@@ -649,10 +590,8 @@ public class BackgroundActivityStartControllerExemptionTests {
        int realCallingPid = REGULAR_PID_2;

        // setup state
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(realCallingUid)))
                .thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(eq(realCallingUid)))
                .thenReturn(true);
        when(mVisibleActivityProcessTracker.hasVisibleActivity(eq(realCallingUid))).thenReturn(
                true);
        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);

        // prepare call
@@ -667,7 +606,6 @@ public class BackgroundActivityStartControllerExemptionTests {
                originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent,
                checkedOptions);
        assertThat(balState.toString()).contains("realCallingUidHasVisibleActivity: true");
        assertThat(balState.toString()).contains("realCallingUidHasVisibleNotPinnedActivity: true");
        assertThat(balState.toString()).contains("realCallingUidHasNonAppVisibleWindow: false");

        // call
+0 −4
Original line number Diff line number Diff line
@@ -543,7 +543,6 @@ public class BackgroundActivityStartControllerTests {
                        + "callingPid: 11001; "
                        + "appSwitchState: 0; "
                        + "callingUidHasVisibleActivity: false; "
                        + "callingUidHasVisibleNotPinnedActivity: false; "
                        + "callingUidHasNonAppVisibleWindow: false; "
                        + "callingUidProcState: NONEXISTENT; "
                        + "isCallingUidPersistentSystemProcess: false; "
@@ -562,7 +561,6 @@ public class BackgroundActivityStartControllerTests {
                        + "realCallingUid: 1; "
                        + "realCallingPid: 1; "
                        + "realCallingUidHasVisibleActivity: false; "
                        + "realCallingUidHasVisibleNotPinnedActivity: false; "
                        + "realCallingUidHasNonAppVisibleWindow: false; "
                        + "realCallingUidProcState: NONEXISTENT; "
                        + "isRealCallingUidPersistentSystemProcess: false; "
@@ -646,7 +644,6 @@ public class BackgroundActivityStartControllerTests {
                        + "callingPid: 11001; "
                        + "appSwitchState: 0; "
                        + "callingUidHasVisibleActivity: false; "
                        + "callingUidHasVisibleNotPinnedActivity: false; "
                        + "callingUidHasNonAppVisibleWindow: false; "
                        + "callingUidProcState: NONEXISTENT; "
                        + "isCallingUidPersistentSystemProcess: false; "
@@ -665,7 +662,6 @@ public class BackgroundActivityStartControllerTests {
                        + "realCallingUid: 1; "
                        + "realCallingPid: 1; "
                        + "realCallingUidHasVisibleActivity: false; "
                        + "realCallingUidHasVisibleNotPinnedActivity: false; "
                        + "realCallingUidHasNonAppVisibleWindow: false; "
                        + "realCallingUidProcState: NONEXISTENT; "
                        + "isRealCallingUidPersistentSystemProcess: false; "
+0 −15
Original line number Diff line number Diff line
@@ -195,21 +195,6 @@ public class BackgroundLaunchProcessControllerTests {
        assertThat(balVerdict.getCode()).isEqualTo(BAL_ALLOW_BOUND_BY_FOREGROUND);
    }

    @Test
    public void testForegroundTaskBlockedIfPinned() {
        mAppSwitchState = APP_SWITCH_ALLOW;
        mHasActivityInVisibleTask = true;
        mInPinnedWindowMode = true;
        BalVerdict balVerdict = mController.areBackgroundActivityStartsAllowed(
                mPid, mUid, mPackageName,
                mAppSwitchState, mBalCheckConfiguration,
                mHasActivityInVisibleTask, mInPinnedWindowMode,
                mHasBackgroundActivityStartPrivileges,
                mLastStopAppSwitchesTime, mLastActivityLaunchTime,
                mLastActivityFinishTime);
        assertThat(balVerdict.getCode()).isEqualTo(BAL_BLOCK);
    }

    @Test
    public void testForegroundTask() {
        mAppSwitchState = APP_SWITCH_ALLOW;