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

Commit f508b150 authored by Oleg Petsjonkin's avatar Oleg Petsjonkin Committed by Piotr Wilczyński
Browse files

LogicalDisplay.updateLayoutLimitedRefreshRateLocked and...

LogicalDisplay.updateLayoutLimitedRefreshRateLocked and updateRefreshRateThermalThrottling shouldn't update display info directly

Bug: 270742628
Test: atest LogicalDisplayTest
Test: atest DisplayModeDirectorTest
Change-Id: I8b46ce14c6d624be87bcda849758b86b4e936913
parent 766ec400
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -341,6 +341,9 @@ public final class DisplayInfo implements Parcelable {
    @Nullable
    @Nullable
    public DisplayShape displayShape;
    public DisplayShape displayShape;


    /**
     * Refresh rate range limitation based on the current device layout
     */
    @Nullable
    @Nullable
    public SurfaceControl.RefreshRateRange layoutLimitedRefreshRate;
    public SurfaceControl.RefreshRateRange layoutLimitedRefreshRate;


@@ -354,7 +357,7 @@ public final class DisplayInfo implements Parcelable {
     * RefreshRateRange limitation for @Temperature.ThrottlingStatus
     * RefreshRateRange limitation for @Temperature.ThrottlingStatus
     */
     */
    @NonNull
    @NonNull
    public SparseArray<SurfaceControl.RefreshRateRange> refreshRateThermalThrottling =
    public SparseArray<SurfaceControl.RefreshRateRange> thermalRefreshRateThrottling =
            new SparseArray<>();
            new SparseArray<>();


    public static final @android.annotation.NonNull Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() {
    public static final @android.annotation.NonNull Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() {
@@ -434,7 +437,7 @@ public final class DisplayInfo implements Parcelable {
                && Objects.equals(displayShape, other.displayShape)
                && Objects.equals(displayShape, other.displayShape)
                && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate)
                && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate)
                && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio)
                && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio)
                && refreshRateThermalThrottling.contentEquals(other.refreshRateThermalThrottling);
                && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling);
    }
    }


    @Override
    @Override
@@ -491,7 +494,7 @@ public final class DisplayInfo implements Parcelable {
        displayShape = other.displayShape;
        displayShape = other.displayShape;
        layoutLimitedRefreshRate = other.layoutLimitedRefreshRate;
        layoutLimitedRefreshRate = other.layoutLimitedRefreshRate;
        hdrSdrRatio = other.hdrSdrRatio;
        hdrSdrRatio = other.hdrSdrRatio;
        refreshRateThermalThrottling = other.refreshRateThermalThrottling;
        thermalRefreshRateThrottling = other.thermalRefreshRateThrottling;
    }
    }


    public void readFromParcel(Parcel source) {
    public void readFromParcel(Parcel source) {
@@ -554,7 +557,7 @@ public final class DisplayInfo implements Parcelable {
        displayShape = source.readTypedObject(DisplayShape.CREATOR);
        displayShape = source.readTypedObject(DisplayShape.CREATOR);
        layoutLimitedRefreshRate = source.readTypedObject(SurfaceControl.RefreshRateRange.CREATOR);
        layoutLimitedRefreshRate = source.readTypedObject(SurfaceControl.RefreshRateRange.CREATOR);
        hdrSdrRatio = source.readFloat();
        hdrSdrRatio = source.readFloat();
        refreshRateThermalThrottling = source.readSparseArray(null,
        thermalRefreshRateThrottling = source.readSparseArray(null,
                SurfaceControl.RefreshRateRange.class);
                SurfaceControl.RefreshRateRange.class);
    }
    }


@@ -616,7 +619,7 @@ public final class DisplayInfo implements Parcelable {
        dest.writeTypedObject(displayShape, flags);
        dest.writeTypedObject(displayShape, flags);
        dest.writeTypedObject(layoutLimitedRefreshRate, flags);
        dest.writeTypedObject(layoutLimitedRefreshRate, flags);
        dest.writeFloat(hdrSdrRatio);
        dest.writeFloat(hdrSdrRatio);
        dest.writeSparseArray(refreshRateThermalThrottling);
        dest.writeSparseArray(thermalRefreshRateThrottling);
    }
    }


    @Override
    @Override
@@ -884,8 +887,8 @@ public final class DisplayInfo implements Parcelable {
        } else {
        } else {
            sb.append(hdrSdrRatio);
            sb.append(hdrSdrRatio);
        }
        }
        sb.append(", refreshRateThermalThrottling ");
        sb.append(", thermalRefreshRateThrottling ");
        sb.append(refreshRateThermalThrottling);
        sb.append(thermalRefreshRateThrottling);
        sb.append("}");
        sb.append("}");
        return sb.toString();
        return sb.toString();
    }
    }
+26 −8
Original line number Original line Diff line number Diff line
@@ -181,6 +181,19 @@ final class LogicalDisplay {
     */
     */
    private String mThermalBrightnessThrottlingDataId;
    private String mThermalBrightnessThrottlingDataId;


    /**
     * Refresh rate range limitation based on the current device layout
     */
    @Nullable
    private SurfaceControl.RefreshRateRange mLayoutLimitedRefreshRate;

    /**
     * RefreshRateRange limitation for @Temperature.ThrottlingStatus
     */
    @NonNull
    private SparseArray<SurfaceControl.RefreshRateRange> mThermalRefreshRateThrottling =
            new SparseArray<>();

    public LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) {
    public LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) {
        mDisplayId = displayId;
        mDisplayId = displayId;
        mLayerStack = layerStack;
        mLayerStack = layerStack;
@@ -339,24 +352,24 @@ final class LogicalDisplay {
     */
     */
    public void updateLayoutLimitedRefreshRateLocked(
    public void updateLayoutLimitedRefreshRateLocked(
            @Nullable SurfaceControl.RefreshRateRange layoutLimitedRefreshRate) {
            @Nullable SurfaceControl.RefreshRateRange layoutLimitedRefreshRate) {
        if (!Objects.equals(layoutLimitedRefreshRate, mBaseDisplayInfo.layoutLimitedRefreshRate)) {
        if (!Objects.equals(layoutLimitedRefreshRate, mLayoutLimitedRefreshRate)) {
            mBaseDisplayInfo.layoutLimitedRefreshRate = layoutLimitedRefreshRate;
            mLayoutLimitedRefreshRate = layoutLimitedRefreshRate;
            mInfo.set(null);
            mDirty = true;
        }
        }
    }
    }
    /**
    /**
     * Updates refreshRateThermalThrottling
     * Updates thermalRefreshRateThrottling
     *
     *
     * @param refreshRanges new refreshRateThermalThrottling ranges limited by layout or default
     * @param refreshRanges new thermalRefreshRateThrottling ranges limited by layout or default
     */
     */
    public void updateThermalRefreshRateThrottling(
    public void updateThermalRefreshRateThrottling(
            @Nullable SparseArray<SurfaceControl.RefreshRateRange> refreshRanges) {
            @Nullable SparseArray<SurfaceControl.RefreshRateRange> refreshRanges) {
        if (refreshRanges == null) {
        if (refreshRanges == null) {
            refreshRanges = new SparseArray<>();
            refreshRanges = new SparseArray<>();
        }
        }
        if (!mBaseDisplayInfo.refreshRateThermalThrottling.contentEquals(refreshRanges)) {
        if (!mThermalRefreshRateThrottling.contentEquals(refreshRanges)) {
            mBaseDisplayInfo.refreshRateThermalThrottling = refreshRanges;
            mThermalRefreshRateThrottling = refreshRanges;
            mInfo.set(null);
            mDirty = true;
        }
        }
    }
    }


@@ -499,6 +512,9 @@ final class LogicalDisplay {
                mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_DESTROY_CONTENT;
                mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_DESTROY_CONTENT;
            }
            }


            mBaseDisplayInfo.layoutLimitedRefreshRate = mLayoutLimitedRefreshRate;
            mBaseDisplayInfo.thermalRefreshRateThrottling = mThermalRefreshRateThrottling;

            mPrimaryDisplayDeviceInfo = deviceInfo;
            mPrimaryDisplayDeviceInfo = deviceInfo;
            mInfo.set(null);
            mInfo.set(null);
            mDirty = false;
            mDirty = false;
@@ -952,6 +968,8 @@ final class LogicalDisplay {
        pw.println("mDisplayGroupName=" + mDisplayGroupName);
        pw.println("mDisplayGroupName=" + mDisplayGroupName);
        pw.println("mThermalBrightnessThrottlingDataId=" + mThermalBrightnessThrottlingDataId);
        pw.println("mThermalBrightnessThrottlingDataId=" + mThermalBrightnessThrottlingDataId);
        pw.println("mLeadDisplayId=" + mLeadDisplayId);
        pw.println("mLeadDisplayId=" + mLeadDisplayId);
        pw.println("mLayoutLimitedRefreshRate=" + mLayoutLimitedRefreshRate);
        pw.println("mThermalRefreshRateThrottling=" + mThermalRefreshRateThrottling);
    }
    }


    @Override
    @Override
+30 −23
Original line number Original line Diff line number Diff line
@@ -1708,14 +1708,13 @@ public class DisplayModeDirector {
        }
        }


        public void observe() {
        public void observe() {
            DisplayManager dm = mContext.getSystemService(DisplayManager.class);
            mInjector.registerDisplayListener(this, mHandler);
            dm.registerDisplayListener(this, mHandler);


            // Populate existing displays
            // Populate existing displays
            SparseArray<Display.Mode[]> modes = new SparseArray<>();
            SparseArray<Display.Mode[]> modes = new SparseArray<>();
            SparseArray<Display.Mode> defaultModes = new SparseArray<>();
            SparseArray<Display.Mode> defaultModes = new SparseArray<>();
            DisplayInfo info = new DisplayInfo();
            DisplayInfo info = new DisplayInfo();
            Display[] displays = dm.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
            Display[] displays = mInjector.getDisplays();
            for (Display d : displays) {
            for (Display d : displays) {
                final int displayId = d.getDisplayId();
                final int displayId = d.getDisplayId();
                d.getDisplayInfo(info);
                d.getDisplayInfo(info);
@@ -1754,17 +1753,9 @@ public class DisplayModeDirector {
            updateLayoutLimitedFrameRate(displayId, displayInfo);
            updateLayoutLimitedFrameRate(displayId, displayInfo);
        }
        }


        @Nullable
        private DisplayInfo getDisplayInfo(int displayId) {
        private DisplayInfo getDisplayInfo(int displayId) {
            Display d = mContext.getSystemService(DisplayManager.class).getDisplay(displayId);
            if (d == null) {
                // We can occasionally get a display added or changed event for a display that was
                // subsequently removed, which means this returns null. Check this case and bail
                // out early; if it gets re-attached we'll eventually get another call back for it.
                return null;
            }
            DisplayInfo info = new DisplayInfo();
            DisplayInfo info = new DisplayInfo();
            d.getDisplayInfo(info);
            mInjector.getDisplayInfo(displayId, info);
            return info;
            return info;
        }
        }


@@ -2435,8 +2426,7 @@ public class DisplayModeDirector {
        }
        }


        private void updateDefaultDisplayState() {
        private void updateDefaultDisplayState() {
            Display display = mContext.getSystemService(DisplayManager.class)
            Display display = mInjector.getDisplay(Display.DEFAULT_DISPLAY);
                    .getDisplay(Display.DEFAULT_DISPLAY);
            if (display == null) {
            if (display == null) {
                return;
                return;
            }
            }
@@ -2753,8 +2743,7 @@ public class DisplayModeDirector {
            sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this);
            sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this);


            synchronized (mSensorObserverLock) {
            synchronized (mSensorObserverLock) {
                for (Display d : mDisplayManager.getDisplays(
                for (Display d : mInjector.getDisplays()) {
                        DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) {
                    mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d));
                    mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d));
                }
                }
            }
            }
@@ -2765,8 +2754,7 @@ public class DisplayModeDirector {
        }
        }


        private void recalculateVotesLocked() {
        private void recalculateVotesLocked() {
            final Display[] displays = mDisplayManager.getDisplays(
            final Display[] displays = mInjector.getDisplays();
                    DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
            for (Display d : displays) {
            for (Display d : displays) {
                int displayId = d.getDisplayId();
                int displayId = d.getDisplayId();
                Vote vote = null;
                Vote vote = null;
@@ -2797,7 +2785,7 @@ public class DisplayModeDirector {


        @Override
        @Override
        public void onDisplayAdded(int displayId) {
        public void onDisplayAdded(int displayId) {
            boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId));
            boolean isDozeState = mInjector.isDozeState(mInjector.getDisplay(displayId));
            synchronized (mSensorObserverLock) {
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.put(displayId, isDozeState);
                mDozeStateByDisplay.put(displayId, isDozeState);
                recalculateVotesLocked();
                recalculateVotesLocked();
@@ -2809,7 +2797,7 @@ public class DisplayModeDirector {
            boolean wasDozeState = mDozeStateByDisplay.get(displayId);
            boolean wasDozeState = mDozeStateByDisplay.get(displayId);
            synchronized (mSensorObserverLock) {
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.put(displayId,
                mDozeStateByDisplay.put(displayId,
                        mInjector.isDozeState(mDisplayManager.getDisplay(displayId)));
                        mInjector.isDozeState(mInjector.getDisplay(displayId)));
                if (wasDozeState != mDozeStateByDisplay.get(displayId)) {
                if (wasDozeState != mDozeStateByDisplay.get(displayId)) {
                    recalculateVotesLocked();
                    recalculateVotesLocked();
                }
                }
@@ -3173,9 +3161,14 @@ public class DisplayModeDirector {
        void registerPeakRefreshRateObserver(@NonNull ContentResolver cr,
        void registerPeakRefreshRateObserver(@NonNull ContentResolver cr,
                @NonNull ContentObserver observer);
                @NonNull ContentObserver observer);


        void registerDisplayListener(@NonNull DisplayManager.DisplayListener listener,
                Handler handler);

        void registerDisplayListener(@NonNull DisplayManager.DisplayListener listener,
        void registerDisplayListener(@NonNull DisplayManager.DisplayListener listener,
                Handler handler, long flags);
                Handler handler, long flags);


        Display getDisplay(int displayId);

        Display[] getDisplays();
        Display[] getDisplays();


        boolean getDisplayInfo(int displayId, DisplayInfo displayInfo);
        boolean getDisplayInfo(int displayId, DisplayInfo displayInfo);
@@ -3211,12 +3204,23 @@ public class DisplayModeDirector {
                    observer, UserHandle.USER_SYSTEM);
                    observer, UserHandle.USER_SYSTEM);
        }
        }


        @Override
        public void registerDisplayListener(DisplayManager.DisplayListener listener,
                Handler handler) {
            getDisplayManager().registerDisplayListener(listener, handler);
        }

        @Override
        @Override
        public void registerDisplayListener(DisplayManager.DisplayListener listener,
        public void registerDisplayListener(DisplayManager.DisplayListener listener,
                Handler handler, long flags) {
                Handler handler, long flags) {
            getDisplayManager().registerDisplayListener(listener, handler, flags);
            getDisplayManager().registerDisplayListener(listener, handler, flags);
        }
        }


        @Override
        public Display getDisplay(int displayId) {
            return getDisplayManager().getDisplay(displayId);
        }

        @Override
        @Override
        public Display[] getDisplays() {
        public Display[] getDisplays() {
            return getDisplayManager().getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
            return getDisplayManager().getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
@@ -3225,11 +3229,14 @@ public class DisplayModeDirector {
        @Override
        @Override
        public boolean getDisplayInfo(int displayId, DisplayInfo displayInfo) {
        public boolean getDisplayInfo(int displayId, DisplayInfo displayInfo) {
            Display display = getDisplayManager().getDisplay(displayId);
            Display display = getDisplayManager().getDisplay(displayId);
            if (display != null) {
            if (display == null) {
                return display.getDisplayInfo(displayInfo);
                // We can occasionally get a display added or changed event for a display that was
            }
                // subsequently removed, which means this returns null. Check this case and bail
                // out early; if it gets re-attached we'll eventually get another call back for it.
                return false;
                return false;
            }
            }
            return display.getDisplayInfo(displayInfo);
        }


        @Override
        @Override
        public BrightnessInfo getBrightnessInfo(int displayId) {
        public BrightnessInfo getBrightnessInfo(int displayId) {
+2 −2
Original line number Original line Diff line number Diff line
@@ -138,7 +138,7 @@ final class SkinThermalStatusObserver extends IThermalEventListener.Stub impleme
        for (Display d : displays) {
        for (Display d : displays) {
            final int displayId = d.getDisplayId();
            final int displayId = d.getDisplayId();
            d.getDisplayInfo(info);
            d.getDisplayInfo(info);
            localMap.put(displayId, info.refreshRateThermalThrottling);
            localMap.put(displayId, info.thermalRefreshRateThrottling);
        }
        }
        synchronized (mThermalObserverLock) {
        synchronized (mThermalObserverLock) {
            for (int i = 0; i < size; i++) {
            for (int i = 0; i < size; i++) {
@@ -154,7 +154,7 @@ final class SkinThermalStatusObserver extends IThermalEventListener.Stub impleme
        DisplayInfo displayInfo = new DisplayInfo();
        DisplayInfo displayInfo = new DisplayInfo();
        mInjector.getDisplayInfo(displayId, displayInfo);
        mInjector.getDisplayInfo(displayId, displayInfo);
        SparseArray<SurfaceControl.RefreshRateRange> throttlingMap =
        SparseArray<SurfaceControl.RefreshRateRange> throttlingMap =
                displayInfo.refreshRateThermalThrottling;
                displayInfo.thermalRefreshRateThrottling;


        synchronized (mThermalObserverLock) {
        synchronized (mThermalObserverLock) {
            mThermalThrottlingByDisplay.put(displayId, throttlingMap);
            mThermalThrottlingByDisplay.put(displayId, throttlingMap);
+34 −7
Original line number Original line Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.display;
package com.android.server.display;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
@@ -26,6 +28,7 @@ import static org.mockito.Mockito.when;


import android.app.PropertyInvalidatedCache;
import android.app.PropertyInvalidatedCache;
import android.graphics.Point;
import android.graphics.Point;
import android.util.SparseArray;
import android.view.Display;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.Surface;
@@ -47,6 +50,7 @@ public class LogicalDisplayTest {
    private static final int LAYER_STACK = 0;
    private static final int LAYER_STACK = 0;
    private static final int DISPLAY_WIDTH = 100;
    private static final int DISPLAY_WIDTH = 100;
    private static final int DISPLAY_HEIGHT = 200;
    private static final int DISPLAY_HEIGHT = 200;
    private static final int MODE_ID = 1;


    private LogicalDisplay mLogicalDisplay;
    private LogicalDisplay mLogicalDisplay;
    private DisplayDevice mDisplayDevice;
    private DisplayDevice mDisplayDevice;
@@ -65,6 +69,9 @@ public class LogicalDisplayTest {
        mDisplayDeviceInfo.height = DISPLAY_HEIGHT;
        mDisplayDeviceInfo.height = DISPLAY_HEIGHT;
        mDisplayDeviceInfo.flags = DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
        mDisplayDeviceInfo.flags = DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
        mDisplayDeviceInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL;
        mDisplayDeviceInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL;
        mDisplayDeviceInfo.modeId = MODE_ID;
        mDisplayDeviceInfo.supportedModes = new Display.Mode[] {new Display.Mode(MODE_ID,
                DISPLAY_WIDTH, DISPLAY_HEIGHT, /* refreshRate= */ 60)};
        when(mDisplayDevice.getDisplayDeviceInfoLocked()).thenReturn(mDisplayDeviceInfo);
        when(mDisplayDevice.getDisplayDeviceInfoLocked()).thenReturn(mDisplayDeviceInfo);


        // Disable binder caches in this process.
        // Disable binder caches in this process.
@@ -168,14 +175,34 @@ public class LogicalDisplayTest {
    }
    }


    @Test
    @Test
    public void testLayoutLimitedRefreshRateNotClearedAfterUpdate() {
    public void testUpdateLayoutLimitedRefreshRate() {
        SurfaceControl.RefreshRateRange refreshRateRange = new SurfaceControl.RefreshRateRange(1,
        SurfaceControl.RefreshRateRange layoutLimitedRefreshRate =
                2);
                new SurfaceControl.RefreshRateRange(0, 120);
        mLogicalDisplay.updateLayoutLimitedRefreshRateLocked(refreshRateRange);
        DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked();
        mLogicalDisplay.updateDisplayGroupIdLocked(1);
        mLogicalDisplay.updateLayoutLimitedRefreshRateLocked(layoutLimitedRefreshRate);
        DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked();
        // Display info should only be updated when updateLocked is called
        assertEquals(info2, info1);


        DisplayInfo result = mLogicalDisplay.getDisplayInfoLocked();
        mLogicalDisplay.updateLocked(mDeviceRepo);
        DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked();
        assertNotEquals(info3, info2);
        assertEquals(layoutLimitedRefreshRate, info3.layoutLimitedRefreshRate);
    }


        assertEquals(refreshRateRange, result.layoutLimitedRefreshRate);
    @Test
    public void testUpdateRefreshRateThermalThrottling() {
        SparseArray<SurfaceControl.RefreshRateRange> refreshRanges = new SparseArray<>();
        refreshRanges.put(0, new SurfaceControl.RefreshRateRange(0, 120));
        DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked();
        mLogicalDisplay.updateThermalRefreshRateThrottling(refreshRanges);
        DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked();
        // Display info should only be updated when updateLocked is called
        assertEquals(info2, info1);

        mLogicalDisplay.updateLocked(mDeviceRepo);
        DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked();
        assertNotEquals(info3, info2);
        assertTrue(refreshRanges.contentEquals(info3.thermalRefreshRateThrottling));
    }
    }
}
}
Loading