Exposing public API to retrieve current setting of 'Match Content Frame Rate'.

Bug: 182148347
Test: atest MatchContentFrameRateTest
Change-Id: Iaa4364fc868a712fd71a48e6efad0df05eb4a6a4
This commit is contained in:
Kriti Dang
2021-03-11 11:33:13 +01:00
parent 18f543c54d
commit 518898d9e6
4 changed files with 66 additions and 11 deletions

View File

@@ -18809,9 +18809,14 @@ package android.hardware.display {
method public android.view.Display getDisplay(int);
method public android.view.Display[] getDisplays();
method public android.view.Display[] getDisplays(String);
method public int getMatchContentFrameRateUserPreference();
method public void registerDisplayListener(android.hardware.display.DisplayManager.DisplayListener, android.os.Handler);
method public void unregisterDisplayListener(android.hardware.display.DisplayManager.DisplayListener);
field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
field public static final int MATCH_CONTENT_FRAMERATE_ALWAYS = 2; // 0x2
field public static final int MATCH_CONTENT_FRAMERATE_NEVER = 0; // 0x0
field public static final int MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY = 1; // 0x1
field public static final int MATCH_CONTENT_FRAMERATE_UNKNOWN = -1; // 0xffffffff
field public static final int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 16; // 0x10
field public static final int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 8; // 0x8
field public static final int VIRTUAL_DISPLAY_FLAG_PRESENTATION = 2; // 0x2

View File

@@ -1141,7 +1141,6 @@ package android.hardware.display {
public final class DisplayManager {
method public boolean areUserDisabledHdrTypesAllowed();
method @RequiresPermission(android.Manifest.permission.MODIFY_REFRESH_RATE_SWITCHING_TYPE) public int getRefreshRateSwitchingType();
method @NonNull public int[] getUserDisabledHdrTypes();
method public boolean isMinimalPostProcessingRequested(int);
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setAreUserDisabledHdrTypesAllowed(boolean);

View File

@@ -38,6 +38,7 @@ import android.media.projection.MediaProjection;
import android.os.Build;
import android.os.Handler;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
import android.view.Surface;
@@ -347,6 +348,37 @@ public final class DisplayManager {
public static final int VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP = 1 << 11;
/** @hide */
@IntDef(prefix = {"MATCH_CONTENT_FRAMERATE_"}, value = {
MATCH_CONTENT_FRAMERATE_UNKNOWN,
MATCH_CONTENT_FRAMERATE_NEVER,
MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY,
MATCH_CONTENT_FRAMERATE_ALWAYS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface MatchContentFrameRateType {}
/**
* Match content frame rate user preference is unknown.
*/
public static final int MATCH_CONTENT_FRAMERATE_UNKNOWN = -1;
/**
* No mode switching is allowed.
*/
public static final int MATCH_CONTENT_FRAMERATE_NEVER = 0;
/**
* Only refresh rate switches without visual interruptions are allowed.
*/
public static final int MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY = 1;
/**
* Refresh rate switches between all refresh rates are allowed even if they have visual
* interruptions for the user.
*/
public static final int MATCH_CONTENT_FRAMERATE_ALWAYS = 2;
/** @hide */
@IntDef(prefix = {"SWITCHING_TYPE_"}, value = {
SWITCHING_TYPE_NONE,
@@ -1076,14 +1108,36 @@ public final class DisplayManager {
}
/**
* Returns the refresh rate switching type.
*
* @hide
* Returns the user preference for "Match content frame rate".
* <p>
* Never: Even if the app requests it, the device will never try to match its output to the
* original frame rate of the content.
* </p><p>
* Seamless: If the app requests it, the device will match its output to the original frame
* rate of the content, ONLY if the display can transition seamlessly.
* </p><p>
* Always: If the app requests it, the device will match its output to the original
* frame rate of the content. This may cause the screen to go blank for a
* second when exiting or entering a video playback.
* </p>
*/
@TestApi
@RequiresPermission(Manifest.permission.MODIFY_REFRESH_RATE_SWITCHING_TYPE)
@SwitchingType public int getRefreshRateSwitchingType() {
return mGlobal.getRefreshRateSwitchingType();
@MatchContentFrameRateType public int getMatchContentFrameRateUserPreference() {
return toMatchContentFrameRateSetting(mGlobal.getRefreshRateSwitchingType());
}
@MatchContentFrameRateType
private int toMatchContentFrameRateSetting(@SwitchingType int switchingType) {
switch (switchingType) {
case SWITCHING_TYPE_NONE:
return MATCH_CONTENT_FRAMERATE_NEVER;
case SWITCHING_TYPE_WITHIN_GROUPS:
return MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY;
case SWITCHING_TYPE_ACROSS_AND_WITHIN_GROUPS:
return MATCH_CONTENT_FRAMERATE_ALWAYS;
default:
Slog.e(TAG, switchingType + " is not a valid value of switching type.");
return MATCH_CONTENT_FRAMERATE_UNKNOWN;
}
}
/**

View File

@@ -2932,9 +2932,6 @@ public final class DisplayManagerService extends SystemService {
@Override // Binder call
public int getRefreshRateSwitchingType() {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.MODIFY_REFRESH_RATE_SWITCHING_TYPE,
"Permission required read refresh rate switching type.");
final long token = Binder.clearCallingIdentity();
try {
return getRefreshRateSwitchingTypeInternal();