diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index a48dcc69ae9f3..9792e4102d798 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -33,7 +33,9 @@ import android.text.TextUtils; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.view.View; +import android.view.WindowInsets; import android.widget.RelativeLayout; import android.widget.TextView; @@ -47,6 +49,7 @@ import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSDetail.Callback; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.policy.DarkIconDispatcher; @@ -260,6 +263,19 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue public void onAttachedToWindow() { SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).addCallbacks(this); Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager); + requestApplyInsets(); + } + + @Override + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + Pair padding = PhoneStatusBarView.cornerCutoutMargins( + insets.getDisplayCutout(), getDisplay()); + if (padding == null) { + setPadding(0, 0, 0, 0); + } else { + setPadding(padding.first, 0, padding.second, 0); + } + return super.onApplyWindowInsets(insets); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index bb929dd163108..994c0abcf70ba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -26,6 +26,7 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.util.Pair; import android.util.TypedValue; import android.view.DisplayCutout; import android.view.Gravity; @@ -43,7 +44,6 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.R; -import com.android.systemui.ScreenDecorations; import com.android.systemui.qs.QSPanel; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.policy.BatteryController; @@ -213,6 +213,7 @@ public class KeyguardStatusBarView extends RelativeLayout @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { + mLayoutState = LAYOUT_NONE; if (updateLayoutConsideringCutout()) { requestLayout(); } @@ -221,13 +222,24 @@ public class KeyguardStatusBarView extends RelativeLayout private boolean updateLayoutConsideringCutout() { DisplayCutout dc = getRootWindowInsets().getDisplayCutout(); - if (dc == null) { + Pair cornerCutoutMargins = + PhoneStatusBarView.cornerCutoutMargins(dc, getDisplay()); + updateCornerCutoutPadding(cornerCutoutMargins); + if (dc == null || cornerCutoutMargins != null) { return updateLayoutParamsNoCutout(); } else { return updateLayoutParamsForCutout(dc); } } + private void updateCornerCutoutPadding(Pair cornerCutoutMargins) { + if (cornerCutoutMargins != null) { + setPadding(cornerCutoutMargins.first, 0, cornerCutoutMargins.second, 0); + } else { + setPadding(0, 0, 0, 0); + } + } + private boolean updateLayoutParamsNoCutout() { if (mLayoutState == LAYOUT_NO_CUTOUT) { return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 5076404a5e4ec..0fd0a05e98ab6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -23,9 +23,12 @@ import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFro import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; +import android.graphics.Point; import android.graphics.Rect; import android.util.AttributeSet; import android.util.EventLog; +import android.util.Pair; +import android.view.Display; import android.view.DisplayCutout; import android.view.Gravity; import android.view.MotionEvent; @@ -33,9 +36,9 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowInsets; import android.view.accessibility.AccessibilityEvent; - import android.widget.FrameLayout; import android.widget.LinearLayout; + import com.android.systemui.Dependency; import com.android.systemui.EventLogTags; import com.android.systemui.R; @@ -284,18 +287,20 @@ public class PhoneStatusBarView extends PanelBar { } private void updateLayoutForCutout() { - updateCutoutLocation(); - updateSafeInsets(); + Pair cornerCutoutMargins = cornerCutoutMargins(mDisplayCutout, + getDisplay()); + updateCutoutLocation(cornerCutoutMargins); + updateSafeInsets(cornerCutoutMargins); } - private void updateCutoutLocation() { + private void updateCutoutLocation(Pair cornerCutoutMargins) { // Not all layouts have a cutout (e.g., Car) if (mCutoutSpace == null) { return; } if (mDisplayCutout == null || mDisplayCutout.isEmpty() - || mLastOrientation != ORIENTATION_PORTRAIT) { + || mLastOrientation != ORIENTATION_PORTRAIT || cornerCutoutMargins != null) { mCutoutSpace.setVisibility(View.GONE); return; } @@ -310,7 +315,7 @@ public class PhoneStatusBarView extends PanelBar { lp.height = bounds.height(); } - private void updateSafeInsets() { + private void updateSafeInsets(Pair cornerCutoutMargins) { // Depending on our rotation, we may have to work around a cutout in the middle of the view, // or letterboxing from the right or left sides. @@ -323,5 +328,30 @@ public class PhoneStatusBarView extends PanelBar { lp.leftMargin = mDisplayCutout.getSafeInsetLeft(); lp.rightMargin = mDisplayCutout.getSafeInsetRight(); + + if (cornerCutoutMargins != null) { + lp.leftMargin = Math.max(lp.leftMargin, cornerCutoutMargins.first); + lp.rightMargin = Math.max(lp.rightMargin, cornerCutoutMargins.second); + } + } + + public static Pair cornerCutoutMargins(DisplayCutout cutout, + Display display) { + if (cutout == null) { + return null; + } + Point size = new Point(); + display.getRealSize(size); + + Rect bounds = new Rect(); + boundsFromDirection(cutout, Gravity.TOP, bounds); + + if (bounds.left <= 0) { + return new Pair<>(bounds.right, 0); + } + if (bounds.right >= size.x) { + return new Pair<>(0, size.x - bounds.left); + } + return null; } }