• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.internal.display;
18 
19 import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED;
20 
21 import android.content.Context;
22 import android.hardware.display.DisplayManager;
23 import android.util.Log;
24 import android.view.Display;
25 
26 /**
27  * Constants and utility methods for refresh rate settings.
28  */
29 public class RefreshRateSettingsUtils {
30 
31     private static final String TAG = "RefreshRateSettingsUtils";
32 
33     public static final float DEFAULT_REFRESH_RATE = 60f;
34 
35     /**
36      * Find the highest refresh rate among all the modes of the default display.
37      *
38      * This method will acquire DisplayManager.mLock, so calling it while holding other locks
39      * should be done with care.
40      * @param context The context
41      * @return The highest refresh rate
42      */
findHighestRefreshRateForDefaultDisplay(Context context)43     public static float findHighestRefreshRateForDefaultDisplay(Context context) {
44         final DisplayManager dm = context.getSystemService(DisplayManager.class);
45         final Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
46         if (display == null) {
47             Log.w(TAG, "No valid default display device");
48             return DEFAULT_REFRESH_RATE;
49         }
50 
51         float maxRefreshRate = DEFAULT_REFRESH_RATE;
52         for (Display.Mode mode : display.getSupportedModes()) {
53             if (mode.getRefreshRate() > maxRefreshRate) {
54                 maxRefreshRate = mode.getRefreshRate();
55             }
56         }
57         return maxRefreshRate;
58     }
59 
60     /**
61      * Find the highest refresh rate among all the modes of all the displays.
62      *
63      * This method will acquire DisplayManager.mLock, so calling it while holding other locks
64      * should be done with care.
65      * @param context The context
66      * @return The highest refresh rate
67      */
findHighestRefreshRateAmongAllDisplays(Context context)68     public static float findHighestRefreshRateAmongAllDisplays(Context context) {
69         final DisplayManager dm = context.getSystemService(DisplayManager.class);
70         final Display[] displays = dm.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
71         if (displays.length == 0) {
72             Log.w(TAG, "No valid display devices");
73             return DEFAULT_REFRESH_RATE;
74         }
75 
76         float maxRefreshRate = DEFAULT_REFRESH_RATE;
77         for (Display display : displays) {
78             for (Display.Mode mode : display.getSupportedModes()) {
79                 if (mode.getRefreshRate() > maxRefreshRate) {
80                     maxRefreshRate = mode.getRefreshRate();
81                 }
82             }
83         }
84         return maxRefreshRate;
85     }
86 
87     /**
88      * Find the highest refresh rate among all the modes of all the built-in/physical displays.
89      *
90      * This method will acquire DisplayManager.mLock, so calling it while holding other locks
91      * should be done with care.
92      * @param context The context
93      * @return The highest refresh rate
94      */
findHighestRefreshRateAmongAllBuiltInDisplays(Context context)95     public static float findHighestRefreshRateAmongAllBuiltInDisplays(Context context) {
96         final DisplayManager dm = context.getSystemService(DisplayManager.class);
97         final Display[] displays = dm.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
98         if (displays.length == 0) {
99             Log.w(TAG, "No valid display devices");
100             return DEFAULT_REFRESH_RATE;
101         }
102 
103         float maxRefreshRate = DEFAULT_REFRESH_RATE;
104         for (Display display : displays) {
105             if (display.getType() != Display.TYPE_INTERNAL) continue;
106             for (Display.Mode mode : display.getSupportedModes()) {
107                 if (mode.getRefreshRate() > maxRefreshRate) {
108                     maxRefreshRate = mode.getRefreshRate();
109                 }
110             }
111         }
112         return maxRefreshRate;
113     }
114 }
115