From 13ed06640c6cf32ea8c784c896c6bf017053edb3 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Mon, 3 Dec 2018 12:28:12 +0200 Subject: [Android] Fix the ability to override environment and arguments This mechanism should only be enabled only for debug deployments, but the check was removed by accident in ca139228abdd522a76b2750aed607440568eb7f3. Fixes: QTBUG-72230 Fixes: QTBUG-72132 Change-Id: I3378436e93314fdf254919aed066f1284a4581b3 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../jar/src/org/qtproject/qt5/android/QtActivityDelegate.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 8f218d34f0..74b515ef5b 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -674,6 +674,13 @@ public class QtActivityDelegate Bundle extras = m_activity.getIntent().getExtras(); if (extras != null) { try { + // do NOT remove !!!! + final String dc = "--Added-by-androiddeployqt--/debugger.command"; + new BufferedReader(new InputStreamReader(m_activity.getAssets().open(dc))).readLine(); + // do NOT remove !!!! + // The previous lines are needed to check if the debug mode is enabled. + // We are not allowed to use extraenvvars or extraappparams in a non debuggable environment. + if (extras.containsKey("extraenvvars")) { try { m_environmentVariables += "\t" + new String(Base64.decode(extras.getString("extraenvvars"), Base64.DEFAULT), "UTF-8"); -- cgit v1.2.3 From 83aa70f0ca5e5c7427a3493c4d3dbc398735a5df Mon Sep 17 00:00:00 2001 From: Vyacheslav Koscheev Date: Wed, 16 Jan 2019 13:11:37 +0700 Subject: Android: fix NPE on m_editPopupMenu Change-Id: Id6d4aea91d621194cf85f604b1b9acdc916bede1 Reviewed-by: Olivier Goffart (Woboq GmbH) --- .../jar/src/org/qtproject/qt5/android/QtActivityDelegate.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 74b515ef5b..02033859e9 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -506,7 +506,8 @@ public class QtActivityDelegate m_rightSelectionHandle = null; m_leftSelectionHandle = null; } - m_editPopupMenu.hide(); + if (m_editPopupMenu != null) + m_editPopupMenu.hide(); break; case CursorHandleShowNormal: @@ -561,7 +562,8 @@ public class QtActivityDelegate } m_editPopupMenu.setPosition(editX, editY, editButtons); } else { - m_editPopupMenu.hide(); + if (m_editPopupMenu != null) + m_editPopupMenu.hide(); } } -- cgit v1.2.3 From e0dc6dce222173bfa8fe20e1f33d24de70ea9fdd Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 17 Dec 2018 08:18:08 +0100 Subject: Android: Set minimum supported version to android-21 With the current distribution, this is 90% of active devices, and it was released in 2014. Qt 5.12 is LTS and will continue to support older Android versions for a long time to come. This is to reduce the testing needed on outdated platforms and allow ourselves to use some newer APIs unconditionally in Qt. Android 21 was chosen because it is the minimum version that supports 64 bit builds. [ChangeLog][Android] Increased the minimum supported Android version to Android 5.0 (API level 21). Fixes: QTBUG-70508 Change-Id: Ia7b4345e42ca05a25a292f11ccbb8cbd692cf8f0 Reviewed-by: BogDan Vatra --- .../org/qtproject/qt5/android/QtActivityDelegate.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 02033859e9..4485ed6338 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -161,15 +161,13 @@ public class QtActivityDelegate m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); try { - if (Build.VERSION.SDK_INT >= 19) { - 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); - } + 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(); } -- cgit v1.2.3 From 3c74042c3db8c68e47ed1f0c2ecd4d39a2d84912 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Mon, 11 Feb 2019 14:22:13 +0200 Subject: Load main library as soon as possible Delaying the main library load cause serious problems for people who want to access it's functions from java before the main method is called. Change-Id: I87f3a8282003395e003b06978048762eeabe6548 Fixes: QTBUG-68813 Reviewed-by: Andy Shaw --- .../org/qtproject/qt5/android/QtActivityDelegate.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 02033859e9..4b87c25787 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -606,11 +606,14 @@ public class QtActivityDelegate } QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY)); ArrayList libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY); - QtNative.loadBundledLibraries(libraries, QtNativeLibrariesDir.nativeLibrariesDir(m_activity)); + String nativeLibsDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity); + QtNative.loadBundledLibraries(libraries, nativeLibsDir); m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY); // older apps provide the main library as the last bundled library; look for this if the main library isn't provided - if (null == m_mainLib && libraries.size() > 0) + if (null == m_mainLib && libraries.size() > 0) { m_mainLib = libraries.get(libraries.size() - 1); + libraries.remove(libraries.size() - 1); + } if (loaderParams.containsKey(EXTRACT_STYLE_KEY)) { String path = loaderParams.getString(EXTRACT_STYLE_KEY); @@ -664,8 +667,8 @@ public class QtActivityDelegate } catch (Exception e) { e.printStackTrace(); } - - return true; + m_mainLib = QtNative.loadMainLibrary(m_mainLib, nativeLibsDir); + return m_mainLib != null; } public boolean startApplication() @@ -728,11 +731,7 @@ public class QtActivityDelegate @Override public void run() { try { - String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity); - QtNative.startApplication(m_applicationParameters, - m_environmentVariables, - m_mainLib, - nativeLibraryDir); + QtNative.startApplication(m_applicationParameters, m_environmentVariables, m_mainLib); m_started = true; } catch (Exception e) { e.printStackTrace(); -- cgit v1.2.3 From 11c728713ff56c6c8e5fce60bde9147ddaafc802 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 11 Feb 2019 11:33:56 +0100 Subject: Android: Show correct keyboard when using Gboard and Japanese layout In 71a63836ed5d21feacbfcdbfdbd4b405f635282f a workaround for Samsung devices using ImhNoPredictiveText was included as there is a bug on those devices. However this causes a problem with other keyboards such as Gboard when using languages such as Japanese, as it would not show the right keyboard at all and only showed a qwerty one in those cases. Therefore we default to not working around the issue as it is more of a problem to not allow certain keyboard layouts as opposed to having predictive text even if it is turned off. For those who want to disable predictive text and as such have the consequences of not showing some keyboard layouts, they can set the QT_ANDROID_ENABLE_WORKAROUND_TO_DISABLE_PREDICTIVE_TEXT environment variable. [ChangeLog][Platform Specific Changes][Android] Text fields with ImhNoPredictiveText set are no longer working around keyboards that disregard this setting. To enforce the workaround then the environment variable - QT_ANDROID_ENABLE_WORKAROUND_TO_DISABLE_PREDICTIVE_TEXT should be set. Change-Id: I9ace7ba96ebad68987b53783e25067b66c002f25 Reviewed-by: Paul Olav Tvete --- src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 4b87c25787..350c6eee96 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -346,7 +346,9 @@ public class QtActivityDelegate } } else if ((inputHints & ImhHiddenText) != 0) { inputType |= android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD; - } else if ((inputHints & ImhSensitiveData) != 0 || (inputHints & ImhNoPredictiveText) != 0) { + } else if ((inputHints & ImhSensitiveData) != 0 || + ((inputHints & ImhNoPredictiveText) != 0 && + System.getenv("QT_ANDROID_ENABLE_WORKAROUND_TO_DISABLE_PREDICTIVE_TEXT") != null)) { inputType |= android.text.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; } -- cgit v1.2.3 From 1d58d2e987bb12b2d79c7a8bb80e14955dadded6 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Tue, 11 Sep 2018 13:56:12 +0200 Subject: Android: Use DisplayListener to detect rotation Since Activity's onConfigurationChanged is not called when rotating from landscape to landscape (through 180 degrees), added display listener to detect the rotation. DisplayManager.DisplayListener.onDisplayChanged() is called exactly when Display.getRotation() value is changed. Task-number: QTBUG-56919 Change-Id: Iabf376adf0a0756dddacaece62e5a2ac604ea947 Reviewed-by: Andy Shaw --- .../qtproject/qt5/android/QtActivityDelegate.java | 30 +++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 a4d134d0fa..1cbb8fe117 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -82,6 +82,7 @@ import android.view.inputmethod.InputMethodManager; import android.view.ViewTreeObserver; import android.widget.ImageView; import android.widget.PopupMenu; +import android.hardware.display.DisplayManager; import java.io.BufferedReader; import java.io.DataOutputStream; @@ -667,6 +668,28 @@ public class QtActivityDelegate } catch (Exception e) { e.printStackTrace(); } + + DisplayManager.DisplayListener displayListener = new DisplayManager.DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { } + + @Override + public void onDisplayChanged(int displayId) { + m_currentRotation = m_activity.getWindowManager().getDefaultDisplay().getRotation(); + QtNative.handleOrientationChanged(m_currentRotation, m_nativeOrientation); + } + + @Override + public void onDisplayRemoved(int displayId) { } + }; + + try { + DisplayManager displayManager = (DisplayManager) m_activity.getSystemService(Context.DISPLAY_SERVICE); + displayManager.registerDisplayListener(displayListener, null); + } catch (Exception e) { + e.printStackTrace(); + } + m_mainLib = QtNative.loadMainLibrary(m_mainLib, nativeLibsDir); return m_mainLib != null; } @@ -856,13 +879,6 @@ public class QtActivityDelegate } catch (Exception e) { e.printStackTrace(); } - - int rotation = m_activity.getWindowManager().getDefaultDisplay().getRotation(); - if (rotation != m_currentRotation) { - QtNative.handleOrientationChanged(rotation, m_nativeOrientation); - } - - m_currentRotation = rotation; } public void onDestroy() -- cgit v1.2.3 From 12978d4ad03af753130ba7c40b6203491cd86cd5 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 18 Mar 2019 14:02:26 +0100 Subject: Android: Support for separate landscape/portrait splash screens To get appropriate aspect ratios for the splash screen, you usually need separate drawables for the portrait and landscape versions. We support this by adding two new meta data entries that can be used. If they are not available, we will fall back to the generic one, so we are still compatible with existing AndroidManifest.xmls. [ChangeLog][Android] Added entries in the AndroidManifest.xml for specific portrait and landscape splash screens. If one is present for the current orientation, it will be preferred over the generic one. Task-number: QTBUG-74029 Change-Id: I5ffea56320aef85f62f21a59df4d077b4163a65a Reviewed-by: Andy Shaw --- .../src/org/qtproject/qt5/android/QtActivityDelegate.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java') 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 350c6eee96..5fef1eccad 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -744,11 +744,19 @@ public class QtActivityDelegate } m_layout = new QtLayout(m_activity, startApplication); + int orientation = m_activity.getResources().getConfiguration().orientation; + try { ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(), PackageManager.GET_META_DATA); - if (info.metaData.containsKey("android.app.splash_screen_drawable")) { + + String splashScreenKey = "android.app.splash_screen_drawable_" + + (orientation == Configuration.ORIENTATION_LANDSCAPE ? "landscape" : "portrait"); + if (!info.metaData.containsKey(splashScreenKey)) + splashScreenKey = "android.app.splash_screen_drawable"; + + if (info.metaData.containsKey(splashScreenKey)) { m_splashScreenSticky = info.metaData.containsKey("android.app.splash_screen_sticky") && info.metaData.getBoolean("android.app.splash_screen_sticky"); - int id = info.metaData.getInt("android.app.splash_screen_drawable"); + int id = info.metaData.getInt(splashScreenKey); m_splashScreen = new ImageView(m_activity); m_splashScreen.setImageDrawable(m_activity.getResources().getDrawable(id)); m_splashScreen.setScaleType(ImageView.ScaleType.FIT_XY); @@ -768,7 +776,6 @@ public class QtActivityDelegate new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - int orientation = m_activity.getResources().getConfiguration().orientation; int rotation = m_activity.getWindowManager().getDefaultDisplay().getRotation(); boolean rot90 = (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270); boolean currentlyLandscape = (orientation == Configuration.ORIENTATION_LANDSCAPE); -- cgit v1.2.3