Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
QtDisplayManager.java
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4package org.qtproject.qt.android;
5
6import android.app.Activity;
7import android.content.Context;
8import android.content.res.Configuration;
9import android.graphics.Rect;
10import android.hardware.display.DisplayManager;
11import android.os.Build;
12import android.util.DisplayMetrics;
13import android.util.Size;
14import android.view.Display;
15import android.view.Surface;
16import android.view.View;
17import android.view.WindowInsets;
18import android.view.WindowManager;
19import android.view.WindowMetrics;
20
21import java.util.ArrayList;
22import java.util.Arrays;
23import java.util.List;
24
25class QtDisplayManager {
26
27 // screen methods
28 public static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels,
29 int availableLeftPixels, int availableTopPixels,
30 int availableWidthPixels, int availableHeightPixels,
31 double XDpi, double YDpi, double scaledDensity,
32 double density, float refreshRate);
33 public static native void handleOrientationChanged(int newRotation, int nativeOrientation);
34 public static native void handleRefreshRateChanged(float refreshRate);
35 public static native void handleUiDarkModeChanged(int newUiMode);
36 public static native void handleScreenAdded(int displayId);
37 public static native void handleScreenChanged(int displayId);
38 public static native void handleScreenRemoved(int displayId);
39 // screen methods
40
41 // Keep in sync with QtAndroid::SystemUiVisibility in androidjnimain.h
42 public static final int SYSTEM_UI_VISIBILITY_NORMAL = 0;
43 public static final int SYSTEM_UI_VISIBILITY_FULLSCREEN = 1;
44 public static final int SYSTEM_UI_VISIBILITY_TRANSLUCENT = 2;
45 private int m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL;
46
47 private static int m_previousRotation = -1;
48
49 private DisplayManager.DisplayListener m_displayListener = null;
50 private final Activity m_activity;
51
52 QtDisplayManager(Activity activity)
53 {
54 m_activity = activity;
55 initDisplayListener();
56 }
57
58 private void initDisplayListener() {
59 m_displayListener = new DisplayManager.DisplayListener() {
60 @Override
61 public void onDisplayAdded(int displayId) {
62 QtDisplayManager.handleScreenAdded(displayId);
63 }
64
65 @Override
66 public void onDisplayChanged(int displayId) {
67 Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
68 ? m_activity.getWindowManager().getDefaultDisplay()
69 : m_activity.getDisplay();
70 float refreshRate = getRefreshRate(display);
71 QtDisplayManager.handleRefreshRateChanged(refreshRate);
72 QtDisplayManager.handleScreenChanged(displayId);
73 }
74
75 @Override
76 public void onDisplayRemoved(int displayId) {
77 QtDisplayManager.handleScreenRemoved(displayId);
78 }
79 };
80 }
81
82 static void handleOrientationChanges(Activity activity)
83 {
84 int currentRotation = getDisplayRotation(activity);
85 if (m_previousRotation == currentRotation)
86 return;
87 int nativeOrientation = getNativeOrientation(activity, currentRotation);
88 QtDisplayManager.handleOrientationChanged(currentRotation, nativeOrientation);
89 m_previousRotation = currentRotation;
90 }
91
92 public static int getDisplayRotation(Activity activity) {
93 Display display = Build.VERSION.SDK_INT < Build.VERSION_CODES.R ?
94 activity.getWindowManager().getDefaultDisplay() :
95 activity.getDisplay();
96
97 return display != null ? display.getRotation() : 0;
98 }
99
100 private static int getNativeOrientation(Activity activity, int rotation)
101 {
102 int orientation = activity.getResources().getConfiguration().orientation;
103 boolean rot90 = (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270);
104 boolean isLandscape = (orientation == Configuration.ORIENTATION_LANDSCAPE);
105 if ((isLandscape && !rot90) || (!isLandscape && rot90))
106 return Configuration.ORIENTATION_LANDSCAPE;
107
108 return Configuration.ORIENTATION_PORTRAIT;
109 }
110
111 static float getRefreshRate(Display display)
112 {
113 return display != null ? display.getRefreshRate() : 60.0f;
114 }
115
116 public void registerDisplayListener()
117 {
118 DisplayManager displayManager =
119 (DisplayManager) m_activity.getSystemService(Context.DISPLAY_SERVICE);
120 displayManager.registerDisplayListener(m_displayListener, null);
121 }
122
123 public void unregisterDisplayListener()
124 {
125 DisplayManager displayManager =
126 (DisplayManager) m_activity.getSystemService(Context.DISPLAY_SERVICE);
127 displayManager.unregisterDisplayListener(m_displayListener);
128 }
129
130 public void setSystemUiVisibility(int systemUiVisibility)
131 {
132 if (m_systemUiVisibility == systemUiVisibility)
133 return;
134
135 m_systemUiVisibility = systemUiVisibility;
136
137 int systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_VISIBLE;
138 switch (m_systemUiVisibility) {
140 m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
141 m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
142 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
143 m_activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
144 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
145 }
146 break;
148 m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
149 m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
150 systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
151 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
152 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
153 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
154 | View.SYSTEM_UI_FLAG_FULLSCREEN
155 | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
156 | View.INVISIBLE;
157 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
158 m_activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
159 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
160 }
161 break;
163 m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
164 | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
165 | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
166 m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
167 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
168 m_activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
169 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
170 }
171 break;
172 }
173 m_activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibilityFlags);
174 }
175
176 public int systemUiVisibility()
177 {
178 return m_systemUiVisibility;
179 }
180
181 public void updateFullScreen()
182 {
183 if (m_systemUiVisibility == SYSTEM_UI_VISIBILITY_FULLSCREEN) {
184 m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL;
185 setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
186 }
187 }
188
189 @UsedFromNativeCode
190 public static Display getDisplay(Context context, int displayId)
191 {
192 DisplayManager displayManager =
193 (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
194 if (displayManager != null) {
195 return displayManager.getDisplay(displayId);
196 }
197 return null;
198 }
199
200 @UsedFromNativeCode
201 public static List<Display> getAvailableDisplays(Context context)
202 {
203 DisplayManager displayManager =
204 (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
205 if (displayManager != null) {
206 Display[] displays = displayManager.getDisplays();
207 return Arrays.asList(displays);
208 }
209 return new ArrayList<>();
210 }
211
212 @UsedFromNativeCode
213 public static Size getDisplaySize(Context displayContext, Display display)
214 {
215 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
216 DisplayMetrics realMetrics = new DisplayMetrics();
217 display.getRealMetrics(realMetrics);
218 return new Size(realMetrics.widthPixels, realMetrics.heightPixels);
219 }
220
221 Context windowsContext = displayContext.createWindowContext(
222 WindowManager.LayoutParams.TYPE_APPLICATION, null);
223 WindowManager windowManager =
224 (WindowManager) windowsContext.getSystemService(Context.WINDOW_SERVICE);
225 WindowMetrics windowsMetrics = windowManager.getCurrentWindowMetrics();
226 Rect bounds = windowsMetrics.getBounds();
227 return new Size(bounds.width(), bounds.height());
228 }
229
230 public static void setApplicationDisplayMetrics(Activity activity, int width, int height)
231 {
232 if (activity == null)
233 return;
234
235 final WindowInsets rootInsets = activity.getWindow().getDecorView().getRootWindowInsets();
236 final WindowManager windowManager = activity.getWindowManager();
238
239 int insetLeft;
240 int insetTop;
241
242 int maxWidth;
243 int maxHeight;
244
245 if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
246 display = windowManager.getDefaultDisplay();
247
248 final DisplayMetrics maxMetrics = new DisplayMetrics();
249 display.getRealMetrics(maxMetrics);
250 maxWidth = maxMetrics.widthPixels;
251 maxHeight = maxMetrics.heightPixels;
252
253 insetLeft = rootInsets.getStableInsetLeft();
254 insetTop = rootInsets.getStableInsetTop();
255 } else {
256 display = activity.getDisplay();
257
258 final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
259 maxWidth = maxMetrics.getBounds().width();
260 maxHeight = maxMetrics.getBounds().height();
261
262 insetLeft = rootInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()).left;
263 insetTop = rootInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()).top;
264 }
265
266 final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();
267
268 double density = displayMetrics.density;
269 double scaledDensity = displayMetrics.scaledDensity;
270
271 setDisplayMetrics(maxWidth, maxHeight, insetLeft, insetTop,
272 width, height, getXDpi(displayMetrics), getYDpi(displayMetrics),
273 scaledDensity, density, getRefreshRate(display));
274 }
275
276 public static float getXDpi(final DisplayMetrics metrics) {
277 if (metrics.xdpi < android.util.DisplayMetrics.DENSITY_LOW)
278 return android.util.DisplayMetrics.DENSITY_LOW;
279 return metrics.xdpi;
280 }
281
282 public static float getYDpi(final DisplayMetrics metrics) {
283 if (metrics.ydpi < android.util.DisplayMetrics.DENSITY_LOW)
284 return android.util.DisplayMetrics.DENSITY_LOW;
285 return metrics.ydpi;
286 }
287}
struct wl_display * display
Definition linuxdmabuf.h:41
Q_CORE_EXPORT QtJniTypes::Activity activity()
double scaledDensity()
@ SYSTEM_UI_VISIBILITY_TRANSLUCENT
@ SYSTEM_UI_VISIBILITY_FULLSCREEN
@ SYSTEM_UI_VISIBILITY_NORMAL
static void * context
#define Size(name)
GLint GLsizei GLsizei height
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLint GLsizei width
struct _XDisplay Display