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

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

RESTRICT AUTOMERGE Ignore pinned Windows (Consolidated fix)

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

Change-Id: I9ce93366a0876c7bc594ef818c8598342d70513d
Bug: 439984935
Test: atest BackgroundActivityLaunchTest
Flag: EXEMPT BUGFIX
parent e5a3093c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,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
@@ -878,6 +878,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()) {
+59 −11
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;
@@ -30,6 +31,7 @@ import android.platform.test.annotations.Presubmit;

import androidx.test.filters.SmallTest;


import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -46,6 +48,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
@@ -64,26 +70,42 @@ public class VisibleActivityProcessTrackerTests extends WindowTestsBase {
    }

    @Test
    public void testVisibleNotPinnedActivity() {
    public void hasVisibleNotPinnedActivity_whenProcessHasNoActivities_returnsFalse() {
        WindowProcessController wpc = createWindowProcessController();
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
        mTracker.onAnyActivityVisible(wpc);
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isTrue();
        mTracker.onAllActivitiesInvisible(wpc);
        assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isFalse();
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
    }

    @Test
    public void testVisiblePinnedActivity() {
    public void hasVisibleNotPinnedActivity_whenProcessHasOnlyInvisibleActivities_returnsFalse() {
        WindowProcessController wpc = createWindowProcessController();
        wpc.getConfiguration().windowConfiguration.setWindowingMode(
                WindowConfiguration.WINDOWING_MODE_PINNED);
        addActivity(wpc, Visibility.INVISIBLE, UNPINNED);
        assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isFalse();
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
        mTracker.onAnyActivityVisible(wpc);
    }

    @Test
    public void hasVisibleNotPinnedActivity_whenProcessHasOnlyPinnedActivities_returnsFalse() {
        WindowProcessController wpc = createWindowProcessController();
        addActivity(wpc, Visibility.VISIBLE, PINNED);
        assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isTrue();
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
        mTracker.onAllActivitiesInvisible(wpc);
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isFalse();
    }

    @Test
    public void hasVisibleNotPinnedActivity_whenProcessHasUnpinnedVisibleActivity_returnsTrue() {
        WindowProcessController wpc = createWindowProcessController();
        addActivity(wpc, Visibility.VISIBLE, UNPINNED);
        assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isTrue();
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isTrue();
    }

    @Test
    public void hasVisibleNotPinnedActivity_whenProcessHasUnpinnedVisReqActivity_returnsTrue() {
        WindowProcessController wpc = createWindowProcessController();
        addActivity(wpc, Visibility.REQUESTED, UNPINNED);
        assertThat(mTracker.hasVisibleActivity(wpc.mUid)).isTrue();
        assertThat(mTracker.hasVisibleNotPinnedActivity(wpc.mUid)).isTrue();
    }

    WindowProcessController createWindowProcessController() {
@@ -96,4 +118,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;
    }
}