Merge "DisplayCutout: Fix corner cutout issues in SystemUI" into pi-dev
This commit is contained in:
@@ -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<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
|
||||
|
||||
@@ -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<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;
|
||||
|
||||
@@ -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<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 @@ public class PhoneStatusBarView extends PanelBar {
|
||||
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 @@ 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<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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user