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

Commit 6d239bf8 authored by Achim Thesmann's avatar Achim Thesmann Committed by Nishith Khanna
Browse files

RESTRICT AUTOMERGE Ignore pinned Windows (Consolidated fix)

ag/32704936
ag/35782210
ag/36195227
ag/36359572

Bug: 439984935
Test: atest BackgroundActivityLaunchTest
Flag: EXEMPT BUGFIX
Cherrypick-From: https://googleplex-android-review.googlesource.com/q/commit:4e09e34b7351dd1d7ec223ec8560e51145de37c9
Merged-In: I9ce93366a0876c7bc594ef818c8598342d70513d
Change-Id: I9ce93366a0876c7bc594ef818c8598342d70513d
parent 90ff4aa9
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -870,7 +870,9 @@ public class BackgroundActivityStartController {

        // 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.hasActiveVisibleWindow(callingUid);
        final boolean callingUidHasAnyVisibleWindow =
                mService.mVisibleActivityProcessTracker.hasVisibleNotPinnedActivity(callingUid)
                        || mService.mActiveUids.hasNonAppVisibleWindow(callingUid);
        final boolean isCallingUidPersistentSystemProcess =
                callingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI;

+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ class VisibleActivityProcessTracker {
     * {@link ActivityRecord#mVisibleRequested} or {@link ActivityRecord#isVisible()} is true.
     */
    boolean hasVisibleNotPinnedActivity(int uid) {
        return match(uid, wpc -> !wpc.inPinnedWindowingMode());
        return match(uid, wpc -> wpc.hasVisibleNotPinnedActivity());
    }

    private boolean match(int uid, Predicate<WindowProcessController> predicate) {
+15 −0
Original line number Diff line number Diff line
@@ -835,6 +835,21 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
        return mHasActivities || mHasRecentTasks;
    }

    /**
     * Check if any Activity is visible (or visibility requested) and not pinned.
     */
    boolean hasVisibleNotPinnedActivity() {
        if (!hasVisibleActivities()) return false;
        for (int i = mActivities.size() - 1; i >= 0; --i) {
            final ActivityRecord activityRecord = mActivities.get(i);
            if ((activityRecord.isVisible() || activityRecord.isVisibleRequested())
                    && !activityRecord.inPinnedWindowingMode()) {
                return true;
            }
        }
        return false;
    }

    @Nullable
    TaskDisplayArea getTopActivityDisplayArea() {
        if (mActivities.isEmpty()) {
+31 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.app.IApplicationThread;
import android.app.WindowConfiguration;
@@ -46,6 +47,10 @@ import org.junit.runner.RunWith;
@RunWith(WindowTestRunner.class)
public class VisibleActivityProcessTrackerTests extends WindowTestsBase {

    enum Visibility { VISIBLE, INVISIBLE, REQUESTED }
    private static final boolean PINNED = true;
    private static final boolean UNPINNED = false;

    private VisibleActivityProcessTracker mTracker;

    @Before
@@ -96,4 +101,30 @@ public class VisibleActivityProcessTrackerTests extends WindowTestsBase {
        mWpc.setThread(mock(IApplicationThread.class));
        return mWpc;
    }

    private static ActivityRecord addActivity(WindowProcessController wpc, Visibility visible,
            boolean pinned) {
        ActivityRecord ar = mock(ActivityRecord.class);
        Task task = mock(Task.class);
        doReturn(task).when(ar).getTask();
        switch (visible) {
            case VISIBLE:
                doReturn(true).when(ar).isVisible();
                doReturn(true).when(ar).isVisibleRequested();
                break;
            case INVISIBLE:
                doReturn(false).when(ar).isVisible();
                doReturn(false).when(ar).isVisibleRequested();
                break;
            case REQUESTED:
                doReturn(false).when(ar).isVisible();
                doReturn(true).when(ar).isVisibleRequested();
                break;
        }
        doReturn(pinned).when(ar).inPinnedWindowingMode();
        when(ar.toString()).thenReturn("ar visible=" + visible + ", pinned=" + pinned);
        wpc.addActivityIfNeeded(ar);
        wpc.computeProcessActivityState();
        return ar;
    }
}