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

Commit ff4d15c1 authored by Kriti Dang's avatar Kriti Dang Committed by Android (Google) Code Review
Browse files

Merge "Adding display commands for hostSide CTS tests"

parents a83cfd59 d8db6019
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -1072,6 +1072,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;
@@ -1094,6 +1101,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) {
+179 −0
Original line number Diff line number Diff line
@@ -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;
        }
    }
}