Optimize keyguard/IME interactions
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
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user