summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/InsetsSourceConsumer.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java9
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java17
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java4
-rw-r--r--services/core/java/com/android/server/wm/InsetsPolicy.java11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java33
8 files changed, 72 insertions, 39 deletions
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index ddfd38c0320b..9901d053184c 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -181,8 +181,9 @@ public class InsetsSourceConsumer {
}
private void applyHiddenToControl() {
- if (mSourceControl == null || mSourceControl.getLeash() == null
- || mController.getAnimationType(mType) != ANIMATION_TYPE_NONE) {
+
+ // TODO: Handle case properly when animation is running already (it shouldn't!)
+ if (mSourceControl == null || mSourceControl.getLeash() == null) {
return;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
index ed1cd8191092..d5a08dda9853 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
@@ -409,15 +409,6 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback {
mAudioManager.dispatchMediaKeyEvent(keyEvent);
}
- @Override
- public void dispatchSystemUiVisibilityChanged(int visibility) {
- super.dispatchSystemUiVisibilityChanged(visibility);
-
- if (!(mContext instanceof Activity)) {
- setSystemUiVisibility(STATUS_BAR_DISABLE_BACK);
- }
- }
-
/**
* In general, we enable unlocking the insecure keyguard with the menu key. However, there are
* some cases where we wish to disable it, notably when the menu button placement or technology
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index ae787260adca..29c67ae1b4a6 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -15,7 +15,12 @@
*/
package com.android.keyguard;
+import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
+import static android.view.ViewRootImpl.sNewInsetsMode;
+import static android.view.WindowInsets.Type.ime;
+import static android.view.WindowInsets.Type.systemBars;
import static com.android.systemui.DejankUtils.whitelistIpcs;
+import static java.lang.Integer.max;
import android.app.Activity;
import android.app.AlertDialog;
@@ -38,6 +43,7 @@ import android.view.SurfaceControl;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
+import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.FrameLayout;
@@ -339,13 +345,22 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
}
@Override
- protected boolean fitSystemWindows(Rect insets) {
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+
// Consume bottom insets because we're setting the padding locally (for IME and navbar.)
- setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), insets.bottom);
- insets.bottom = 0;
- return false;
+ int inset;
+ if (sNewInsetsMode == NEW_INSETS_MODE_FULL) {
+ int bottomInset = insets.getInsetsIgnoringVisibility(systemBars()).bottom;
+ int imeInset = insets.getInsets(ime()).bottom;
+ inset = max(bottomInset, imeInset);
+ } else {
+ inset = insets.getSystemWindowInsetBottom();
+ }
+ setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), inset);
+ return insets.inset(0, 0, 0, inset);
}
+
private void showDialog(String title, String message) {
if (mAlertDialog != null) {
mAlertDialog.dismiss();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java
index 3af80387778b..10b68b9a518d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java
@@ -16,8 +16,10 @@
package com.android.systemui.statusbar.phone;
+import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
import static com.android.systemui.DejankUtils.whitelistIpcs;
import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT;
@@ -180,6 +182,13 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
mLp.setTitle("NotificationShade");
mLp.packageName = mContext.getPackageName();
mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+ // We use BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE here, however, there is special logic in
+ // window manager which disables the transient show behavior.
+ // TODO: Clean this up once that behavior moves into the Shell.
+ mLp.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
+ mLp.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
+
mWindowManager.addView(mNotificationShadeView, mLp);
mLpChanged.copyFrom(mLp);
onThemeChanged();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 86a81ce3d1f1..6a046884e835 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -16,6 +16,9 @@
package com.android.systemui.statusbar.phone;
+import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
+import static android.view.ViewRootImpl.sNewInsetsMode;
+import static android.view.WindowInsets.Type.navigationBars;
import static com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_FADING;
import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
@@ -789,7 +792,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
@Override
public void run() {
- mStatusBar.getNavigationBarView().getRootView().setVisibility(View.VISIBLE);
+ if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) {
+ mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
+ .show(navigationBars());
+ } else {
+ mStatusBar.getNavigationBarView().getRootView().setVisibility(View.VISIBLE);
+ }
}
};
@@ -856,7 +864,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
} else {
mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
- mStatusBar.getNavigationBarView().getRootView().setVisibility(View.GONE);
+ if (sNewInsetsMode == NEW_INSETS_MODE_FULL) {
+ mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
+ .hide(navigationBars());
+ } else {
+ mStatusBar.getNavigationBarView().getRootView().setVisibility(View.GONE);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index f8df883a3e1c..cf64695cb9a2 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -3056,7 +3056,9 @@ public class DisplayPolicy {
}
final InsetsControlTarget controlTarget =
swipeTarget.getControllableInsetProvider().getControlTarget();
- if (controlTarget == null) {
+
+ // No transient mode on lockscreen (in notification shade window).
+ if (controlTarget == null || controlTarget == getNotificationShade()) {
return;
}
if (controlTarget.canShowTransient()) {
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index fa764e3dfc18..2d4211aa16d8 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -187,6 +187,10 @@ class InsetsPolicy {
if (mShowingTransientTypes.indexOf(ITYPE_STATUS_BAR) != -1) {
return mTransientControlTarget;
}
+ if (focusedWin == mPolicy.getNotificationShade()) {
+ // Notification shade has control anyways, no reason to force anything.
+ return focusedWin;
+ }
if (areSystemBarsForciblyVisible() || isKeyguardOrStatusBarForciblyVisible()) {
return null;
}
@@ -197,6 +201,10 @@ class InsetsPolicy {
if (mShowingTransientTypes.indexOf(ITYPE_NAVIGATION_BAR) != -1) {
return mTransientControlTarget;
}
+ if (focusedWin == mPolicy.getNotificationShade()) {
+ // Notification shade has control anyways, no reason to force anything.
+ return focusedWin;
+ }
if (areSystemBarsForciblyVisible() || isNavBarForciblyVisible()) {
return null;
}
@@ -204,9 +212,6 @@ class InsetsPolicy {
}
private boolean isKeyguardOrStatusBarForciblyVisible() {
- if (mPolicy.isKeyguardShowing()) {
- return true;
- }
final WindowState statusBar = mPolicy.getStatusBar();
if (statusBar != null) {
// TODO(b/118118435): Pretend to the app that it's still able to control it?
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 c3bead7162e6..e71225579989 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -119,18 +119,6 @@ public class InsetsPolicyTest extends WindowTestsBase {
assertNull(controls);
}
- @Test
- public void testControlsForDispatch_keyguard() {
- addWindow(TYPE_NOTIFICATION_SHADE, "notificationShade");
- addWindow(TYPE_NAVIGATION_BAR, "navBar");
- mockKeyguardShowing();
-
- final InsetsSourceControl[] controls = addAppWindowAndGetControlsForDispatch();
- // The app must not control the top bar.
- assertNotNull(controls);
- assertEquals(1, controls.length);
- }
-
// TODO: adjust this test if we pretend to the app that it's still able to control it.
@Test
public void testControlsForDispatch_forceStatusBarVisible() {
@@ -159,6 +147,21 @@ public class InsetsPolicyTest extends WindowTestsBase {
}
@Test
+ public void testControlsForDispatch_statusBarForceShowNavigation_butFocusedAnyways() {
+ WindowState notifShade = addWindow(TYPE_NOTIFICATION_SHADE, "notificationShade");
+ notifShade.mAttrs.privateFlags |= PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
+ addWindow(TYPE_NAVIGATION_BAR, "navBar");
+
+ mDisplayContent.getInsetsPolicy().updateBarControlTarget(notifShade);
+ InsetsSourceControl[] controls
+ = mDisplayContent.getInsetsStateController().getControlsForDispatch(notifShade);
+
+ // The app controls the navigation bar.
+ assertNotNull(controls);
+ assertEquals(1, controls.length);
+ }
+
+ @Test
public void testShowTransientBars_bothCanBeTransient_appGetsBothFakeControls() {
addWindow(TYPE_STATUS_BAR, "statusBar")
.getControllableInsetProvider().getSource().setVisible(false);
@@ -260,10 +263,4 @@ public class InsetsPolicyTest extends WindowTestsBase {
mDisplayContent.getInsetsPolicy().updateBarControlTarget(win);
return mDisplayContent.getInsetsStateController().getControlsForDispatch(win);
}
-
- private void mockKeyguardShowing() {
- final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
- spyOn(displayPolicy);
- doReturn(true).when(displayPolicy).isKeyguardShowing();
- }
}