OSDN Git Service

Omit NavigationGuard if the input method uses FLAG_LAYOUT_IN_OVERSCAN
authorMark Renouf <mrenouf@google.com>
Thu, 5 Jan 2017 17:44:50 +0000 (12:44 -0500)
committerMark Renouf <mrenouf@google.com>
Thu, 5 Jan 2017 18:52:59 +0000 (13:52 -0500)
In some cases (e.g. Android Wear) SystemWindowInsets can be non-zero
due to overscan layout hints even when no SystemUI is present.

This change resepects the overscan flag on input method windows
allowing an IME to opt-out of the navigation bar guard and receive
full-height content view.

BUG: 32700226
Change-Id: Ic38f204a892bf34e8dae65990d5aa8c95af555d8

core/java/com/android/internal/policy/DecorView.java

index 92ab324..8dfdc6a 100644 (file)
@@ -96,6 +96,7 @@ import static android.view.Window.DECOR_CAPTION_SHADE_LIGHT;
 import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
 import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
+import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
 import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
 import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
@@ -969,7 +970,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         mFrameOffsets.set(insets.getSystemWindowInsets());
         insets = updateColorViews(insets, true /* animate */);
         insets = updateStatusGuard(insets);
-        updateNavigationGuard(insets);
+        insets = updateNavigationGuard(insets);
         if (getForeground() != null) {
             drawableChanged();
         }
@@ -1329,9 +1330,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         return insets;
     }
 
-    private void updateNavigationGuard(WindowInsets insets) {
-        // IMEs lay out below the nav bar, but the content view must not (for back compat)
-        if (mWindow.getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD) {
+    private WindowInsets updateNavigationGuard(WindowInsets insets) {
+        // IME windows lay out below the nav bar, but the content view must not (for back compat)
+        // Only make this adjustment if the window is not requesting layout in overscan
+        if (mWindow.getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD
+                && (mWindow.getAttributes().flags & FLAG_LAYOUT_IN_OVERSCAN) == 0) {
             // prevent the content view from including the nav bar height
             if (mWindow.mContentParent != null) {
                 if (mWindow.mContentParent.getLayoutParams() instanceof MarginLayoutParams) {
@@ -1356,7 +1359,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
                 mNavigationGuard.setLayoutParams(lp);
             }
             updateNavigationGuardColor();
+            insets = insets.consumeSystemWindowInsets(
+                    false, false, false, true /* bottom */);
         }
+        return insets;
     }
 
     void updateNavigationGuardColor() {