Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f566900 authored by John Spurlock's avatar John Spurlock Committed by Android (Google) Code Review
Browse files

Merge "Ensure the simple CAB appears below the status bar." into klp-dev

parents 89bd9733 a81736a7
Loading
Loading
Loading
Loading
+62 −6
Original line number Diff line number Diff line
@@ -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();
            }
        }
    }