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

Commit c2bae89e authored by Evan Laird's avatar Evan Laird
Browse files

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
parent 2e53c54a
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -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();