From fcae2b7f2d6d23bcdf83fad53509fdc07961de7a Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Wed, 12 Jun 2024 13:05:16 +0300 Subject: [PATCH] Android: restart whole app if the activity was restarted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the Activity restart path is run while m_layout is null, it would lead to a NullPointerException when trying to access m_layout. Moreover, the code here doesn't make sense, as m_layout.getParent() should probably be only done when super.updateActivityAfterRestart() returns true because if it returns false, the app will be restarted anyway. Testing the restarting behavior of the Activity, it seems that the code code doesn't really work in bringing the app to a usable state after an activity restart, and this code path should be re-evaluated. Thus, I'm simplifying the logic to only restart the whole app, and later figure out a way to do a proper smooth transition instead. Fixes: QTBUG-124786 Pick-to: 6.7 Change-Id: I79f0c53c815bf71c831d0b930f358c9fd820a2d4 Reviewed-by: Tinja Paavoseppä (cherry picked from commit 7602f71aa6cd10ff1b16d154fa967c8fce8e8d0a) Reviewed-by: Qt Cherry-pick Bot --- .../qtproject/qt/android/QtActivityBase.java | 28 +++++++++---------- .../qt/android/QtActivityDelegate.java | 15 ---------- .../qt/android/QtActivityDelegateBase.java | 15 ---------- 3 files changed, 14 insertions(+), 44 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 b5de60d49d7..dccaf45a05e 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java @@ -63,25 +63,19 @@ public class QtActivityBase extends Activity implements QtNative.AppStateDetails m_applicationParams += params; } - private void handleActivityRestart() { - if (QtNative.getStateDetails().isStarted) { - boolean updated = m_delegate.updateActivityAfterRestart(this); - if (!updated) { - // could not update the activity so restart the application - Intent intent = Intent.makeRestartActivityTask(getComponentName()); - startActivity(intent); - QtNative.quitApp(); - Runtime.getRuntime().exit(0); - } - } - } - @Override public void setTheme(int resId) { super.setTheme(resId); m_isCustomThemeSet = true; } + private void restartApplication() { + Intent intent = Intent.makeRestartActivityTask(getComponentName()); + startActivity(intent); + QtNative.quitApp(); + Runtime.getRuntime().exit(0); + } + @Override protected void onCreate(Bundle savedInstanceState) { @@ -94,11 +88,17 @@ public class QtActivityBase extends Activity implements QtNative.AppStateDetails android.R.style.Theme_Holo_Light); } + if (QtNative.getStateDetails().isStarted) { + // We don't yet have a reliable way to keep the app + // running properly in case of an Activity only restart, + // so for now restart the whole app. + restartApplication(); + } + m_delegate = new QtActivityDelegate(this); QtNative.registerAppStateListener(this); - handleActivityRestart(); addReferrer(getIntent()); QtActivityLoader loader = new QtActivityLoader(this); 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 596074c6310..d78c059094b 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -97,21 +97,6 @@ class QtActivityDelegate extends QtActivityDelegateBase }); } - @Override - public boolean updateActivityAfterRestart(Activity activity) { - boolean updated = super.updateActivityAfterRestart(activity); - // TODO verify whether this is even needed, the last I checked the initMembers - // recreates the layout anyway - // update the new activity content view to old layout - ViewGroup layoutParent = (ViewGroup)m_layout.getParent(); - if (layoutParent != null) - layoutParent.removeView(m_layout); - - m_activity.setContentView(m_layout); - - return updated; - } - @Override void startNativeApplicationImpl(String appParams, String mainLib) { diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java index 4980a47d08d..84a5961b8a6 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java @@ -77,21 +77,6 @@ abstract class QtActivityDelegateBase return m_contextMenuVisible; } - public boolean updateActivityAfterRestart(Activity activity) { - try { - // set new activity - m_activity = activity; - QtNative.setActivity(m_activity); - - // force c++ native activity object to update - return QtNative.updateNativeActivity(); - } catch (Exception e) { - Log.w(QtNative.QtTAG, "Failed to update the activity."); - e.printStackTrace(); - return false; - } - } - public void startNativeApplication(String appParams, String mainLib) { if (m_membersInitialized)