OSDN Git Service

IME navigation guard implemented as a View.
authorJohn Spurlock <jspurlock@google.com>
Thu, 10 Oct 2013 14:27:44 +0000 (10:27 -0400)
committerJohn Spurlock <jspurlock@google.com>
Thu, 10 Oct 2013 16:54:05 +0000 (12:54 -0400)
Instead of a custom onDraw in order to stay 100% in sync with abrupt
layout changes.

Also use the unrestricted layout bottom to avoid unnecessary
fitSystemWindows churn.

Bug:11162351
Change-Id: If9bb9a52d503e348d642bf1238f75c4a418ad805

core/java/com/android/internal/inputmethod/InputMethodRoot.java
core/res/res/layout/input_method.xml
core/res/res/values/symbols.xml
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

index f070a58..40a424b 100644 (file)
 package com.android.internal.inputmethod;
 
 import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.graphics.Rect;
 import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
 import android.widget.LinearLayout;
 
 public class InputMethodRoot extends LinearLayout {
-    private final Rect mGuardRect = new Rect();
-    private final Paint mGuardPaint = new Paint();
+
+    private View mNavigationGuard;
 
     public InputMethodRoot(Context context) {
         this(context, null);
@@ -37,25 +37,19 @@ public class InputMethodRoot extends LinearLayout {
 
     public InputMethodRoot(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs);
-        setWillNotDraw(false);
-        mGuardPaint.setColor(context.getResources()
-                .getColor(com.android.internal.R.color.input_method_navigation_guard));
     }
 
     @Override
     protected boolean fitSystemWindows(Rect insets) {
-        setPadding(0, 0, 0, insets.bottom);
+        if (mNavigationGuard == null) {
+            mNavigationGuard = findViewById(com.android.internal.R.id.navigationGuard);
+        }
+        if (mNavigationGuard == null) {
+            return super.fitSystemWindows(insets);
+        }
+        ViewGroup.LayoutParams lp = mNavigationGuard.getLayoutParams();
+        lp.height = insets.bottom;
+        mNavigationGuard.setLayoutParams(lp);
         return true;
     }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        // draw navigation bar guard
-        final int w = getMeasuredWidth();
-        final int h = getMeasuredHeight();
-        mGuardRect.set(0, h - getPaddingBottom(), w, h);
-        canvas.drawRect(mGuardRect, mGuardPaint);
-    }
 }
index 23d7189..00a3990 100644 (file)
@@ -52,4 +52,9 @@
         android:layout_height="wrap_content"
         android:visibility="gone">
     </FrameLayout>
+
+    <View android:id="@+id/navigationGuard"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:background="@+color/input_method_navigation_guard"/>
 </com.android.internal.inputmethod.InputMethodRoot>
index edfdcc2..adcb3fb 100644 (file)
   <java-symbol type="id" name="month" />
   <java-symbol type="id" name="month_name" />
   <java-symbol type="id" name="name" />
+  <java-symbol type="id" name="navigationGuard" />
   <java-symbol type="id" name="next" />
   <java-symbol type="id" name="next_button" />
   <java-symbol type="id" name="new_app_action" />
index e9e3b27..225bb94 100644 (file)
@@ -2992,7 +2992,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             pf.top = df.top = of.top = cf.top = vf.top = mDockTop;
             pf.right = df.right = of.right = cf.right = vf.right = mDockRight;
             // IM dock windows layout below the nav bar...
-            pf.bottom = df.bottom = of.bottom = mRestrictedScreenTop + mRestrictedScreenHeight;
+            pf.bottom = df.bottom = of.bottom = mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
             // ...with content insets above the nav bar
             cf.bottom = vf.bottom = mStableBottom;
             // IM dock windows always go to the bottom of the screen.