Loading core/java/android/window/WindowContainerTransaction.java +16 −13 Original line number Diff line number Diff line Loading @@ -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 = Loading @@ -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(); Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -2134,8 +2136,8 @@ public final class WindowContainerTransaction implements Parcelable { } @Nullable public IBinder getInsetsFrameOwner() { return mInsetsFrameOwner; public IBinder getCaller() { return mCaller; } @NonNull Loading Loading @@ -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) Loading Loading @@ -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=") Loading @@ -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); Loading Loading @@ -2472,7 +2475,7 @@ public final class WindowContainerTransaction implements Parcelable { private InsetsFrameProvider mInsetsFrameProvider; @Nullable private IBinder mInsetsFrameOwner; private IBinder mCaller; private boolean mToTop; Loading Loading @@ -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; } Loading Loading @@ -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; Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitStatusBarHider.kt +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -68,6 +69,7 @@ class SplitStatusBarHider( SplitState.SplitStateChangeListener { updateStatusBarBehavior(it, isLeftRightSplit, isSplitVisible) } private val systemBarVisibilityOverrideCaller = Binder() init { if (enableFlexibleTwoAppSplit()) { Loading Loading @@ -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*/) } Loading services/core/java/com/android/server/wm/DisplayPolicy.java +112 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -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="); Loading services/core/java/com/android/server/wm/WindowOrganizerController.java +3 −2 Original line number Diff line number Diff line Loading @@ -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: { Loading @@ -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: { Loading Loading @@ -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 { Loading services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +75 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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
core/java/android/window/WindowContainerTransaction.java +16 −13 Original line number Diff line number Diff line Loading @@ -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 = Loading @@ -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(); Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -2134,8 +2136,8 @@ public final class WindowContainerTransaction implements Parcelable { } @Nullable public IBinder getInsetsFrameOwner() { return mInsetsFrameOwner; public IBinder getCaller() { return mCaller; } @NonNull Loading Loading @@ -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) Loading Loading @@ -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=") Loading @@ -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); Loading Loading @@ -2472,7 +2475,7 @@ public final class WindowContainerTransaction implements Parcelable { private InsetsFrameProvider mInsetsFrameProvider; @Nullable private IBinder mInsetsFrameOwner; private IBinder mCaller; private boolean mToTop; Loading Loading @@ -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; } Loading Loading @@ -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; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitStatusBarHider.kt +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -68,6 +69,7 @@ class SplitStatusBarHider( SplitState.SplitStateChangeListener { updateStatusBarBehavior(it, isLeftRightSplit, isSplitVisible) } private val systemBarVisibilityOverrideCaller = Binder() init { if (enableFlexibleTwoAppSplit()) { Loading Loading @@ -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*/) } Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +112 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -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="); Loading
services/core/java/com/android/server/wm/WindowOrganizerController.java +3 −2 Original line number Diff line number Diff line Loading @@ -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: { Loading @@ -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: { Loading Loading @@ -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 { Loading
services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +75 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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())); } }