diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java index 176b05dc57..37a49238ef 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java @@ -130,7 +130,7 @@ public class QtActivityBase extends Activity if (QtNative.getStateDetails().isStarted) { QtNative.updateWindow(); // Suspending the app clears the immersive mode, so we need to set it again. - m_delegate.displayManager().updateFullScreen(this); + m_delegate.displayManager().updateFullScreen(); } } @@ -257,7 +257,7 @@ public class QtActivityBase extends Activity super.onRestoreInstanceState(savedInstanceState); QtNative.setStarted(savedInstanceState.getBoolean("Started")); int savedSystemUiVisibility = savedInstanceState.getInt("SystemUiVisibility"); - m_delegate.displayManager().setSystemUiVisibility(this, savedSystemUiVisibility); + m_delegate.displayManager().setSystemUiVisibility(savedSystemUiVisibility); // FIXME restore all surfaces } @@ -282,7 +282,7 @@ public class QtActivityBase extends Activity { super.onWindowFocusChanged(hasFocus); if (hasFocus) - m_delegate.displayManager().updateFullScreen(this); + m_delegate.displayManager().updateFullScreen(); } @Override diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java index d157cfdf9c..5ef0b611f0 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -47,9 +47,9 @@ public class QtActivityDelegate private View m_dummyView = null; private QtAccessibilityDelegate m_accessibilityDelegate = null; - private final QtDisplayManager m_displayManager = new QtDisplayManager(); + private QtDisplayManager m_displayManager = null; - private final QtInputDelegate m_inputDelegate; + private QtInputDelegate m_inputDelegate = null; QtActivityDelegate(Activity activity) { @@ -57,18 +57,6 @@ public class QtActivityDelegate QtNative.setActivity(m_activity); setActionBarVisibility(false); - - QtInputDelegate.KeyboardVisibilityListener keyboardVisibilityListener = - () -> m_displayManager.updateFullScreen(m_activity); - m_inputDelegate = new QtInputDelegate(m_activity, keyboardVisibilityListener); - - try { - PackageManager pm = m_activity.getPackageManager(); - ActivityInfo activityInfo = pm.getActivityInfo(m_activity.getComponentName(), 0); - m_inputDelegate.setSoftInputMode(activityInfo.softInputMode); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } } QtDisplayManager displayManager() { @@ -90,7 +78,7 @@ public class QtActivityDelegate public void setSystemUiVisibility(int systemUiVisibility) { QtNative.runAction(() -> { - m_displayManager.setSystemUiVisibility(m_activity, systemUiVisibility); + m_displayManager.setSystemUiVisibility(systemUiVisibility); m_layout.requestLayout(); QtNative.updateWindow(); }); @@ -149,7 +137,20 @@ public class QtActivityDelegate { m_layout = new QtLayout(m_activity); - m_displayManager.registerDisplayListener(m_activity, m_layout); + m_displayManager = new QtDisplayManager(m_activity, m_layout); + m_displayManager.registerDisplayListener(); + + QtInputDelegate.KeyboardVisibilityListener keyboardVisibilityListener = + () -> m_displayManager.updateFullScreen(); + m_inputDelegate = new QtInputDelegate(m_activity, keyboardVisibilityListener); + + try { + PackageManager pm = m_activity.getPackageManager(); + ActivityInfo activityInfo = pm.getActivityInfo(m_activity.getComponentName(), 0); + m_inputDelegate.setSoftInputMode(activityInfo.softInputMode); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } int orientation = m_activity.getResources().getConfiguration().orientation; diff --git a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java index 6364fa53a1..1374176416 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java @@ -44,21 +44,23 @@ public class QtDisplayManager { public static final int SYSTEM_UI_VISIBILITY_TRANSLUCENT = 2; private int m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL; - // FIXME: some methods here make more sense as non-static, fix that - QtDisplayManager() {} + private DisplayManager.DisplayListener m_displayListener = null; + private final Activity m_activity; - // TODO: unregister the listener upon activity destruction as well - public void registerDisplayListener(Activity activity, QtLayout layout) + QtDisplayManager(Activity activity, QtLayout layout) { - DisplayManager.DisplayListener displayListener = new DisplayManager.DisplayListener() - { + m_activity = activity; + initDisplayListener(layout); + } + + private void initDisplayListener(QtLayout layout) { + m_displayListener = new DisplayManager.DisplayListener() { @Override public void onDisplayAdded(int displayId) { QtDisplayManager.handleScreenAdded(displayId); } - private boolean isSimilarRotation(int r1, int r2) - { + private boolean isSimilarRotation(int r1, int r2) { return (r1 == r2) || (r1 == Surface.ROTATION_0 && r2 == Surface.ROTATION_180) || (r1 == Surface.ROTATION_180 && r2 == Surface.ROTATION_0) @@ -67,11 +69,10 @@ public class QtDisplayManager { } @Override - public void onDisplayChanged(int displayId) - { + public void onDisplayChanged(int displayId) { Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) - ? activity.getWindowManager().getDefaultDisplay() - : activity.getDisplay(); + ? m_activity.getWindowManager().getDefaultDisplay() + : m_activity.getDisplay(); int rotation = display.getRotation(); layout.setActivityDisplayRotation(rotation); // Process orientation change only if it comes after the size @@ -79,7 +80,7 @@ public class QtDisplayManager { // Otherwise it will be processed in QtLayout. if (isSimilarRotation(rotation, layout.displayRotation())) { QtDisplayManager.handleOrientationChanged(rotation, - getNativeOrientation(activity, rotation)); + getNativeOrientation(m_activity, rotation)); } float refreshRate = display.getRefreshRate(); @@ -92,9 +93,14 @@ public class QtDisplayManager { QtDisplayManager.handleScreenRemoved(displayId); } }; + } - DisplayManager displayManager = (DisplayManager) activity.getSystemService(Context.DISPLAY_SERVICE); - displayManager.registerDisplayListener(displayListener, null); + // TODO: unregister the listener upon activity destruction as well + public void registerDisplayListener() + { + DisplayManager displayManager = + (DisplayManager) m_activity.getSystemService(Context.DISPLAY_SERVICE); + displayManager.registerDisplayListener(m_displayListener, null); } public static int getNativeOrientation(Activity activity, int rotation) @@ -112,9 +118,8 @@ public class QtDisplayManager { return nativeOrientation; } - public void setSystemUiVisibility(Activity activity, int systemUiVisibility) + public void setSystemUiVisibility(int systemUiVisibility) { - if (m_systemUiVisibility == systemUiVisibility) return; @@ -123,16 +128,16 @@ public class QtDisplayManager { int systemUiVisibilityFlags = View.SYSTEM_UI_FLAG_VISIBLE; switch (m_systemUiVisibility) { case SYSTEM_UI_VISIBILITY_NORMAL: - activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - activity.getWindow().getAttributes().layoutInDisplayCutoutMode = + m_activity.getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; } break; case SYSTEM_UI_VISIBILITY_FULLSCREEN: - activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + m_activity.getWindow().clearFlags(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 @@ -141,22 +146,22 @@ public class QtDisplayManager { | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.INVISIBLE; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - activity.getWindow().getAttributes().layoutInDisplayCutoutMode = + m_activity.getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; } break; case SYSTEM_UI_VISIBILITY_TRANSLUCENT: - activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN + m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - activity.getWindow().getAttributes().layoutInDisplayCutoutMode = + m_activity.getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; } break; } - activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibilityFlags); + m_activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibilityFlags); } public int systemUiVisibility() @@ -164,11 +169,11 @@ public class QtDisplayManager { return m_systemUiVisibility; } - public void updateFullScreen(Activity activity) + public void updateFullScreen() { if (m_systemUiVisibility == SYSTEM_UI_VISIBILITY_FULLSCREEN) { m_systemUiVisibility = SYSTEM_UI_VISIBILITY_NORMAL; - setSystemUiVisibility(activity, SYSTEM_UI_VISIBILITY_FULLSCREEN); + setSystemUiVisibility(SYSTEM_UI_VISIBILITY_FULLSCREEN); } }