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

Commit 0316c21e authored by Presubmit Automerger Backend's avatar Presubmit Automerger Backend
Browse files

[automerge] Isolate count of visible window from mirror of uid state 2p: 4d2f0f91

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17135563

Change-Id: Ib36a899141a7e0f9f6aa0c9ba8dd33d3be50bbc9
parents 4f043764 4d2f0f91
Loading
Loading
Loading
Loading
+26 −29
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package com.android.server.wm;
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;

import android.app.ActivityManager.ProcessState;
import android.util.SparseArray;
import android.util.SparseIntArray;

import java.io.PrintWriter;

@@ -29,15 +29,14 @@ import java.io.PrintWriter;
 * adjustment) or getting state from window manager (background start check).
 */
class MirrorActiveUids {
    private final SparseArray<UidRecord> mUidStates = new SparseArray<>();
    /** Uid -> process state. */
    private final SparseIntArray mUidStates = new SparseIntArray();

    /** Uid -> number of non-app visible windows belong to the uid. */
    private final SparseIntArray mNumNonAppVisibleWindowMap = new SparseIntArray();

    synchronized void onUidActive(int uid, int procState) {
        UidRecord r = mUidStates.get(uid);
        if (r == null) {
            r = new UidRecord();
            mUidStates.put(uid, r);
        }
        r.mProcState = procState;
        mUidStates.put(uid, procState);
    }

    synchronized void onUidInactive(int uid) {
@@ -45,22 +44,28 @@ class MirrorActiveUids {
    }

    synchronized void onUidProcStateChanged(int uid, int procState) {
        final UidRecord r = mUidStates.get(uid);
        if (r != null) {
            r.mProcState = procState;
        final int index = mUidStates.indexOfKey(uid);
        if (index >= 0) {
            mUidStates.setValueAt(index, procState);
        }
    }

    synchronized @ProcessState int getUidState(int uid) {
        final UidRecord r = mUidStates.get(uid);
        return r != null ? r.mProcState : PROCESS_STATE_NONEXISTENT;
        return mUidStates.get(uid, PROCESS_STATE_NONEXISTENT);
    }

    /** Called when the surface of non-application (exclude toast) window is shown or hidden. */
    synchronized void onNonAppSurfaceVisibilityChanged(int uid, boolean visible) {
        final UidRecord r = mUidStates.get(uid);
        if (r != null) {
            r.mNumNonAppVisibleWindow += visible ? 1 : -1;
        final int index = mNumNonAppVisibleWindowMap.indexOfKey(uid);
        if (index >= 0) {
            final int num = mNumNonAppVisibleWindowMap.valueAt(index) + (visible ? 1 : -1);
            if (num > 0) {
                mNumNonAppVisibleWindowMap.setValueAt(index, num);
            } else {
                mNumNonAppVisibleWindowMap.removeAt(index);
            }
        } else if (visible) {
            mNumNonAppVisibleWindowMap.append(uid, 1);
        }
    }

@@ -70,23 +75,15 @@ class MirrorActiveUids {
     * {@link VisibleActivityProcessTracker}.
     */
    synchronized boolean hasNonAppVisibleWindow(int uid) {
        final UidRecord r = mUidStates.get(uid);
        return r != null && r.mNumNonAppVisibleWindow > 0;
        return mNumNonAppVisibleWindowMap.get(uid) > 0;
    }

    synchronized void dump(PrintWriter pw, String prefix) {
        pw.print(prefix + "NumNonAppVisibleWindowByUid:[");
        for (int i = mUidStates.size() - 1; i >= 0; i--) {
            final UidRecord r = mUidStates.valueAt(i);
            if (r.mNumNonAppVisibleWindow > 0) {
                pw.print(" " + mUidStates.keyAt(i) + ":" + r.mNumNonAppVisibleWindow);
            }
        pw.print(prefix + "NumNonAppVisibleWindowUidMap:[");
        for (int i = mNumNonAppVisibleWindowMap.size() - 1; i >= 0; i--) {
            pw.print(" " + mNumNonAppVisibleWindowMap.keyAt(i) + ":"
                    + mNumNonAppVisibleWindowMap.valueAt(i));
        }
        pw.println("]");
    }

    private static final class UidRecord {
        @ProcessState int mProcState;
        int mNumNonAppVisibleWindow;
    }
}
+5 −1
Original line number Diff line number Diff line
@@ -800,7 +800,6 @@ public class WindowStateTests extends WindowTestsBase {
    @Test
    public void testHasActiveVisibleWindow() {
        final int uid = ActivityBuilder.DEFAULT_FAKE_UID;
        mAtm.mActiveUids.onUidActive(uid, 0 /* any proc state */);

        final WindowState app = createWindow(null, TYPE_APPLICATION, "app", uid);
        app.mActivityRecord.setVisible(false);
@@ -828,6 +827,11 @@ public class WindowStateTests extends WindowTestsBase {
        // Make the application overlay window visible. It should be a valid active visible window.
        overlay.onSurfaceShownChanged(true);
        assertTrue(mAtm.hasActiveVisibleWindow(uid));

        // The number of windows should be independent of the existence of uid state.
        mAtm.mActiveUids.onUidInactive(uid);
        mAtm.mActiveUids.onUidActive(uid, 0 /* any proc state */);
        assertTrue(mAtm.mActiveUids.hasNonAppVisibleWindow(uid));
    }

    @UseTestDisplay(addWindows = W_ACTIVITY)