diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index d0ecae9e34e4b..c798d85f0feae 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -602,4 +602,22 @@ public class InsetsController implements WindowInsetsController { mAnimCallbackScheduled = true; } } + + @Override + public void setSystemBarsAppearance(@Appearance int appearance) { + if (mViewRoot.mWindowAttributes.insetsFlags.appearance != appearance) { + mViewRoot.mWindowAttributes.insetsFlags.appearance = appearance; + mViewRoot.mWindowAttributesChanged = true; + mViewRoot.scheduleTraversals(); + } + } + + @Override + public void setSystemBarsBehavior(@Behavior int behavior) { + if (mViewRoot.mWindowAttributes.insetsFlags.behavior != behavior) { + mViewRoot.mWindowAttributes.insetsFlags.behavior = behavior; + mViewRoot.mWindowAttributesChanged = true; + mViewRoot.scheduleTraversals(); + } + } } diff --git a/core/java/android/view/InsetsFlags.java b/core/java/android/view/InsetsFlags.java new file mode 100644 index 0000000000000..276e80a772f33 --- /dev/null +++ b/core/java/android/view/InsetsFlags.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import static android.view.WindowInsetsController.APPEARANCE_LIGHT_SIDE_BARS; +import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR; +import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; +import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_BARS; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; + +import android.view.WindowInsetsController.Appearance; +import android.view.WindowInsetsController.Behavior; + +/** + * Contains the information about {@link Appearance} and {@link Behavior} of system windows which + * can produce insets. This is for carrying the request from a client to the system server. + * @hide + */ +public class InsetsFlags { + + @ViewDebug.ExportedProperty(flagMapping = { + @ViewDebug.FlagToString( + mask = APPEARANCE_OPAQUE_BARS, + equals = APPEARANCE_OPAQUE_BARS, + name = "OPAQUE_BARS"), + @ViewDebug.FlagToString( + mask = APPEARANCE_LOW_PROFILE_BARS, + equals = APPEARANCE_LOW_PROFILE_BARS, + name = "LOW_PROFILE_BARS"), + @ViewDebug.FlagToString( + mask = APPEARANCE_LIGHT_TOP_BAR, + equals = APPEARANCE_LIGHT_TOP_BAR, + name = "LIGHT_TOP_BAR"), + @ViewDebug.FlagToString( + mask = APPEARANCE_LIGHT_SIDE_BARS, + equals = APPEARANCE_LIGHT_SIDE_BARS, + name = "LIGHT_SIDE_BARS") + }) + public @Appearance int appearance; + + @ViewDebug.ExportedProperty(flagMapping = { + @ViewDebug.FlagToString( + mask = BEHAVIOR_SHOW_BARS_BY_SWIPE, + equals = BEHAVIOR_SHOW_BARS_BY_SWIPE, + name = "SHOW_BARS_BY_SWIPE"), + @ViewDebug.FlagToString( + mask = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, + equals = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, + name = "SHOW_TRANSIENT_BARS_BY_SWIPE") + }) + public @Behavior int behavior; +} diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java index b70832315e2c2..396422ef5c57b 100644 --- a/core/java/android/view/WindowInsetsController.java +++ b/core/java/android/view/WindowInsetsController.java @@ -18,9 +18,14 @@ package android.view; import static android.view.WindowInsets.Type.ime; +import android.annotation.IntDef; import android.annotation.NonNull; +import android.graphics.Insets; import android.view.WindowInsets.Type.InsetType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Interface to control windows that generate insets. * @@ -29,6 +34,73 @@ import android.view.WindowInsets.Type.InsetType; */ public interface WindowInsetsController { + /** + * Makes system bars become opaque with solid dark background and light foreground. + * @hide + */ + int APPEARANCE_OPAQUE_BARS = 1; + + /** + * Makes items on system bars become less noticeable without changing the layout of the bars. + * @hide + */ + int APPEARANCE_LOW_PROFILE_BARS = 1 << 1; + + /** + * Changes the foreground color for the light top bar so that the items on the bar can be read + * clearly. + */ + int APPEARANCE_LIGHT_TOP_BAR = 1 << 2; + + /** + * Changes the foreground color for the light side bars so that the items on the bar can be read + * clearly. + */ + int APPEARANCE_LIGHT_SIDE_BARS = 1 << 3; + + /** Determines the appearance of system bars. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = true, value = {APPEARANCE_OPAQUE_BARS, APPEARANCE_LOW_PROFILE_BARS, + APPEARANCE_LIGHT_TOP_BAR, APPEARANCE_LIGHT_SIDE_BARS}) + @interface Appearance { + } + + /** + * The default option for {@link #setSystemBarsBehavior(int)}. The side bars will be forcibly + * shown by the system on any user interaction on the corresponding display if the side bars are + * hidden by {@link #hide(int)} or {@link WindowInsetsAnimationController#changeInsets(Insets)}. + */ + int BEHAVIOR_SHOW_SIDE_BARS_BY_TOUCH = 0; + + /** + * Option for {@link #setSystemBarsBehavior(int)}: Window would like to remain interactive when + * hiding the side bars by calling {@link #hide(int)} or + * {@link WindowInsetsAnimationController#changeInsets(Insets)}. + * + *
When system bars are hidden in this mode, they can be revealed with system gestures, such + * as swiping from the edge of the screen where the bar is hidden from.
+ */ + int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; + + /** + * Option for {@link #setSystemBarsBehavior(int)}: Window would like to remain interactive when + * hiding the side bars by calling {@link #hide(int)} or + * {@link WindowInsetsAnimationController#changeInsets(Insets)}. + * + *When system bars are hidden in this mode, they can be revealed temporarily with system + * gestures, such as swiping from the edge of the screen where the bar is hidden from. These + * transient system bars will overlay app’s content, may have some degree of transparency, and + * will automatically hide after a short timeout.
+ */ + int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; + + /** Determines the behavior of system bars when hiding them by calling {@link #hide}. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(value = {BEHAVIOR_SHOW_SIDE_BARS_BY_TOUCH, BEHAVIOR_SHOW_BARS_BY_SWIPE, + BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE}) + @interface Behavior { + } + /** * Makes a set of windows that cause insets appear on screen. *
@@ -108,4 +180,20 @@ public interface WindowInsetsController {
default void hideInputMethod() {
hide(ime());
}
+
+ /**
+ * Controls the appearance of system bars.
+ *
+ * @param appearance Bitmask of {@link Appearance} flags.
+ * @see Appearance
+ */
+ void setSystemBarsAppearance(@Appearance int appearance);
+
+ /**
+ * Controls the behavior of system bars.
+ *
+ * @param behavior Determines how the bars behave when being hidden by the application.
+ * @see Behavior
+ */
+ void setSystemBarsBehavior(@Behavior int behavior);
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 2e5a7501f898b..9cd356f6d6532 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -18,6 +18,8 @@ package android.view;
import static android.content.pm.ActivityInfo.COLOR_MODE_DEFAULT;
import static android.view.WindowLayoutParamsProto.ALPHA;
+import static android.view.WindowLayoutParamsProto.APPEARANCE;
+import static android.view.WindowLayoutParamsProto.BEHAVIOR;
import static android.view.WindowLayoutParamsProto.BUTTON_BRIGHTNESS;
import static android.view.WindowLayoutParamsProto.COLOR_MODE;
import static android.view.WindowLayoutParamsProto.FLAGS;
@@ -2612,6 +2614,14 @@ public interface WindowManager extends ViewManager {
@ActivityInfo.ColorMode
private int mColorMode = COLOR_MODE_DEFAULT;
+ /**
+ * Carries the requests about {@link WindowInsetsController.Appearance} and
+ * {@link WindowInsetsController.Behavior} to the system windows which can produce insets.
+ *
+ * @hide
+ */
+ public final InsetsFlags insetsFlags = new InsetsFlags();
+
public LayoutParams() {
super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
type = TYPE_APPLICATION;
@@ -2774,6 +2784,8 @@ public interface WindowManager extends ViewManager {
TextUtils.writeToParcel(accessibilityTitle, out, parcelableFlags);
out.writeInt(mColorMode);
out.writeLong(hideTimeoutMilliseconds);
+ out.writeInt(insetsFlags.appearance);
+ out.writeInt(insetsFlags.behavior);
}
public static final @android.annotation.NonNull Parcelable.Creator