OSDN Git Service

Optimize keyguard/IME interactions
authorAdam Powell <adamp@google.com>
Mon, 5 Nov 2012 22:16:59 +0000 (14:16 -0800)
committerAdam Powell <adamp@google.com>
Mon, 5 Nov 2012 22:26:33 +0000 (14:26 -0800)
Change the keyguard window to LAYOUT_IN_SCREEN | LAYOUT_INSET_DECOR
and make the ViewManagerHost fitSystemWindows. This eliminates the
need to resize the actual window and associated surfaces when the IME
comes and goes.

Force the widget pager to measure at the fullscreen size of the
keyguard, even if the IME is showing. This causes the widgets to clip
instead of resize, removing a few more moving parts that can be
distracting/affect performance.

Partially improves bug 7427586

Change-Id: I0d86d0ca8045f737fa97ca5d1e7f6a49f746b999

policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java
policy/src/com/android/internal/policy/impl/keyguard/SlidingChallengeLayout.java

index 7c117d9..6d88652 100644 (file)
@@ -122,6 +122,7 @@ public class KeyguardViewManager {
     class ViewManagerHost extends FrameLayout {
         public ViewManagerHost(Context context) {
             super(context);
+            setFitsSystemWindows(true);
         }
 
         @Override
@@ -164,7 +165,8 @@ public class KeyguardViewManager {
 
             mKeyguardHost = new ViewManagerHost(mContext);
 
-            int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
+            int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                    | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
                     | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
 
             if (!mNeedsInput) {
index 2712494..f98ba35 100644 (file)
@@ -29,6 +29,7 @@ import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.util.DisplayMetrics;
 import android.util.FloatProperty;
 import android.util.Log;
 import android.util.Property;
@@ -64,6 +65,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
     private Drawable mFrameDrawable;
     private boolean mEdgeCaptured;
 
+    private DisplayMetrics mDisplayMetrics;
+
     // Initialized during measurement from child layoutparams
     private View mExpandChallengeView;
     private KeyguardSecurityContainer mChallengeView;
@@ -264,7 +267,8 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
         mTouchSlopSquare = mTouchSlop * mTouchSlop;
 
-        final float density = res.getDisplayMetrics().density;
+        mDisplayMetrics = res.getDisplayMetrics();
+        final float density = mDisplayMetrics.density;
 
         // top half of the lock icon, plus another 25% to be sure
         mDragHandleClosedAbove = (int) (DRAG_HANDLE_CLOSED_ABOVE * density + 0.5f);
@@ -887,9 +891,27 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout
                 continue;
             }
             // Don't measure the challenge view twice!
-            if (child != mChallengeView) {
-                measureChildWithMargins(child, widthSpec, 0, heightSpec, 0);
+            if (child == mChallengeView) continue;
+
+            // Measure children. Widget frame measures special, so that we can ignore
+            // insets for the IME.
+            int parentWidthSpec = widthSpec, parentHeightSpec = heightSpec;
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            if (lp.childType == LayoutParams.CHILD_TYPE_WIDGETS) {
+                final View root = getRootView();
+                if (root != null) {
+                    // This calculation is super dodgy and relies on several assumptions.
+                    // Specifically that the root of the window will be padded in for insets
+                    // and that the window is LAYOUT_IN_SCREEN.
+                    final int windowWidth = mDisplayMetrics.widthPixels;
+                    final int windowHeight = mDisplayMetrics.heightPixels - root.getPaddingTop();
+                    parentWidthSpec = MeasureSpec.makeMeasureSpec(
+                            windowWidth, MeasureSpec.EXACTLY);
+                    parentHeightSpec = MeasureSpec.makeMeasureSpec(
+                            windowHeight, MeasureSpec.EXACTLY);
+                }
             }
+            measureChildWithMargins(child, parentWidthSpec, 0, parentHeightSpec, 0);
         }
     }