From 576be5d0472a675f267fbbf94067b9a1bf295794 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Wed, 22 Nov 2023 15:32:01 +0200 Subject: [PATCH] Android: don't pass Activity to some QtDisplayManager methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the display manager is mainly created by the Activity delegate and lives with it, so pass the Actitivy and use it internally, instead of passing it to every method. Task-number: QTBUG-118077 Change-Id: I7761490ac8746cc6dad3bd59514a54da18519990 Reviewed-by: Tinja Paavoseppä --- .../qtproject/qt/android/QtActivityBase.java | 6 +- .../qt/android/QtActivityDelegate.java | 33 +++++----- .../qt/android/QtDisplayManager.java | 63 ++++++++++--------- 3 files changed, 54 insertions(+), 48 deletions(-) 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); } }