summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/IWindowManager.aidl5
-rw-r--r--core/java/android/view/InsetsAnimationControlImpl.java34
-rw-r--r--core/java/android/view/InsetsController.java4
-rw-r--r--core/java/android/view/InsetsFlags.java60
-rw-r--r--core/java/android/view/InsetsState.java30
-rw-r--r--core/java/android/view/WindowInsetsController.java20
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl37
-rw-r--r--core/java/com/android/internal/statusbar/RegisterStatusBarResult.java25
-rw-r--r--core/java/com/android/internal/view/AppearanceRegion.aidl19
-rw-r--r--core/java/com/android/internal/view/AppearanceRegion.java142
-rw-r--r--core/tests/coretests/src/android/view/InsetsFlagsTest.java71
-rw-r--r--core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java8
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java172
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java117
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java165
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java162
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java202
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java59
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java122
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java143
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java15
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java67
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java8
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java135
-rw-r--r--services/core/java/com/android/server/wm/InsetsControlTarget.java7
-rw-r--r--services/core/java/com/android/server/wm/InsetsPolicy.java167
-rw-r--r--services/core/java/com/android/server/wm/InsetsSourceProvider.java29
-rw-r--r--services/core/java/com/android/server/wm/InsetsStateController.java23
-rw-r--r--services/core/java/com/android/server/wm/Session.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java18
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java48
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java88
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java7
-rw-r--r--tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java1
43 files changed, 665 insertions, 1617 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 7f717a72b0f9..35cfe9e591cf 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -306,11 +306,6 @@ interface IWindowManager
oneway void statusBarVisibilityChanged(int displayId, int visibility);
/**
- * Called by System UI to notify Window Manager to hide transient bars.
- */
- oneway void hideTransientBars(int displayId);
-
- /**
* When set to {@code true} the system bars will always be shown. This is true even if an app
* requests to be fullscreen by setting the system ui visibility flags. The
* functionality was added for the automotive case as a way to guarantee required content stays
diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java
index 0fb1c33df2ab..e4deffadc966 100644
--- a/core/java/android/view/InsetsAnimationControlImpl.java
+++ b/core/java/android/view/InsetsAnimationControlImpl.java
@@ -146,11 +146,20 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
}
final Insets offset = Insets.subtract(mShownInsets, mPendingInsets);
ArrayList<SurfaceParams> params = new ArrayList<>();
- updateLeashesForSide(INSET_SIDE_LEFT, offset.left, mPendingInsets.left, params, state);
- updateLeashesForSide(INSET_SIDE_TOP, offset.top, mPendingInsets.top, params, state);
- updateLeashesForSide(INSET_SIDE_RIGHT, offset.right, mPendingInsets.right, params, state);
- updateLeashesForSide(INSET_SIDE_BOTTOM, offset.bottom, mPendingInsets.bottom, params,
- state);
+ if (offset.left != 0) {
+ updateLeashesForSide(INSET_SIDE_LEFT, offset.left, mPendingInsets.left, params, state);
+ }
+ if (offset.top != 0) {
+ updateLeashesForSide(INSET_SIDE_TOP, offset.top, mPendingInsets.top, params, state);
+ }
+ if (offset.right != 0) {
+ updateLeashesForSide(INSET_SIDE_RIGHT, offset.right, mPendingInsets.right, params,
+ state);
+ }
+ if (offset.bottom != 0) {
+ updateLeashesForSide(INSET_SIDE_BOTTOM, offset.bottom, mPendingInsets.bottom, params,
+ state);
+ }
SyncRtSurfaceTransactionApplier applier = mTransactionApplierSupplier.get();
applier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
mCurrentInsets = mPendingInsets;
@@ -215,9 +224,6 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
private void updateLeashesForSide(@InsetSide int side, int offset, int inset,
ArrayList<SurfaceParams> surfaceParams, InsetsState state) {
ArraySet<InsetsSourceConsumer> items = mSideSourceMap.get(side);
- if (items == null) {
- return;
- }
// TODO: Implement behavior when inset spans over multiple types
for (int i = items.size() - 1; i >= 0; i--) {
final InsetsSourceConsumer consumer = items.valueAt(i);
@@ -268,15 +274,9 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
SparseSetArray<InsetsSourceConsumer> sideSourcesMap,
SparseArray<InsetsSourceConsumer> consumers) {
for (int i = typeSideMap.size() - 1; i >= 0; i--) {
- final int type = typeSideMap.keyAt(i);
- final int side = typeSideMap.valueAt(i);
- final InsetsSourceConsumer consumer = consumers.get(type);
- if (consumer == null) {
- // If the types that we are controlling are less than the types that the system has,
- // there can be some null consumers.
- continue;
- }
- sideSourcesMap.add(side, consumer);
+ int type = typeSideMap.keyAt(i);
+ int side = typeSideMap.valueAt(i);
+ sideSourcesMap.add(side, consumers.get(type));
}
}
}
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index eca6dcb1daac..5bb4f63d62c8 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -67,9 +67,9 @@ public class InsetsController implements WindowInsetsController {
* Translation animation evaluator.
*/
private static TypeEvaluator<Insets> sEvaluator = (fraction, startValue, endValue) -> Insets.of(
- (int) (startValue.left + fraction * (endValue.left - startValue.left)),
+ 0,
(int) (startValue.top + fraction * (endValue.top - startValue.top)),
- (int) (startValue.right + fraction * (endValue.right - startValue.right)),
+ 0,
(int) (startValue.bottom + fraction * (endValue.bottom - startValue.bottom)));
/**
diff --git a/core/java/android/view/InsetsFlags.java b/core/java/android/view/InsetsFlags.java
index 6e459b22e657..276e80a772f3 100644
--- a/core/java/android/view/InsetsFlags.java
+++ b/core/java/android/view/InsetsFlags.java
@@ -16,18 +16,10 @@
package android.view;
-import static android.view.View.NAVIGATION_BAR_TRANSLUCENT;
-import static android.view.View.NAVIGATION_BAR_TRANSPARENT;
-import static android.view.View.STATUS_BAR_TRANSLUCENT;
-import static android.view.View.STATUS_BAR_TRANSPARENT;
-import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
-import static android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
-import static android.view.View.SYSTEM_UI_FLAG_LOW_PROFILE;
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_SIDE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_TOP_BAR;
+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;
@@ -43,13 +35,9 @@ public class InsetsFlags {
@ViewDebug.ExportedProperty(flagMapping = {
@ViewDebug.FlagToString(
- mask = APPEARANCE_OPAQUE_TOP_BAR,
- equals = APPEARANCE_OPAQUE_TOP_BAR,
- name = "OPAQUE_TOP_BAR"),
- @ViewDebug.FlagToString(
- mask = APPEARANCE_OPAQUE_SIDE_BARS,
- equals = APPEARANCE_OPAQUE_SIDE_BARS,
- name = "OPAQUE_SIDE_BARS"),
+ mask = APPEARANCE_OPAQUE_BARS,
+ equals = APPEARANCE_OPAQUE_BARS,
+ name = "OPAQUE_BARS"),
@ViewDebug.FlagToString(
mask = APPEARANCE_LOW_PROFILE_BARS,
equals = APPEARANCE_LOW_PROFILE_BARS,
@@ -76,44 +64,4 @@ public class InsetsFlags {
name = "SHOW_TRANSIENT_BARS_BY_SWIPE")
})
public @Behavior int behavior;
-
- /**
- * Converts system UI visibility to appearance.
- *
- * @param systemUiVisibility the system UI visibility to be converted.
- * @return the outcome {@link Appearance}
- */
- public static @Appearance int getAppearance(int systemUiVisibility) {
- int appearance = 0;
- appearance |= convertFlag(systemUiVisibility, SYSTEM_UI_FLAG_LOW_PROFILE,
- APPEARANCE_LOW_PROFILE_BARS);
- appearance |= convertFlag(systemUiVisibility, SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,
- APPEARANCE_LIGHT_TOP_BAR);
- appearance |= convertFlag(systemUiVisibility, SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR,
- APPEARANCE_LIGHT_SIDE_BARS);
- appearance |= convertNoFlag(systemUiVisibility,
- STATUS_BAR_TRANSLUCENT | STATUS_BAR_TRANSPARENT, APPEARANCE_OPAQUE_TOP_BAR);
- appearance |= convertNoFlag(systemUiVisibility,
- NAVIGATION_BAR_TRANSLUCENT | NAVIGATION_BAR_TRANSPARENT,
- APPEARANCE_OPAQUE_SIDE_BARS);
- return appearance;
- }
-
- /**
- * Converts the system UI visibility into an appearance flag if the given visibility contains
- * the given system UI flag.
- */
- private static @Appearance int convertFlag(int systemUiVisibility, int systemUiFlag,
- @Appearance int appearance) {
- return (systemUiVisibility & systemUiFlag) != 0 ? appearance : 0;
- }
-
- /**
- * Converts the system UI visibility into an appearance flag if the given visibility doesn't
- * contains the given system UI flag.
- */
- private static @Appearance int convertNoFlag(int systemUiVisibility, int systemUiFlag,
- @Appearance int appearance) {
- return (systemUiVisibility & systemUiFlag) == 0 ? appearance : 0;
- }
}
diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java
index 99502a6c1d72..a04c39b63c85 100644
--- a/core/java/android/view/InsetsState.java
+++ b/core/java/android/view/InsetsState.java
@@ -270,23 +270,10 @@ public class InsetsState implements Parcelable {
*
* @param type The {@link InternalInsetType} of the source to remove
*/
- public void removeSource(@InternalInsetType int type) {
+ public void removeSource(int type) {
mSources.remove(type);
}
- /**
- * A shortcut for setting the visibility of the source.
- *
- * @param type The {@link InternalInsetType} of the source to set the visibility
- * @param visible {@code true} for visible
- */
- public void setSourceVisible(@InternalInsetType int type, boolean visible) {
- InsetsSource source = mSources.get(type);
- if (source != null) {
- source.setVisible(visible);
- }
- }
-
public void set(InsetsState other) {
set(other, false /* copySources */);
}
@@ -370,19 +357,6 @@ public class InsetsState implements Parcelable {
}
}
- public static boolean containsType(@InternalInsetType int[] types,
- @InternalInsetType int type) {
- if (types == null) {
- return false;
- }
- for (int t : types) {
- if (t == type) {
- return true;
- }
- }
- return false;
- }
-
public void dump(String prefix, PrintWriter pw) {
pw.println(prefix + "InsetsState");
for (int i = mSources.size() - 1; i >= 0; i--) {
@@ -390,7 +364,7 @@ public class InsetsState implements Parcelable {
}
}
- public static String typeToString(@InternalInsetType int type) {
+ public static String typeToString(int type) {
switch (type) {
case TYPE_TOP_BAR:
return "TYPE_TOP_BAR";
diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java
index b41531988518..396422ef5c57 100644
--- a/core/java/android/view/WindowInsetsController.java
+++ b/core/java/android/view/WindowInsetsController.java
@@ -35,39 +35,33 @@ import java.lang.annotation.RetentionPolicy;
public interface WindowInsetsController {
/**
- * Makes the top bars become opaque with solid dark background and light foreground.
+ * Makes system bars become opaque with solid dark background and light foreground.
* @hide
*/
- int APPEARANCE_OPAQUE_TOP_BAR = 1;
-
- /**
- * Makes the side bars become opaque with solid dark background and light foreground.
- * @hide
- */
- int APPEARANCE_OPAQUE_SIDE_BARS = 1 << 1;
+ 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 << 2;
+ 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 << 3;
+ 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 << 4;
+ int APPEARANCE_LIGHT_SIDE_BARS = 1 << 3;
/** Determines the appearance of system bars. */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, value = {APPEARANCE_OPAQUE_TOP_BAR, APPEARANCE_OPAQUE_SIDE_BARS,
- APPEARANCE_LOW_PROFILE_BARS, APPEARANCE_LIGHT_TOP_BAR, APPEARANCE_LIGHT_SIDE_BARS})
+ @IntDef(flag = true, value = {APPEARANCE_OPAQUE_BARS, APPEARANCE_LOW_PROFILE_BARS,
+ APPEARANCE_LIGHT_TOP_BAR, APPEARANCE_LIGHT_SIDE_BARS})
@interface Appearance {
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index d9e2ba3e0975..c8ba52a63151 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -23,7 +23,6 @@ import android.os.Bundle;
import android.service.notification.StatusBarNotification;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.view.AppearanceRegion;
/** @hide */
oneway interface IStatusBar
@@ -57,7 +56,7 @@ oneway interface IStatusBar
int mask, in Rect fullscreenBounds, in Rect dockedBounds,
boolean navbarColorManagedByIme);
- void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive);
+ void topAppWindowChanged(int displayId, boolean menuVisible);
void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition,
boolean showImeSwitcher, boolean isMultiClientImeEnabled);
void setWindowState(int display, int window, int state);
@@ -173,38 +172,4 @@ oneway interface IStatusBar
* Notifies System UI whether the recents animation is running or not.
*/
void onRecentsAnimationStateChanged(boolean running);
-
- /**
- * Notifies System UI side of system bar appearance change on the specified display.
- *
- * @param displayId the ID of the display to notify
- * @param appearance the appearance of the focused window. The light top bar appearance is not
- * controlled here, but primaryAppearance and secondaryAppearance.
- * @param appearanceRegions a set of appearances which will be only applied in their own bounds.
- * This is for system bars which across multiple stack, e.g., status
- * bar, that the bar can have partial appearances in corresponding
- * stacks.
- * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME.
- */
- void onSystemBarAppearanceChanged(int displayId, int appearance,
- in AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme);
-
- /**
- * Notifies System UI to show transient bars. The transient bars are system bars, e.g., status
- * bar and navigation bar which are temporarily visible to the user.
- *
- * @param displayId the ID of the display to notify.
- * @param types the internal insets types of the bars are about to show transiently.
- */
- void showTransient(int displayId, in int[] types);
-
- /**
- * Notifies System UI to abort the transient state of system bars, which prevents the bars being
- * hidden automatically. This is usually called when the app wants to show the permanent system
- * bars again.
- *
- * @param displayId the ID of the display to notify.
- * @param types the internal insets types of the bars are about to abort the transient state.
- */
- void abortTransient(int displayId, in int[] types);
}
diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java
index 4c3f04b10892..6b0f8b2f5dc9 100644
--- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java
+++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java
@@ -29,6 +29,7 @@ public final class RegisterStatusBarResult implements Parcelable {
public final ArrayMap<String, StatusBarIcon> mIcons;
public final int mDisabledFlags1; // switch[0]
public final int mSystemUiVisibility; // switch[1]
+ public final boolean mMenuVisible; // switch[2]
public final int mImeWindowVis; // switch[3]
public final int mImeBackDisposition; // switch[4]
public final boolean mShowImeSwitcher; // switch[5]
@@ -39,18 +40,16 @@ public final class RegisterStatusBarResult implements Parcelable {
public final Rect mFullscreenStackBounds;
public final Rect mDockedStackBounds;
public final boolean mNavbarColorManagedByIme;
- public final boolean mAppFullscreen;
- public final boolean mAppImmersive;
public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1,
- int systemUiVisibility, int imeWindowVis, int imeBackDisposition,
+ int systemUiVisibility, boolean menuVisible, int imeWindowVis, int imeBackDisposition,
boolean showImeSwitcher, int disabledFlags2, int fullscreenStackSysUiVisibility,
int dockedStackSysUiVisibility, IBinder imeToken, Rect fullscreenStackBounds,
- Rect dockedStackBounds, boolean navbarColorManagedByIme, boolean appFullscreen,
- boolean appImmersive) {
+ Rect dockedStackBounds, boolean navbarColorManagedByIme) {
mIcons = new ArrayMap<>(icons);
mDisabledFlags1 = disabledFlags1;
mSystemUiVisibility = systemUiVisibility;
+ mMenuVisible = menuVisible;
mImeWindowVis = imeWindowVis;
mImeBackDisposition = imeBackDisposition;
mShowImeSwitcher = showImeSwitcher;
@@ -61,8 +60,6 @@ public final class RegisterStatusBarResult implements Parcelable {
mFullscreenStackBounds = fullscreenStackBounds;
mDockedStackBounds = dockedStackBounds;
mNavbarColorManagedByIme = navbarColorManagedByIme;
- mAppFullscreen = appFullscreen;
- mAppImmersive = appImmersive;
}
@Override
@@ -75,6 +72,7 @@ public final class RegisterStatusBarResult implements Parcelable {
dest.writeTypedArrayMap(mIcons, flags);
dest.writeInt(mDisabledFlags1);
dest.writeInt(mSystemUiVisibility);
+ dest.writeBoolean(mMenuVisible);
dest.writeInt(mImeWindowVis);
dest.writeInt(mImeBackDisposition);
dest.writeBoolean(mShowImeSwitcher);
@@ -85,8 +83,6 @@ public final class RegisterStatusBarResult implements Parcelable {
dest.writeTypedObject(mFullscreenStackBounds, flags);
dest.writeTypedObject(mDockedStackBounds, flags);
dest.writeBoolean(mNavbarColorManagedByIme);
- dest.writeBoolean(mAppFullscreen);
- dest.writeBoolean(mAppImmersive);
}
/**
@@ -100,6 +96,7 @@ public final class RegisterStatusBarResult implements Parcelable {
source.createTypedArrayMap(StatusBarIcon.CREATOR);
final int disabledFlags1 = source.readInt();
final int systemUiVisibility = source.readInt();
+ final boolean menuVisible = source.readBoolean();
final int imeWindowVis = source.readInt();
final int imeBackDisposition = source.readInt();
final boolean showImeSwitcher = source.readBoolean();
@@ -110,13 +107,11 @@ public final class RegisterStatusBarResult implements Parcelable {
final Rect fullscreenStackBounds = source.readTypedObject(Rect.CREATOR);
final Rect dockedStackBounds = source.readTypedObject(Rect.CREATOR);
final boolean navbarColorManagedByIme = source.readBoolean();
- final boolean appFullscreen = source.readBoolean();
- final boolean appImmersive = source.readBoolean();
return new RegisterStatusBarResult(icons, disabledFlags1, systemUiVisibility,
- imeWindowVis, imeBackDisposition, showImeSwitcher, disabledFlags2,
- fullscreenStackSysUiVisibility, dockedStackSysUiVisibility, imeToken,
- fullscreenStackBounds, dockedStackBounds, navbarColorManagedByIme,
- appFullscreen, appImmersive);
+ menuVisible, imeWindowVis, imeBackDisposition, showImeSwitcher,
+ disabledFlags2, fullscreenStackSysUiVisibility,
+ dockedStackSysUiVisibility, imeToken, fullscreenStackBounds,
+ dockedStackBounds, navbarColorManagedByIme);
}
@Override
diff --git a/core/java/com/android/internal/view/AppearanceRegion.aidl b/core/java/com/android/internal/view/AppearanceRegion.aidl
deleted file mode 100644
index 1638bf5bbfd6..000000000000
--- a/core/java/com/android/internal/view/AppearanceRegion.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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 com.android.internal.view;
-
-parcelable AppearanceRegion;
diff --git a/core/java/com/android/internal/view/AppearanceRegion.java b/core/java/com/android/internal/view/AppearanceRegion.java
deleted file mode 100644
index 1a0cb4b0dfbf..000000000000
--- a/core/java/com/android/internal/view/AppearanceRegion.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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 com.android.internal.view;
-
-import android.annotation.NonNull;
-import android.graphics.Rect;
-import android.os.Parcelable;
-import android.view.InsetsFlags;
-import android.view.ViewDebug;
-
-import com.android.internal.util.DataClass;
-
-/**
- * Specifies which region applies which appearance.
- */
-@DataClass
-public class AppearanceRegion implements Parcelable {
-
- private int mAppearance;
- private @NonNull Rect mBounds;
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- final AppearanceRegion sa = (AppearanceRegion) o;
- return mAppearance == sa.mAppearance && mBounds.equals(sa.mBounds);
- }
-
- @Override
- public String toString() {
- final String appearanceString =
- ViewDebug.flagsToString(InsetsFlags.class, "appearance", mAppearance);
- return "AppearanceRegion{" + appearanceString + " bounds=" + mBounds.toShortString() + "}";
- }
-
-
-
- // Code below generated by codegen v1.0.7.
- //
- // DO NOT MODIFY!
- // CHECKSTYLE:OFF Generated code
- //
- // To regenerate run:
- // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/com/android/internal/view/AppearanceRegion.java
-
-
- @DataClass.Generated.Member
- public AppearanceRegion(
- int appearance,
- @NonNull Rect bounds) {
- this.mAppearance = appearance;
- this.mBounds = bounds;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mBounds);
-
- // onConstructed(); // You can define this method to get a callback
- }
-
- @DataClass.Generated.Member
- public int getAppearance() {
- return mAppearance;
- }
-
- @DataClass.Generated.Member
- public @NonNull Rect getBounds() {
- return mBounds;
- }
-
- @Override
- @DataClass.Generated.Member
- public void writeToParcel(android.os.Parcel dest, int flags) {
- // You can override field parcelling by defining methods like:
- // void parcelFieldName(Parcel dest, int flags) { ... }
-
- dest.writeInt(mAppearance);
- dest.writeTypedObject(mBounds, flags);
- }
-
- @Override
- @DataClass.Generated.Member
- public int describeContents() { return 0; }
-
- /** @hide */
- @SuppressWarnings({"unchecked", "RedundantCast"})
- @DataClass.Generated.Member
- protected AppearanceRegion(android.os.Parcel in) {
- // You can override field unparcelling by defining methods like:
- // static FieldType unparcelFieldName(Parcel in) { ... }
-
- int appearance = in.readInt();
- Rect bounds = (Rect) in.readTypedObject(Rect.CREATOR);
-
- this.mAppearance = appearance;
- this.mBounds = bounds;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mBounds);
-
- // onConstructed(); // You can define this method to get a callback
- }
-
- @DataClass.Generated.Member
- public static final @NonNull Parcelable.Creator<AppearanceRegion> CREATOR
- = new Parcelable.Creator<AppearanceRegion>() {
- @Override
- public AppearanceRegion[] newArray(int size) {
- return new AppearanceRegion[size];
- }
-
- @Override
- public AppearanceRegion createFromParcel(android.os.Parcel in) {
- return new AppearanceRegion(in);
- }
- };
-
- @DataClass.Generated(
- time = 1570909617357L,
- codegenVersion = "1.0.7",
- sourceFile = "frameworks/base/core/java/com/android/internal/view/AppearanceRegion.java",
- inputSignatures = "private int mAppearance\nprivate @android.annotation.NonNull android.graphics.Rect mBounds\npublic @java.lang.Override boolean equals(java.lang.Object)\npublic @java.lang.Override java.lang.String toString()\nclass AppearanceRegion extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass")
- @Deprecated
- private void __metadata() {}
-
-}
diff --git a/core/tests/coretests/src/android/view/InsetsFlagsTest.java b/core/tests/coretests/src/android/view/InsetsFlagsTest.java
deleted file mode 100644
index 7d4445ba456a..000000000000
--- a/core/tests/coretests/src/android/view/InsetsFlagsTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.InsetsFlags.getAppearance;
-import static android.view.View.NAVIGATION_BAR_TRANSLUCENT;
-import static android.view.View.NAVIGATION_BAR_TRANSPARENT;
-import static android.view.View.STATUS_BAR_TRANSLUCENT;
-import static android.view.View.STATUS_BAR_TRANSPARENT;
-import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
-import static android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
-import static android.view.View.SYSTEM_UI_FLAG_LOW_PROFILE;
-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_SIDE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_TOP_BAR;
-
-import static org.junit.Assert.assertTrue;
-
-import android.platform.test.annotations.Presubmit;
-import android.view.WindowInsetsController.Appearance;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for {@link InsetsFlags}.
- *
- * <p>Build/Install/Run:
- * atest FrameworksCoreTests:InsetsFlagsTest
- *
- * <p>This test class is a part of Window Manager Service tests and specified in
- * {@link com.android.server.wm.test.filters.FrameworksTestsFilter}.
- */
-@Presubmit
-@RunWith(AndroidJUnit4.class)
-public class InsetsFlagsTest {
-
- @Test
- public void testGetAppearance() {
- assertContainsAppearance(APPEARANCE_LOW_PROFILE_BARS, SYSTEM_UI_FLAG_LOW_PROFILE);
- assertContainsAppearance(APPEARANCE_LIGHT_TOP_BAR, SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
- assertContainsAppearance(APPEARANCE_LIGHT_SIDE_BARS, SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
- assertContainsAppearance(APPEARANCE_OPAQUE_TOP_BAR,
- 0xffffffff & ~(STATUS_BAR_TRANSLUCENT | STATUS_BAR_TRANSPARENT));
- assertContainsAppearance(APPEARANCE_OPAQUE_SIDE_BARS,
- 0xffffffff & ~(NAVIGATION_BAR_TRANSLUCENT | NAVIGATION_BAR_TRANSPARENT));
- }
-
- void assertContainsAppearance(@Appearance int appearance, int systemUiVisibility) {
- assertTrue((getAppearance(systemUiVisibility) & appearance) == appearance);
- }
-}
diff --git a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java
index 0be5009f85f0..b93c3a7a17e2 100644
--- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java
+++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java
@@ -48,6 +48,7 @@ public class RegisterStatusBarResultTest {
final RegisterStatusBarResult original = new RegisterStatusBarResult(iconMap,
0x2 /* disabledFlags1 */,
0x4 /* systemUiVisibility */,
+ true /* menuVisible */,
0x8 /* imeWindowVis */,
0x10 /* imeBackDisposition */,
false /* showImeSwitcher */,
@@ -57,9 +58,7 @@ public class RegisterStatusBarResultTest {
new Binder() /* imeToken */,
new Rect(0x100, 0x200, 0x400, 0x800) /* fullscreenStackBounds */,
new Rect(0x1000, 0x2000, 0x4000, 0x8000) /* dockedStackBounds */,
- true /* navbarColorManagedByIme */,
- true /* appFullscreen */,
- true /* appImmersive */);
+ true /* navbarColorManagedByIme */);
final RegisterStatusBarResult copy = clone(original);
@@ -70,6 +69,7 @@ public class RegisterStatusBarResultTest {
assertThat(copy.mDisabledFlags1).isEqualTo(original.mDisabledFlags1);
assertThat(copy.mSystemUiVisibility).isEqualTo(original.mSystemUiVisibility);
+ assertThat(copy.mMenuVisible).isEqualTo(original.mMenuVisible);
assertThat(copy.mImeWindowVis).isEqualTo(original.mImeWindowVis);
assertThat(copy.mImeBackDisposition).isEqualTo(original.mImeBackDisposition);
assertThat(copy.mShowImeSwitcher).isEqualTo(original.mShowImeSwitcher);
@@ -82,8 +82,6 @@ public class RegisterStatusBarResultTest {
assertThat(copy.mFullscreenStackBounds).isEqualTo(original.mFullscreenStackBounds);
assertThat(copy.mDockedStackBounds).isEqualTo(original.mDockedStackBounds);
assertThat(copy.mNavbarColorManagedByIme).isEqualTo(original.mNavbarColorManagedByIme);
- assertThat(copy.mAppFullscreen).isEqualTo(original.mAppFullscreen);
- assertThat(copy.mAppImmersive).isEqualTo(original.mAppImmersive);
}
private RegisterStatusBarResult clone(RegisterStatusBarResult original) {
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java
index 208d3b62d7b2..fe547a0a16fa 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java
@@ -95,6 +95,11 @@ public interface StatusBarStateController {
default void onDozeAmountChanged(float linear, float eased) {}
/**
+ * Callback to be notified when the sysui visibility changes
+ */
+ default void onSystemUiVisibilityChanged(int visibility) {}
+
+ /**
* Callback to be notified when the pulsing state changes
*/
default void onPulsingChanged(boolean pulsing) {}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index c9dc08e78afb..d6a8f906197d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -22,8 +22,6 @@ import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEF
import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.TYPE_TOP_BAR;
import static com.android.systemui.statusbar.phone.StatusBar.ONLY_CORE_APPS;
@@ -45,17 +43,12 @@ import android.os.Looper;
import android.os.Message;
import android.util.Pair;
import android.util.SparseArray;
-import android.view.InsetsFlags;
-import android.view.InsetsState.InternalInsetType;
-import android.view.View;
-import android.view.WindowInsetsController.Appearance;
import androidx.annotation.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.view.AppearanceRegion;
import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.policy.CallbackController;
@@ -83,7 +76,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
private static final int MSG_EXPAND_NOTIFICATIONS = 3 << MSG_SHIFT;
private static final int MSG_COLLAPSE_PANELS = 4 << MSG_SHIFT;
private static final int MSG_EXPAND_SETTINGS = 5 << MSG_SHIFT;
- private static final int MSG_SYSTEM_BAR_APPEARANCE_CHANGED = 6 << MSG_SHIFT;
+ private static final int MSG_SET_SYSTEMUI_VISIBILITY = 6 << MSG_SHIFT;
private static final int MSG_DISPLAY_READY = 7 << MSG_SHIFT;
private static final int MSG_SHOW_IME_BUTTON = 8 << MSG_SHIFT;
private static final int MSG_TOGGLE_RECENT_APPS = 9 << MSG_SHIFT;
@@ -122,9 +115,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
private static final int MSG_SHOW_PINNING_TOAST_ENTER_EXIT = 45 << MSG_SHIFT;
private static final int MSG_SHOW_PINNING_TOAST_ESCAPE = 46 << MSG_SHIFT;
private static final int MSG_RECENTS_ANIMATION_STATE_CHANGED = 47 << MSG_SHIFT;
- private static final int MSG_SHOW_TRANSIENT = 48 << MSG_SHIFT;
- private static final int MSG_ABORT_TRANSIENT = 49 << MSG_SHIFT;
- private static final int MSG_TOP_APP_WINDOW_CHANGED = 50 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -170,6 +160,28 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
default void animateExpandSettingsPanel(String obj) { }
/**
+ * Called to notify visibility flag changes.
+ * @see IStatusBar#setSystemUiVisibility(int, int, int, int, int, Rect, Rect).
+ *
+ * @param displayId The id of the display to notify.
+ * @param vis The visibility flags except SYSTEM_UI_FLAG_LIGHT_STATUS_BAR which will
+ * be reported separately in fullscreenStackVis and dockedStackVis.
+ * @param fullscreenStackVis The flags which only apply in the region of the fullscreen
+ * stack, which is currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.
+ * @param dockedStackVis The flags that only apply in the region of the docked stack, which
+ * is currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.
+ * @param mask Which flags to change.
+ * @param fullscreenStackBounds The current bounds of the fullscreen stack, in screen
+ * coordinates.
+ * @param dockedStackBounds The current bounds of the docked stack, in screen coordinates.
+ * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME.
+ */
+ default void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+ int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+ boolean navbarColorManagedByIme) {
+ }
+
+ /**
* Called to notify IME window status changes.
*
* @param displayId The id of the display to notify.
@@ -280,28 +292,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
* @see IStatusBar#onRecentsAnimationStateChanged(boolean)
*/
default void onRecentsAnimationStateChanged(boolean running) { }
-
- /**
- * @see IStatusBar#onSystemBarAppearanceChanged(int, int, AppearanceRegion[], boolean).
- */
- default void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) { }
-
- /**
- * @see IStatusBar#showTransient(int, int[]).
- */
- default void showTransient(int displayId, @InternalInsetType int[] types) { }
-
- /**
- * @see IStatusBar#abortTransient(int, int[]).
- */
- default void abortTransient(int displayId, @InternalInsetType int[] types) { }
-
- /**
- * @see IStatusBar#topAppWindowChanged(int, boolean, boolean).
- */
- default void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
- }
}
@VisibleForTesting
@@ -466,53 +456,28 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
}
- // TODO(b/118118435): Remove this function after migration
@Override
public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
boolean navbarColorManagedByIme) {
synchronized (mLock) {
- final boolean hasDockedStack = !dockedStackBounds.isEmpty();
- final boolean transientStatus = (vis & View.STATUS_BAR_TRANSIENT) != 0;
- final boolean transientNavigation = (vis & View.NAVIGATION_BAR_TRANSIENT) != 0;
- if (transientStatus && transientNavigation) {
- showTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR});
- } else if (transientStatus) {
- showTransient(displayId, new int[]{TYPE_TOP_BAR});
- abortTransient(displayId, new int[]{TYPE_NAVIGATION_BAR});
- } else if (transientNavigation) {
- showTransient(displayId, new int[]{TYPE_NAVIGATION_BAR});
- abortTransient(displayId, new int[]{TYPE_TOP_BAR});
- } else {
- abortTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR});
- }
+ // Don't coalesce these, since it might have one time flags set such as
+ // STATUS_BAR_UNHIDE which might get lost.
SomeArgs args = SomeArgs.obtain();
args.argi1 = displayId;
- args.argi2 = InsetsFlags.getAppearance(vis);
- args.argi3 = navbarColorManagedByIme ? 1 : 0;
- final int fullscreenAppearance = InsetsFlags.getAppearance(fullscreenStackVis);
- final int dockedAppearance = InsetsFlags.getAppearance(dockedStackVis);
- args.arg1 = hasDockedStack
- ? new AppearanceRegion[]{
- new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds),
- new AppearanceRegion(dockedAppearance, dockedStackBounds)}
- : new AppearanceRegion[]{
- new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds)};
- mHandler.obtainMessage(MSG_SYSTEM_BAR_APPEARANCE_CHANGED, args).sendToTarget();
+ args.argi2 = vis;
+ args.argi3 = fullscreenStackVis;
+ args.argi4 = dockedStackVis;
+ args.argi5 = mask;
+ args.argi6 = navbarColorManagedByIme ? 1 : 0;
+ args.arg1 = fullscreenStackBounds;
+ args.arg2 = dockedStackBounds;
+ mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, args).sendToTarget();
}
}
@Override
- public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
- synchronized (mLock) {
- SomeArgs args = SomeArgs.obtain();
- args.argi1 = displayId;
- args.argi2 = isFullscreen ? 1 : 0;
- args.argi3 = isImmersive ? 1 : 0;
- mHandler.obtainMessage(MSG_TOP_APP_WINDOW_CHANGED, args).sendToTarget();
- }
-
- }
+ public void topAppWindowChanged(int displayId, boolean menuVisible) { }
@Override
public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
@@ -862,33 +827,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
}
- @Override
- public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
- synchronized (mLock) {
- SomeArgs args = SomeArgs.obtain();
- args.argi1 = displayId;
- args.argi2 = appearance;
- args.argi3 = navbarColorManagedByIme ? 1 : 0;
- args.arg1 = appearanceRegions;
- mHandler.obtainMessage(MSG_SYSTEM_BAR_APPEARANCE_CHANGED, args).sendToTarget();
- }
- }
-
- @Override
- public void showTransient(int displayId, int[] types) {
- synchronized (mLock) {
- mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, 0, types).sendToTarget();
- }
- }
-
- @Override
- public void abortTransient(int displayId, int[] types) {
- synchronized (mLock) {
- mHandler.obtainMessage(MSG_ABORT_TRANSIENT, displayId, 0, types).sendToTarget();
- }
- }
-
private final class H extends Handler {
private H(Looper l) {
super(l);
@@ -941,6 +879,15 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
mCallbacks.get(i).animateExpandSettingsPanel((String) msg.obj);
}
break;
+ case MSG_SET_SYSTEMUI_VISIBILITY:
+ args = (SomeArgs) msg.obj;
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).setSystemUiVisibility(args.argi1, args.argi2, args.argi3,
+ args.argi4, args.argi5, (Rect) args.arg1, (Rect) args.arg2,
+ args.argi6 == 1);
+ }
+ args.recycle();
+ break;
case MSG_SHOW_IME_BUTTON:
args = (SomeArgs) msg.obj;
handleShowImeButton(args.argi1 /* displayId */, (IBinder) args.arg1 /* token */,
@@ -1147,39 +1094,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
mCallbacks.get(i).onRecentsAnimationStateChanged(msg.arg1 > 0);
}
break;
- case MSG_SYSTEM_BAR_APPEARANCE_CHANGED:
- args = (SomeArgs) msg.obj;
- for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).onSystemBarAppearanceChanged(args.argi1, args.argi2,
- (AppearanceRegion[]) args.arg1, args.argi3 == 1);
- }
- args.recycle();
- break;
- case MSG_SHOW_TRANSIENT: {
- final int displayId = msg.arg1;
- final int[] types = (int[]) msg.obj;
- for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).showTransient(displayId, types);
- }
- break;
- }
- case MSG_ABORT_TRANSIENT: {
- final int displayId = msg.arg1;
- final int[] types = (int[]) msg.obj;
- for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).abortTransient(displayId, types);
- }
- break;
- }
- case MSG_TOP_APP_WINDOW_CHANGED: {
- args = (SomeArgs) msg.obj;
- for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).topAppWindowChanged(
- args.argi1, args.argi2 != 0, args.argi3 != 0);
- }
- args.recycle();
- break;
- }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
index 275475d6d72c..5144a95a0a51 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
@@ -156,7 +156,7 @@ public class NavigationBarController implements Callbacks {
Dependency.get(NotificationRemoteInputManager.class),
Dependency.get(IWindowManager.class));
navBar.setAutoHideController(autoHideController);
- navBar.restoreAppearanceAndTransientState();
+ navBar.restoreSystemUiVisibilityState();
mNavigationBars.append(displayId, navBar);
if (result != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 46a12330f6d6..8b9268e1888a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -320,6 +320,18 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll
}
@Override
+ public void setSystemUiVisibility(int visibility) {
+ if (mSystemUiVisibility != visibility) {
+ mSystemUiVisibility = visibility;
+ synchronized (mListeners) {
+ for (RankedListener rl : new ArrayList<>(mListeners)) {
+ rl.mListener.onSystemUiVisibilityChanged(mSystemUiVisibility);
+ }
+ }
+ }
+ }
+
+ @Override
public void setPulsing(boolean pulsing) {
if (mPulsing != pulsing) {
mPulsing = pulsing;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
index 50ab8a8abe16..2ad979ab64e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
@@ -111,6 +111,11 @@ public interface SysuiStatusBarStateController extends StatusBarStateController
boolean isKeyguardRequested();
/**
+ * Set systemui visibility
+ */
+ void setSystemUiVisibility(int visibility);
+
+ /**
* Set pulsing
*/
void setPulsing(boolean visibility);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
index 008464e543a0..175d072e4c8b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
@@ -17,39 +17,52 @@
package com.android.systemui.statusbar.phone;
import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import android.content.Context;
+import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
import android.view.IWindowManager;
import android.view.MotionEvent;
+import android.view.View;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import javax.inject.Inject;
import javax.inject.Named;
/** A controller to control all auto-hide things. */
-public class AutoHideController {
+public class AutoHideController implements CommandQueue.Callbacks {
private static final String TAG = "AutoHideController";
private final IWindowManager mWindowManagerService;
private final Handler mHandler;
private final NotificationRemoteInputManager mRemoteInputManager;
+ private final CommandQueue mCommandQueue;
private StatusBar mStatusBar;
private NavigationBarFragment mNavigationBar;
- private int mDisplayId;
+ @VisibleForTesting
+ int mDisplayId;
+ @VisibleForTesting
+ int mSystemUiVisibility;
+ // last value sent to window manager
+ private int mLastDispatchedSystemUiVisibility = ~View.SYSTEM_UI_FLAG_VISIBLE;
private boolean mAutoHideSuspended;
- private static final long AUTO_HIDE_TIMEOUT_MS = 2250;
+ private static final long AUTOHIDE_TIMEOUT_MS = 2250;
private final Runnable mAutoHide = () -> {
- if (isAnyTransientBarShown()) {
- hideTransientBars();
+ int requested = mSystemUiVisibility & ~getTransientMask();
+ if (mSystemUiVisibility != requested) {
+ notifySystemUiVisibilityChanged(requested);
}
};
@@ -57,6 +70,8 @@ public class AutoHideController {
public AutoHideController(Context context, @Named(MAIN_HANDLER_NAME) Handler handler,
NotificationRemoteInputManager notificationRemoteInputManager,
IWindowManager iWindowManager) {
+ mCommandQueue = SysUiServiceProvider.getComponent(context, CommandQueue.class);
+ mCommandQueue.addCallback(this);
mHandler = handler;
mRemoteInputManager = notificationRemoteInputManager;
mWindowManagerService = iWindowManager;
@@ -64,6 +79,13 @@ public class AutoHideController {
mDisplayId = context.getDisplayId();
}
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ if (displayId == mDisplayId) {
+ mCommandQueue.removeCallback(this);
+ }
+ }
+
void setStatusBar(StatusBar statusBar) {
mStatusBar = statusBar;
}
@@ -72,18 +94,50 @@ public class AutoHideController {
mNavigationBar = navigationBar;
}
- private void hideTransientBars() {
+ @Override
+ public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+ int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+ boolean navbarColorManagedByIme) {
+ if (displayId != mDisplayId) {
+ return;
+ }
+ int oldVal = mSystemUiVisibility;
+ int newVal = (oldVal & ~mask) | (vis & mask);
+ int diff = newVal ^ oldVal;
+
+ if (diff != 0) {
+ mSystemUiVisibility = newVal;
+
+ // ready to unhide
+ if (hasStatusBar() && (vis & View.STATUS_BAR_UNHIDE) != 0) {
+ mSystemUiVisibility &= ~View.STATUS_BAR_UNHIDE;
+ }
+
+ if (hasNavigationBar() && (vis & View.NAVIGATION_BAR_UNHIDE) != 0) {
+ mSystemUiVisibility &= ~View.NAVIGATION_BAR_UNHIDE;
+ }
+
+ // Re-send setSystemUiVisibility to update un-hide status.
+ if (mSystemUiVisibility != newVal) {
+ mCommandQueue.setSystemUiVisibility(mDisplayId, mSystemUiVisibility,
+ fullscreenStackVis, dockedStackVis, mask, fullscreenStackBounds,
+ dockedStackBounds, navbarColorManagedByIme);
+ }
+
+ notifySystemUiVisibilityChanged(mSystemUiVisibility);
+ }
+ }
+
+ @VisibleForTesting
+ void notifySystemUiVisibilityChanged(int vis) {
try {
- mWindowManagerService.hideTransientBars(mDisplayId);
+ if (mLastDispatchedSystemUiVisibility != vis) {
+ mWindowManagerService.statusBarVisibilityChanged(mDisplayId, vis);
+ mLastDispatchedSystemUiVisibility = vis;
+ }
} catch (RemoteException ex) {
Log.w(TAG, "Cannot get WindowManager");
}
- if (mStatusBar != null) {
- mStatusBar.clearTransient();
- }
- if (mNavigationBar != null) {
- mNavigationBar.clearTransient();
- }
}
void resumeSuspendedAutoHide() {
@@ -102,12 +156,13 @@ public class AutoHideController {
if (checkBarModesRunnable != null) {
mHandler.removeCallbacks(checkBarModesRunnable);
}
- mAutoHideSuspended = isAnyTransientBarShown();
+ mAutoHideSuspended = (mSystemUiVisibility & getTransientMask()) != 0;
}
void touchAutoHide() {
// update transient bar auto hide
- if (isAnyTransientBarShown()) {
+ if ((hasStatusBar() && mStatusBar.getStatusBarMode() == MODE_SEMI_TRANSPARENT)
+ || hasNavigationBar() && mNavigationBar.isSemiTransparent()) {
scheduleAutoHide();
} else {
cancelAutoHide();
@@ -115,9 +170,9 @@ public class AutoHideController {
}
private Runnable getCheckBarModesRunnable() {
- if (mStatusBar != null) {
+ if (hasStatusBar()) {
return () -> mStatusBar.checkBarModes();
- } else if (mNavigationBar != null) {
+ } else if (hasNavigationBar()) {
return () -> mNavigationBar.checkNavBarModes();
} else {
return null;
@@ -131,14 +186,15 @@ public class AutoHideController {
private void scheduleAutoHide() {
cancelAutoHide();
- mHandler.postDelayed(mAutoHide, AUTO_HIDE_TIMEOUT_MS);
+ mHandler.postDelayed(mAutoHide, AUTOHIDE_TIMEOUT_MS);
}
void checkUserAutoHide(MotionEvent event) {
- boolean shouldAutoHide = isAnyTransientBarShown()
+ boolean shouldAutoHide =
+ (mSystemUiVisibility & getTransientMask()) != 0 // a transient bar is revealed.
&& event.getAction() == MotionEvent.ACTION_OUTSIDE // touch outside the source bar.
&& event.getX() == 0 && event.getY() == 0;
- if (mStatusBar != null) {
+ if (hasStatusBar()) {
// a touch outside both bars
shouldAutoHide &= !mRemoteInputManager.getController().isRemoteInputActive();
}
@@ -152,8 +208,23 @@ public class AutoHideController {
mHandler.postDelayed(mAutoHide, 350); // longer than app gesture -> flag clear
}
- private boolean isAnyTransientBarShown() {
- return (mStatusBar != null && mStatusBar.isTransientShown())
- || mNavigationBar != null && mNavigationBar.isTransientShown();
+ private int getTransientMask() {
+ int mask = 0;
+ if (hasStatusBar()) {
+ mask |= View.STATUS_BAR_TRANSIENT;
+ }
+ if (hasNavigationBar()) {
+ mask |= View.NAVIGATION_BAR_TRANSIENT;
+ }
+ return mask;
+ }
+
+ boolean hasNavigationBar() {
+ return mNavigationBar != null;
+ }
+
+ @VisibleForTesting
+ boolean hasStatusBar() {
+ return mStatusBar != null;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index e6731e6b8a34..211a40a91101 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -44,11 +44,11 @@ public class BarTransitions {
private static final boolean DEBUG = false;
private static final boolean DEBUG_COLORS = false;
- public static final int MODE_TRANSPARENT = 0;
+ public static final int MODE_OPAQUE = 0;
public static final int MODE_SEMI_TRANSPARENT = 1;
public static final int MODE_TRANSLUCENT = 2;
public static final int MODE_LIGHTS_OUT = 3;
- public static final int MODE_OPAQUE = 4;
+ public static final int MODE_TRANSPARENT = 4;
public static final int MODE_WARNING = 5;
public static final int MODE_LIGHTS_OUT_TRANSPARENT = 6;
@@ -72,7 +72,7 @@ public class BarTransitions {
private final View mView;
protected final BarBackgroundDrawable mBarBackground;
- private @TransitionMode int mMode;
+ private int mMode;
private boolean mAlwaysOpaque = false;
public BarTransitions(View view, int gradientResourceId) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
index c9c38a0ef5f5..442c08991581 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.phone;
import static android.view.Display.INVALID_DISPLAY;
+import static android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+import static android.view.View.NAVIGATION_BAR_TRANSIENT;
import android.content.Context;
import android.content.res.Resources;
@@ -131,7 +133,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
private boolean mIsAttached;
private boolean mIsGesturalModeEnabled;
private boolean mIsEnabled;
- private boolean mIsNavBarShownTransiently;
+ private boolean mIsInTransientImmersiveStickyState;
private InputMonitor mInputMonitor;
private InputEventReceiver mInputEventReceiver;
@@ -196,8 +198,10 @@ public class EdgeBackGestureHandler implements DisplayListener {
updateCurrentUserResources(currentUserContext.getResources());
}
- public void onNavBarTransientStateChanged(boolean isTransient) {
- mIsNavBarShownTransiently = isTransient;
+ public void onSystemUiVisibilityChanged(int systemUiVisibility) {
+ mIsInTransientImmersiveStickyState =
+ (systemUiVisibility & SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0
+ && (systemUiVisibility & NAVIGATION_BAR_TRANSIENT) != 0;
}
private void disposeInputChannel() {
@@ -312,7 +316,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
}
// Always allow if the user is in a transient sticky immersive state
- if (mIsNavBarShownTransiently) {
+ if (mIsInTransientImmersiveStickyState) {
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index 2e776e39b54c..b0b656a1a951 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -16,20 +16,15 @@
package com.android.systemui.statusbar.phone;
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_SIDE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR;
-
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import android.content.Context;
import android.graphics.Color;
-import android.view.InsetsFlags;
-import android.view.ViewDebug;
-import android.view.WindowInsetsController.Appearance;
+import android.graphics.Rect;
+import android.view.View;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
-import com.android.internal.view.AppearanceRegion;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher;
@@ -54,10 +49,13 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
private BiometricUnlockController mBiometricUnlockController;
private LightBarTransitionsController mNavigationBarController;
- private @Appearance int mAppearance;
- private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
- private int mStatusBarMode;
- private int mNavigationBarMode;
+ private int mSystemUiVisibility;
+ private int mFullscreenStackVisibility;
+ private int mDockedStackVisibility;
+ private boolean mFullscreenLight;
+ private boolean mDockedLight;
+ private int mLastStatusBarMode;
+ private int mLastNavigationBarMode;
private final Color mDarkModeColor;
/**
@@ -77,6 +75,8 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
*/
private boolean mForceDarkForScrim;
+ private final Rect mLastFullscreenBounds = new Rect();
+ private final Rect mLastDockedBounds = new Rect();
private boolean mQsCustomizing;
private boolean mDirectReplying;
@@ -101,32 +101,45 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
mBiometricUnlockController = biometricUnlockController;
}
- void onStatusBarAppearanceChanged(AppearanceRegion[] appearanceRegions, boolean sbModeChanged,
+ public void onSystemUiVisibilityChanged(int fullscreenStackVis, int dockedStackVis,
+ int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, boolean sbModeChanged,
int statusBarMode, boolean navbarColorManagedByIme) {
- final int numStacks = appearanceRegions.length;
- boolean stackAppearancesChanged = mAppearanceRegions.length != numStacks;
- for (int i = 0; i < numStacks && !stackAppearancesChanged; i++) {
- stackAppearancesChanged |= !appearanceRegions[i].equals(mAppearanceRegions[i]);
- }
- if (stackAppearancesChanged || sbModeChanged) {
- mAppearanceRegions = appearanceRegions;
- onStatusBarModeChanged(statusBarMode);
+ int oldFullscreen = mFullscreenStackVisibility;
+ int newFullscreen = (oldFullscreen & ~mask) | (fullscreenStackVis & mask);
+ int diffFullscreen = newFullscreen ^ oldFullscreen;
+ int oldDocked = mDockedStackVisibility;
+ int newDocked = (oldDocked & ~mask) | (dockedStackVis & mask);
+ int diffDocked = newDocked ^ oldDocked;
+ if ((diffFullscreen & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0
+ || (diffDocked & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0
+ || sbModeChanged
+ || !mLastFullscreenBounds.equals(fullscreenStackBounds)
+ || !mLastDockedBounds.equals(dockedStackBounds)) {
+
+ mFullscreenLight = isLight(newFullscreen, statusBarMode,
+ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+ mDockedLight = isLight(newDocked, statusBarMode, View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+ updateStatus(fullscreenStackBounds, dockedStackBounds);
}
- mNavbarColorManagedByIme = navbarColorManagedByIme;
- }
- void onStatusBarModeChanged(int newBarMode) {
- mStatusBarMode = newBarMode;
- updateStatus();
+ mFullscreenStackVisibility = newFullscreen;
+ mDockedStackVisibility = newDocked;
+ mLastStatusBarMode = statusBarMode;
+ mNavbarColorManagedByIme = navbarColorManagedByIme;
+ mLastFullscreenBounds.set(fullscreenStackBounds);
+ mLastDockedBounds.set(dockedStackBounds);
}
- void onNavigationBarAppearanceChanged(@Appearance int appearance, boolean nbModeChanged,
+ public void onNavigationVisibilityChanged(int vis, int mask, boolean nbModeChanged,
int navigationBarMode, boolean navbarColorManagedByIme) {
- int diff = appearance ^ mAppearance;
- if ((diff & APPEARANCE_LIGHT_SIDE_BARS) != 0 || nbModeChanged) {
- final boolean last = mNavigationLight;
- mHasLightNavigationBar = isLight(appearance, navigationBarMode,
- APPEARANCE_LIGHT_SIDE_BARS);
+ int oldVis = mSystemUiVisibility;
+ int newVis = (oldVis & ~mask) | (vis & mask);
+ int diffVis = newVis ^ oldVis;
+ if ((diffVis & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0
+ || nbModeChanged) {
+ boolean last = mNavigationLight;
+ mHasLightNavigationBar = isLight(vis, navigationBarMode,
+ View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
mNavigationLight = mHasLightNavigationBar
&& (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
&& !mQsCustomizing;
@@ -134,20 +147,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
updateNavigation();
}
}
- mAppearance = appearance;
- mNavigationBarMode = navigationBarMode;
+ mSystemUiVisibility = newVis;
+ mLastNavigationBarMode = navigationBarMode;
mNavbarColorManagedByIme = navbarColorManagedByIme;
}
- void onNavigationBarModeChanged(int newBarMode) {
- mHasLightNavigationBar = isLight(mAppearance, newBarMode, APPEARANCE_LIGHT_SIDE_BARS);
- }
-
private void reevaluate() {
- onStatusBarAppearanceChanged(mAppearanceRegions, true /* sbModeChange */, mStatusBarMode,
- mNavbarColorManagedByIme);
- onNavigationBarAppearanceChanged(mAppearance, true /* nbModeChanged */,
- mNavigationBarMode, mNavbarColorManagedByIme);
+ onSystemUiVisibilityChanged(mFullscreenStackVisibility,
+ mDockedStackVisibility, 0 /* mask */, mLastFullscreenBounds, mLastDockedBounds,
+ true /* sbModeChange*/, mLastStatusBarMode, mNavbarColorManagedByIme);
+ onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, true /* nbModeChanged */,
+ mLastNavigationBarMode, mNavbarColorManagedByIme);
}
public void setQsCustomizing(boolean customizing) {
@@ -181,10 +191,10 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
}
}
- private static boolean isLight(int appearance, int barMode, int flag) {
- final boolean isTransparentBar = (barMode == MODE_TRANSPARENT
+ private boolean isLight(int vis, int barMode, int flag) {
+ boolean isTransparentBar = (barMode == MODE_TRANSPARENT
|| barMode == MODE_LIGHTS_OUT_TRANSPARENT);
- final boolean light = (appearance & flag) != 0;
+ boolean light = (vis & flag) != 0;
return isTransparentBar && light;
}
@@ -197,49 +207,49 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
&& unlockMode != BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
}
- private void updateStatus() {
- final int numStacks = mAppearanceRegions.length;
- int numLightStacks = 0;
-
- // We can only have maximum one light stack.
- int indexLightStack = -1;
+ private void updateStatus(Rect fullscreenStackBounds, Rect dockedStackBounds) {
+ boolean hasDockedStack = !dockedStackBounds.isEmpty();
- for (int i = 0; i < numStacks; i++) {
- if (isLight(mAppearanceRegions[i].getAppearance(), mStatusBarMode,
- APPEARANCE_LIGHT_TOP_BAR)) {
- numLightStacks++;
- indexLightStack = i;
- }
- }
-
- // If all stacks are light, all icons get dark.
- if (numLightStacks == numStacks) {
+ // If both are light or fullscreen is light and there is no docked stack, all icons get
+ // dark.
+ if ((mFullscreenLight && mDockedLight) || (mFullscreenLight && !hasDockedStack)) {
mStatusBarIconController.setIconsDarkArea(null);
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
}
- // If no one is light, all icons become white.
- else if (numLightStacks == 0) {
+ // If no one is light or the fullscreen is not light and there is no docked stack,
+ // all icons become white.
+ else if ((!mFullscreenLight && !mDockedLight) || (!mFullscreenLight && !hasDockedStack)) {
mStatusBarIconController.getTransitionsController().setIconsDark(
false, animateChange());
}
// Not the same for every stack, magic!
else {
- mStatusBarIconController.setIconsDarkArea(
- mAppearanceRegions[indexLightStack].getBounds());
+ Rect bounds = mFullscreenLight ? fullscreenStackBounds : dockedStackBounds;
+ if (bounds.isEmpty()) {
+ mStatusBarIconController.setIconsDarkArea(null);
+ } else {
+ mStatusBarIconController.setIconsDarkArea(bounds);
+ }
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
}
}
private void updateNavigation() {
if (mNavigationBarController != null) {
- mNavigationBarController.setIconsDark(mNavigationLight, animateChange());
+ mNavigationBarController.setIconsDark(
+ mNavigationLight, animateChange());
}
}
@Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+
+ }
+
+ @Override
public void onPowerSaveChanged(boolean isPowerSave) {
reevaluate();
}
@@ -247,21 +257,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("LightBarController: ");
- pw.print(" mAppearance=0x"); pw.println(ViewDebug.flagsToString(
- InsetsFlags.class, "appearance", mAppearance));
- final int numStacks = mAppearanceRegions.length;
- for (int i = 0; i < numStacks; i++) {
- final boolean isLight = isLight(mAppearanceRegions[i].getAppearance(), mStatusBarMode,
- APPEARANCE_LIGHT_TOP_BAR);
- pw.print(" stack #"); pw.print(i); pw.print(": ");
- pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight);
- }
+ pw.print(" mSystemUiVisibility=0x"); pw.print(
+ Integer.toHexString(mSystemUiVisibility));
+ pw.print(" mFullscreenStackVisibility=0x"); pw.print(
+ Integer.toHexString(mFullscreenStackVisibility));
+ pw.print(" mDockedStackVisibility=0x"); pw.println(
+ Integer.toHexString(mDockedStackVisibility));
+
+ pw.print(" mFullscreenLight="); pw.print(mFullscreenLight);
+ pw.print(" mDockedLight="); pw.println(mDockedLight);
+
+ pw.print(" mLastFullscreenBounds="); pw.print(mLastFullscreenBounds);
+ pw.print(" mLastDockedBounds="); pw.println(mLastDockedBounds);
pw.print(" mNavigationLight="); pw.print(mNavigationLight);
pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);
- pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
- pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
+ pw.print(" mLastStatusBarMode="); pw.print(mLastStatusBarMode);
+ pw.print(" mLastNavigationBarMode="); pw.println(mLastNavigationBarMode);
pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim);
pw.print(" mQsCustomizing="); pw.print(mQsCustomizing);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 7030dfc4c33b..38dc5ea4dcd5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -21,10 +21,6 @@ import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.WindowType;
import static android.app.StatusBarManager.WindowVisibleState;
import static android.app.StatusBarManager.windowStateToString;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.containsType;
-import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_SIDE_BARS;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
@@ -35,6 +31,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OU
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_WINDOW_STATE;
@@ -55,6 +52,7 @@ import android.content.IntentFilter;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.PixelFormat;
+import android.graphics.Rect;
import android.inputmethodservice.InputMethodService;
import android.net.Uri;
import android.os.Binder;
@@ -69,14 +67,12 @@ import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
-import android.view.InsetsState.InternalInsetType;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowInsetsController.Appearance;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.accessibility.AccessibilityEvent;
@@ -88,7 +84,6 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
-import com.android.internal.view.AppearanceRegion;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
@@ -133,8 +128,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
private static final boolean DEBUG = false;
private static final String EXTRA_DISABLE_STATE = "disabled_state";
private static final String EXTRA_DISABLE2_STATE = "disabled2_state";
- private static final String EXTRA_APPEARANCE = "appearance";
- private static final String EXTRA_TRANSIENT_STATE = "transient_state";
+ private static final String EXTRA_SYSTEM_UI_VISIBILITY = "system_ui_visibility";
/** Allow some time inbetween the long press for back and recents. */
private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200;
@@ -171,10 +165,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
private Locale mLocale;
private int mLayoutDirection;
- /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int) */
- private @Appearance int mAppearance;
-
- private boolean mTransientShown;
+ private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
private LightBarController mLightBarController;
private AutoHideController mAutoHideController;
@@ -304,8 +295,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
if (savedInstanceState != null) {
mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0);
mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0);
- mAppearance = savedInstanceState.getInt(EXTRA_APPEARANCE, 0);
- mTransientShown = savedInstanceState.getBoolean(EXTRA_TRANSIENT_STATE, false);
+ mSystemUiVisibility = savedInstanceState.getInt(EXTRA_SYSTEM_UI_VISIBILITY, 0);
}
mAccessibilityManagerWrapper.addCallback(mAccessibilityListener);
@@ -407,8 +397,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_DISABLE_STATE, mDisabledFlags1);
outState.putInt(EXTRA_DISABLE2_STATE, mDisabledFlags2);
- outState.putInt(EXTRA_APPEARANCE, mAppearance);
- outState.putBoolean(EXTRA_TRANSIENT_STATE, mTransientShown);
+ outState.putInt(EXTRA_SYSTEM_UI_VISIBILITY, mSystemUiVisibility);
if (mNavigationBarView != null) {
mNavigationBarView.getLightTransitionsController().saveState(outState);
}
@@ -529,107 +518,80 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
rotationButtonController.onRotationProposal(rotation, winRotation, isValid);
}
- /** Restores the appearance and the transient saved state to {@link NavigationBarFragment}. */
- public void restoreAppearanceAndTransientState() {
- final int barMode = barMode(mTransientShown, mAppearance);
- mNavigationBarMode = barMode;
+ /** Restores the System UI flags saved state to {@link NavigationBarFragment}. */
+ public void restoreSystemUiVisibilityState() {
+ final int barMode = computeBarMode(0, mSystemUiVisibility);
+ if (barMode != -1) {
+ mNavigationBarMode = barMode;
+ }
checkNavBarModes();
mAutoHideController.touchAutoHide();
- mLightBarController.onNavigationBarAppearanceChanged(mAppearance, true /* nbModeChanged */,
- barMode, false /* navbarColorManagedByIme */);
+ mLightBarController.onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */,
+ true /* nbModeChanged */, mNavigationBarMode, false /* navbarColorManagedByIme */);
}
@Override
- public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
+ public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+ int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+ boolean navbarColorManagedByIme) {
if (displayId != mDisplayId) {
return;
}
+ final int oldVal = mSystemUiVisibility;
+ final int newVal = (oldVal & ~mask) | (vis & mask);
+ final int diff = newVal ^ oldVal;
boolean nbModeChanged = false;
- if (mAppearance != appearance) {
- mAppearance = appearance;
- if (getView() == null) {
- return;
+ if (diff != 0) {
+ mSystemUiVisibility = newVal;
+
+ // update navigation bar mode
+ final int nbMode = getView() == null
+ ? -1 : computeBarMode(oldVal, newVal);
+ nbModeChanged = nbMode != -1;
+ if (nbModeChanged) {
+ if (mNavigationBarMode != nbMode) {
+ if (mNavigationBarMode == MODE_TRANSPARENT
+ || mNavigationBarMode == MODE_LIGHTS_OUT_TRANSPARENT) {
+ mNavigationBarView.hideRecentsOnboarding();
+ }
+ mNavigationBarMode = nbMode;
+ checkNavBarModes();
+ }
+ mAutoHideController.touchAutoHide();
+ }
+ if (mNavigationBarView != null) {
+ mNavigationBarView.onSystemUiVisibilityChanged(mSystemUiVisibility);
}
- nbModeChanged = updateBarMode(barMode(mTransientShown, appearance));
- }
- mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged,
- mNavigationBarMode, navbarColorManagedByIme);
- }
-
- @Override
- public void showTransient(int displayId, @InternalInsetType int[] types) {
- if (displayId != mDisplayId) {
- return;
- }
- if (!containsType(types, TYPE_NAVIGATION_BAR)) {
- return;
- }
- if (!mTransientShown) {
- mTransientShown = true;
- handleTransientChanged();
- }
- }
-
- @Override
- public void abortTransient(int displayId, @InternalInsetType int[] types) {
- if (displayId != mDisplayId) {
- return;
- }
- if (!containsType(types, TYPE_NAVIGATION_BAR)) {
- return;
- }
- clearTransient();
- }
-
- void clearTransient() {
- if (mTransientShown) {
- mTransientShown = false;
- handleTransientChanged();
}
+ mLightBarController.onNavigationVisibilityChanged(
+ vis, mask, nbModeChanged, mNavigationBarMode, navbarColorManagedByIme);
}
- private void handleTransientChanged() {
- if (getView() == null) {
- return;
- }
- if (mNavigationBarView != null) {
- mNavigationBarView.onTransientStateChanged(mTransientShown);
- }
- final int barMode = barMode(mTransientShown, mAppearance);
- if (updateBarMode(barMode)) {
- mLightBarController.onNavigationBarModeChanged(barMode);
+ private @TransitionMode int computeBarMode(int oldVis, int newVis) {
+ final int oldMode = barMode(oldVis);
+ final int newMode = barMode(newVis);
+ if (oldMode == newMode) {
+ return -1; // no mode change
}
+ return newMode;
}
- // Returns true if the bar mode is changed.
- private boolean updateBarMode(int barMode) {
- if (mNavigationBarMode != barMode) {
- if (mNavigationBarMode == MODE_TRANSPARENT
- || mNavigationBarMode == MODE_LIGHTS_OUT_TRANSPARENT) {
- mNavigationBarView.hideRecentsOnboarding();
- }
- mNavigationBarMode = barMode;
- checkNavBarModes();
- mAutoHideController.touchAutoHide();
- return true;
- }
- return false;
- }
-
- private static @TransitionMode int barMode(boolean isTransient, int appearance) {
- final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_SIDE_BARS;
- if (isTransient) {
+ private @TransitionMode int barMode(int vis) {
+ final int lightsOutTransparent =
+ View.SYSTEM_UI_FLAG_LOW_PROFILE | View.NAVIGATION_BAR_TRANSIENT;
+ if ((vis & View.NAVIGATION_BAR_TRANSIENT) != 0) {
return MODE_SEMI_TRANSPARENT;
- } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) {
- return MODE_LIGHTS_OUT;
- } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) {
+ } else if ((vis & View.NAVIGATION_BAR_TRANSLUCENT) != 0) {
+ return MODE_TRANSLUCENT;
+ } else if ((vis & lightsOutTransparent) == lightsOutTransparent) {
return MODE_LIGHTS_OUT_TRANSPARENT;
- } else if ((appearance & APPEARANCE_OPAQUE_SIDE_BARS) != 0) {
- return MODE_OPAQUE;
- } else {
+ } else if ((vis & View.NAVIGATION_BAR_TRANSPARENT) != 0) {
return MODE_TRANSPARENT;
+ } else if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
+ return MODE_LIGHTS_OUT;
+ } else {
+ return MODE_OPAQUE;
}
}
@@ -1028,8 +990,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
mAutoHideController.setNavigationBar(this);
}
- boolean isTransientShown() {
- return mTransientShown;
+ public boolean isSemiTransparent() {
+ return mNavigationBarMode == MODE_SEMI_TRANSPARENT;
}
private void checkBarModes() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 4b4a35bae05d..ae18833d99b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -366,8 +366,8 @@ public class NavigationBarView extends FrameLayout implements
return super.onTouchEvent(event);
}
- void onTransientStateChanged(boolean isTransient) {
- mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient);
+ void onSystemUiVisibilityChanged(int systemUiVisibility) {
+ mEdgeBackGestureHandler.onSystemUiVisibilityChanged(systemUiVisibility);
}
void onBarTransition(int newMode) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 08ffd066a9f0..c092f9b0a4c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -24,11 +24,6 @@ import static android.app.StatusBarManager.WindowType;
import static android.app.StatusBarManager.WindowVisibleState;
import static android.app.StatusBarManager.windowStateToString;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
-import static android.view.InsetsFlags.getAppearance;
-import static android.view.InsetsState.TYPE_TOP_BAR;
-import static android.view.InsetsState.containsType;
-import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_TOP_BAR;
import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
import static com.android.systemui.Dependency.BG_HANDLER;
@@ -80,6 +75,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.PointF;
+import android.graphics.Rect;
import android.media.AudioAttributes;
import android.metrics.LogMaker;
import android.net.Uri;
@@ -108,7 +104,6 @@ import android.util.Log;
import android.util.Slog;
import android.view.Display;
import android.view.IWindowManager;
-import android.view.InsetsState.InternalInsetType;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -117,7 +112,6 @@ import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
-import android.view.WindowInsetsController.Appearance;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager;
@@ -130,7 +124,6 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.RegisterStatusBarResult;
-import com.android.internal.view.AppearanceRegion;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -432,13 +425,10 @@ public class StatusBar extends SystemUI implements DemoMode,
private int mDisabled1 = 0;
private int mDisabled2 = 0;
- /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int) */
- private @Appearance int mAppearance;
-
- private boolean mTransientShown;
-
- private boolean mAppFullscreen;
- private boolean mAppImmersive;
+ // tracking calls to View.setSystemUiVisibility()
+ private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
+ private final Rect mLastFullscreenStackBounds = new Rect();
+ private final Rect mLastDockedStackBounds = new Rect();
private final DisplayMetrics mDisplayMetrics;
@@ -831,22 +821,10 @@ public class StatusBar extends SystemUI implements DemoMode,
// Set up the initial notification state. This needs to happen before CommandQueue.disable()
setUpPresenter();
- if ((result.mSystemUiVisibility & View.STATUS_BAR_TRANSIENT) != 0) {
- showTransientUnchecked();
- }
- final int fullscreenAppearance = getAppearance(result.mFullscreenStackSysUiVisibility);
- final int dockedAppearance = getAppearance(result.mDockedStackSysUiVisibility);
- final AppearanceRegion[] appearanceRegions = result.mDockedStackBounds.isEmpty()
- ? new AppearanceRegion[]{
- new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds)}
- : new AppearanceRegion[]{
- new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds),
- new AppearanceRegion(dockedAppearance, result.mDockedStackBounds)};
- onSystemBarAppearanceChanged(mDisplayId, getAppearance(result.mSystemUiVisibility),
- appearanceRegions, result.mNavbarColorManagedByIme);
- mAppFullscreen = result.mAppFullscreen;
- mAppImmersive = result.mAppImmersive;
-
+ setSystemUiVisibility(mDisplayId, result.mSystemUiVisibility,
+ result.mFullscreenStackSysUiVisibility, result.mDockedStackSysUiVisibility,
+ 0xffffffff, result.mFullscreenStackBounds, result.mDockedStackBounds,
+ result.mNavbarColorManagedByIme);
// StatusBarManagerService has a back up of IME token and it's restored here.
setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
result.mImeBackDisposition, result.mShowImeSwitcher);
@@ -2245,103 +2223,49 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
- @Override
- public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
+ @Override // CommandQueue
+ public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+ int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+ boolean navbarColorManagedByIme) {
if (displayId != mDisplayId) {
return;
}
- boolean barModeChanged = false;
- final int diff = mAppearance ^ appearance;
- if (mAppearance != appearance) {
- mAppearance = appearance;
+ final int oldVal = mSystemUiVisibility;
+ final int newVal = (oldVal&~mask) | (vis&mask);
+ final int diff = newVal ^ oldVal;
+ if (DEBUG) Log.d(TAG, String.format(
+ "setSystemUiVisibility displayId=%d vis=%s mask=%s oldVal=%s newVal=%s diff=%s",
+ displayId, Integer.toHexString(vis), Integer.toHexString(mask),
+ Integer.toHexString(oldVal), Integer.toHexString(newVal),
+ Integer.toHexString(diff)));
+ boolean sbModeChanged = false;
+ if (diff != 0) {
+ mSystemUiVisibility = newVal;
// update low profile
- if ((diff & APPEARANCE_LOW_PROFILE_BARS) != 0) {
+ if ((diff & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
updateAreThereNotifications();
}
- barModeChanged = updateBarMode(barMode(mTransientShown, appearance));
- }
- mLightBarController.onStatusBarAppearanceChanged(appearanceRegions, barModeChanged,
- mStatusBarMode, navbarColorManagedByIme);
- }
-
- @Override
- public void showTransient(int displayId, @InternalInsetType int[] types) {
- if (displayId != mDisplayId) {
- return;
- }
- if (!containsType(types, TYPE_TOP_BAR)) {
- return;
- }
- showTransientUnchecked();
- }
-
- private void showTransientUnchecked() {
- if (!mTransientShown) {
- mTransientShown = true;
- mNoAnimationOnNextBarModeChange = true;
- handleTransientChanged();
- }
- }
-
- @Override
- public void abortTransient(int displayId, @InternalInsetType int[] types) {
- if (displayId != mDisplayId) {
- return;
- }
- if (!containsType(types, TYPE_TOP_BAR)) {
- return;
- }
- clearTransient();
- }
-
- void clearTransient() {
- if (mTransientShown) {
- mTransientShown = false;
- handleTransientChanged();
- }
- }
-
- private void handleTransientChanged() {
- final int barMode = barMode(mTransientShown, mAppearance);
- if (updateBarMode(barMode)) {
- mLightBarController.onStatusBarModeChanged(barMode);
- }
- }
- private boolean updateBarMode(int barMode) {
- if (mStatusBarMode != barMode) {
- mStatusBarMode = barMode;
- checkBarModes();
- mAutoHideController.touchAutoHide();
- return true;
- }
- return false;
- }
+ // ready to unhide
+ if ((vis & View.STATUS_BAR_UNHIDE) != 0) {
+ mNoAnimationOnNextBarModeChange = true;
+ }
- private static @TransitionMode int barMode(boolean isTransient, int appearance) {
- final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_TOP_BAR;
- if (isTransient) {
- return MODE_SEMI_TRANSPARENT;
- } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) {
- return MODE_LIGHTS_OUT;
- } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) {
- return MODE_LIGHTS_OUT_TRANSPARENT;
- } else if ((appearance & APPEARANCE_OPAQUE_TOP_BAR) != 0) {
- return MODE_OPAQUE;
- } else {
- return MODE_TRANSPARENT;
- }
- }
+ // update status bar mode
+ final int sbMode = computeStatusBarMode(oldVal, newVal);
- @Override
- public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
- if (displayId != mDisplayId) {
- return;
+ sbModeChanged = sbMode != -1;
+ if (sbModeChanged && sbMode != mStatusBarMode) {
+ mStatusBarMode = sbMode;
+ checkBarModes();
+ mAutoHideController.touchAutoHide();
+ }
+ mStatusBarStateController.setSystemUiVisibility(mSystemUiVisibility);
}
- mAppFullscreen = isFullscreen;
- mAppImmersive = isImmersive;
+ mLightBarController.onSystemUiVisibilityChanged(fullscreenStackVis, dockedStackVis,
+ mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode,
+ navbarColorManagedByIme);
}
@Override
@@ -2372,10 +2296,40 @@ public class StatusBar extends SystemUI implements DemoMode,
setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, running);
}
+ protected @TransitionMode int computeStatusBarMode(int oldVal, int newVal) {
+ return computeBarMode(oldVal, newVal);
+ }
+
protected BarTransitions getStatusBarTransitions() {
return mStatusBarView.getBarTransitions();
}
+ protected @TransitionMode int computeBarMode(int oldVis, int newVis) {
+ final int oldMode = barMode(oldVis);
+ final int newMode = barMode(newVis);
+ if (oldMode == newMode) {
+ return -1; // no mode change
+ }
+ return newMode;
+ }
+
+ private @TransitionMode int barMode(int vis) {
+ int lightsOutTransparent = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.STATUS_BAR_TRANSPARENT;
+ if ((vis & View.STATUS_BAR_TRANSIENT) != 0) {
+ return MODE_SEMI_TRANSPARENT;
+ } else if ((vis & View.STATUS_BAR_TRANSLUCENT) != 0) {
+ return MODE_TRANSLUCENT;
+ } else if ((vis & lightsOutTransparent) == lightsOutTransparent) {
+ return MODE_LIGHTS_OUT_TRANSPARENT;
+ } else if ((vis & View.STATUS_BAR_TRANSPARENT) != 0) {
+ return MODE_TRANSPARENT;
+ } else if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
+ return MODE_LIGHTS_OUT;
+ } else {
+ return MODE_OPAQUE;
+ }
+ }
+
void checkBarModes() {
if (mDemoMode) return;
if (mStatusBarView != null) checkBarMode(mStatusBarMode, mStatusBarWindowState,
@@ -2431,16 +2385,20 @@ public class StatusBar extends SystemUI implements DemoMode,
/** Returns whether the top activity is in fullscreen mode. */
public boolean inFullscreenMode() {
- return mAppFullscreen;
+ return 0
+ != (mSystemUiVisibility
+ & (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
}
/** Returns whether the top activity is in immersive mode. */
public boolean inImmersiveMode() {
- return mAppImmersive;
+ return 0
+ != (mSystemUiVisibility
+ & (View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY));
}
private boolean areLightsOn() {
- return 0 == (mAppearance & APPEARANCE_LOW_PROFILE_BARS);
+ return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
public static String viewInfo(View v) {
@@ -4764,8 +4722,8 @@ public class StatusBar extends SystemUI implements DemoMode,
void createStatusBar(StatusBar statusbar);
}
- boolean isTransientShown() {
- return mTransientShown;
+ public @TransitionMode int getStatusBarMode() {
+ return mStatusBarMode;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 6b513919e912..d04c7bd38320 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -23,7 +23,6 @@ import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Canvas;
-import android.graphics.Insets;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -43,7 +42,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
-import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.widget.FrameLayout;
@@ -76,8 +74,7 @@ public class StatusBarWindowView extends FrameLayout {
}
@Override
- public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
- final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars());
+ protected boolean fitSystemWindows(Rect insets) {
if (getFitsSystemWindows()) {
boolean paddingChanged = insets.top != getPaddingTop()
|| insets.bottom != getPaddingBottom();
@@ -103,6 +100,9 @@ public class StatusBarWindowView extends FrameLayout {
if (paddingChanged) {
setPadding(0, 0, 0, 0);
}
+ insets.left = 0;
+ insets.top = 0;
+ insets.right = 0;
} else {
if (mRightInset != 0 || mLeftInset != 0) {
mRightInset = 0;
@@ -116,8 +116,9 @@ public class StatusBarWindowView extends FrameLayout {
if (changed) {
setPadding(0, 0, 0, 0);
}
+ insets.top = 0;
}
- return windowInsets;
+ return false;
}
private void applyMargins() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index eb198c6ad4f7..1bd01e166ddb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -15,8 +15,6 @@
package com.android.systemui.statusbar;
import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.TYPE_TOP_BAR;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Matchers.eq;
@@ -27,12 +25,10 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.content.ComponentName;
import android.graphics.Rect;
import android.os.Bundle;
-import android.view.WindowInsetsController.Appearance;
import androidx.test.filters.SmallTest;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.view.AppearanceRegion;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -114,56 +110,21 @@ public class CommandQueueTest extends SysuiTestCase {
}
@Test
- public void testOnSystemBarAppearanceChanged() {
- doTestOnSystemBarAppearanceChanged(DEFAULT_DISPLAY, 1,
- new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false);
- }
-
- @Test
- public void testOnSystemBarAppearanceChangedForSecondaryDisplay() {
- doTestOnSystemBarAppearanceChanged(SECONDARY_DISPLAY, 1,
- new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false);
- }
-
- private void doTestOnSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
- mCommandQueue.onSystemBarAppearanceChanged(displayId, appearance, appearanceRegions,
- navbarColorManagedByIme);
- waitForIdleSync();
- verify(mCallbacks).onSystemBarAppearanceChanged(eq(displayId), eq(appearance),
- eq(appearanceRegions), eq(navbarColorManagedByIme));
- }
-
- @Test
- public void testShowTransient() {
- int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
- mCommandQueue.showTransient(DEFAULT_DISPLAY, types);
- waitForIdleSync();
- verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types));
- }
-
- @Test
- public void testShowTransientForSecondaryDisplay() {
- int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
- mCommandQueue.showTransient(SECONDARY_DISPLAY, types);
- waitForIdleSync();
- verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types));
- }
-
- @Test
- public void testAbortTransient() {
- int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
- mCommandQueue.abortTransient(DEFAULT_DISPLAY, types);
+ public void testSetSystemUiVisibility() {
+ Rect r = new Rect();
+ mCommandQueue.setSystemUiVisibility(DEFAULT_DISPLAY, 1, 2, 3, 4, null, r, false);
waitForIdleSync();
- verify(mCallbacks).abortTransient(eq(DEFAULT_DISPLAY), eq(types));
+ verify(mCallbacks).setSystemUiVisibility(eq(DEFAULT_DISPLAY), eq(1), eq(2), eq(3), eq(4),
+ eq(null), eq(r), eq(false));
}
@Test
- public void testAbortTransientForSecondaryDisplay() {
- int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
- mCommandQueue.abortTransient(SECONDARY_DISPLAY, types);
+ public void testSetSystemUiVisibilityForSecondaryDisplay() {
+ Rect r = new Rect();
+ mCommandQueue.setSystemUiVisibility(SECONDARY_DISPLAY, 1, 2, 3, 4, null, r, false);
waitForIdleSync();
- verify(mCallbacks).abortTransient(eq(SECONDARY_DISPLAY), eq(types));
+ verify(mCallbacks).setSystemUiVisibility(eq(SECONDARY_DISPLAY), eq(1), eq(2), eq(3), eq(4),
+ eq(null), eq(r), eq(false));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java
new file mode 100644
index 000000000000..16f02d9dd661
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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 com.android.systemui.statusbar.phone;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.graphics.Rect;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.IWindowManager;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** atest AutoHideControllerTest */
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+@SmallTest
+public class AutoHideControllerTest extends SysuiTestCase {
+
+ private AutoHideController mAutoHideController;
+
+ private static final int FULL_MASK = 0xffffffff;
+
+ @Before
+ public void setUp() {
+ mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
+ mAutoHideController =
+ spy(new AutoHideController(mContext, Dependency.get(Dependency.MAIN_HANDLER),
+ mock(NotificationRemoteInputManager.class), mock(IWindowManager.class)));
+ mAutoHideController.mDisplayId = DEFAULT_DISPLAY;
+ mAutoHideController.mSystemUiVisibility = View.VISIBLE;
+ }
+
+ @After
+ public void tearDown() {
+ mAutoHideController = null;
+ }
+
+ @Test
+ public void testSetSystemUiVisibilityEarlyReturnWithDifferentDisplay() {
+ mAutoHideController.setSystemUiVisibility(1, 1, 2, 3, 4, null, new Rect(), false);
+
+ verify(mAutoHideController, never()).notifySystemUiVisibilityChanged(anyInt());
+ }
+
+ @Test
+ public void testSetSystemUiVisibilityEarlyReturnWithSameVisibility() {
+ mAutoHideController
+ .setSystemUiVisibility(
+ DEFAULT_DISPLAY, View.VISIBLE, 2, 3, 4, null, new Rect(), false);
+
+ verify(mAutoHideController, never()).notifySystemUiVisibilityChanged(anyInt());
+ }
+
+ // Test if status bar unhide status doesn't change without status bar.
+ @Test
+ public void testSetSystemUiVisibilityWithoutStatusBar() {
+ doReturn(false).when(mAutoHideController).hasStatusBar();
+ int expectedStatus = View.STATUS_BAR_UNHIDE;
+ mAutoHideController.mSystemUiVisibility =
+ View.SYSTEM_UI_FLAG_FULLSCREEN | View.STATUS_BAR_UNHIDE;
+
+ mAutoHideController.setSystemUiVisibility(
+ DEFAULT_DISPLAY, expectedStatus, 2, 3, FULL_MASK, null, new Rect(), false);
+
+ assertEquals("System UI visibility should not be changed",
+ expectedStatus, mAutoHideController.mSystemUiVisibility);
+ verify(mAutoHideController, times(1)).notifySystemUiVisibilityChanged(eq(expectedStatus));
+ }
+
+ @Test
+ public void testSetSystemUiVisibilityWithVisChanged() {
+ doReturn(true).when(mAutoHideController).hasStatusBar();
+ doReturn(true).when(mAutoHideController).hasNavigationBar();
+ mAutoHideController.mSystemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.STATUS_BAR_UNHIDE
+ | View.NAVIGATION_BAR_UNHIDE;
+
+ mAutoHideController.setSystemUiVisibility(
+ DEFAULT_DISPLAY, View.STATUS_BAR_UNHIDE | View.NAVIGATION_BAR_UNHIDE,
+ 2, 3, FULL_MASK, null, new Rect(), false);
+
+ int expectedStatus = View.VISIBLE;
+ assertEquals(expectedStatus, mAutoHideController.mSystemUiVisibility);
+ verify(mAutoHideController).notifySystemUiVisibilityChanged(eq(expectedStatus));
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
deleted file mode 100644
index 6260d531a290..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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 com.android.systemui.statusbar.phone;
-
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR;
-
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
-
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.graphics.Rect;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.view.AppearanceRegion;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.policy.BatteryController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-public class LightBarControllerTest extends SysuiTestCase {
-
- private LightBarTransitionsController mLightBarTransitionsController;
- private SysuiDarkIconDispatcher mStatusBarIconController;
- private LightBarController mLightBarController;
-
- @Before
- public void setup() {
- mStatusBarIconController = mock(SysuiDarkIconDispatcher.class);
- mLightBarTransitionsController = mock(LightBarTransitionsController.class);
- when(mStatusBarIconController.getTransitionsController()).thenReturn(
- mLightBarTransitionsController);
- mLightBarController = new LightBarController(mContext, mStatusBarIconController,
- mock(BatteryController.class));
- }
-
- @Test
- public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksLight() {
- final Rect firstBounds = new Rect(0, 0, 1, 1);
- final Rect secondBounds = new Rect(1, 0, 2, 1);
- final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
- new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, firstBounds),
- new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, secondBounds)
- };
- mLightBarController.onStatusBarAppearanceChanged(
- appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
- false /* navbarColorManagedByIme */);
- verify(mStatusBarIconController).setIconsDarkArea(eq(null));
- verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
- }
-
- @Test
- public void testOnStatusBarAppearanceChanged_multipleStacks_oneStackLightOneStackDark() {
- final Rect firstBounds = new Rect(0, 0, 1, 1);
- final Rect secondBounds = new Rect(1, 0, 2, 1);
- final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
- new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, firstBounds),
- new AppearanceRegion(0 /* appearance */, secondBounds)
- };
- mLightBarController.onStatusBarAppearanceChanged(
- appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
- false /* navbarColorManagedByIme */);
- verify(mStatusBarIconController).setIconsDarkArea(eq(firstBounds));
- verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
- }
-
- @Test
- public void testOnStatusBarAppearanceChanged_multipleStacks_oneStackDarkOneStackLight() {
- final Rect firstBounds = new Rect(0, 0, 1, 1);
- final Rect secondBounds = new Rect(1, 0, 2, 1);
- final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
- new AppearanceRegion(0 /* appearance */, firstBounds),
- new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, secondBounds)
- };
- mLightBarController.onStatusBarAppearanceChanged(
- appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
- false /* navbarColorManagedByIme */);
- verify(mStatusBarIconController).setIconsDarkArea(eq(secondBounds));
- verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
- }
-
- @Test
- public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksDark() {
- final Rect firstBounds = new Rect(0, 0, 1, 1);
- final Rect secondBounds = new Rect(1, 0, 2, 1);
- final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
- new AppearanceRegion(0 /* appearance */, firstBounds),
- new AppearanceRegion(0 /* appearance */, secondBounds)
- };
- mLightBarController.onStatusBarAppearanceChanged(
- appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
- false /* navbarColorManagedByIme */);
- verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean());
- }
-
- @Test
- public void testOnStatusBarAppearanceChanged_singleStack_light() {
- final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
- new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, new Rect(0, 0, 1, 1))
- };
- mLightBarController.onStatusBarAppearanceChanged(
- appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
- false /* navbarColorManagedByIme */);
- verify(mStatusBarIconController).setIconsDarkArea(eq(null));
- verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
- }
-
- @Test
- public void testOnStatusBarAppearanceChanged_singleStack_dark() {
- final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
- new AppearanceRegion(0, new Rect(0, 0, 1, 1))
- };
- mLightBarController.onStatusBarAppearanceChanged(
- appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
- false /* navbarColorManagedByIme */);
- verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean());
- }
-}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index ec64ee6d52de..a93d2b8b6fb9 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -18,10 +18,7 @@ package com.android.server.statusbar;
import android.graphics.Rect;
import android.os.Bundle;
-import android.view.InsetsState.InternalInsetType;
-import android.view.WindowInsetsController.Appearance;
-import com.android.internal.view.AppearanceRegion;
import com.android.server.notification.NotificationDelegate;
public interface StatusBarManagerInternal {
@@ -78,7 +75,7 @@ public interface StatusBarManagerInternal {
void startAssist(Bundle args);
void onCameraLaunchGestureDetected(int source);
- void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive);
+ void topAppWindowChanged(int displayId, boolean menuVisible);
void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis,
int mask, Rect fullscreenBounds, Rect dockedBounds, boolean isNavbarColorManagedByIme,
String cause);
@@ -116,14 +113,4 @@ public interface StatusBarManagerInternal {
* Notifies System UI whether the recents animation is running.
*/
void onRecentsAnimationStateChanged(boolean running);
-
- /** @see com.android.internal.statusbar.IStatusBar#onSystemBarAppearanceChanged */
- void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme);
-
- /** @see com.android.internal.statusbar.IStatusBar#showTransient */
- void showTransient(int displayId, @InternalInsetType int[] types);
-
- /** @see com.android.internal.statusbar.IStatusBar#abortTransient */
- void abortTransient(int displayId, @InternalInsetType int[] types);
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 3c1a6afccda1..65bb2342d504 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -47,7 +47,6 @@ import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
-import android.view.WindowInsetsController.Appearance;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -57,7 +56,6 @@ import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.DumpUtils;
-import com.android.internal.view.AppearanceRegion;
import com.android.server.LocalServices;
import com.android.server.notification.NotificationDelegate;
import com.android.server.policy.GlobalActionsProvider;
@@ -258,8 +256,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
- public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
- StatusBarManagerService.this.topAppWindowChanged(displayId, isFullscreen, isImmersive);
+ public void topAppWindowChanged(int displayId, boolean menuVisible) {
+ StatusBarManagerService.this.topAppWindowChanged(displayId, menuVisible);
}
@Override
@@ -469,36 +467,6 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
}
-
- @Override
- public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
- AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
- // TODO (b/118118435): save the information to UiState
- if (mBar != null) {
- try {
- mBar.onSystemBarAppearanceChanged(displayId, appearance, appearanceRegions,
- navbarColorManagedByIme);
- } catch (RemoteException ex) { }
- }
- }
-
- @Override
- public void showTransient(int displayId, int[] types) {
- if (mBar != null) {
- try {
- mBar.showTransient(displayId, types);
- } catch (RemoteException ex) { }
- }
- }
-
- @Override
- public void abortTransient(int displayId, int[] types) {
- if (mBar != null) {
- try {
- mBar.abortTransient(displayId, types);
- } catch (RemoteException ex) { }
- }
- }
};
private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {
@@ -849,19 +817,23 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
/**
- * Enables System UI to know whether the top app is fullscreen or not, and whether this app is
- * in immersive mode or not.
+ * Hide or show the on-screen Menu key. Only call this from the window manager, typically in
+ * response to a window with {@link android.view.WindowManager.LayoutParams#needsMenuKey} set
+ * to {@link android.view.WindowManager.LayoutParams#NEEDS_MENU_SET_TRUE}.
*/
- private void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
+ private void topAppWindowChanged(int displayId, final boolean menuVisible) {
enforceStatusBar();
+ if (SPEW) {
+ Slog.d(TAG, "display#" + displayId + ": "
+ + (menuVisible ? "showing" : "hiding") + " MENU key");
+ }
synchronized(mLock) {
- getUiState(displayId).setFullscreen(isFullscreen);
- getUiState(displayId).setImmersive(isImmersive);
+ getUiState(displayId).setMenuVisible(menuVisible);
mHandler.post(() -> {
if (mBar != null) {
try {
- mBar.topAppWindowChanged(displayId, isFullscreen, isImmersive);
+ mBar.topAppWindowChanged(displayId, menuVisible);
} catch (RemoteException ex) {
}
}
@@ -970,8 +942,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
private int mDockedStackSysUiVisibility = 0;
private final Rect mFullscreenStackBounds = new Rect();
private final Rect mDockedStackBounds = new Rect();
- private boolean mFullscreen = false;
- private boolean mImmersive = false;
+ private boolean mMenuVisible = false;
private int mDisabled1 = 0;
private int mDisabled2 = 0;
private int mImeWindowVis = 0;
@@ -993,12 +964,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
mDisabled2 = disabled2;
}
- private void setFullscreen(boolean isFullscreen) {
- mFullscreen = isFullscreen;
+ private boolean isMenuVisible() {
+ return mMenuVisible;
}
- private void setImmersive(boolean immersive) {
- mImmersive = immersive;
+ private void setMenuVisible(boolean menuVisible) {
+ mMenuVisible = menuVisible;
}
private boolean disableEquals(int disabled1, int disabled2) {
@@ -1085,12 +1056,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
// Make it aware of multi-display if needed.
final UiState state = mDisplayUiState.get(DEFAULT_DISPLAY);
return new RegisterStatusBarResult(icons, gatherDisableActionsLocked(mCurrentUserId, 1),
- state.mSystemUiVisibility, state.mImeWindowVis,
+ state.mSystemUiVisibility, state.mMenuVisible, state.mImeWindowVis,
state.mImeBackDisposition, state.mShowImeSwitcher,
gatherDisableActionsLocked(mCurrentUserId, 2),
state.mFullscreenStackSysUiVisibility, state.mDockedStackSysUiVisibility,
state.mImeToken, state.mFullscreenStackBounds, state.mDockedStackBounds,
- state.mNavbarColorManagedByIme, state.mFullscreen, state.mImmersive);
+ state.mNavbarColorManagedByIme);
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 8af33731376f..4c3611e971b4 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -3450,14 +3450,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
return win != null;
}
- void hideTransientBars() {
- // TODO(b/118118435): Remove this after migration
- final int transientFlags = View.STATUS_BAR_TRANSIENT | View.NAVIGATION_BAR_TRANSIENT;
- statusBarVisibilityChanged(mLastStatusBarVisibility & ~transientFlags);
-
- getInsetsPolicy().hideTransient();
- }
-
void statusBarVisibilityChanged(int visibility) {
mLastStatusBarVisibility = visibility;
visibility = getDisplayPolicy().adjustSystemUiVisibilityLw(visibility);
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index f41a34a45d83..60e9819ecbcf 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -30,11 +30,7 @@ import static android.view.InsetsState.TYPE_TOP_GESTURES;
import static android.view.InsetsState.TYPE_TOP_TAPPABLE_ELEMENT;
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_NONE;
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR;
-import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE;
-import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.INPUT_CONSUMER_NAVIGATION;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
@@ -133,7 +129,6 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.util.ArraySet;
-import android.util.IntArray;
import android.util.Pair;
import android.util.PrintWriterPrinter;
import android.util.Slog;
@@ -150,7 +145,6 @@ import android.view.PointerIcon;
import android.view.Surface;
import android.view.View;
import android.view.ViewRootImpl;
-import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManagerGlobal;
@@ -164,7 +158,6 @@ import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.util.ScreenShapeHelper;
import com.android.internal.util.ScreenshotHelper;
import com.android.internal.util.function.TriConsumer;
-import com.android.internal.view.AppearanceRegion;
import com.android.internal.widget.PointerLocationView;
import com.android.server.LocalServices;
import com.android.server.UiThread;
@@ -242,7 +235,7 @@ public class DisplayPolicy {
@Px
private int mSideGestureInset;
- StatusBarManagerInternal getStatusBarManagerInternal() {
+ private StatusBarManagerInternal getStatusBarManagerInternal() {
synchronized (mServiceAcquireLock) {
if (mStatusBarManagerInternal == null) {
mStatusBarManagerInternal =
@@ -334,18 +327,14 @@ public class DisplayPolicy {
private int mForceClearedSystemUiFlags = 0;
private int mLastFullscreenStackSysUiFlags;
private int mLastDockedStackSysUiFlags;
- private int mLastAppearance;
- private int mLastFullscreenAppearance;
- private int mLastDockedAppearance;
private final Rect mNonDockedStackBounds = new Rect();
private final Rect mDockedStackBounds = new Rect();
private final Rect mLastNonDockedStackBounds = new Rect();
private final Rect mLastDockedStackBounds = new Rect();
- // What we last reported to system UI about whether the focused window is fullscreen/immersive.
- private boolean mLastFocusIsFullscreen = false;
- private boolean mLastFocusIsImmersive = false;
-
+ // What we last reported to system UI about whether the compatibility
+ // menu needs to be displayed.
+ private boolean mLastFocusNeedsMenu = false;
// If nonzero, a panic gesture was performed at that time in uptime millis and is still pending.
private long mPendingPanicGestureUptime;
@@ -3056,38 +3045,19 @@ public class DisplayPolicy {
// Swipe-up for navigation bar is disabled during setup
return;
}
- if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) {
- if (swipeTarget == mNavigationBar
- && !getInsetsPolicy().isHidden(InsetsState.TYPE_NAVIGATION_BAR)) {
- // Don't show status bar when swiping on already visible navigation bar
- return;
- }
- final InsetsControlTarget controlTarget =
- swipeTarget.getControllableInsetProvider().getControlTarget();
- if (controlTarget == null) {
+ boolean sb = mStatusBarController.checkShowTransientBarLw();
+ boolean nb = mNavigationBarController.checkShowTransientBarLw()
+ && !isNavBarEmpty(mLastSystemUiFlags);
+ if (sb || nb) {
+ // Don't show status bar when swiping on already visible navigation bar
+ if (!nb && swipeTarget == mNavigationBar) {
+ if (DEBUG) Slog.d(TAG, "Not showing transient bar, wrong swipe target");
return;
}
- if (controlTarget.canShowTransient()) {
- mDisplayContent.getInsetsPolicy().showTransient(IntArray.wrap(
- new int[]{TYPE_TOP_BAR, InsetsState.TYPE_NAVIGATION_BAR}));
- } else {
- controlTarget.showInsets(WindowInsets.Type.systemBars(), false);
- }
- } else {
- boolean sb = mStatusBarController.checkShowTransientBarLw();
- boolean nb = mNavigationBarController.checkShowTransientBarLw()
- && !isNavBarEmpty(mLastSystemUiFlags);
- if (sb || nb) {
- // Don't show status bar when swiping on already visible navigation bar
- if (!nb && swipeTarget == mNavigationBar) {
- if (DEBUG) Slog.d(TAG, "Not showing transient bar, wrong swipe target");
- return;
- }
- if (sb) mStatusBarController.showTransient();
- if (nb) mNavigationBarController.showTransient();
- updateSystemUiVisibilityLw();
- }
+ if (sb) mStatusBarController.showTransient();
+ if (nb) mNavigationBarController.showTransient();
mImmersiveModeConfirmation.confirmCurrentPrompt();
+ updateSystemUiVisibilityLw();
}
}
}
@@ -3108,10 +3078,6 @@ public class DisplayPolicy {
return mService.mPolicy.isKeyguardOccluded();
}
- InsetsPolicy getInsetsPolicy() {
- return mDisplayContent.getInsetsPolicy();
- }
-
void resetSystemUiVisibilityLw() {
mLastSystemUiFlags = 0;
updateSystemUiVisibilityLw();
@@ -3163,20 +3129,14 @@ public class DisplayPolicy {
&= ~PolicyControl.adjustClearableFlags(win, View.SYSTEM_UI_CLEARABLE_FLAGS);
}
- final int appearance = win.mAttrs.insetsFlags.appearance;
final int fullscreenVisibility = updateLightStatusBarLw(0 /* vis */,
mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState);
final int dockedVisibility = updateLightStatusBarLw(0 /* vis */,
mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState);
- final int fullscreenAppearance = updateLightStatusBarAppearanceLw(0 /* vis */,
- mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState);
- final int dockedAppearance = updateLightStatusBarAppearanceLw(0 /* vis */,
- mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState);
mService.getStackBounds(
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, mDockedStackBounds);
- final boolean inSplitScreen = !mDockedStackBounds.isEmpty();
- mService.getStackBounds(inSplitScreen ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
- : WINDOWING_MODE_FULLSCREEN,
+ mService.getStackBounds(mDockedStackBounds.isEmpty()
+ ? WINDOWING_MODE_FULLSCREEN : WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
ACTIVITY_TYPE_UNDEFINED, mNonDockedStackBounds);
final Pair<Integer, Boolean> result =
updateSystemBarsLw(win, mLastSystemUiFlags, tmpVisibility);
@@ -3184,24 +3144,8 @@ public class DisplayPolicy {
final int diff = visibility ^ mLastSystemUiFlags;
final int fullscreenDiff = fullscreenVisibility ^ mLastFullscreenStackSysUiFlags;
final int dockedDiff = dockedVisibility ^ mLastDockedStackSysUiFlags;
- final InsetsPolicy insetsPolicy = getInsetsPolicy();
- final boolean isFullscreen = (visibility & (View.SYSTEM_UI_FLAG_FULLSCREEN
- | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)) != 0
- || (PolicyControl.getWindowFlags(win, win.mAttrs) & FLAG_FULLSCREEN) != 0
- || (mStatusBar != null && insetsPolicy.isHidden(TYPE_TOP_BAR))
- || (mNavigationBar != null && insetsPolicy.isHidden(
- InsetsState.TYPE_NAVIGATION_BAR));
- final int behavior = win.mAttrs.insetsFlags.behavior;
- final boolean isImmersive = (visibility & (View.SYSTEM_UI_FLAG_IMMERSIVE
- | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)) != 0
- || behavior == BEHAVIOR_SHOW_BARS_BY_SWIPE
- || behavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
- if (diff == 0 && fullscreenDiff == 0 && dockedDiff == 0
- && mLastAppearance == appearance
- && mLastFullscreenAppearance == fullscreenAppearance
- && mLastDockedAppearance == dockedAppearance
- && mLastFocusIsFullscreen == isFullscreen
- && mLastFocusIsImmersive == isImmersive
+ final boolean needsMenu = win.getNeedsMenuLw(mTopFullscreenOpaqueWindowState);
+ if (diff == 0 && fullscreenDiff == 0 && dockedDiff == 0 && mLastFocusNeedsMenu == needsMenu
&& mFocusedApp == win.getAppToken()
&& mLastNonDockedStackBounds.equals(mNonDockedStackBounds)
&& mLastDockedStackBounds.equals(mDockedStackBounds)) {
@@ -3210,39 +3154,21 @@ public class DisplayPolicy {
mLastSystemUiFlags = visibility;
mLastFullscreenStackSysUiFlags = fullscreenVisibility;
mLastDockedStackSysUiFlags = dockedVisibility;
- mLastAppearance = appearance;
- mLastFullscreenAppearance = fullscreenAppearance;
- mLastDockedAppearance = dockedAppearance;
- mLastFocusIsFullscreen = isFullscreen;
- mLastFocusIsImmersive = isImmersive;
+ mLastFocusNeedsMenu = needsMenu;
mFocusedApp = win.getAppToken();
mLastNonDockedStackBounds.set(mNonDockedStackBounds);
mLastDockedStackBounds.set(mDockedStackBounds);
final Rect fullscreenStackBounds = new Rect(mNonDockedStackBounds);
final Rect dockedStackBounds = new Rect(mDockedStackBounds);
- final AppearanceRegion[] appearanceRegions = inSplitScreen
- ? new AppearanceRegion[]{
- new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds),
- new AppearanceRegion(dockedAppearance, dockedStackBounds)}
- : new AppearanceRegion[]{
- new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds)};
final boolean isNavbarColorManagedByIme = result.second;
mHandler.post(() -> {
StatusBarManagerInternal statusBar = getStatusBarManagerInternal();
if (statusBar != null) {
final int displayId = getDisplayId();
- // TODO(b/118118435): disabled flags only
statusBar.setSystemUiVisibility(displayId, visibility, fullscreenVisibility,
dockedVisibility, 0xffffffff, fullscreenStackBounds,
dockedStackBounds, isNavbarColorManagedByIme, win.toString());
- if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) {
- statusBar.onSystemBarAppearanceChanged(displayId, appearance,
- appearanceRegions, isNavbarColorManagedByIme);
- }
- statusBar.topAppWindowChanged(displayId, isFullscreen, isImmersive);
-
- // TODO(b/118118435): Remove this after removing system UI visibilities.
- mDisplayContent.statusBarVisibilityChanged(visibility);
+ statusBar.topAppWindowChanged(displayId, needsMenu);
}
});
return diff;
@@ -3264,22 +3190,6 @@ public class DisplayPolicy {
return vis;
}
- private int updateLightStatusBarAppearanceLw(int appearance, WindowState opaque,
- WindowState opaqueOrDimming) {
- final boolean onKeyguard = isStatusBarKeyguard() && !isKeyguardOccluded();
- final WindowState statusColorWin = onKeyguard ? mStatusBar : opaqueOrDimming;
- if (statusColorWin != null && (statusColorWin == opaque || onKeyguard)) {
- // If the top fullscreen-or-dimming window is also the top fullscreen, respect
- // its light flag.
- appearance &= ~APPEARANCE_LIGHT_TOP_BAR;
- appearance |= statusColorWin.mAttrs.insetsFlags.appearance & APPEARANCE_LIGHT_TOP_BAR;
- } else if (statusColorWin != null && statusColorWin.isDimming()) {
- // Otherwise if it's dimming, clear the light flag.
- appearance &= ~APPEARANCE_LIGHT_TOP_BAR;
- }
- return appearance;
- }
-
@VisibleForTesting
@Nullable
static WindowState chooseNavigationColorWindowLw(WindowState opaque,
@@ -3601,8 +3511,6 @@ public class DisplayPolicy {
mPendingPanicGestureUptime = SystemClock.uptimeMillis();
if (!isNavBarEmpty(mLastSystemUiFlags)) {
mNavigationBarController.showTransient();
- mDisplayContent.getInsetsPolicy().showTransient(IntArray.wrap(
- new int[] {InsetsState.TYPE_NAVIGATION_BAR}));
}
}
}
@@ -3680,6 +3588,9 @@ public class DisplayPolicy {
pw.print(" mForceClearedSystemUiFlags=0x");
pw.println(Integer.toHexString(mForceClearedSystemUiFlags));
}
+ if (mLastFocusNeedsMenu) {
+ pw.print(prefix); pw.print("mLastFocusNeedsMenu="); pw.println(mLastFocusNeedsMenu);
+ }
pw.print(prefix); pw.print("mShowingDream="); pw.print(mShowingDream);
pw.print(" mDreamingLockscreen="); pw.print(mDreamingLockscreen);
pw.print(" mDreamingSleepToken="); pw.println(mDreamingSleepToken);
diff --git a/services/core/java/com/android/server/wm/InsetsControlTarget.java b/services/core/java/com/android/server/wm/InsetsControlTarget.java
index c8ce53d444d5..22ba82ace865 100644
--- a/services/core/java/com/android/server/wm/InsetsControlTarget.java
+++ b/services/core/java/com/android/server/wm/InsetsControlTarget.java
@@ -42,11 +42,4 @@ interface InsetsControlTarget {
*/
default void hideInsets(@InsetType int types, boolean fromIme) {
}
-
- /**
- * Returns {@code true} if the control target allows the system to show transient windows.
- */
- default boolean canShowTransient() {
- return false;
- }
}
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index e8e530a73451..2dc50d86eaea 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -16,22 +16,13 @@
package com.android.server.wm;
-import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
-import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.TYPE_TOP_BAR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
import android.annotation.Nullable;
-import android.app.StatusBarManager;
-import android.util.IntArray;
-import android.view.InsetsState;
-import android.view.InsetsState.InternalInsetType;
-import android.view.ViewRootImpl;
/**
* Policy that implements who gets control over the windows generating insets.
@@ -41,12 +32,6 @@ class InsetsPolicy {
private final InsetsStateController mStateController;
private final DisplayContent mDisplayContent;
private final DisplayPolicy mPolicy;
- private final TransientControlTarget mTransientControlTarget = new TransientControlTarget();
- private final IntArray mShowingTransientTypes = new IntArray();
-
- private WindowState mFocusedWin;
- private BarWindow mTopBar = new BarWindow(StatusBarManager.WINDOW_STATUS_BAR);
- private BarWindow mNavBar = new BarWindow(StatusBarManager.WINDOW_NAVIGATION_BAR);
InsetsPolicy(InsetsStateController stateController, DisplayContent displayContent) {
mStateController = stateController;
@@ -56,129 +41,11 @@ class InsetsPolicy {
/** Updates the target which can control system bars. */
void updateBarControlTarget(@Nullable WindowState focusedWin) {
- mFocusedWin = focusedWin;
mStateController.onBarControlTargetChanged(getTopControlTarget(focusedWin),
- getFakeTopControlTarget(focusedWin),
- getNavControlTarget(focusedWin),
- getFakeNavControlTarget(focusedWin));
- mTopBar.setVisible(focusedWin == null
- || focusedWin != getTopControlTarget(focusedWin)
- || focusedWin.getClientInsetsState().getSource(TYPE_TOP_BAR).isVisible());
- mNavBar.setVisible(focusedWin == null
- || focusedWin != getNavControlTarget(focusedWin)
- || focusedWin.getClientInsetsState().getSource(TYPE_NAVIGATION_BAR).isVisible());
- }
-
- boolean isHidden(@InternalInsetType int type) {
- final InsetsSourceProvider provider = mStateController.peekSourceProvider(type);
- return provider != null && provider.hasWindow() && !provider.getSource().isVisible();
- }
-
- void showTransient(IntArray types) {
- boolean changed = false;
- for (int i = types.size() - 1; i >= 0; i--) {
- final int type = types.get(i);
- if (mShowingTransientTypes.indexOf(type) != -1) {
- continue;
- }
- if (!isHidden(type)) {
- continue;
- }
- mShowingTransientTypes.add(type);
- changed = true;
- }
- if (changed) {
- updateBarControlTarget(mFocusedWin);
- mPolicy.getStatusBarManagerInternal().showTransient(mDisplayContent.getDisplayId(),
- mShowingTransientTypes.toArray());
- mStateController.notifyInsetsChanged();
- // TODO(b/118118435): Animation
- }
- }
-
- void hideTransient() {
- if (mShowingTransientTypes.size() == 0) {
- return;
- }
-
- // TODO(b/118118435): Animation
- mShowingTransientTypes.clear();
- updateBarControlTarget(mFocusedWin);
- mStateController.notifyInsetsChanged();
- }
-
- /**
- * @see InsetsStateController#getInsetsForDispatch
- */
- InsetsState getInsetsForDispatch(WindowState target) {
- InsetsState state = mStateController.getInsetsForDispatch(target);
- if (mShowingTransientTypes.size() == 0) {
- return state;
- }
- for (int i = mShowingTransientTypes.size() - 1; i >= 0; i--) {
- state.setSourceVisible(mShowingTransientTypes.get(i), false);
- }
- return state;
- }
-
- void onInsetsModified(WindowState windowState, InsetsState state) {
- mStateController.onInsetsModified(windowState, state);
- checkAbortTransient(windowState, state);
- if (ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL) {
- return;
- }
- if (windowState == getTopControlTarget(mFocusedWin)) {
- mTopBar.setVisible(state.getSource(TYPE_TOP_BAR).isVisible());
- }
- if (windowState == getNavControlTarget(mFocusedWin)) {
- mNavBar.setVisible(state.getSource(TYPE_NAVIGATION_BAR).isVisible());
- }
- }
-
- /**
- * Called when a window modified the insets state. If the window set a insets source to visible
- * while it is shown transiently, we need to abort the transient state.
- *
- * @param windowState who changed the insets state.
- * @param state the modified insets state.
- */
- private void checkAbortTransient(WindowState windowState, InsetsState state) {
- if (mShowingTransientTypes.size() != 0) {
- IntArray abortTypes = new IntArray();
- for (int i = mShowingTransientTypes.size() - 1; i >= 0; i--) {
- final int type = mShowingTransientTypes.get(i);
- if (mStateController.isFakeTarget(type, windowState)
- && state.getSource(type).isVisible()) {
- mShowingTransientTypes.remove(i);
- abortTypes.add(type);
- }
- }
- if (abortTypes.size() > 0) {
- mPolicy.getStatusBarManagerInternal().abortTransient(mDisplayContent.getDisplayId(),
- abortTypes.toArray());
- updateBarControlTarget(mFocusedWin);
- }
- }
- }
-
- private @Nullable InsetsControlTarget getFakeTopControlTarget(@Nullable WindowState focused) {
- if (mShowingTransientTypes.indexOf(TYPE_TOP_BAR) != -1) {
- return focused;
- }
- return null;
- }
-
- private @Nullable InsetsControlTarget getFakeNavControlTarget(@Nullable WindowState focused) {
- if (mShowingTransientTypes.indexOf(TYPE_NAVIGATION_BAR) != -1) {
- return focused;
- }
- return null;
+ getNavControlTarget(focusedWin));
}
private @Nullable InsetsControlTarget getTopControlTarget(@Nullable WindowState focusedWin) {
- if (mShowingTransientTypes.indexOf(TYPE_TOP_BAR) != -1) {
- return mTransientControlTarget;
- }
if (areSystemBarsForciblyVisible() || isStatusBarForciblyVisible()) {
return null;
}
@@ -186,9 +53,6 @@ class InsetsPolicy {
}
private @Nullable InsetsControlTarget getNavControlTarget(@Nullable WindowState focusedWin) {
- if (mShowingTransientTypes.indexOf(TYPE_NAVIGATION_BAR) != -1) {
- return mTransientControlTarget;
- }
if (areSystemBarsForciblyVisible() || isNavBarForciblyVisible()) {
return null;
}
@@ -202,7 +66,7 @@ class InsetsPolicy {
}
final int privateFlags = statusBar.mAttrs.privateFlags;
- // TODO(b/118118435): Pretend to the app that it's still able to control it?
+ // TODO: Pretend to the app that it's still able to control it?
if ((privateFlags & PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT) != 0) {
return true;
}
@@ -236,31 +100,4 @@ class InsetsPolicy {
return isDockedStackVisible || isFreeformStackVisible || isResizing;
}
- private class BarWindow {
-
- private final int mId;
- private @StatusBarManager.WindowVisibleState int mState =
- StatusBarManager.WINDOW_STATE_SHOWING;
-
- BarWindow(int id) {
- mId = id;
- }
-
- private void setVisible(boolean visible) {
- final int state = visible ? WINDOW_STATE_SHOWING : WINDOW_STATE_HIDDEN;
- if (mState != state) {
- mState = state;
- mPolicy.getStatusBarManagerInternal().setWindowState(
- mDisplayContent.getDisplayId(), mId, state);
- }
- }
- }
-
- // TODO(b/118118435): Implement animations for it (with SurfaceAnimator)
- private class TransientControlTarget implements InsetsControlTarget {
-
- @Override
- public void notifyInsetsControlChanged() {
- }
- }
}
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index a7724a11eec2..3731d3f38800 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -111,9 +111,7 @@ class InsetsSourceProvider {
void setWindow(@Nullable WindowState win,
@Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) {
if (mWin != null) {
- if (mControllable) {
- mWin.setControllableInsetProvider(null);
- }
+ mWin.setInsetProvider(null);
// The window may be animating such that we can hand out the leash to the control
// target. Revoke the leash by cancelling the animation to correct the state.
// TODO: Ideally, we should wait for the animation to finish so previous window can
@@ -125,8 +123,8 @@ class InsetsSourceProvider {
if (win == null) {
setServerVisible(false);
mSource.setFrame(new Rect());
- } else if (mControllable) {
- mWin.setControllableInsetProvider(this);
+ } else {
+ mWin.setInsetProvider(this);
if (mControlTarget != null) {
updateControlForTarget(mControlTarget, true /* force */);
}
@@ -134,13 +132,6 @@ class InsetsSourceProvider {
}
/**
- * @return Whether there is a window which backs this source.
- */
- boolean hasWindow() {
- return mWin != null;
- }
-
- /**
* Called when a layout pass has occurred.
*/
void onPostLayout() {
@@ -234,10 +225,6 @@ class InsetsSourceProvider {
return null;
}
- InsetsControlTarget getControlTarget() {
- return mControlTarget;
- }
-
boolean isClientVisible() {
return sNewInsetsMode == NEW_INSETS_MODE_NONE || mClientVisible;
}
@@ -254,13 +241,9 @@ class InsetsSourceProvider {
@Override
public void startAnimation(SurfaceControl animationLeash, Transaction t,
OnAnimationFinishedCallback finishCallback) {
- // TODO(b/118118435): We can remove the type check when implementing the transient bar
- // animation.
- if (mSource.getType() == TYPE_IME) {
- // TODO: use 0 alpha and remove t.hide() once b/138459974 is fixed.
- t.setAlpha(animationLeash, 1 /* alpha */);
- t.hide(animationLeash);
- }
+ // TODO: use 0 alpha and remove t.hide() once b/138459974 is fixed.
+ t.setAlpha(animationLeash, 1 /* alpha */);
+ t.hide(animationLeash);
mCapturedLeash = animationLeash;
final Rect frame = mWin.getWindowFrames().mFrame;
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index e0554242fb29..b0410335c5cd 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.view.InsetsState.InternalInsetType;
import static android.view.InsetsState.TYPE_IME;
import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
import static android.view.InsetsState.TYPE_TOP_BAR;
@@ -30,7 +31,6 @@ import android.util.SparseArray;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
-import android.view.InsetsState.InternalInsetType;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -73,7 +73,7 @@ class InsetsStateController {
* @return The state stripped of the necessary information.
*/
InsetsState getInsetsForDispatch(WindowState target) {
- final InsetsSourceProvider provider = target.getControllableInsetProvider();
+ final InsetsSourceProvider provider = target.getInsetProvider();
if (provider == null) {
return mState;
}
@@ -123,13 +123,6 @@ class InsetsStateController {
}
/**
- * @return The provider of a specific type or null if we don't have it.
- */
- @Nullable InsetsSourceProvider peekSourceProvider(@InternalInsetType int type) {
- return mProviders.get(type);
- }
-
- /**
* Called when a layout pass has occurred.
*/
void onPostLayout() {
@@ -159,10 +152,6 @@ class InsetsStateController {
}
}
- boolean isFakeTarget(@InternalInsetType int type, InsetsControlTarget target) {
- return mTypeFakeControlTargetMap.get(type) == target;
- }
-
void onImeTargetChanged(@Nullable InsetsControlTarget imeTarget) {
onControlChanged(TYPE_IME, imeTarget);
notifyPendingInsetsControlChanged();
@@ -177,13 +166,9 @@ class InsetsStateController {
* and visibility.
*/
void onBarControlTargetChanged(@Nullable InsetsControlTarget topControlling,
- @Nullable InsetsControlTarget fakeTopControlling,
- @Nullable InsetsControlTarget navControlling,
- @Nullable InsetsControlTarget fakeNavControlling) {
+ @Nullable InsetsControlTarget navControlling) {
onControlChanged(TYPE_TOP_BAR, topControlling);
onControlChanged(TYPE_NAVIGATION_BAR, navControlling);
- onControlFakeTargetChanged(TYPE_TOP_BAR, fakeTopControlling);
- onControlFakeTargetChanged(TYPE_NAVIGATION_BAR, fakeNavControlling);
notifyPendingInsetsControlChanged();
}
@@ -294,7 +279,7 @@ class InsetsStateController {
});
}
- void notifyInsetsChanged() {
+ private void notifyInsetsChanged() {
mDisplayContent.forAllWindows(mDispatchInsetsChanged, true /* traverseTopToBottom */);
}
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 06e7d665bb42..b047d8f8a7b9 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -465,8 +465,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
final WindowState windowState = mService.windowForClientLocked(this, window,
false /* throwOnError */);
if (windowState != null) {
- windowState.setClientInsetsState(state);
- windowState.getDisplayContent().getInsetsPolicy().onInsetsModified(
+ windowState.getDisplayContent().getInsetsStateController().onInsetsModified(
windowState, state);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 56ff064494fa..c48528042348 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1663,7 +1663,7 @@ public class WindowManagerService extends IWindowManager.Stub
outFrame, outContentInsets, outStableInsets, outOutsets, outDisplayCutout)) {
res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_SYSTEM_BARS;
}
- outInsetsState.set(displayContent.getInsetsPolicy().getInsetsForDispatch(win));
+ outInsetsState.set(displayContent.getInsetsStateController().getInsetsForDispatch(win));
if (mInTouchMode) {
res |= WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE;
@@ -2356,7 +2356,7 @@ public class WindowManagerService extends IWindowManager.Stub
outStableInsets, outOutsets);
outCutout.set(win.getWmDisplayCutout().getDisplayCutout());
outBackdropFrame.set(win.getBackdropFrame(win.getFrameLw()));
- outInsetsState.set(displayContent.getInsetsPolicy().getInsetsForDispatch(win));
+ outInsetsState.set(displayContent.getInsetsStateController().getInsetsForDispatch(win));
if (DEBUG) {
Slog.v(TAG_WM, "Relayout given client " + client.asBinder()
+ ", requestedWidth=" + requestedWidth
@@ -5574,20 +5574,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
- public void hideTransientBars(int displayId) {
- mAtmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
- "hideTransientBars()");
- synchronized (mGlobalLock) {
- final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
- if (displayContent != null) {
- displayContent.hideTransientBars();
- } else {
- Slog.w(TAG, "hideTransientBars with invalid displayId=" + displayId);
- }
- }
- }
-
- @Override
public void setForceShowSystemBars(boolean show) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
!= PackageManager.PERMISSION_GRANTED) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 3ec949f94783..7ff9b7057653 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -31,7 +31,6 @@ import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE;
-import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
@@ -192,7 +191,6 @@ import android.view.InputChannel;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.InputWindowHandle;
-import android.view.InsetsState;
import android.view.Surface.Rotation;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
@@ -635,20 +633,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
private boolean mIsDimming = false;
- private @Nullable InsetsSourceProvider mControllableInsetProvider;
- private InsetsState mClientInsetsState = new InsetsState();
+ private @Nullable InsetsSourceProvider mInsetProvider;
private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f;
private KeyInterceptionInfo mKeyInterceptionInfo;
- InsetsState getClientInsetsState() {
- return mClientInsetsState;
- }
-
- void setClientInsetsState(InsetsState state) {
- mClientInsetsState = state;
- }
-
void seamlesslyRotateIfAllowed(Transaction transaction, @Rotation int oldRotation,
@Rotation int rotation, boolean requested) {
// Invisible windows and the wallpaper do not participate in the seamless rotation animation
@@ -1503,8 +1492,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return wouldBeVisibleIfPolicyIgnored() && isVisibleByPolicy()
// If we don't have a provider, this window isn't used as a window generating
// insets, so nobody can hide it over the inset APIs.
- && (mControllableInsetProvider == null
- || mControllableInsetProvider.isClientVisible());
+ && (mInsetProvider == null || mInsetProvider.isClientVisible());
}
/**
@@ -3362,7 +3350,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void notifyInsetsChanged() {
try {
mClient.insetsChanged(
- getDisplayContent().getInsetsPolicy().getInsetsForDispatch(this));
+ getDisplayContent().getInsetsStateController().getInsetsForDispatch(this));
} catch (RemoteException e) {
Slog.w(TAG, "Failed to deliver inset state change", e);
}
@@ -3372,9 +3360,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
public void notifyInsetsControlChanged() {
final InsetsStateController stateController =
getDisplayContent().getInsetsStateController();
- final InsetsPolicy policy = getDisplayContent().getInsetsPolicy();
try {
- mClient.insetsControlChanged(policy.getInsetsForDispatch(this),
+ mClient.insetsControlChanged(stateController.getInsetsForDispatch(this),
stateController.getControlsForDispatch(this));
} catch (RemoteException e) {
Slog.w(TAG, "Failed to deliver inset state change", e);
@@ -3399,11 +3386,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
- @Override
- public boolean canShowTransient() {
- return (mAttrs.insetsFlags.behavior & BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) != 0;
- }
-
Rect getBackdropFrame(Rect frame) {
// When the task is docked, we send fullscreen sized backDropFrame as soon as resizing
// start even if we haven't received the relayout window, so that the client requests
@@ -4832,7 +4814,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void startAnimation(Animation anim) {
// If we are an inset provider, all our animations are driven by the inset client.
- if (mControllableInsetProvider != null) {
+ if (mInsetProvider != null && mInsetProvider.isControllable()) {
return;
}
@@ -4852,7 +4834,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private void startMoveAnimation(int left, int top) {
// If we are an inset provider, all our animations are driven by the inset client.
- if (mControllableInsetProvider != null) {
+ if (mInsetProvider != null && mInsetProvider.isControllable()) {
return;
}
@@ -5336,22 +5318,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mWindowFrames.setContentChanged(false);
}
- /**
- * Set's an {@link InsetsSourceProvider} to be associated with this window, but only if the
- * provider itself is controllable, as one window can be the provider of more than one inset
- * type (i.e. gesture insets). If this window is controllable, all its animations must be
- * controlled by its control target, and the visibility of this window should be taken account
- * into the state of the control target.
- *
- * @param insetProvider the provider which should not be visible to the client.
- * @see InsetsStateController#getInsetsForDispatch(WindowState)
- */
- void setControllableInsetProvider(InsetsSourceProvider insetProvider) {
- mControllableInsetProvider = insetProvider;
+ void setInsetProvider(InsetsSourceProvider insetProvider) {
+ mInsetProvider = insetProvider;
}
- InsetsSourceProvider getControllableInsetProvider() {
- return mControllableInsetProvider;
+ InsetsSourceProvider getInsetProvider() {
+ return mInsetProvider;
}
private final class MoveAnimationSpec implements AnimationSpec {
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index 8c2ae5a7659a..f3a8e1a0bd5e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -19,7 +19,6 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.view.InsetsState.TYPE_TOP_BAR;
import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
@@ -33,9 +32,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import android.platform.test.annotations.Presubmit;
-import android.util.IntArray;
import android.view.InsetsSourceControl;
-import android.view.InsetsState;
import android.view.test.InsetsModeSession;
import androidx.test.filters.FlakyTest;
@@ -154,91 +151,6 @@ public class InsetsPolicyTest extends WindowTestsBase {
assertEquals(1, controls.length);
}
- @Test
- public void testShowTransientBars_bothCanBeTransient_appGetsBothFakeControls() {
- addWindow(TYPE_STATUS_BAR, "topBar")
- .getControllableInsetProvider().getSource().setVisible(false);
- addWindow(TYPE_NAVIGATION_BAR, "navBar")
- .getControllableInsetProvider().getSource().setVisible(false);
- final WindowState app = addWindow(TYPE_APPLICATION, "app");
-
- final InsetsPolicy policy = mDisplayContent.getInsetsPolicy();
- policy.updateBarControlTarget(app);
- policy.showTransient(
- IntArray.wrap(new int[]{TYPE_TOP_BAR, InsetsState.TYPE_NAVIGATION_BAR}));
- final InsetsSourceControl[] controls =
- mDisplayContent.getInsetsStateController().getControlsForDispatch(app);
-
- // The app must get both fake controls.
- assertEquals(2, controls.length);
- for (int i = controls.length - 1; i >= 0; i--) {
- assertNull(controls[i].getLeash());
- }
- }
-
- @Test
- public void testShowTransientBars_topCanBeTransient_appGetsTopFakeControl() {
- addWindow(TYPE_STATUS_BAR, "topBar")
- .getControllableInsetProvider().getSource().setVisible(false);
- addWindow(TYPE_NAVIGATION_BAR, "navBar")
- .getControllableInsetProvider().getSource().setVisible(true);
- final WindowState app = addWindow(TYPE_APPLICATION, "app");
-
- final InsetsPolicy policy = mDisplayContent.getInsetsPolicy();
- policy.updateBarControlTarget(app);
- policy.showTransient(
- IntArray.wrap(new int[]{TYPE_TOP_BAR, InsetsState.TYPE_NAVIGATION_BAR}));
- final InsetsSourceControl[] controls =
- mDisplayContent.getInsetsStateController().getControlsForDispatch(app);
-
- // The app must get the fake control of the top bar, and must get the real control of the
- // navigation bar.
- assertEquals(2, controls.length);
- for (int i = controls.length - 1; i >= 0; i--) {
- final InsetsSourceControl control = controls[i];
- if (control.getType() == TYPE_TOP_BAR) {
- assertNull(controls[i].getLeash());
- } else {
- assertNotNull(controls[i].getLeash());
- }
- }
- }
-
- @Test
- public void testAbortTransientBars_bothCanBeAborted_appGetsBothRealControls() {
- addWindow(TYPE_STATUS_BAR, "topBar")
- .getControllableInsetProvider().getSource().setVisible(false);
- addWindow(TYPE_NAVIGATION_BAR, "navBar")
- .getControllableInsetProvider().getSource().setVisible(false);
- final WindowState app = addWindow(TYPE_APPLICATION, "app");
-
- final InsetsPolicy policy = mDisplayContent.getInsetsPolicy();
- policy.updateBarControlTarget(app);
- policy.showTransient(
- IntArray.wrap(new int[]{TYPE_TOP_BAR, InsetsState.TYPE_NAVIGATION_BAR}));
- InsetsSourceControl[] controls =
- mDisplayContent.getInsetsStateController().getControlsForDispatch(app);
-
- // The app must get both fake controls.
- assertEquals(2, controls.length);
- for (int i = controls.length - 1; i >= 0; i--) {
- assertNull(controls[i].getLeash());
- }
-
- final InsetsState state = policy.getInsetsForDispatch(app);
- state.setSourceVisible(TYPE_TOP_BAR, true);
- state.setSourceVisible(InsetsState.TYPE_NAVIGATION_BAR, true);
- policy.onInsetsModified(app, state);
-
- controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(app);
-
- // The app must get both real controls.
- assertEquals(2, controls.length);
- for (int i = controls.length - 1; i >= 0; i--) {
- assertNotNull(controls[i].getLeash());
- }
- }
-
private WindowState addWindow(int type, String name) {
final WindowState win = createWindow(null, type, name);
mDisplayContent.getDisplayPolicy().addWindowLw(win, win.mAttrs);
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 011161b4f063..81ea32bb4f73 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -66,7 +66,7 @@ public class InsetsStateControllerTest extends WindowTestsBase {
final WindowState topBar = createWindow(null, TYPE_APPLICATION, "topBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null);
- topBar.setControllableInsetProvider(getController().getSourceProvider(TYPE_TOP_BAR));
+ topBar.setInsetProvider(getController().getSourceProvider(TYPE_TOP_BAR));
assertNotNull(getController().getInsetsForDispatch(app).getSource(TYPE_TOP_BAR));
}
@@ -75,7 +75,7 @@ public class InsetsStateControllerTest extends WindowTestsBase {
final WindowState topBar = createWindow(null, TYPE_APPLICATION, "topBar");
mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR)
.setWindow(topBar, null);
- topBar.setControllableInsetProvider(getController().getSourceProvider(TYPE_TOP_BAR));
+ topBar.setInsetProvider(getController().getSourceProvider(TYPE_TOP_BAR));
final InsetsState state = getController().getInsetsForDispatch(topBar);
for (int i = state.getSourcesCount() - 1; i >= 0; i--) {
final InsetsSource source = state.sourceAt(i);
@@ -101,7 +101,7 @@ public class InsetsStateControllerTest extends WindowTestsBase {
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null);
getController().getSourceProvider(TYPE_NAVIGATION_BAR).setWindow(navBar, null);
- getController().onBarControlTargetChanged(app, null, app, null);
+ getController().onBarControlTargetChanged(app, app);
InsetsSourceControl[] controls = getController().getControlsForDispatch(app);
assertEquals(2, controls.length);
}
@@ -111,9 +111,9 @@ public class InsetsStateControllerTest extends WindowTestsBase {
final WindowState topBar = createWindow(null, TYPE_APPLICATION, "topBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null);
- getController().onBarControlTargetChanged(app, null, null, null);
+ getController().onBarControlTargetChanged(app, null);
assertNotNull(getController().getControlsForDispatch(app));
- getController().onBarControlTargetChanged(null, null, null, null);
+ getController().onBarControlTargetChanged(null, null);
assertNull(getController().getControlsForDispatch(app));
}
@@ -123,7 +123,7 @@ public class InsetsStateControllerTest extends WindowTestsBase {
final WindowState topBar = createWindow(null, TYPE_APPLICATION, "topBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
getController().getSourceProvider(TYPE_TOP_BAR).setWindow(topBar, null);
- getController().onBarControlTargetChanged(app, null, null, null);
+ getController().onBarControlTargetChanged(app, null);
assertNotNull(getController().getControlsForDispatch(app));
topBar.cancelAnimation();
assertNull(getController().getControlsForDispatch(app));
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index 447880a0f019..a09253ab31f0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -397,15 +397,14 @@ public class WindowStateTests extends WindowTestsBase {
}
@Test
- public void testVisibleWithInsetsProvider() {
+ public void testVisibleWithInsetsProvider() throws Exception {
final WindowState topBar = createWindow(null, TYPE_STATUS_BAR, "topBar");
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
topBar.mHasSurface = true;
assertTrue(topBar.isVisible());
mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR)
- .setWindow(topBar, null /* frameProvider */);
- mDisplayContent.getInsetsStateController().onBarControlTargetChanged(
- app, null /* fakeTopControlling */, app, null /* fakeNavControlling */);
+ .setWindow(topBar, null);
+ mDisplayContent.getInsetsStateController().onBarControlTargetChanged(app, app);
mDisplayContent.getInsetsStateController().getSourceProvider(TYPE_TOP_BAR)
.onInsetsModified(app, new InsetsSource(TYPE_TOP_BAR));
waitUntilHandlersIdle();
diff --git a/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java b/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
index 957216e17925..c9e3404e0f1a 100644
--- a/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
+++ b/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
@@ -41,7 +41,6 @@ public final class FrameworksTestsFilter extends SelectTest {
"android.view.DisplayCutoutTest",
"android.view.InsetsAnimationControlImplTest",
"android.view.InsetsControllerTest",
- "android.view.InsetsFlagsTest",
"android.view.InsetsSourceTest",
"android.view.InsetsSourceConsumerTest",
"android.view.InsetsStateTest",