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

Commit 125368e1 authored by Tiger Huang's avatar Tiger Huang Committed by Android (Google) Code Review
Browse files

Merge "Let system bar visibility override can be cascaded" into main

parents 1f521944 365211d3
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -276,6 +276,7 @@ public final class WindowContainerTransaction implements Parcelable {
    @NonNull
    public WindowContainerTransaction setSystemBarVisibilityOverride(
            @NonNull WindowContainerToken display,
            @NonNull IBinder caller,
            @InsetsType int forciblyShowingInsetsTypes,
            @InsetsType int forciblyHidingInsetsTypes) {
        final int forciblyShowingAndHidingTypes =
@@ -288,6 +289,7 @@ public final class WindowContainerTransaction implements Parcelable {
        final HierarchyOp hierarchyOp = new HierarchyOp.Builder(
                HierarchyOp.HIERARCHY_OP_TYPE_SET_SYSTEM_BAR_VISIBILITY_OVERRIDE)
                .setContainer(display.asBinder())
                .setCaller(caller)
                .setSystemBarVisibilityOverride(
                        forciblyShowingInsetsTypes, forciblyHidingInsetsTypes)
                .build();
@@ -966,7 +968,7 @@ public final class WindowContainerTransaction implements Parcelable {
                                .setArbitraryRectangle(frame)
                                .setBoundingRects(boundingRects)
                                .setFlags(flags))
                        .setInsetsFrameOwner(owner)
                        .setCaller(owner)
                        .build();
        mHierarchyOps.add(hierarchyOp);
        return this;
@@ -990,7 +992,7 @@ public final class WindowContainerTransaction implements Parcelable {
                new HierarchyOp.Builder(HierarchyOp.HIERARCHY_OP_TYPE_REMOVE_INSETS_FRAME_PROVIDER)
                        .setContainer(receiver.asBinder())
                        .setInsetsFrameProvider(new InsetsFrameProvider(owner, index, type))
                        .setInsetsFrameOwner(owner)
                        .setCaller(owner)
                        .build();
        mHierarchyOps.add(hierarchyOp);
        return this;
@@ -1819,7 +1821,7 @@ public final class WindowContainerTransaction implements Parcelable {
        private InsetsFrameProvider mInsetsFrameProvider;

        @Nullable
        private IBinder mInsetsFrameOwner;
        private IBinder mCaller;

        // Moves/reparents to top of parent when {@code true}, otherwise moves/reparents to bottom.
        private boolean mToTop;
@@ -2062,7 +2064,7 @@ public final class WindowContainerTransaction implements Parcelable {
            mIncludingParents = copy.mIncludingParents;
            mReparent = copy.mReparent;
            mInsetsFrameProvider = copy.mInsetsFrameProvider;
            mInsetsFrameOwner = copy.mInsetsFrameOwner;
            mCaller = copy.mCaller;
            mToTop = copy.mToTop;
            mReparentTopOnly = copy.mReparentTopOnly;
            mWindowingModes = copy.mWindowingModes;
@@ -2092,7 +2094,7 @@ public final class WindowContainerTransaction implements Parcelable {
            mIncludingParents = in.readBoolean();
            mReparent = in.readStrongBinder();
            mInsetsFrameProvider = in.readTypedObject(InsetsFrameProvider.CREATOR);
            mInsetsFrameOwner = in.readStrongBinder();
            mCaller = in.readStrongBinder();
            mToTop = in.readBoolean();
            mReparentTopOnly = in.readBoolean();
            mWindowingModes = in.createIntArray();
@@ -2134,8 +2136,8 @@ public final class WindowContainerTransaction implements Parcelable {
        }

        @Nullable
        public IBinder getInsetsFrameOwner() {
            return mInsetsFrameOwner;
        public IBinder getCaller() {
            return mCaller;
        }

        @NonNull
@@ -2344,7 +2346,7 @@ public final class WindowContainerTransaction implements Parcelable {
                case HIERARCHY_OP_TYPE_REMOVE_INSETS_FRAME_PROVIDER:
                    sb.append("container=").append(mContainer)
                            .append(" provider=").append(mInsetsFrameProvider)
                            .append(" owner=").append(mInsetsFrameOwner);
                            .append(" caller=").append(mCaller);
                    break;
                case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP:
                    sb.append("container=").append(mContainer)
@@ -2391,6 +2393,7 @@ public final class WindowContainerTransaction implements Parcelable {
                    break;
                case HIERARCHY_OP_TYPE_SET_SYSTEM_BAR_VISIBILITY_OVERRIDE:
                    sb.append(" container=").append(mContainer)
                            .append(" caller=").append(mCaller)
                            .append(" mForciblyShowingInsetsTypes=")
                            .append(WindowInsets.Type.toString(mForciblyShowingInsetsTypes))
                            .append(" mForciblyHidingInsetsTypes=")
@@ -2415,7 +2418,7 @@ public final class WindowContainerTransaction implements Parcelable {
            dest.writeBoolean(mIncludingParents);
            dest.writeStrongBinder(mReparent);
            dest.writeTypedObject(mInsetsFrameProvider, flags);
            dest.writeStrongBinder(mInsetsFrameOwner);
            dest.writeStrongBinder(mCaller);
            dest.writeBoolean(mToTop);
            dest.writeBoolean(mReparentTopOnly);
            dest.writeIntArray(mWindowingModes);
@@ -2472,7 +2475,7 @@ public final class WindowContainerTransaction implements Parcelable {
            private InsetsFrameProvider mInsetsFrameProvider;

            @Nullable
            private IBinder mInsetsFrameOwner;
            private IBinder mCaller;

            private boolean mToTop;

@@ -2550,8 +2553,8 @@ public final class WindowContainerTransaction implements Parcelable {
                return this;
            }

            Builder setInsetsFrameOwner(@Nullable IBinder owner) {
                mInsetsFrameOwner = owner;
            Builder setCaller(@Nullable IBinder caller) {
                mCaller = caller;
                return this;
            }

@@ -2673,7 +2676,7 @@ public final class WindowContainerTransaction implements Parcelable {
                        ? Arrays.copyOf(mActivityTypes, mActivityTypes.length)
                        : null;
                hierarchyOp.mInsetsFrameProvider = mInsetsFrameProvider;
                hierarchyOp.mInsetsFrameOwner = mInsetsFrameOwner;
                hierarchyOp.mCaller = mCaller;
                hierarchyOp.mToTop = mToTop;
                hierarchyOp.mReparentTopOnly = mReparentTopOnly;
                hierarchyOp.mLaunchOptions = mLaunchOptions;
+5 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.splitscreen

import android.os.Binder
import android.view.Display.DEFAULT_DISPLAY
import android.view.WindowInsets.Type.navigationBars
import android.view.WindowInsets.Type.statusBars
@@ -68,6 +69,7 @@ class SplitStatusBarHider(
        SplitState.SplitStateChangeListener {
            updateStatusBarBehavior(it, isLeftRightSplit, isSplitVisible)
        }
    private val systemBarVisibilityOverrideCaller = Binder()

    init {
        if (enableFlexibleTwoAppSplit()) {
@@ -146,10 +148,12 @@ class SplitStatusBarHider(
        val wct = WindowContainerTransaction()
        if (forceImmersive) {
            wct.setSystemBarVisibilityOverride(displayToken,
                systemBarVisibilityOverrideCaller,
                navigationBars() /*forciblyShowingTypes*/,
                statusBars() /*forciblyHidingTypes*/)
        } else {
            wct.setSystemBarVisibilityOverride(displayToken,
                systemBarVisibilityOverrideCaller,
                0 /*forciblyShowingTypes*/,
                0 /*forciblyHidingTypes*/)
        }
+112 −6
Original line number Diff line number Diff line
@@ -95,10 +95,12 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
@@ -288,6 +290,10 @@ public class DisplayPolicy {
     */
    private @InsetsType int mHidingPermanentInsetsTypes;

    /** Mapping from a caller to a SystemBarVisibilityOverride. */
    private final ArrayMap<IBinder, SystemBarVisibilityOverride> mSystemBarVisibilityOverrideMap =
            new ArrayMap<>();

    private boolean mImeInsetsConsumed;

    private boolean mIsImmersiveMode;
@@ -2509,14 +2515,90 @@ public class DisplayPolicy {
        }
    }

    private class SystemBarVisibilityOverride implements IBinder.DeathRecipient {

        private final IBinder mCaller;
        private @InsetsType int mForciblyShowingInsetsTypes;
        private @InsetsType int mForciblyHidingInsetsTypes;

        SystemBarVisibilityOverride(@NonNull IBinder caller) throws RemoteException {
            mCaller = caller;
        }

        boolean set(
                @InsetsType int forciblyShowingInsetsTypes,
                @InsetsType int forciblyHidingInsetsTypes) {
            if (mForciblyShowingInsetsTypes != forciblyShowingInsetsTypes
                    || mForciblyHidingInsetsTypes != forciblyHidingInsetsTypes) {
                mForciblyShowingInsetsTypes = forciblyShowingInsetsTypes;
                mForciblyHidingInsetsTypes = forciblyHidingInsetsTypes;
                return true;
            }
            return false;
        }

        @InsetsType int getForciblyShowingInsetsTypes() {
            return mForciblyShowingInsetsTypes;
        }

        @InsetsType int getForciblyHidingInsetsTypes() {
            return mForciblyHidingInsetsTypes;
        }

        @Override
        public void binderDied() {
            synchronized (mService.mGlobalLock) {
                setSystemBarVisibilityOverride(
                        mCaller,
                        0 /* forciblyShowingInsetsTypes */,
                        0 /* forciblyHidingInsetsTypes */);
            }
        }

        @Override
        public String toString() {
            return "SystemBarVisibilityOverride{@" + Integer.toHexString(mCaller.hashCode())
                    + " show:[" + Type.toString(mForciblyShowingInsetsTypes)
                    + "] hide: [" + Type.toString(mForciblyHidingInsetsTypes) + "]}";
        }
    }

    void setSystemBarVisibilityOverride(
            @InsetsType int forciblyShowingInsetsTypes, @InsetsType int forciblyHidingInsetsTypes) {
        if (mShowingPermanentInsetsTypes != forciblyShowingInsetsTypes
                || mHidingPermanentInsetsTypes != forciblyHidingInsetsTypes) {
            mShowingPermanentInsetsTypes = forciblyShowingInsetsTypes;
            mHidingPermanentInsetsTypes = forciblyHidingInsetsTypes;
            updateSystemBarAttributes();
            @NonNull IBinder caller,
            @InsetsType int forciblyShowingInsetsTypes,
            @InsetsType int forciblyHidingInsetsTypes) {
        SystemBarVisibilityOverride override = mSystemBarVisibilityOverrideMap.get(caller);
        try {
            if (forciblyShowingInsetsTypes != 0 || forciblyHidingInsetsTypes != 0) {
                if (override == null) {
                    override = new SystemBarVisibilityOverride(caller);
                    caller.linkToDeath(override, 0 /* flags */);
                    mSystemBarVisibilityOverrideMap.put(caller, override);
                }
                if (override.set(forciblyShowingInsetsTypes, forciblyHidingInsetsTypes)) {
                    updateSystemBarVisibilityOverride();
                }
            } else {
                if (override != null) {
                    caller.unlinkToDeath(override, 0 /* flags */);
                    mSystemBarVisibilityOverrideMap.remove(caller);
                    updateSystemBarVisibilityOverride();
                }
            }
        } catch (RemoteException e) {
            Slog.w(TAG, "Unable to set " + override + " due to RemoteException.", e);
        }
    }

    private void updateSystemBarVisibilityOverride() {
        mShowingPermanentInsetsTypes = 0;
        mHidingPermanentInsetsTypes = 0;
        for (int i = mSystemBarVisibilityOverrideMap.size() - 1; i >= 0; i--) {
            final SystemBarVisibilityOverride override = mSystemBarVisibilityOverrideMap.valueAt(i);
            mShowingPermanentInsetsTypes |= override.getForciblyShowingInsetsTypes();
            mHidingPermanentInsetsTypes |= override.getForciblyHidingInsetsTypes();
        }
        updateSystemBarAttributes();
    }

    void resetSystemBarAttributes() {
@@ -3086,6 +3168,30 @@ public class DisplayPolicy {
                pw.print(prefixInner);  pw.println(win);
            }
        }
        if (mShowingTransientInsetsTypes != 0) {
            pw.print(prefix);
            pw.print("mShowingTransientInsetsTypes=");
            pw.println(WindowInsets.Type.toString(mShowingTransientInsetsTypes));
        }
        if (mShowingPermanentInsetsTypes != 0) {
            pw.print(prefix);
            pw.print("mShowingPermanentInsetsTypes=");
            pw.println(WindowInsets.Type.toString(mShowingPermanentInsetsTypes));
        }
        if (mHidingPermanentInsetsTypes != 0) {
            pw.print(prefix);
            pw.print("mHidingPermanentInsetsTypes=");
            pw.println(WindowInsets.Type.toString(mHidingPermanentInsetsTypes));
        }
        if (!mSystemBarVisibilityOverrideMap.isEmpty()) {
            pw.print(prefix);
            pw.println("mSystemBarVisibilityOverrideMap:");
            for (int i = mSystemBarVisibilityOverrideMap.size() - 1; i >= 0; i--) {
                pw.print(prefix);
                pw.print("  ");
                pw.println(mSystemBarVisibilityOverrideMap.valueAt(i));
            }
        }
        pw.print(prefix); pw.print("mTopIsFullscreen="); pw.println(mTopIsFullscreen);
        pw.print(prefix); pw.print("mImeInsetsConsumed="); pw.println(mImeInsetsConsumed);
        pw.print(prefix); pw.print("mForceShowNavigationBarEnabled=");
+3 −2
Original line number Diff line number Diff line
@@ -1499,7 +1499,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                    break;
                }
                container.addLocalInsetsFrameProvider(
                        hop.getInsetsFrameProvider(), hop.getInsetsFrameOwner());
                        hop.getInsetsFrameProvider(), hop.getCaller());
                break;
            }
            case HIERARCHY_OP_TYPE_REMOVE_INSETS_FRAME_PROVIDER: {
@@ -1510,7 +1510,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                    break;
                }
                container.removeLocalInsetsFrameProvider(
                        hop.getInsetsFrameProvider(), hop.getInsetsFrameOwner());
                        hop.getInsetsFrameProvider(), hop.getCaller());
                break;
            }
            case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP: {
@@ -1605,6 +1605,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                final WindowContainer container = WindowContainer.fromBinder(hop.getContainer());
                if (container instanceof DisplayContent displayContent) {
                    displayContent.getDisplayPolicy().setSystemBarVisibilityOverride(
                            hop.getCaller(),
                            hop.getForciblyShowingInsetsTypes(),
                            hop.getForciblyHidingInsetsTypes());
                } else {
+75 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.ViewRootImpl.CLIENT_TRANSIENT;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
@@ -53,6 +54,7 @@ import static org.mockito.Mockito.when;
import android.graphics.Insets;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.Binder;
import android.platform.test.annotations.Presubmit;
import android.view.DisplayInfo;
import android.view.InsetsFrameProvider;
@@ -578,4 +580,77 @@ public class DisplayPolicyTests extends WindowTestsBase {

        assertFalse(mDisplayContent.getInsetsPolicy().isTransient(navigationBars()));
    }

    @SetupWindows(addWindows = { W_ACTIVITY })
    @Test
    public void testSetSystemBarVisibilityOverride() {
        final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
        final InsetsPolicy insetsPolicy = mDisplayContent.getInsetsPolicy();
        final Binder caller1 = new Binder();
        final Binder caller2 = new Binder();

        displayPolicy.applyPostLayoutPolicyLw(mAppWindow, mAppWindow.mAttrs, null, null);

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller1, statusBars(), 0);

        assertTrue(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller2, navigationBars(), 0);

        assertTrue(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertTrue(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller1, 0, 0);

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertTrue(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller2, 0, 0);

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller1, 0, statusBars());

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertTrue(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller2, 0, navigationBars());

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertTrue(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertTrue(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller1, 0, 0);

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertTrue(insetsPolicy.areTypesForciblyHidden(navigationBars()));

        displayPolicy.setSystemBarVisibilityOverride(caller2, 0, 0);

        assertFalse(insetsPolicy.areTypesForciblyShown(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyShown(navigationBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(statusBars()));
        assertFalse(insetsPolicy.areTypesForciblyHidden(navigationBars()));

    }
}
Loading