Adds hasArrSupport api
BUG: 361433651
Test: atest DisplayModeDirectorTest && atest BrightnessObserverTest && atest SettingsObserverTest
Flag: com.android.server.display.feature.flags.enable_has_arr_support
Change-Id: I4a313424ecf5639f90b7323203293e4b1534c590
diff --git a/core/api/current.txt b/core/api/current.txt
index 565254f..f892495 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -50909,6 +50909,7 @@
method public android.view.Display.Mode[] getSupportedModes();
method @Deprecated public float[] getSupportedRefreshRates();
method @Deprecated public int getWidth();
+ method @FlaggedApi("com.android.server.display.feature.flags.enable_has_arr_support") public boolean hasArrSupport();
method public boolean isHdr();
method public boolean isHdrSdrRatioAvailable();
method public boolean isMinimalPostProcessingSupported();
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 8a8022c..e940e55bd 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -21,6 +21,7 @@
import static android.hardware.flags.Flags.FLAG_OVERLAYPROPERTIES_CLASS_API;
import static com.android.server.display.feature.flags.Flags.FLAG_HIGHEST_HDR_SDR_RATIO_API;
+import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_HAS_ARR_SUPPORT;
import android.Manifest;
import android.annotation.FlaggedApi;
@@ -1266,6 +1267,18 @@
}
/**
+ * Returns whether display supports adaptive refresh rate or not.
+ */
+ // TODO(b/372526856) Add a link to the documentation for ARR.
+ @FlaggedApi(FLAG_ENABLE_HAS_ARR_SUPPORT)
+ public boolean hasArrSupport() {
+ synchronized (mLock) {
+ updateDisplayInfoLocked();
+ return mDisplayInfo.hasArrSupport;
+ }
+ }
+
+ /**
* <p> Returns true if the connected display can be switched into a mode with minimal
* post processing. </p>
*
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index cac3e3c..26fce90 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -198,6 +198,12 @@
public float renderFrameRate;
/**
+ * If {@code true} this Display supports adaptive refresh rates.
+ * // TODO(b/372526856) Add a link to the documentation for ARR.
+ */
+ public boolean hasArrSupport;
+
+ /**
* The default display mode.
*/
public int defaultModeId;
@@ -436,6 +442,7 @@
&& rotation == other.rotation
&& modeId == other.modeId
&& renderFrameRate == other.renderFrameRate
+ && hasArrSupport == other.hasArrSupport
&& defaultModeId == other.defaultModeId
&& userPreferredModeId == other.userPreferredModeId
&& Arrays.equals(supportedModes, other.supportedModes)
@@ -497,6 +504,7 @@
rotation = other.rotation;
modeId = other.modeId;
renderFrameRate = other.renderFrameRate;
+ hasArrSupport = other.hasArrSupport;
defaultModeId = other.defaultModeId;
userPreferredModeId = other.userPreferredModeId;
supportedModes = Arrays.copyOf(other.supportedModes, other.supportedModes.length);
@@ -553,6 +561,7 @@
rotation = source.readInt();
modeId = source.readInt();
renderFrameRate = source.readFloat();
+ hasArrSupport = source.readBoolean();
defaultModeId = source.readInt();
userPreferredModeId = source.readInt();
int nModes = source.readInt();
@@ -626,6 +635,7 @@
dest.writeInt(rotation);
dest.writeInt(modeId);
dest.writeFloat(renderFrameRate);
+ dest.writeBoolean(hasArrSupport);
dest.writeInt(defaultModeId);
dest.writeInt(userPreferredModeId);
dest.writeInt(supportedModes.length);
@@ -871,6 +881,8 @@
sb.append(modeId);
sb.append(", renderFrameRate ");
sb.append(renderFrameRate);
+ sb.append(", hasArrSupport ");
+ sb.append(hasArrSupport);
sb.append(", defaultMode ");
sb.append(defaultModeId);
sb.append(", userPreferredModeId ");
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 19e244a..e6de478 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -1810,6 +1810,7 @@
public DisplayMode[] supportedDisplayModes;
public int activeDisplayModeId;
public float renderFrameRate;
+ public boolean hasArrSupport;
public int[] supportedColorModes;
public int activeColorMode;
@@ -1827,6 +1828,7 @@
+ "supportedDisplayModes=" + Arrays.toString(supportedDisplayModes)
+ ", activeDisplayModeId=" + activeDisplayModeId
+ ", renderFrameRate=" + renderFrameRate
+ + ", hasArrSupport=" + hasArrSupport
+ ", supportedColorModes=" + Arrays.toString(supportedColorModes)
+ ", activeColorMode=" + activeColorMode
+ ", hdrCapabilities=" + hdrCapabilities
@@ -1846,13 +1848,14 @@
&& Arrays.equals(supportedColorModes, that.supportedColorModes)
&& activeColorMode == that.activeColorMode
&& Objects.equals(hdrCapabilities, that.hdrCapabilities)
- && preferredBootDisplayMode == that.preferredBootDisplayMode;
+ && preferredBootDisplayMode == that.preferredBootDisplayMode
+ && hasArrSupport == that.hasArrSupport;
}
@Override
public int hashCode() {
return Objects.hash(Arrays.hashCode(supportedDisplayModes), activeDisplayModeId,
- renderFrameRate, activeColorMode, hdrCapabilities);
+ renderFrameRate, activeColorMode, hdrCapabilities, hasArrSupport);
}
}
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index a939d92..755704a 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -115,6 +115,7 @@
jfieldID supportedDisplayModes;
jfieldID activeDisplayModeId;
jfieldID renderFrameRate;
+ jfieldID hasArrSupport;
jfieldID supportedColorModes;
jfieldID activeColorMode;
jfieldID hdrCapabilities;
@@ -1453,7 +1454,7 @@
env->SetIntField(object, gDynamicDisplayInfoClassInfo.activeDisplayModeId,
info.activeDisplayModeId);
env->SetFloatField(object, gDynamicDisplayInfoClassInfo.renderFrameRate, info.renderFrameRate);
-
+ env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.hasArrSupport, info.hasArrSupport);
jintArray colorModesArray = env->NewIntArray(info.supportedColorModes.size());
if (colorModesArray == NULL) {
jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
@@ -2641,6 +2642,8 @@
GetFieldIDOrDie(env, dynamicInfoClazz, "activeDisplayModeId", "I");
gDynamicDisplayInfoClassInfo.renderFrameRate =
GetFieldIDOrDie(env, dynamicInfoClazz, "renderFrameRate", "F");
+ gDynamicDisplayInfoClassInfo.hasArrSupport =
+ GetFieldIDOrDie(env, dynamicInfoClazz, "hasArrSupport", "Z");
gDynamicDisplayInfoClassInfo.supportedColorModes =
GetFieldIDOrDie(env, dynamicInfoClazz, "supportedColorModes", "[I");
gDynamicDisplayInfoClassInfo.activeColorMode =
diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
index acf4db3..0807c70 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
@@ -292,6 +292,13 @@
*/
public float renderFrameRate;
+
+ /**
+ * If {@code true}, this Display supports adaptive refresh rates.
+ * @see android.view.DisplayInfo#hasArrSupport for more details.
+ */
+ public boolean hasArrSupport;
+
/**
* The default mode of the display.
*/
@@ -540,7 +547,8 @@
other.brightnessDefault)
|| !Objects.equals(roundedCorners, other.roundedCorners)
|| installOrientation != other.installOrientation
- || !Objects.equals(displayShape, other.displayShape)) {
+ || !Objects.equals(displayShape, other.displayShape)
+ || hasArrSupport != other.hasArrSupport) {
diff |= DIFF_OTHER;
}
return diff;
@@ -558,6 +566,7 @@
height = other.height;
modeId = other.modeId;
renderFrameRate = other.renderFrameRate;
+ hasArrSupport = other.hasArrSupport;
defaultModeId = other.defaultModeId;
userPreferredModeId = other.userPreferredModeId;
supportedModes = other.supportedModes;
@@ -602,6 +611,7 @@
sb.append(width).append(" x ").append(height);
sb.append(", modeId ").append(modeId);
sb.append(", renderFrameRate ").append(renderFrameRate);
+ sb.append(", hasArrSupport ").append(hasArrSupport);
sb.append(", defaultModeId ").append(defaultModeId);
sb.append(", userPreferredModeId ").append(userPreferredModeId);
sb.append(", supportedModes ").append(Arrays.toString(supportedModes));
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 5edea0a..f9c3a46 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -246,6 +246,7 @@
private int mActiveModeId = INVALID_MODE_ID;
private boolean mDisplayModeSpecsInvalid;
private int mActiveColorMode;
+ private boolean mHasArrSupport;
private Display.HdrCapabilities mHdrCapabilities;
private boolean mAllmSupported;
private boolean mGameContentTypeSupported;
@@ -311,6 +312,7 @@
changed |= updateHdrCapabilitiesLocked(dynamicInfo.hdrCapabilities);
changed |= updateAllmSupport(dynamicInfo.autoLowLatencyModeSupported);
changed |= updateGameContentTypeSupport(dynamicInfo.gameContentTypeSupported);
+ changed |= updateHasArrSupportLocked(dynamicInfo.hasArrSupport);
if (changed) {
mHavePendingChanges = true;
@@ -602,6 +604,14 @@
return true;
}
+ private boolean updateHasArrSupportLocked(boolean newHasArrSupport) {
+ if (mHasArrSupport == newHasArrSupport) {
+ return false;
+ }
+ mHasArrSupport = newHasArrSupport;
+ return true;
+ }
+
private boolean updateAllmSupport(boolean supported) {
if (mAllmSupported == supported) {
return false;
@@ -684,6 +694,7 @@
mInfo.supportedColorModes[i] = mSupportedColorModes.get(i);
}
mInfo.hdrCapabilities = mHdrCapabilities;
+ mInfo.hasArrSupport = mHasArrSupport;
mInfo.appVsyncOffsetNanos = mActiveSfDisplayMode.appVsyncOffsetNanos;
mInfo.presentationDeadlineNanos = mActiveSfDisplayMode.presentationDeadlineNanos;
mInfo.state = mState;
@@ -1274,6 +1285,7 @@
pw.println("mActiveColorMode=" + mActiveColorMode);
pw.println("mDefaultModeId=" + mDefaultModeId);
pw.println("mUserPreferredModeId=" + mUserPreferredModeId);
+ pw.println("mHasArrSupport=" + mHasArrSupport);
pw.println("mState=" + Display.stateToString(mState));
pw.println("mCommittedState=" + Display.stateToString(mCommittedState));
pw.println("mBrightnessState=" + mBrightnessState);
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 007e3a8..1d90c29 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -506,6 +506,7 @@
mBaseDisplayInfo.rotation = Surface.ROTATION_0;
mBaseDisplayInfo.modeId = deviceInfo.modeId;
mBaseDisplayInfo.renderFrameRate = deviceInfo.renderFrameRate;
+ mBaseDisplayInfo.hasArrSupport = deviceInfo.hasArrSupport;
mBaseDisplayInfo.defaultModeId = deviceInfo.defaultModeId;
mBaseDisplayInfo.userPreferredModeId = deviceInfo.userPreferredModeId;
mBaseDisplayInfo.supportedModes = Arrays.copyOf(
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index 99ced7f..b46533f 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -222,6 +222,11 @@
Flags::enableBatteryStatsForAllDisplays
);
+ private final FlagState mHasArrSupport = new FlagState(
+ Flags.FLAG_ENABLE_HAS_ARR_SUPPORT,
+ Flags::enableHasArrSupport
+ );
+
/**
* @return {@code true} if 'port' is allowed in display layout configuration file.
*/
@@ -468,6 +473,12 @@
}
/**
+ * @return {@code true} if hasArrSupport API is enabled.
+ */
+ public boolean hasArrSupportFlag() {
+ return mHasArrSupport.isEnabled();
+ }
+ /**
* dumps all flagstates
* @param pw printWriter
*/
@@ -514,6 +525,7 @@
pw.println(" " + mEnableBatteryStatsForAllDisplays);
pw.println(" " + mBlockAutobrightnessChangesOnStylusUsage);
pw.println(" " + mIsUserRefreshRateForExternalDisplayEnabled);
+ pw.println(" " + mHasArrSupport);
}
private static class FlagState {
diff --git a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
index 3dc035e..cbe3d79 100644
--- a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
+++ b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
@@ -401,6 +401,7 @@
|| !Objects.equals(first.deviceProductInfo, second.deviceProductInfo)
|| first.modeId != second.modeId
|| first.renderFrameRate != second.renderFrameRate
+ || first.hasArrSupport != second.hasArrSupport
|| first.defaultModeId != second.defaultModeId
|| first.userPreferredModeId != second.userPreferredModeId
|| !Arrays.equals(first.supportedModes, second.supportedModes)