Merge "Ensure the simple CAB appears below the status bar." into klp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
2f566900a4
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user