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

Commit be6007f0 authored by Adrian Roos's avatar Adrian Roos Committed by Android (Google) Code Review
Browse files

Merge "DisplayCutout: Fix corner cutout issues in SystemUI" into pi-dev

parents 6ecff890 13836059
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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
+14 −2
Original line number Diff line number Diff line
@@ -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;
+36 −6
Original line number Diff line number Diff line
@@ -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;
    }
}