diff options
Diffstat (limited to 'policy/src')
-rw-r--r-- | policy/src/com/android/internal/policy/impl/PhoneWindow.java | 68 |
1 files changed, 62 insertions, 6 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 1745bc7..44fc1f8 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -1922,7 +1922,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private PopupWindow mActionModePopup; private Runnable mShowActionModePopup; - // View added at runtime to IME windows to cover the navigation bar + // View added at runtime to draw under the status bar area + private View mStatusGuard; + // View added at runtime to draw under the navigation bar area private View mNavigationGuard; public DecorView(Context context, int featureId) { @@ -2484,7 +2486,64 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override protected boolean fitSystemWindows(Rect insets) { mFrameOffsets.set(insets); + updateStatusGuard(insets); + updateNavigationGuard(insets); + if (getForeground() != null) { + drawableChanged(); + } + return super.fitSystemWindows(insets); + } + private void updateStatusGuard(Rect insets) { + boolean showStatusGuard = false; + // Show the status guard when the non-overlay contextual action bar is showing + if (mActionModeView != null) { + if (mActionModeView.getLayoutParams() instanceof MarginLayoutParams) { + MarginLayoutParams mlp = (MarginLayoutParams) mActionModeView.getLayoutParams(); + boolean mlpChanged = false; + final boolean nonOverlayShown = + (getLocalFeatures() & (1 << FEATURE_ACTION_MODE_OVERLAY)) == 0 + && mActionModeView.isShown(); + if (nonOverlayShown) { + // set top margin to top insets, show status guard + if (mlp.topMargin != insets.top) { + mlpChanged = true; + mlp.topMargin = insets.top; + if (mStatusGuard == null) { + mStatusGuard = new View(mContext); + mStatusGuard.setBackgroundColor(mContext.getResources() + .getColor(R.color.input_method_navigation_guard)); + addView(mStatusGuard, new LayoutParams( + LayoutParams.MATCH_PARENT, mlp.topMargin, + Gravity.START | Gravity.TOP)); + } else { + LayoutParams lp = (LayoutParams) mStatusGuard.getLayoutParams(); + if (lp.height != mlp.topMargin) { + lp.height = mlp.topMargin; + mStatusGuard.setLayoutParams(lp); + } + } + } + insets.top = 0; // consume top insets + showStatusGuard = true; + } else { + // reset top margin + if (mlp.topMargin != 0) { + mlpChanged = true; + mlp.topMargin = 0; + } + } + if (mlpChanged) { + mActionModeView.setLayoutParams(mlp); + } + } + } + if (mStatusGuard != null) { + mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); + } + } + + private void updateNavigationGuard(Rect insets) { // IMEs lay out below the nav bar, but the content view must not (for back compat) if (getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD) { // prevent the content view from including the nav bar height @@ -2510,11 +2569,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { mNavigationGuard.setLayoutParams(lp); } } - - if (getForeground() != null) { - drawableChanged(); - } - return super.fitSystemWindows(insets); } private void drawableChanged() { @@ -2693,6 +2747,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + requestFitSystemWindows(); return mWrapped.onPrepareActionMode(mode, menu); } @@ -2719,6 +2774,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } mActionMode = null; + requestFitSystemWindows(); } } } |