summaryrefslogtreecommitdiffstats
path: root/src/android/jar
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-01-16 09:06:06 +0100
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-03-30 13:03:49 +0100
commita35a7fcb5a713956e97bc87ccbd273737c7418df (patch)
tree14aca562752c4b2444243b589fe6b5c53913a24c /src/android/jar
parent3f73995a03c4b40e2648cb9af5d3e7ca393bf597 (diff)
Android: Implement MaximizeUsingFullscreenGeometryHint
(This reintroduces c17a5cec1901dd23f4c39ec2ae47a060fbb06895, which was reverted in Qt 5 because it requires API level 23.) This flag tells the app to use as much of the screen as possible while still keeping system UI visible, and can be supported on Android by using translucent system UI, similar to iOS. What this does: 1. It changes the current fullscreen/not-fullscreen logic to allow three states: fullscreen, fullscreen with translucent decorations and not-fullscreen. 2. In order for it to work, we have to send the actual screen geometry and available geometry, at least in the case where the user needs to know the available geometry to know the safe area of the window. So we get the real screen metrics and pass these to the QPA plugin (API level 17, so we can do that now that the minimum version is 21.) 3. Note that getting the insets and calculating the useable area does not work for non-fullscreen windows, since Android is quite inconsistent in this respect. So in this case we just use the window size and origin of 0,0 for the available geometry. 4. Since we are touching this code anyway, this patch also tries to use more consistent wording (calling it "available geometry" everywhere instead of desktop geometry in some places and just geometry in others, etc.) [ChangeLog][Android] Qt::MaximizeUsingFullscreenGeometryHint window flag is now supported, and will make the window fullscreen, but keep the system UI on-screen, with a translucent background color. Fixes: QTBUG-74202 Change-Id: I4cc5ef9cc2a3bd22d4d8d2bb767c6ff8a3aa75c0 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> Reviewed-by: Christian Strømme <christian.stromme@qt.io>
Diffstat (limited to 'src/android/jar')
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java63
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtLayout.java31
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtNative.java40
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java2
4 files changed, 94 insertions, 42 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index 2df2ed9a1d..0db9441749 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -121,6 +121,10 @@ public class QtActivityDelegate
private static final String EXTRACT_STYLE_KEY = "extract.android.style";
private static final String EXTRACT_STYLE_MINIMAL_KEY = "extract.android.style.option";
+ public static final int SYSTEM_UI_VISIBILITY_NORMAL = 0;
+ public static final int SYSTEM_UI_VISIBILITY_FULLSCREEN = 1;
+ public static final int SYSTEM_UI_VISIBILITY_TRANSLUCENT = 2;
+
private static String m_environmentVariables = null;
private static String m_applicationParameters = null;
@@ -131,7 +135,7 @@ public class QtActivityDelegate
private long m_metaState;
private int m_lastChar = 0;
private int m_softInputMode = 0;
- private boolean m_fullScreen = false;
+ private int m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL;
private boolean m_started = false;
private HashMap<Integer, QtSurface> m_surfaces = null;
private HashMap<Integer, View> m_nativeViews = null;
@@ -153,38 +157,51 @@ public class QtActivityDelegate
private CursorHandle m_rightSelectionHandle;
private EditPopupMenu m_editPopupMenu;
- public void setFullScreen(boolean enterFullScreen)
+
+ public void setSystemUiVisibility(int systemUiVisibility)
{
- if (m_fullScreen == enterFullScreen)
+ if (m_systemUiVisibility == systemUiVisibility)
return;
- if (m_fullScreen = enterFullScreen) {
+ m_systemUiVisibility = systemUiVisibility;
+
+ int systemUiVisibilityFlags = 0;
+ switch (m_systemUiVisibility) {
+ case SYSTEM_UI_VISIBILITY_NORMAL:
+ m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
+ m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_VISIBLE;
+ break;
+ case SYSTEM_UI_VISIBILITY_FULLSCREEN:
m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- try {
- int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
- flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
- flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
- flags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
- flags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_IMMERSIVE_STICKY").getInt(null);
- m_activity.getWindow().getDecorView().setSystemUiVisibility(flags | View.INVISIBLE);
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
+ systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+ | View.INVISIBLE;
+ break;
+ case SYSTEM_UI_VISIBILITY_TRANSLUCENT:
+ m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- m_activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
- }
+ systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_VISIBLE;
+ break;
+ };
+
+ m_activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibilityFlags);
+
m_layout.requestLayout();
}
public void updateFullScreen()
{
- if (m_fullScreen) {
- m_fullScreen = false;
- setFullScreen(true);
+ if (m_systemUiVisibility == SYSTEM_UI_VISIBILITY_FULLSCREEN) {
+ m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL;
+ setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN);
}
}
@@ -943,7 +960,7 @@ public class QtActivityDelegate
} catch (Exception e) {
e.printStackTrace();
}
- outState.putBoolean("FullScreen", m_fullScreen);
+ outState.putInt("SystemUiVisibility", m_systemUiVisibility);
outState.putBoolean("Started", m_started);
// It should never
}
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
index f22b8176c8..63993f81b5 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
@@ -46,6 +46,7 @@ import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowInsets;
public class QtLayout extends ViewGroup
{
@@ -69,10 +70,32 @@ public class QtLayout extends ViewGroup
@Override
protected void onSizeChanged (int w, int h, int oldw, int oldh)
{
- DisplayMetrics metrics = new DisplayMetrics();
- ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
- QtNative.setApplicationDisplayMetrics(metrics.widthPixels, metrics.heightPixels, w, h,
- metrics.xdpi, metrics.ydpi, metrics.scaledDensity, metrics.density);
+ WindowInsets insets = getRootWindowInsets();
+
+ DisplayMetrics realMetrics = new DisplayMetrics();
+ ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRealMetrics(realMetrics);
+
+ boolean isFullScreenView = h == realMetrics.heightPixels;
+
+ int insetLeft = isFullScreenView ? insets.getSystemWindowInsetLeft() : 0;
+ int insetTop = isFullScreenView ? insets.getSystemWindowInsetTop() : 0;
+ int insetRight = isFullScreenView ? insets.getSystemWindowInsetRight() : 0;
+ int insetBottom = isFullScreenView ? insets.getSystemWindowInsetBottom() : 0;
+
+ int usableAreaWidth = w - insetLeft - insetRight;
+ int usableAreaHeight = h - insetTop - insetBottom;
+
+ QtNative.setApplicationDisplayMetrics(realMetrics.widthPixels,
+ realMetrics.heightPixels,
+ insetLeft,
+ insetTop,
+ usableAreaWidth,
+ usableAreaHeight,
+ realMetrics.xdpi,
+ realMetrics.ydpi,
+ realMetrics.scaledDensity,
+ realMetrics.density);
+
if (m_startApplicationRunnable != null) {
m_startApplicationRunnable.run();
m_startApplicationRunnable = null;
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
index 082bae0782..dba407c0b1 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
@@ -96,8 +96,10 @@ public class QtNative
private static boolean m_started = false;
private static int m_displayMetricsScreenWidthPixels = 0;
private static int m_displayMetricsScreenHeightPixels = 0;
- private static int m_displayMetricsDesktopWidthPixels = 0;
- private static int m_displayMetricsDesktopHeightPixels = 0;
+ private static int m_displayMetricsAvailableLeftPixels = 0;
+ private static int m_displayMetricsAvailableTopPixels = 0;
+ private static int m_displayMetricsAvailableWidthPixels = 0;
+ private static int m_displayMetricsAvailableHeightPixels = 0;
private static double m_displayMetricsXDpi = .0;
private static double m_displayMetricsYDpi = .0;
private static double m_displayMetricsScaledDensity = 1.0;
@@ -480,8 +482,10 @@ public class QtNative
res[0] = startQtAndroidPlugin(qtParams, environment);
setDisplayMetrics(m_displayMetricsScreenWidthPixels,
m_displayMetricsScreenHeightPixels,
- m_displayMetricsDesktopWidthPixels,
- m_displayMetricsDesktopHeightPixels,
+ m_displayMetricsAvailableLeftPixels,
+ m_displayMetricsAvailableTopPixels,
+ m_displayMetricsAvailableWidthPixels,
+ m_displayMetricsAvailableHeightPixels,
m_displayMetricsXDpi,
m_displayMetricsYDpi,
m_displayMetricsScaledDensity,
@@ -502,8 +506,10 @@ public class QtNative
public static void setApplicationDisplayMetrics(int screenWidthPixels,
int screenHeightPixels,
- int desktopWidthPixels,
- int desktopHeightPixels,
+ int availableLeftPixels,
+ int availableTopPixels,
+ int availableWidthPixels,
+ int availableHeightPixels,
double XDpi,
double YDpi,
double scaledDensity,
@@ -519,8 +525,10 @@ public class QtNative
if (m_started) {
setDisplayMetrics(screenWidthPixels,
screenHeightPixels,
- desktopWidthPixels,
- desktopHeightPixels,
+ availableLeftPixels,
+ availableTopPixels,
+ availableWidthPixels,
+ availableHeightPixels,
XDpi,
YDpi,
scaledDensity,
@@ -528,8 +536,10 @@ public class QtNative
} else {
m_displayMetricsScreenWidthPixels = screenWidthPixels;
m_displayMetricsScreenHeightPixels = screenHeightPixels;
- m_displayMetricsDesktopWidthPixels = desktopWidthPixels;
- m_displayMetricsDesktopHeightPixels = desktopHeightPixels;
+ m_displayMetricsAvailableLeftPixels = availableLeftPixels;
+ m_displayMetricsAvailableTopPixels = availableTopPixels;
+ m_displayMetricsAvailableWidthPixels = availableWidthPixels;
+ m_displayMetricsAvailableHeightPixels = availableHeightPixels;
m_displayMetricsXDpi = XDpi;
m_displayMetricsYDpi = YDpi;
m_displayMetricsScaledDensity = scaledDensity;
@@ -785,13 +795,13 @@ public class QtNative
});
}
- private static void setFullScreen(final boolean fullScreen)
+ private static void setSystemUiVisibility(final int systemUiVisibility)
{
runAction(new Runnable() {
@Override
public void run() {
if (m_activityDelegate != null) {
- m_activityDelegate.setFullScreen(fullScreen);
+ m_activityDelegate.setSystemUiVisibility(systemUiVisibility);
}
updateWindow();
}
@@ -1162,8 +1172,10 @@ public class QtNative
// screen methods
public static native void setDisplayMetrics(int screenWidthPixels,
int screenHeightPixels,
- int desktopWidthPixels,
- int desktopHeightPixels,
+ int availableLeftPixels,
+ int availableTopPixels,
+ int availableWidthPixels,
+ int availableHeightPixels,
double XDpi,
double YDpi,
double scaledDensity,
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
index 33bcb364de..4cceab50c7 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtServiceDelegate.java
@@ -115,7 +115,7 @@ public class QtServiceDelegate
QtNative.setService(m_service, this);
QtNative.setClassLoader(classLoader);
- QtNative.setApplicationDisplayMetrics(10, 10, 10, 10, 120, 120, 1.0, 1.0);
+ QtNative.setApplicationDisplayMetrics(10, 10, 0, 0, 10, 10, 120, 120, 1.0, 1.0);
if (loaderParams.containsKey(STATIC_INIT_CLASSES_KEY)) {
for (String className: loaderParams.getStringArray(STATIC_INIT_CLASSES_KEY)) {