DisplayCutout: Fix corner cutout issues in SystemUI
Bug: 74195186
Test: Turn on Corner Display Cutout, verify SystemUI nowhere gets obscured by the cutout.
Change-Id: I27eeca067fdf65f5fa1570057b7f23157708d65c
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index a48dcc6..9792e41 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.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.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 void onAttachedToWindow() {
SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).addCallbacks(this);
Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
+ requestApplyInsets();
+ }
+
+ @Override
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ Pair<Integer, Integer> 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 bb929dd..994c0ab 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.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.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 @@
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ mLayoutState = LAYOUT_NONE;
if (updateLayoutConsideringCutout()) {
requestLayout();
}
@@ -221,13 +222,24 @@
private boolean updateLayoutConsideringCutout() {
DisplayCutout dc = getRootWindowInsets().getDisplayCutout();
- if (dc == null) {
+ Pair<Integer, Integer> cornerCutoutMargins =
+ PhoneStatusBarView.cornerCutoutMargins(dc, getDisplay());
+ updateCornerCutoutPadding(cornerCutoutMargins);
+ if (dc == null || cornerCutoutMargins != null) {
return updateLayoutParamsNoCutout();
} else {
return updateLayoutParamsForCutout(dc);
}
}
+ private void updateCornerCutoutPadding(Pair<Integer, Integer> 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 5076404..0fd0a05 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 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.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 @@
}
private void updateLayoutForCutout() {
- updateCutoutLocation();
- updateSafeInsets();
+ Pair<Integer, Integer> cornerCutoutMargins = cornerCutoutMargins(mDisplayCutout,
+ getDisplay());
+ updateCutoutLocation(cornerCutoutMargins);
+ updateSafeInsets(cornerCutoutMargins);
}
- private void updateCutoutLocation() {
+ private void updateCutoutLocation(Pair<Integer, Integer> 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 @@
lp.height = bounds.height();
}
- private void updateSafeInsets() {
+ private void updateSafeInsets(Pair<Integer, Integer> 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 @@
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<Integer, Integer> 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;
}
}