From d8db601962b9c52521907439344e5b410d644b11 Mon Sep 17 00:00:00 2001 From: Kriti Dang Date: Wed, 24 Nov 2021 17:34:49 +0100 Subject: Adding display commands for hostSide CTS tests Adding commands to set display mode, set user disabled HDR types and set match content frame rate user preference. These commands are used in hostSide test to verify the MediaCapabilitiesMetrics. Bug: 206615436 Test: atest android.cts.statsdatom.media.MediaCapabilitiesTests#testDisplayCapabilities Change-Id: Ie83b147dc43c4905919656561f2670bc8651fe47 --- .../server/display/DisplayManagerService.java | 16 ++ .../server/display/DisplayManagerShellCommand.java | 179 +++++++++++++++++++++ 2 files changed, 195 insertions(+) diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index e4bed3d06714..f1cd12cbb10c 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1056,6 +1056,13 @@ public final class DisplayManagerService extends SystemService { + "setUserDisabledHdrTypesInternal"); return; } + + // Verify if userDisabledHdrTypes contains expected HDR types + if (!isSubsetOf(Display.HdrCapabilities.HDR_TYPES, userDisabledHdrTypes)) { + Slog.e(TAG, "userDisabledHdrTypes contains unexpected types"); + return; + } + Arrays.sort(userDisabledHdrTypes); if (Arrays.equals(mUserDisabledHdrTypes, userDisabledHdrTypes)) { return; @@ -1078,6 +1085,15 @@ public final class DisplayManagerService extends SystemService { } } + private boolean isSubsetOf(int[] sortedSuperset, int[] subset) { + for (int i : subset) { + if (Arrays.binarySearch(sortedSuperset, i) < 0) { + return false; + } + } + return true; + } + private void setAreUserDisabledHdrTypesAllowedInternal( boolean areUserDisabledHdrTypesAllowed) { synchronized (mSyncRoot) { diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java index 9412c938f934..43a850c5d626 100644 --- a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java +++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java @@ -20,9 +20,11 @@ import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.os.ShellCommand; +import android.util.Slog; import android.view.Display; import java.io.PrintWriter; +import java.util.Arrays; class DisplayManagerShellCommand extends ShellCommand { private static final String TAG = "DisplayManagerShellCommand"; @@ -60,6 +62,20 @@ class DisplayManagerShellCommand extends ShellCommand { return setAmbientColorTemperatureOverride(); case "constrain-launcher-metrics": return setConstrainLauncherMetrics(); + case "set-user-preferred-display-mode": + return setUserPreferredDisplayMode(); + case "clear-user-preferred-display-mode": + return clearUserPreferredDisplayMode(); + case "get-user-preferred-display-mode": + return getUserPreferredDisplayMode(); + case "set-match-content-frame-rate-pref": + return setMatchContentFrameRateUserPreference(); + case "get-match-content-frame-rate-pref": + return getMatchContentFrameRateUserPreference(); + case "set-user-disabled-hdr-types": + return setUserDisabledHdrTypes(); + case "get-user-disabled-hdr-types": + return getUserDisabledHdrTypes(); default: return handleDefaultCommands(cmd); } @@ -93,6 +109,21 @@ class DisplayManagerShellCommand extends ShellCommand { pw.println(" constrain-launcher-metrics [true|false]"); pw.println(" Sets if Display#getRealSize and getRealMetrics should be constrained for "); pw.println(" Launcher."); + pw.println(" set-user-preferred-display-mode WIDTH HEIGHT REFRESH-RATE"); + pw.println(" Sets the user preferred display mode which has fields WIDTH, HEIGHT and " + + "REFRESH-RATE"); + pw.println(" clear-user-preferred-display-mode"); + pw.println(" Clears the user preferred display mode"); + pw.println(" get-user-preferred-display-mode"); + pw.println(" Returns the user preferred display mode or null id no mode is set by user"); + pw.println(" set-match-content-frame-rate-pref PREFERENCE"); + pw.println(" Sets the match content frame rate preference as PREFERENCE "); + pw.println(" get-match-content-frame-rate-pref"); + pw.println(" Returns the match content frame rate preference"); + pw.println(" set-user-disabled-hdr-types TYPES..."); + pw.println(" Sets the user disabled HDR types as TYPES"); + pw.println(" get-user-disabled-hdr-types"); + pw.println(" Returns the user disabled HDR types"); pw.println(); Intent.printIntentArgsHelp(pw , ""); } @@ -166,4 +197,152 @@ class DisplayManagerShellCommand extends ShellCommand { mService.setShouldConstrainMetricsForLauncher(constrain); return 0; } + + private int setUserPreferredDisplayMode() { + final String widthText = getNextArg(); + if (widthText == null) { + getErrPrintWriter().println("Error: no width specified"); + return 1; + } + + final String heightText = getNextArg(); + if (heightText == null) { + getErrPrintWriter().println("Error: no height specified"); + return 1; + } + + final String refreshRateText = getNextArg(); + if (refreshRateText == null) { + getErrPrintWriter().println("Error: no refresh-rate specified"); + return 1; + } + + final int width, height; + final float refreshRate; + try { + width = Integer.parseInt(widthText); + height = Integer.parseInt(heightText); + refreshRate = Float.parseFloat(refreshRateText); + } catch (NumberFormatException e) { + getErrPrintWriter().println("Error: invalid format of width, height or refresh rate"); + return 1; + } + if (width < 0 || height < 0 || refreshRate <= 0.0f) { + getErrPrintWriter().println("Error: invalid value of width, height or refresh rate"); + return 1; + } + + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + dm.setUserPreferredDisplayMode(new Display.Mode(width, height, refreshRate)); + return 0; + } + + private int clearUserPreferredDisplayMode() { + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + dm.clearUserPreferredDisplayMode(); + return 0; + } + + private int getUserPreferredDisplayMode() { + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + final Display.Mode mode = dm.getUserPreferredDisplayMode(); + if (mode == null) { + getOutPrintWriter().println("User preferred display mode: null"); + return 0; + } + + getOutPrintWriter().println("User preferred display mode: " + mode.getPhysicalWidth() + " " + + mode.getPhysicalHeight() + " " + mode.getRefreshRate()); + return 0; + } + + private int setMatchContentFrameRateUserPreference() { + final String matchContentFrameRatePrefText = getNextArg(); + if (matchContentFrameRatePrefText == null) { + getErrPrintWriter().println("Error: no matchContentFrameRatePref specified"); + return 1; + } + + final int matchContentFrameRatePreference; + try { + matchContentFrameRatePreference = Integer.parseInt(matchContentFrameRatePrefText); + } catch (NumberFormatException e) { + getErrPrintWriter().println("Error: invalid format of matchContentFrameRatePreference"); + return 1; + } + if (matchContentFrameRatePreference < 0) { + getErrPrintWriter().println("Error: invalid value of matchContentFrameRatePreference"); + return 1; + } + + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + + final int refreshRateSwitchingType = + toRefreshRateSwitchingType(matchContentFrameRatePreference); + dm.setRefreshRateSwitchingType(refreshRateSwitchingType); + return 0; + } + + private int getMatchContentFrameRateUserPreference() { + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + getOutPrintWriter().println("Match content frame rate type: " + + dm.getMatchContentFrameRateUserPreference()); + return 0; + } + + private int setUserDisabledHdrTypes() { + final String[] userDisabledHdrTypesText = getAllArgs(); + if (userDisabledHdrTypesText == null) { + getErrPrintWriter().println("Error: no userDisabledHdrTypes specified"); + return 1; + } + + int[] userDisabledHdrTypes = new int[userDisabledHdrTypesText.length]; + try { + int index = 0; + for (String userDisabledHdrType : userDisabledHdrTypesText) { + userDisabledHdrTypes[index++] = Integer.parseInt(userDisabledHdrType); + } + } catch (NumberFormatException e) { + getErrPrintWriter().println("Error: invalid format of userDisabledHdrTypes"); + return 1; + } + + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + dm.setUserDisabledHdrTypes(userDisabledHdrTypes); + return 0; + } + + private int getUserDisabledHdrTypes() { + final Context context = mService.getContext(); + final DisplayManager dm = context.getSystemService(DisplayManager.class); + final int[] userDisabledHdrTypes = dm.getUserDisabledHdrTypes(); + getOutPrintWriter().println("User disabled HDR types: " + + Arrays.toString(userDisabledHdrTypes)); + return 0; + } + + @DisplayManager.SwitchingType + private int toRefreshRateSwitchingType( + @DisplayManager.MatchContentFrameRateType int matchContentFrameRateType) { + switch (matchContentFrameRateType) { + case DisplayManager.MATCH_CONTENT_FRAMERATE_NEVER: + return DisplayManager.SWITCHING_TYPE_NONE; + case DisplayManager.MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY: + return DisplayManager.SWITCHING_TYPE_WITHIN_GROUPS; + case DisplayManager.MATCH_CONTENT_FRAMERATE_ALWAYS: + return DisplayManager.SWITCHING_TYPE_ACROSS_AND_WITHIN_GROUPS; + case DisplayManager.MATCH_CONTENT_FRAMERATE_UNKNOWN: + default: + Slog.e(TAG, matchContentFrameRateType + " is not a valid value of " + + "matchContentFrameRate type."); + return -1; + } + } } -- cgit v1.2.3-59-g8ed1b