| /* | |
| * Copyright (C) 2018 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 android.annotation.FlaggedApi; | |
| import android.annotation.IntDef; | |
| import android.annotation.NonNull; | |
| import android.annotation.Nullable; | |
| import android.graphics.Insets; | |
| import android.inputmethodservice.InputMethodService; | |
| import android.os.Build; | |
| import android.os.CancellationSignal; | |
| import android.view.WindowInsets.Type; | |
| import android.view.WindowInsets.Type.InsetsType; | |
| import android.view.animation.Interpolator; | |
| import android.view.flags.Flags; | |
| import java.lang.annotation.Retention; | |
| import java.lang.annotation.RetentionPolicy; | |
| /** | |
| * Interface to control windows that generate insets. | |
| */ | |
| public interface WindowInsetsController { | |
| /** | |
| * Makes status bars become opaque with solid dark background and light foreground. | |
| * @hide | |
| */ | |
| int APPEARANCE_OPAQUE_STATUS_BARS = 1; | |
| /** | |
| * Makes navigation bars become opaque with solid dark background and light foreground. | |
| * @hide | |
| */ | |
| int APPEARANCE_OPAQUE_NAVIGATION_BARS = 1 << 1; | |
| /** | |
| * Makes items on system bars become less noticeable without changing the layout of the bars. | |
| * @hide | |
| */ | |
| int APPEARANCE_LOW_PROFILE_BARS = 1 << 2; | |
| /** | |
| * Changes the foreground color for light status bars so that the items on the bar can be read | |
| * clearly. | |
| */ | |
| int APPEARANCE_LIGHT_STATUS_BARS = 1 << 3; | |
| /** | |
| * Changes the foreground color for light navigation bars so that the items on the bar can be | |
| * read clearly. | |
| */ | |
| int APPEARANCE_LIGHT_NAVIGATION_BARS = 1 << 4; | |
| /** | |
| * Makes status bars semi-transparent with dark background and light foreground. | |
| * @hide | |
| */ | |
| int APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS = 1 << 5; | |
| /** | |
| * Makes navigation bars semi-transparent with dark background and light foreground. | |
| * @hide | |
| */ | |
| int APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS = 1 << 6; | |
| /** | |
| * Makes the caption bar transparent. | |
| */ | |
| @FlaggedApi(Flags.FLAG_CUSTOMIZABLE_WINDOW_HEADERS) | |
| int APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND = 1 << 7; | |
| /** | |
| * When {@link WindowInsetsController#APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND} is set, | |
| * changes the foreground color of the caption bars so that the items on the bar can be read | |
| * clearly on light backgrounds. | |
| */ | |
| @FlaggedApi(Flags.FLAG_CUSTOMIZABLE_WINDOW_HEADERS) | |
| int APPEARANCE_LIGHT_CAPTION_BARS = 1 << 8; | |
| /** | |
| * Same as {@link #APPEARANCE_LIGHT_NAVIGATION_BARS} but set by the system. The system will | |
| * respect {@link #APPEARANCE_LIGHT_NAVIGATION_BARS} when this is cleared. | |
| * @hide | |
| */ | |
| int APPEARANCE_FORCE_LIGHT_NAVIGATION_BARS = 1 << 9; | |
| /** | |
| * Determines the appearance of system bars. | |
| * @hide | |
| */ | |
| @Retention(RetentionPolicy.SOURCE) | |
| @IntDef(flag = true, value = { | |
| APPEARANCE_OPAQUE_STATUS_BARS, | |
| APPEARANCE_OPAQUE_NAVIGATION_BARS, | |
| APPEARANCE_LOW_PROFILE_BARS, | |
| APPEARANCE_LIGHT_STATUS_BARS, | |
| APPEARANCE_LIGHT_NAVIGATION_BARS, | |
| APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS, | |
| APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS, | |
| APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND, | |
| APPEARANCE_LIGHT_CAPTION_BARS, | |
| APPEARANCE_FORCE_LIGHT_NAVIGATION_BARS}) | |
| @interface Appearance { | |
| } | |
| /** | |
| * Option for {@link #setSystemBarsBehavior(int)}. System bars will be forcibly shown on any | |
| * user interaction on the corresponding display if navigation bars are hidden by | |
| * {@link #hide(int)} or | |
| * {@link WindowInsetsAnimationController#setInsetsAndAlpha(Insets, float, float)}. | |
| * @deprecated This is not supported on Android {@link Build.VERSION_CODES#S} and later. Use | |
| * {@link #BEHAVIOR_DEFAULT} or {@link #BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE} | |
| * instead. | |
| */ | |
| @Deprecated | |
| int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; | |
| /** | |
| * The default option for {@link #setSystemBarsBehavior(int)}: Window would like to remain | |
| * interactive when hiding navigation bars by calling {@link #hide(int)} or | |
| * {@link WindowInsetsAnimationController#setInsetsAndAlpha(Insets, float, float)}. | |
| * | |
| * <p>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.</p> | |
| * | |
| * <p>When the gesture navigation is enabled, the system gestures can be triggered regardless | |
| * the visibility of system bars.</p> | |
| */ | |
| int BEHAVIOR_DEFAULT = 1; | |
| /** | |
| * Option for {@link #setSystemBarsBehavior(int)}: Window would like to remain interactive when | |
| * hiding navigation bars by calling {@link #hide(int)} or | |
| * {@link WindowInsetsAnimationController#setInsetsAndAlpha(Insets, float, float)}. | |
| * | |
| * <p>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.</p> | |
| * @deprecated Use {@link #BEHAVIOR_DEFAULT} instead. | |
| */ | |
| @Deprecated | |
| int BEHAVIOR_SHOW_BARS_BY_SWIPE = BEHAVIOR_DEFAULT; | |
| /** | |
| * Option for {@link #setSystemBarsBehavior(int)}: Window would like to remain interactive when | |
| * hiding navigation bars by calling {@link #hide(int)} or | |
| * {@link WindowInsetsAnimationController#setInsetsAndAlpha(Insets, float, float)}. | |
| * | |
| * <p>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.</p> | |
| */ | |
| int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; | |
| /** | |
| * Determines the behavior of system bars when hiding them by calling {@link #hide}. | |
| * @hide | |
| */ | |
| @Retention(RetentionPolicy.SOURCE) | |
| @IntDef(value = {BEHAVIOR_DEFAULT, BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE}) | |
| @interface Behavior { | |
| } | |
| /** | |
| * Makes a set of windows that cause insets appear on screen. | |
| * <p> | |
| * Note that if the window currently doesn't have control over a certain type, it will apply the | |
| * change as soon as the window gains control. The app can listen to the event by observing | |
| * {@link View#onApplyWindowInsets} and checking visibility with {@link WindowInsets#isVisible}. | |
| * | |
| * @param types A bitmask of {@link WindowInsets.Type} specifying what windows the app | |
| * would like to make appear on screen. | |
| */ | |
| void show(@InsetsType int types); | |
| /** | |
| * Makes a set of windows causing insets disappear. | |
| * <p> | |
| * Note that if the window currently doesn't have control over a certain type, it will apply the | |
| * change as soon as the window gains control. The app can listen to the event by observing | |
| * {@link View#onApplyWindowInsets} and checking visibility with {@link WindowInsets#isVisible}. | |
| * | |
| * @param types A bitmask of {@link WindowInsets.Type} specifying what windows the app | |
| * would like to make disappear. | |
| */ | |
| void hide(@InsetsType int types); | |
| /** | |
| * Lets the application control window inset animations in a frame-by-frame manner by modifying | |
| * the position of the windows in the system causing insets directly. | |
| * | |
| * @param types The {@link WindowInsets.Type}s the application has requested to control. | |
| * @param durationMillis Duration of animation in | |
| * {@link java.util.concurrent.TimeUnit#MILLISECONDS}, or -1 if the | |
| * animation doesn't have a predetermined duration. This value will be | |
| * passed to {@link WindowInsetsAnimation#getDurationMillis()} | |
| * @param interpolator The interpolator used for this animation, or {@code null} if this | |
| * animation doesn't follow an interpolation curve. This value will be | |
| * passed to {@link WindowInsetsAnimation#getInterpolator()} and used to | |
| * calculate {@link WindowInsetsAnimation#getInterpolatedFraction()}. | |
| * @param listener The {@link WindowInsetsAnimationControlListener} that gets called when the | |
| * windows are ready to be controlled, among other callbacks. | |
| * @param cancellationSignal A cancellation signal that the caller can use to cancel the | |
| * request to obtain control, or once they have control, to cancel the | |
| * control. | |
| * @see WindowInsetsAnimation#getFraction() | |
| * @see WindowInsetsAnimation#getInterpolatedFraction() | |
| * @see WindowInsetsAnimation#getInterpolator() | |
| * @see WindowInsetsAnimation#getDurationMillis() | |
| */ | |
| void controlWindowInsetsAnimation(@InsetsType int types, long durationMillis, | |
| @Nullable Interpolator interpolator, | |
| @Nullable CancellationSignal cancellationSignal, | |
| @NonNull WindowInsetsAnimationControlListener listener); | |
| /** | |
| * Lets the application add non-controllable listener object that can be called back | |
| * when animation is invoked by the system by host calling methods such as {@link #show} or | |
| * {@link #hide}. | |
| * | |
| * The listener is supposed to be used for logging only, using the control or | |
| * relying on the timing of the callback in any other way is not supported. | |
| * | |
| * @param listener The {@link WindowInsetsAnimationControlListener} that gets called when | |
| * the animation is driven by the system and not the host | |
| * @hide | |
| */ | |
| void setSystemDrivenInsetsAnimationLoggingListener( | |
| @Nullable WindowInsetsAnimationControlListener listener); | |
| /** | |
| * Controls the appearance of system bars. | |
| * <p> | |
| * For example, the following statement adds {@link #APPEARANCE_LIGHT_STATUS_BARS}: | |
| * <pre> | |
| * setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS) | |
| * </pre> | |
| * And the following statement clears it: | |
| * <pre> | |
| * setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS) | |
| * </pre> | |
| * | |
| * @param appearance Bitmask of appearance flags. | |
| * @param mask Specifies which flags of appearance should be changed. | |
| * @see #getSystemBarsAppearance | |
| */ | |
| void setSystemBarsAppearance(@Appearance int appearance, @Appearance int mask); | |
| /** | |
| * Similar to {@link #setSystemBarsAppearance} but the given flag will only take effect when it | |
| * is not controlled by {@link #setSystemBarsAppearance}. | |
| * | |
| * @see WindowInsetsController#getSystemBarsAppearance() | |
| * @see android.R.attr#windowLightStatusBar | |
| * @see android.R.attr#windowLightNavigationBar | |
| * @hide | |
| */ | |
| void setSystemBarsAppearanceFromResource(@Appearance int appearance, @Appearance int mask); | |
| /** | |
| * Retrieves the requested appearance of system bars. | |
| * | |
| * @return The requested bitmask of system bar appearance controlled by this window. | |
| * @see #setSystemBarsAppearance(int, int) | |
| * @see android.R.attr#windowLightStatusBar | |
| * @see android.R.attr#windowLightNavigationBar | |
| */ | |
| @Appearance int getSystemBarsAppearance(); | |
| /** | |
| * Sets the insets height for the IME caption bar, which corresponds to the | |
| * "fake" IME navigation bar. | |
| * | |
| * @param height the insets height of the IME caption bar. | |
| * @hide | |
| */ | |
| default void setImeCaptionBarInsetsHeight(int height) { | |
| } | |
| /** | |
| * Controls the behavior of system bars. | |
| * | |
| * @param behavior Determines how the bars behave when being hidden by the application. | |
| * @see #getSystemBarsBehavior | |
| */ | |
| void setSystemBarsBehavior(@Behavior int behavior); | |
| /** | |
| * Retrieves the requested behavior of system bars. | |
| * | |
| * @return the system bar behavior controlled by this window. | |
| * @see #setSystemBarsBehavior(int) | |
| */ | |
| @Behavior int getSystemBarsBehavior(); | |
| /** | |
| * Disables or enables the animations. | |
| * | |
| * @hide | |
| */ | |
| void setAnimationsDisabled(boolean disable); | |
| /** | |
| * @hide | |
| */ | |
| InsetsState getState(); | |
| /** | |
| * @return Insets types that have been requested to be visible. | |
| * @hide | |
| */ | |
| @InsetsType int getRequestedVisibleTypes(); | |
| /** | |
| * Adds a {@link OnControllableInsetsChangedListener} to the window insets controller. | |
| * | |
| * @param listener The listener to add. | |
| * | |
| * @see OnControllableInsetsChangedListener | |
| * @see #removeOnControllableInsetsChangedListener(OnControllableInsetsChangedListener) | |
| */ | |
| void addOnControllableInsetsChangedListener( | |
| @NonNull OnControllableInsetsChangedListener listener); | |
| /** | |
| * Removes a {@link OnControllableInsetsChangedListener} from the window insets controller. | |
| * | |
| * @param listener The listener to remove. | |
| * | |
| * @see OnControllableInsetsChangedListener | |
| * @see #addOnControllableInsetsChangedListener(OnControllableInsetsChangedListener) | |
| */ | |
| void removeOnControllableInsetsChangedListener( | |
| @NonNull OnControllableInsetsChangedListener listener); | |
| /** | |
| * Listener to be notified when the set of controllable {@link WindowInsets.Type} controlled by | |
| * a {@link WindowInsetsController} changes. | |
| * <p> | |
| * Once a {@link WindowInsets.Type} becomes controllable, the app will be able to control the | |
| * window that is causing this type of insets by calling {@link #controlWindowInsetsAnimation}. | |
| * <p> | |
| * Note: When listening to controllability of the {@link Type#ime}, | |
| * {@link #controlWindowInsetsAnimation} may still fail in case the {@link InputMethodService} | |
| * decides to cancel the show request. This could happen when there is a hardware keyboard | |
| * attached. | |
| * | |
| * @see #addOnControllableInsetsChangedListener(OnControllableInsetsChangedListener) | |
| * @see #removeOnControllableInsetsChangedListener(OnControllableInsetsChangedListener) | |
| */ | |
| interface OnControllableInsetsChangedListener { | |
| /** | |
| * Called when the set of controllable {@link WindowInsets.Type} changes. | |
| * | |
| * @param controller The controller for which the set of controllable | |
| * {@link WindowInsets.Type}s are changing. | |
| * @param typeMask Bitwise type-mask of the {@link WindowInsets.Type}s the controller is | |
| * currently able to control. | |
| */ | |
| void onControllableInsetsChanged(@NonNull WindowInsetsController controller, | |
| @InsetsType int typeMask); | |
| } | |
| } |