4package org.qtproject.qt.android;
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;
21import java.util.ArrayList;
22import java.util.Arrays;
25class QtDisplayManager {
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);
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;
47 private static int m_previousRotation = -1;
49 private DisplayManager.DisplayListener m_displayListener =
null;
50 private final Activity m_activity;
52 QtDisplayManager(Activity activity)
55 initDisplayListener();
58 private void initDisplayListener() {
59 m_displayListener =
new DisplayManager.DisplayListener() {
61 public void onDisplayAdded(
int displayId) {
62 QtDisplayManager.handleScreenAdded(displayId);
66 public void onDisplayChanged(
int displayId) {
68 ? m_activity.getWindowManager().getDefaultDisplay()
69 : m_activity.getDisplay();
70 float refreshRate = getRefreshRate(
display);
71 QtDisplayManager.handleRefreshRateChanged(refreshRate);
72 QtDisplayManager.handleScreenChanged(displayId);
76 public void onDisplayRemoved(
int displayId) {
77 QtDisplayManager.handleScreenRemoved(displayId);
82 static void handleOrientationChanges(Activity activity)
84 int currentRotation = getDisplayRotation(activity);
85 if (m_previousRotation == currentRotation)
87 int nativeOrientation = getNativeOrientation(activity, currentRotation);
88 QtDisplayManager.handleOrientationChanged(currentRotation, nativeOrientation);
89 m_previousRotation = currentRotation;
92 public static int getDisplayRotation(Activity activity) {
94 activity.getWindowManager().getDefaultDisplay() :
100 private static int getNativeOrientation(Activity activity,
int rotation)
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;
108 return Configuration.ORIENTATION_PORTRAIT;
116 public void registerDisplayListener()
118 DisplayManager displayManager =
119 (DisplayManager) m_activity.getSystemService(Context.DISPLAY_SERVICE);
120 displayManager.registerDisplayListener(m_displayListener,
null);
123 public void unregisterDisplayListener()
125 DisplayManager displayManager =
126 (DisplayManager) m_activity.getSystemService(Context.DISPLAY_SERVICE);
127 displayManager.unregisterDisplayListener(m_displayListener);
130 public void setSystemUiVisibility(
int systemUiVisibility)
132 if (m_systemUiVisibility == systemUiVisibility)
135 m_systemUiVisibility = systemUiVisibility;
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;
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
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;
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;
173 m_activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibilityFlags);
176 public int systemUiVisibility()
178 return m_systemUiVisibility;
181 public void updateFullScreen()
183 if (m_systemUiVisibility == SYSTEM_UI_VISIBILITY_FULLSCREEN) {
185 setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
192 DisplayManager displayManager =
193 (DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE);
194 if (displayManager !=
null) {
195 return displayManager.getDisplay(displayId);
201 public static List<Display> getAvailableDisplays(Context
context)
203 DisplayManager displayManager =
204 (DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE);
205 if (displayManager !=
null) {
206 Display[] displays = displayManager.getDisplays();
207 return Arrays.asList(displays);
209 return new ArrayList<>();
213 public static Size getDisplaySize(Context displayContext,
Display display)
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);
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());
230 public static void setApplicationDisplayMetrics(Activity activity,
int width,
int height)
232 if (activity ==
null)
235 final WindowInsets rootInsets =
activity.getWindow().getDecorView().getRootWindowInsets();
236 final WindowManager windowManager =
activity.getWindowManager();
245 if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
246 display = windowManager.getDefaultDisplay();
248 final DisplayMetrics maxMetrics =
new DisplayMetrics();
249 display.getRealMetrics(maxMetrics);
250 maxWidth = maxMetrics.widthPixels;
251 maxHeight = maxMetrics.heightPixels;
253 insetLeft = rootInsets.getStableInsetLeft();
254 insetTop = rootInsets.getStableInsetTop();
258 final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
259 maxWidth = maxMetrics.getBounds().width();
260 maxHeight = maxMetrics.getBounds().height();
262 insetLeft = rootInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()).left;
263 insetTop = rootInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()).top;
266 final DisplayMetrics displayMetrics =
activity.getResources().getDisplayMetrics();
268 double density = displayMetrics.density;
271 setDisplayMetrics(maxWidth, maxHeight, insetLeft, insetTop,
272 width,
height, getXDpi(displayMetrics), getYDpi(displayMetrics),
273 scaledDensity, density, getRefreshRate(
display));
276 public static float getXDpi(
final DisplayMetrics
metrics) {
277 if (
metrics.xdpi < android.util.DisplayMetrics.DENSITY_LOW)
278 return android.util.DisplayMetrics.DENSITY_LOW;
282 public static float getYDpi(
final DisplayMetrics
metrics) {
283 if (
metrics.ydpi < android.util.DisplayMetrics.DENSITY_LOW)
284 return android.util.DisplayMetrics.DENSITY_LOW;
struct wl_display * display
Q_CORE_EXPORT QtJniTypes::Activity activity()
@ SYSTEM_UI_VISIBILITY_TRANSLUCENT
@ SYSTEM_UI_VISIBILITY_FULLSCREEN
@ SYSTEM_UI_VISIBILITY_NORMAL
GLint GLsizei GLsizei height
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics