diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 75f16667f506b..6c5f195ba2a05 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -480,9 +480,9 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro : inset != 0; if (outState != null && source != null) { - outState.getOrCreateSource(source.getId(), source.getType()) + outState.addSource(new InsetsSource(source) .setVisible(visible) - .setFrame(mTmpFrame); + .setFrame(mTmpFrame)); } // If the system is controlling the insets source, the leash can be null. diff --git a/core/java/android/view/InsetsFrameProvider.java b/core/java/android/view/InsetsFrameProvider.java index 2d7dc316cb51c..a69af24756a02 100644 --- a/core/java/android/view/InsetsFrameProvider.java +++ b/core/java/android/view/InsetsFrameProvider.java @@ -23,6 +23,7 @@ import android.graphics.Rect; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; +import android.view.InsetsSource.Flags; import android.view.WindowInsets.Type.InsetsType; import java.util.Arrays; @@ -85,6 +86,13 @@ public class InsetsFrameProvider implements Parcelable { */ private Insets mInsetsSize = null; + /** + * Various behavioral options/flags. Default is none. + * + * @see Flags + */ + private @Flags int mFlags; + /** * If null, the size set in insetsSize will be applied to all window types. If it contains * element of some types, the insets reported to the window with that types will be overridden. @@ -149,6 +157,15 @@ public class InsetsFrameProvider implements Parcelable { return mSource; } + public InsetsFrameProvider setFlags(@Flags int flags, @Flags int mask) { + mFlags = (mFlags & ~mask) | (flags & mask); + return this; + } + + public @Flags int getFlags() { + return mFlags; + } + public InsetsFrameProvider setInsetsSize(Insets insetsSize) { mInsetsSize = insetsSize; return this; @@ -198,6 +215,7 @@ public class InsetsFrameProvider implements Parcelable { sb.append(", index=").append(mIndex); sb.append(", type=").append(WindowInsets.Type.toString(mType)); sb.append(", source=").append(sourceToString(mSource)); + sb.append(", flags=[").append(InsetsSource.flagsToString(mFlags)).append("]"); if (mInsetsSize != null) { sb.append(", insetsSize=").append(mInsetsSize); } @@ -230,6 +248,7 @@ public class InsetsFrameProvider implements Parcelable { mIndex = in.readInt(); mType = in.readInt(); mSource = in.readInt(); + mFlags = in.readInt(); mInsetsSize = in.readTypedObject(Insets.CREATOR); mInsetsSizeOverrides = in.createTypedArray(InsetsSizeOverride.CREATOR); mArbitraryRectangle = in.readTypedObject(Rect.CREATOR); @@ -241,6 +260,7 @@ public class InsetsFrameProvider implements Parcelable { out.writeInt(mIndex); out.writeInt(mType); out.writeInt(mSource); + out.writeInt(mFlags); out.writeTypedObject(mInsetsSize, flags); out.writeTypedArray(mInsetsSizeOverrides, flags); out.writeTypedObject(mArbitraryRectangle, flags); @@ -260,7 +280,7 @@ public class InsetsFrameProvider implements Parcelable { } final InsetsFrameProvider other = (InsetsFrameProvider) o; return Objects.equals(mOwner, other.mOwner) && mIndex == other.mIndex - && mType == other.mType && mSource == other.mSource + && mType == other.mType && mSource == other.mSource && mFlags == other.mFlags && Objects.equals(mInsetsSize, other.mInsetsSize) && Arrays.equals(mInsetsSizeOverrides, other.mInsetsSizeOverrides) && Objects.equals(mArbitraryRectangle, other.mArbitraryRectangle); @@ -268,7 +288,7 @@ public class InsetsFrameProvider implements Parcelable { @Override public int hashCode() { - return Objects.hash(mOwner, mIndex, mType, mSource, mInsetsSize, + return Objects.hash(mOwner, mIndex, mType, mSource, mFlags, mInsetsSize, Arrays.hashCode(mInsetsSizeOverrides), mArbitraryRectangle); } diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java index 39477380e196f..bd48771ec4b31 100644 --- a/core/java/android/view/InsetsSource.java +++ b/core/java/android/view/InsetsSource.java @@ -22,6 +22,7 @@ import static android.view.InsetsSourceProto.VISIBLE; import static android.view.InsetsSourceProto.VISIBLE_FRAME; import static android.view.WindowInsets.Type.ime; +import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -33,7 +34,10 @@ import android.util.proto.ProtoOutputStream; import android.view.WindowInsets.Type.InsetsType; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Objects; +import java.util.StringJoiner; /** * Represents the state of a single entity generating insets for clients. @@ -44,6 +48,24 @@ public class InsetsSource implements Parcelable { /** The insets source ID of IME */ public static final int ID_IME = createId(null, 0, ime()); + /** + * Controls whether this source suppresses the scrim. If the scrim is ignored, the system won't + * draw a semi-transparent scrim behind the system bar area even when the bar contrast is + * enforced. + * + * @see android.R.styleable#Window_enforceStatusBarContrast + * @see android.R.styleable#Window_enforceNavigationBarContrast + */ + public static final int FLAG_SUPPRESS_SCRIM = 1; + + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = true, prefix = "FLAG_", value = { + FLAG_SUPPRESS_SCRIM, + }) + public @interface Flags {} + + private @Flags int mFlags; + /** * An unique integer to identify this source across processes. */ @@ -75,6 +97,7 @@ public class InsetsSource implements Parcelable { mVisibleFrame = other.mVisibleFrame != null ? new Rect(other.mVisibleFrame) : null; + mFlags = other.mFlags; mInsetsRoundedCornerFrame = other.mInsetsRoundedCornerFrame; } @@ -84,6 +107,7 @@ public class InsetsSource implements Parcelable { mVisibleFrame = other.mVisibleFrame != null ? new Rect(other.mVisibleFrame) : null; + mFlags = other.mFlags; mInsetsRoundedCornerFrame = other.mInsetsRoundedCornerFrame; } @@ -107,6 +131,11 @@ public class InsetsSource implements Parcelable { return this; } + public InsetsSource setFlags(@Flags int flags) { + mFlags = flags; + return this; + } + public int getId() { return mId; } @@ -127,6 +156,10 @@ public class InsetsSource implements Parcelable { return mVisible; } + public @Flags int getFlags() { + return mFlags; + } + boolean isUserControllable() { // If mVisibleFrame is null, it will be the same area as mFrame. return mVisibleFrame == null || !mVisibleFrame.isEmpty(); @@ -254,6 +287,14 @@ public class InsetsSource implements Parcelable { + WindowInsets.Type.indexOf(type); } + public static String flagsToString(@Flags int flags) { + final StringJoiner joiner = new StringJoiner(" "); + if ((flags & FLAG_SUPPRESS_SCRIM) != 0) { + joiner.add("SUPPRESS_SCRIM"); + } + return joiner.toString(); + } + /** * Export the state of {@link InsetsSource} into a protocol buffer output stream. * @@ -280,6 +321,7 @@ public class InsetsSource implements Parcelable { pw.print(" visibleFrame="); pw.print(mVisibleFrame.toShortString()); } pw.print(" visible="); pw.print(mVisible); + pw.print(" flags="); pw.print(flagsToString(mFlags)); pw.print(" insetsRoundedCornerFrame="); pw.print(mInsetsRoundedCornerFrame); pw.println(); } @@ -302,6 +344,7 @@ public class InsetsSource implements Parcelable { if (mId != that.mId) return false; if (mType != that.mType) return false; if (mVisible != that.mVisible) return false; + if (mFlags != that.mFlags) return false; if (excludeInvisibleImeFrames && !mVisible && mType == WindowInsets.Type.ime()) return true; if (!Objects.equals(mVisibleFrame, that.mVisibleFrame)) return false; if (mInsetsRoundedCornerFrame != that.mInsetsRoundedCornerFrame) return false; @@ -310,7 +353,8 @@ public class InsetsSource implements Parcelable { @Override public int hashCode() { - return Objects.hash(mId, mType, mFrame, mVisibleFrame, mVisible, mInsetsRoundedCornerFrame); + return Objects.hash(mId, mType, mFrame, mVisibleFrame, mVisible, mFlags, + mInsetsRoundedCornerFrame); } public InsetsSource(Parcel in) { @@ -323,6 +367,7 @@ public class InsetsSource implements Parcelable { mVisibleFrame = null; } mVisible = in.readBoolean(); + mFlags = in.readInt(); mInsetsRoundedCornerFrame = in.readBoolean(); } @@ -343,6 +388,7 @@ public class InsetsSource implements Parcelable { dest.writeInt(0); } dest.writeBoolean(mVisible); + dest.writeInt(mFlags); dest.writeBoolean(mInsetsRoundedCornerFrame); } @@ -352,6 +398,7 @@ public class InsetsSource implements Parcelable { + " mType=" + WindowInsets.Type.toString(mType) + " mFrame=" + mFrame.toShortString() + " mVisible=" + mVisible + + " mFlags=[" + flagsToString(mFlags) + "]" + (mInsetsRoundedCornerFrame ? " insetsRoundedCornerFrame" : "") + "}"; } diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index bd249c42031dd..5b974cdb2bca5 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -143,9 +143,14 @@ public class InsetsState implements Parcelable { boolean[] typeVisibilityMap = new boolean[Type.SIZE]; final Rect relativeFrame = new Rect(frame); final Rect relativeFrameMax = new Rect(frame); + @InsetsType int suppressScrimTypes = 0; for (int i = mSources.size() - 1; i >= 0; i--) { final InsetsSource source = mSources.valueAt(i); + if ((source.getFlags() & InsetsSource.FLAG_SUPPRESS_SCRIM) != 0) { + suppressScrimTypes |= source.getType(); + } + processSource(source, relativeFrame, false /* ignoreVisibility */, typeInsetsMap, idSideMap, typeVisibilityMap); @@ -177,7 +182,7 @@ public class InsetsState implements Parcelable { } return new WindowInsets(typeInsetsMap, typeMaxInsetsMap, typeVisibilityMap, isScreenRound, - alwaysConsumeSystemBars, calculateRelativeCutout(frame), + alwaysConsumeSystemBars, suppressScrimTypes, calculateRelativeCutout(frame), calculateRelativeRoundedCorners(frame), calculateRelativePrivacyIndicatorBounds(frame), calculateRelativeDisplayShape(frame), diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index fd55d8d55bc92..4acaea8495868 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -91,6 +91,7 @@ public final class WindowInsets { */ private final boolean mAlwaysConsumeSystemBars; + private final @InsetsType int mSuppressScrimTypes; private final boolean mSystemWindowInsetsConsumed; private final boolean mStableInsetsConsumed; private final boolean mDisplayCutoutConsumed; @@ -116,8 +117,8 @@ public final class WindowInsets { static { CONSUMED = new WindowInsets(createCompatTypeMap(null), createCompatTypeMap(null), - createCompatVisibilityMap(createCompatTypeMap(null)), false, false, null, null, - null, null, systemBars(), false); + createCompatVisibilityMap(createCompatTypeMap(null)), false, false, 0, null, + null, null, null, systemBars(), false); } /** @@ -136,7 +137,8 @@ public final class WindowInsets { @Nullable Insets[] typeMaxInsetsMap, boolean[] typeVisibilityMap, boolean isRound, - boolean alwaysConsumeSystemBars, DisplayCutout displayCutout, + boolean alwaysConsumeSystemBars, @InsetsType int suppressScrimTypes, + DisplayCutout displayCutout, RoundedCorners roundedCorners, PrivacyIndicatorBounds privacyIndicatorBounds, DisplayShape displayShape, @@ -154,6 +156,7 @@ public final class WindowInsets { mTypeVisibilityMap = typeVisibilityMap; mIsRound = isRound; mAlwaysConsumeSystemBars = alwaysConsumeSystemBars; + mSuppressScrimTypes = suppressScrimTypes; mCompatInsetsTypes = compatInsetsTypes; mCompatIgnoreVisibility = compatIgnoreVisibility; @@ -175,7 +178,8 @@ public final class WindowInsets { this(src.mSystemWindowInsetsConsumed ? null : src.mTypeInsetsMap, src.mStableInsetsConsumed ? null : src.mTypeMaxInsetsMap, src.mTypeVisibilityMap, src.mIsRound, - src.mAlwaysConsumeSystemBars, displayCutoutCopyConstructorArgument(src), + src.mAlwaysConsumeSystemBars, src.mSuppressScrimTypes, + displayCutoutCopyConstructorArgument(src), src.mRoundedCorners, src.mPrivacyIndicatorBounds, src.mDisplayShape, @@ -231,8 +235,8 @@ public final class WindowInsets { /** @hide */ @UnsupportedAppUsage public WindowInsets(Rect systemWindowInsets) { - this(createCompatTypeMap(systemWindowInsets), null, new boolean[SIZE], false, false, null, - null, null, null, systemBars(), false /* compatIgnoreVisibility */); + this(createCompatTypeMap(systemWindowInsets), null, new boolean[SIZE], false, false, 0, + null, null, null, null, systemBars(), false /* compatIgnoreVisibility */); } /** @@ -552,7 +556,7 @@ public final class WindowInsets { return new WindowInsets(mSystemWindowInsetsConsumed ? null : mTypeInsetsMap, mStableInsetsConsumed ? null : mTypeMaxInsetsMap, mTypeVisibilityMap, - mIsRound, mAlwaysConsumeSystemBars, + mIsRound, mAlwaysConsumeSystemBars, mSuppressScrimTypes, null /* displayCutout */, mRoundedCorners, mPrivacyIndicatorBounds, mDisplayShape, mCompatInsetsTypes, mCompatIgnoreVisibility); } @@ -603,7 +607,7 @@ public final class WindowInsets { public WindowInsets consumeSystemWindowInsets() { return new WindowInsets(null, null, mTypeVisibilityMap, - mIsRound, mAlwaysConsumeSystemBars, + mIsRound, mAlwaysConsumeSystemBars, mSuppressScrimTypes, // If the system window insets types contain displayCutout, we should also consume // it. (mCompatInsetsTypes & displayCutout()) != 0 @@ -895,6 +899,13 @@ public final class WindowInsets { return mAlwaysConsumeSystemBars; } + /** + * @hide + */ + public @InsetsType int getSuppressScrimTypes() { + return mSuppressScrimTypes; + } + @Override public String toString() { StringBuilder result = new StringBuilder("WindowInsets{\n "); @@ -919,7 +930,9 @@ public final class WindowInsets { result.append("\n "); result.append(mDisplayShape != null ? "displayShape=" + mDisplayShape : ""); result.append("\n "); - result.append("compatInsetsTypes=" + mCompatInsetsTypes); + result.append("suppressScrimTypes=" + Type.toString(mSuppressScrimTypes)); + result.append("\n "); + result.append("compatInsetsTypes=" + Type.toString(mCompatInsetsTypes)); result.append("\n "); result.append("compatIgnoreVisibility=" + mCompatIgnoreVisibility); result.append("\n "); @@ -1014,7 +1027,7 @@ public final class WindowInsets { ? null : insetInsets(mTypeMaxInsetsMap, left, top, right, bottom), mTypeVisibilityMap, - mIsRound, mAlwaysConsumeSystemBars, + mIsRound, mAlwaysConsumeSystemBars, mSuppressScrimTypes, mDisplayCutoutConsumed ? null : mDisplayCutout == null @@ -1038,6 +1051,7 @@ public final class WindowInsets { return mIsRound == that.mIsRound && mAlwaysConsumeSystemBars == that.mAlwaysConsumeSystemBars + && mSuppressScrimTypes == that.mSuppressScrimTypes && mSystemWindowInsetsConsumed == that.mSystemWindowInsetsConsumed && mStableInsetsConsumed == that.mStableInsetsConsumed && mDisplayCutoutConsumed == that.mDisplayCutoutConsumed @@ -1054,8 +1068,9 @@ public final class WindowInsets { public int hashCode() { return Objects.hash(Arrays.hashCode(mTypeInsetsMap), Arrays.hashCode(mTypeMaxInsetsMap), Arrays.hashCode(mTypeVisibilityMap), mIsRound, mDisplayCutout, mRoundedCorners, - mAlwaysConsumeSystemBars, mSystemWindowInsetsConsumed, mStableInsetsConsumed, - mDisplayCutoutConsumed, mPrivacyIndicatorBounds, mDisplayShape); + mAlwaysConsumeSystemBars, mSuppressScrimTypes, mSystemWindowInsetsConsumed, + mStableInsetsConsumed, mDisplayCutoutConsumed, mPrivacyIndicatorBounds, + mDisplayShape); } @@ -1120,6 +1135,7 @@ public final class WindowInsets { private boolean mIsRound; private boolean mAlwaysConsumeSystemBars; + private @InsetsType int mSuppressScrimTypes; private PrivacyIndicatorBounds mPrivacyIndicatorBounds = new PrivacyIndicatorBounds(); @@ -1147,6 +1163,7 @@ public final class WindowInsets { mRoundedCorners = insets.mRoundedCorners; mIsRound = insets.mIsRound; mAlwaysConsumeSystemBars = insets.mAlwaysConsumeSystemBars; + mSuppressScrimTypes = insets.mSuppressScrimTypes; mPrivacyIndicatorBounds = insets.mPrivacyIndicatorBounds; mDisplayShape = insets.mDisplayShape; } @@ -1420,6 +1437,13 @@ public final class WindowInsets { return this; } + /** @hide */ + @NonNull + public Builder setSuppressScrimTypes(@InsetsType int suppressScrimTypes) { + mSuppressScrimTypes = suppressScrimTypes; + return this; + } + /** * Builds a {@link WindowInsets} instance. * @@ -1429,8 +1453,8 @@ public final class WindowInsets { public WindowInsets build() { return new WindowInsets(mSystemInsetsConsumed ? null : mTypeInsetsMap, mStableInsetsConsumed ? null : mTypeMaxInsetsMap, mTypeVisibilityMap, - mIsRound, mAlwaysConsumeSystemBars, mDisplayCutout, mRoundedCorners, - mPrivacyIndicatorBounds, mDisplayShape, systemBars(), + mIsRound, mAlwaysConsumeSystemBars, mSuppressScrimTypes, mDisplayCutout, + mRoundedCorners, mPrivacyIndicatorBounds, mDisplayShape, systemBars(), false /* compatIgnoreVisibility */); } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 47e6b6e4d9da9..15f70f358d6e0 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -233,6 +233,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind private boolean mLastHasLeftStableInset = false; private int mLastWindowFlags = 0; private boolean mLastShouldAlwaysConsumeSystemBars = false; + private @InsetsType int mLastSuppressScrimTypes = 0; private int mRootScrollY = 0; @@ -1143,6 +1144,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mLastHasLeftStableInset = hasLeftStableInset; mLastShouldAlwaysConsumeSystemBars = insets.shouldAlwaysConsumeSystemBars(); + mLastSuppressScrimTypes = insets.getSuppressScrimTypes(); } boolean navBarToRightEdge = isNavBarToRightEdge(mLastBottomInset, mLastRightInset); @@ -1378,7 +1380,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return calculateBarColor(mWindow.getAttributes().flags, FLAG_TRANSLUCENT_STATUS, mSemiTransparentBarColor, mWindow.mStatusBarColor, appearance, APPEARANCE_LIGHT_STATUS_BARS, - mWindow.mEnsureStatusBarContrastWhenTransparent); + mWindow.mEnsureStatusBarContrastWhenTransparent + && (mLastSuppressScrimTypes & WindowInsets.Type.statusBars()) == 0); } private int calculateNavigationBarColor(@Appearance int appearance) { @@ -1386,7 +1389,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mSemiTransparentBarColor, mWindow.mNavigationBarColor, appearance, APPEARANCE_LIGHT_NAVIGATION_BARS, mWindow.mEnsureNavigationBarContrastWhenTransparent - && getContext().getResources().getBoolean(R.bool.config_navBarNeedsScrim)); + && (mLastSuppressScrimTypes & WindowInsets.Type.navigationBars()) == 0); } public static int calculateBarColor(int flags, int translucentFlag, int semiTransparentBarColor, diff --git a/core/tests/coretests/src/android/view/WindowInsetsTest.java b/core/tests/coretests/src/android/view/WindowInsetsTest.java index 4fed396456dad..b4ba23c92a223 100644 --- a/core/tests/coretests/src/android/view/WindowInsetsTest.java +++ b/core/tests/coretests/src/android/view/WindowInsetsTest.java @@ -40,14 +40,14 @@ public class WindowInsetsTest { @Test public void systemWindowInsets_afterConsuming_isConsumed() { assertTrue(new WindowInsets(WindowInsets.createCompatTypeMap(new Rect(1, 2, 3, 4)), null, - null, false, false, null, null, null, null, + null, false, false, 0, null, null, null, null, WindowInsets.Type.systemBars(), false) .consumeSystemWindowInsets().isConsumed()); } @Test public void multiNullConstructor_isConsumed() { - assertTrue(new WindowInsets(null, null, null, false, false, null, null, null, null, + assertTrue(new WindowInsets(null, null, null, false, false, 0, null, null, null, null, WindowInsets.Type.systemBars(), false).isConsumed()); } @@ -63,8 +63,8 @@ public class WindowInsetsTest { boolean[] visible = new boolean[SIZE]; WindowInsets.assignCompatInsets(maxInsets, new Rect(0, 10, 0, 0)); WindowInsets.assignCompatInsets(insets, new Rect(0, 0, 0, 0)); - WindowInsets windowInsets = new WindowInsets(insets, maxInsets, visible, false, false, null, - null, null, DisplayShape.NONE, systemBars(), + WindowInsets windowInsets = new WindowInsets(insets, maxInsets, visible, false, false, + 0, null, null, null, DisplayShape.NONE, systemBars(), true /* compatIgnoreVisibility */); assertEquals(Insets.of(0, 10, 0, 0), windowInsets.getSystemWindowInsets()); } diff --git a/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java b/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java index 4d4ec3523d390..a1a4265cd0a58 100644 --- a/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java +++ b/core/tests/coretests/src/com/android/internal/widget/ActionBarOverlayLayoutTest.java @@ -169,7 +169,7 @@ public class ActionBarOverlayLayoutTest { private WindowInsets insetsWith(Insets content, DisplayCutout cutout) { return new WindowInsets(WindowInsets.createCompatTypeMap(content.toRect()), null, null, - false, false, cutout, null, null, null, WindowInsets.Type.systemBars(), false); + false, false, 0, cutout, null, null, null, WindowInsets.Type.systemBars(), false); } private ViewGroup createViewGroupWithId(int id) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index e8ef612ae2cf2..c2d73f39b7e80 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -25,6 +25,7 @@ import static android.app.StatusBarManager.WindowType; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; import static android.app.WindowConfiguration.ROTATION_UNDEFINED; +import static android.view.InsetsSource.FLAG_SUPPRESS_SCRIM; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; @@ -1717,12 +1718,15 @@ public class NavigationBar extends ViewController implements if (insetsHeight != -1 && !mEdgeBackGestureHandler.isButtonForcedVisible()) { navBarProvider.setInsetsSize(Insets.of(0, 0, 0, insetsHeight)); } + final boolean needsScrim = userContext.getResources().getBoolean( + com.android.internal.R.bool.config_navBarNeedsScrim); + navBarProvider.setFlags(needsScrim ? 0 : FLAG_SUPPRESS_SCRIM, FLAG_SUPPRESS_SCRIM); final InsetsFrameProvider tappableElementProvider = new InsetsFrameProvider( mInsetsSourceOwner, 0, WindowInsets.Type.tappableElement()); - final boolean navBarTapThrough = userContext.getResources().getBoolean( + final boolean tapThrough = userContext.getResources().getBoolean( com.android.internal.R.bool.config_navBarTapThrough); - if (navBarTapThrough) { + if (tapThrough) { tappableElementProvider.setInsetsSize(Insets.NONE); } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 6ed20257f829e..339b6ec300497 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -128,7 +128,7 @@ import com.android.internal.protolog.common.ProtoLog; import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.util.ScreenshotHelper; import com.android.internal.util.ScreenshotRequest; -import com.android.internal.util.function.TriConsumer; +import com.android.internal.util.function.TriFunction; import com.android.internal.view.AppearanceRegion; import com.android.internal.widget.PointerLocationView; import com.android.server.LocalServices; @@ -1081,11 +1081,11 @@ public class DisplayPolicy { // The index of the provider and corresponding insets types cannot change at // runtime as ensured in WMS. Make use of the index in the provider directly // to access the latest provided size at runtime. - final TriConsumer frameProvider = + final TriFunction frameProvider = getFrameProvider(win, i, INSETS_OVERRIDE_INDEX_INVALID); final InsetsFrameProvider.InsetsSizeOverride[] overrides = provider.getInsetsSizeOverrides(); - final SparseArray> + final SparseArray> overrideProviders; if (overrides != null) { overrideProviders = new SparseArray<>(); @@ -1106,7 +1106,7 @@ public class DisplayPolicy { } } - private static TriConsumer getFrameProvider( + private static TriFunction getFrameProvider( WindowState win, int index, int overrideIndex) { return (displayFrames, windowContainer, inOutFrame) -> { final LayoutParams lp = win.mAttrs.forRotation(displayFrames.mRotation); @@ -1152,6 +1152,7 @@ public class DisplayPolicy { inOutFrame.set(sTmpRect2); } } + return ifp.getFlags(); }; } @@ -1179,7 +1180,7 @@ public class DisplayPolicy { } } - TriConsumer getImeSourceFrameProvider() { + TriFunction getImeSourceFrameProvider() { return (displayFrames, windowContainer, inOutFrame) -> { WindowState windowState = windowContainer.asWindowState(); if (windowState == null) { @@ -1198,6 +1199,7 @@ public class DisplayPolicy { } else { inOutFrame.inset(windowState.mGivenContentInsets); } + return 0; }; } diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 3e03b9983a5db..b7eaf259ea7ab 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -47,7 +47,7 @@ import android.view.WindowInsets; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; -import com.android.internal.util.function.TriConsumer; +import com.android.internal.util.function.TriFunction; import com.android.server.wm.SurfaceAnimator.AnimationType; import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; @@ -73,8 +73,9 @@ class InsetsSourceProvider { private @Nullable InsetsControlTarget mFakeControlTarget; private @Nullable ControlAdapter mAdapter; - private TriConsumer mFrameProvider; - private SparseArray> mOverrideFrameProviders; + private TriFunction mFrameProvider; + private SparseArray> + mOverrideFrameProviders; private final SparseArray mOverrideFrames = new SparseArray(); private boolean mIsLeashReadyForDispatching; private final Rect mSourceFrame = new Rect(); @@ -149,8 +150,8 @@ class InsetsSourceProvider { * resulting frame that should be reported to given window type. */ void setWindowContainer(@Nullable WindowContainer windowContainer, - @Nullable TriConsumer frameProvider, - @Nullable SparseArray> + @Nullable TriFunction frameProvider, + @Nullable SparseArray> overrideFrameProviders) { if (mWindowContainer != null) { if (mControllable) { @@ -203,7 +204,7 @@ class InsetsSourceProvider { if (mServerVisible) { mTmpRect.set(mWindowContainer.getBounds()); if (mFrameProvider != null) { - mFrameProvider.accept(mWindowContainer.getDisplayContent().mDisplayFrames, + mFrameProvider.apply(mWindowContainer.getDisplayContent().mDisplayFrames, mWindowContainer, mTmpRect); } } else { @@ -216,8 +217,11 @@ class InsetsSourceProvider { mSourceFrame.set(frame); if (mFrameProvider != null) { - mFrameProvider.accept(mWindowContainer.getDisplayContent().mDisplayFrames, - mWindowContainer, mSourceFrame); + final int flags = mFrameProvider.apply( + mWindowContainer.getDisplayContent().mDisplayFrames, + mWindowContainer, + mSourceFrame); + mSource.setFlags(flags); } updateSourceFrameForServerVisibility(); @@ -233,10 +237,10 @@ class InsetsSourceProvider { } else { overrideFrame = new Rect(frame); } - final TriConsumer provider = + final TriFunction provider = mOverrideFrameProviders.get(windowType); if (provider != null) { - mOverrideFrameProviders.get(windowType).accept( + mOverrideFrameProviders.get(windowType).apply( mWindowContainer.getDisplayContent().mDisplayFrames, mWindowContainer, overrideFrame); } @@ -274,7 +278,7 @@ class InsetsSourceProvider { source.setVisible(mSource.isVisible()); mTmpRect.set(frame); if (mFrameProvider != null) { - mFrameProvider.accept(displayFrames, mWindowContainer, mTmpRect); + mFrameProvider.apply(displayFrames, mWindowContainer, mTmpRect); } source.setFrame(mTmpRect); return source; diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java index 5e513f1a0d010..3934b023b9fdd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -94,6 +94,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { mProvider.setWindowContainer(statusBar, (displayFrames, windowState, rect) -> { rect.set(10, 10, 20, 20); + return 0; }, null); mProvider.updateSourceFrame(statusBar.getFrame()); mProvider.onPostLayout(); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index ff2944a809761..d1d83f62934d7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -52,7 +52,7 @@ import android.view.InsetsState; import androidx.test.filters.SmallTest; -import com.android.internal.util.function.TriConsumer; +import com.android.internal.util.function.TriFunction; import org.junit.Test; import org.junit.runner.RunWith; @@ -289,10 +289,12 @@ public class InsetsStateControllerTest extends WindowTestsBase { InsetsSourceProvider statusBarProvider = getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()); - final SparseArray> imeOverrideProviders = - new SparseArray<>(); - imeOverrideProviders.put(TYPE_INPUT_METHOD, ((displayFrames, windowState, rect) -> - rect.set(0, 1, 2, 3))); + final SparseArray> + imeOverrideProviders = new SparseArray<>(); + imeOverrideProviders.put(TYPE_INPUT_METHOD, ((displayFrames, windowState, rect) -> { + rect.set(0, 1, 2, 3); + return 0; + })); statusBarProvider.setWindowContainer(statusBar, null, imeOverrideProviders); getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(ime, null, null);