Fixed QS tiles incorrectly clipping in landscape shade

When shade is in full width mode in landscape (i.e. on phones),
the QS tile clipping was incorrect due to the QS container view
having an inset to avoid the camera cutout. This inset needed to be
accounted for so the clipping would accurately mimic the shape of
the notifications scrim, which does not have an inset.

This only fixes the visible mismatch in QS tile clipping in landscape
mode; it does not fix the very subtle ~1-2 pixels mismatch in
QS tile clipping that is consistently visible in any orientation and
is most likely an anti-aliasing issue(?)

Bug: 267303661
Test: Manually verified QS tile clipping appears correct
Change-Id: I78421482b1c3f5e8eca355182aef0cdac2e4edfe
This commit is contained in:
Shawn Lee
2023-04-24 15:06:31 -07:00
parent 742405591b
commit 7b449d9101
4 changed files with 39 additions and 10 deletions

View File

@@ -131,7 +131,8 @@ public interface QS extends FragmentBase {
/**
* A rounded corner clipping that makes QS feel as if it were behind everything.
*/
void setFancyClipping(int top, int bottom, int cornerRadius, boolean visible);
void setFancyClipping(int leftInset, int top, int rightInset, int bottom, int cornerRadius,
boolean visible, boolean fullWidth);
/**
* @return if quick settings is fully collapsed currently

View File

@@ -38,7 +38,9 @@ import java.io.PrintWriter;
*/
public class QSContainerImpl extends FrameLayout implements Dumpable {
private int mFancyClippingLeftInset;
private int mFancyClippingTop;
private int mFancyClippingRightInset;
private int mFancyClippingBottom;
private final float[] mFancyClippingRadii = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
private final Path mFancyClippingPath = new Path();
@@ -53,6 +55,7 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
private boolean mQsDisabled;
private int mContentHorizontalPadding = -1;
private boolean mClippingEnabled;
private boolean mIsFullWidth;
public QSContainerImpl(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -237,7 +240,8 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
/**
* Clip QS bottom using a concave shape.
*/
public void setFancyClipping(int top, int bottom, int radius, boolean enabled) {
public void setFancyClipping(int leftInset, int top, int rightInset, int bottom, int radius,
boolean enabled, boolean fullWidth) {
boolean updatePath = false;
if (mFancyClippingRadii[0] != radius) {
mFancyClippingRadii[0] = radius;
@@ -246,10 +250,18 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
mFancyClippingRadii[3] = radius;
updatePath = true;
}
if (mFancyClippingLeftInset != leftInset) {
mFancyClippingLeftInset = leftInset;
updatePath = true;
}
if (mFancyClippingTop != top) {
mFancyClippingTop = top;
updatePath = true;
}
if (mFancyClippingRightInset != rightInset) {
mFancyClippingRightInset = rightInset;
updatePath = true;
}
if (mFancyClippingBottom != bottom) {
mFancyClippingBottom = bottom;
updatePath = true;
@@ -258,6 +270,10 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
mClippingEnabled = enabled;
updatePath = true;
}
if (mIsFullWidth != fullWidth) {
mIsFullWidth = fullWidth;
updatePath = true;
}
if (updatePath) {
updateClippingPath();
@@ -281,15 +297,21 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
return;
}
mFancyClippingPath.addRoundRect(0, mFancyClippingTop, getWidth(),
int clippingLeft = mIsFullWidth ? -mFancyClippingLeftInset : 0;
int clippingRight = mIsFullWidth ? getWidth() + mFancyClippingRightInset : getWidth();
mFancyClippingPath.addRoundRect(clippingLeft, mFancyClippingTop, clippingRight,
mFancyClippingBottom, mFancyClippingRadii, Path.Direction.CW);
invalidate();
}
@Override
public void dump(PrintWriter pw, String[] args) {
pw.println(getClass().getSimpleName() + " updateClippingPath: top("
+ mFancyClippingTop + ") bottom(" + mFancyClippingBottom + ") mClippingEnabled("
+ mClippingEnabled + ")");
pw.println(getClass().getSimpleName() + " updateClippingPath: "
+ "leftInset(" + mFancyClippingLeftInset + ") "
+ "top(" + mFancyClippingTop + ") "
+ "rightInset(" + mFancyClippingRightInset + ") "
+ "bottom(" + mFancyClippingBottom + ") "
+ "mClippingEnabled(" + mClippingEnabled + ") "
+ "mIsFullWidth(" + mIsFullWidth + ")");
}
}

View File

@@ -18,9 +18,10 @@ import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
import static com.android.systemui.media.dagger.MediaModule.QS_PANEL;
import static com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL;
import static com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
import static com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.res.Configuration;
@@ -395,9 +396,11 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
}
@Override
public void setFancyClipping(int top, int bottom, int cornerRadius, boolean visible) {
public void setFancyClipping(int leftInset, int top, int rightInset, int bottom,
int cornerRadius, boolean visible, boolean fullWidth) {
if (getView() instanceof QSContainerImpl) {
((QSContainerImpl) getView()).setFancyClipping(top, bottom, cornerRadius, visible);
((QSContainerImpl) getView()).setFancyClipping(leftInset, top, rightInset, bottom,
cornerRadius, visible, fullWidth);
}
}

View File

@@ -1212,10 +1212,13 @@ public class QuickSettingsController {
mVisible = qsVisible;
mQs.setQsVisible(qsVisible);
mQs.setFancyClipping(
mDisplayLeftInset,
clipTop,
mDisplayRightInset,
clipBottom,
radius,
qsVisible && !mSplitShadeEnabled);
qsVisible && !mSplitShadeEnabled,
mIsFullWidth);
}