Cache Display.Mode so we can ignore refresh rate changes

DisplayCutoutView calls #update() when `onDisplayChanged` is called, but
if that were to be called _only_ because the refresh rate changes, then
we redraw the displaycutoutview (with no meaningful changes) and this
causes the display to change refresh rate again, starting the loop over.

Fixes: 155155363
Test: manual
Change-Id: Ic885cf24a9f4cc45970a3388653789abb3f592bb
This commit is contained in:
Evan Laird
2020-07-01 20:33:27 -04:00
parent 2e53c54ab9
commit c2bae89e36

View File

@@ -62,6 +62,7 @@ import android.os.UserHandle;
import android.provider.Settings.Secure;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.DisplayCutout.BoundsPosition;
import android.view.DisplayInfo;
@@ -820,6 +821,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private static final float HIDDEN_CAMERA_PROTECTION_SCALE = 0.5f;
private Display.Mode mDisplayMode = null;
private final DisplayInfo mInfo = new DisplayInfo();
private final Paint mPaint = new Paint();
private final List<Rect> mBounds = new ArrayList();
@@ -904,11 +906,33 @@ public class ScreenDecorations extends SystemUI implements Tunable {
@Override
public void onDisplayChanged(int displayId) {
Display.Mode oldMode = mDisplayMode;
mDisplayMode = getDisplay().getMode();
// Display mode hasn't meaningfully changed, we can ignore it
if (!modeChanged(oldMode, mDisplayMode)) {
return;
}
if (displayId == getDisplay().getDisplayId()) {
update();
}
}
private boolean modeChanged(Display.Mode oldMode, Display.Mode newMode) {
if (oldMode == null) {
return true;
}
boolean changed = false;
changed |= oldMode.getPhysicalHeight() != newMode.getPhysicalHeight();
changed |= oldMode.getPhysicalWidth() != newMode.getPhysicalWidth();
// We purposely ignore refresh rate and id changes here, because we don't need to
// invalidate for those, and they can trigger the refresh rate to increase
return changed;
}
public void setRotation(int rotation) {
mRotation = rotation;
update();