From f90499d1df2576858306be1dee6d56d1c72ba127 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sun, 5 Oct 2025 14:40:33 +0200 Subject: [PATCH] FLAG_ACTIVITY_CLEAR_TOP: create Activity if it doesn't already exist When originally implementing this flag, we forgot to handle cases where the Activity does not exist. --- src/api-impl-jni/app/android_app_Activity.c | 6 +++++- .../generated_headers/android_app_Activity.h | 4 ++-- src/api-impl/android/app/Activity.java | 2 +- src/api-impl/android/content/Context.java | 9 +++++---- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/api-impl-jni/app/android_app_Activity.c b/src/api-impl-jni/app/android_app_Activity.c index 181cef2c..84e6c40f 100644 --- a/src/api-impl-jni/app/android_app_Activity.c +++ b/src/api-impl-jni/app/android_app_Activity.c @@ -201,10 +201,11 @@ JNIEXPORT void JNICALL Java_android_app_Activity_nativeStartActivity(JNIEnv *env activity_start(env, activity); } -JNIEXPORT void JNICALL Java_android_app_Activity_nativeResumeActivity(JNIEnv *env, jclass class, jclass activity_class, jobject intent) +JNIEXPORT jboolean JNICALL Java_android_app_Activity_nativeResumeActivity(JNIEnv *env, jclass class, jclass activity_class, jobject intent) { GList *l; GList *activities_to_close = NULL; + jboolean found = JNI_FALSE; for (l = activity_backlog; l != NULL; l = l->next) { if ((*env)->IsSameObject(env, activity_class, _CLASS(l->data))) { if (l != activity_backlog) { @@ -218,6 +219,7 @@ JNIEXPORT void JNICALL Java_android_app_Activity_nativeResumeActivity(JNIEnv *en (*env)->CallVoidMethod(env, l->data, handle_cache.activity.onNewIntent, intent); if((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); + found = JNI_TRUE; break; } } @@ -228,6 +230,8 @@ JNIEXPORT void JNICALL Java_android_app_Activity_nativeResumeActivity(JNIEnv *en _UNREF(l->data); } g_list_free(activities_to_close); + + return found; } JNIEXPORT void JNICALL Java_android_app_Activity_nativeOpenURI(JNIEnv *env, jclass class, jstring uriString) diff --git a/src/api-impl-jni/generated_headers/android_app_Activity.h b/src/api-impl-jni/generated_headers/android_app_Activity.h index ea63c269..d1577237 100644 --- a/src/api-impl-jni/generated_headers/android_app_Activity.h +++ b/src/api-impl-jni/generated_headers/android_app_Activity.h @@ -40,9 +40,9 @@ JNIEXPORT void JNICALL Java_android_app_Activity_nativeStartActivity /* * Class: android_app_Activity * Method: nativeResumeActivity - * Signature: (Ljava/lang/Class;Landroid/content/Intent;)V + * Signature: (Ljava/lang/Class;Landroid/content/Intent;)Z */ -JNIEXPORT void JNICALL Java_android_app_Activity_nativeResumeActivity +JNIEXPORT jboolean JNICALL Java_android_app_Activity_nativeResumeActivity (JNIEnv *, jclass, jclass, jobject); /* diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 592d129d..254f7301 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -582,7 +582,7 @@ public class Activity extends ContextThemeWrapper implements Window.Callback, La private native void nativeFinish(long native_window); public static native void nativeStartActivity(Activity activity); - public static native void nativeResumeActivity(Class activityClass, Intent intent); + public static native boolean nativeResumeActivity(Class activityClass, Intent intent); public static native void nativeOpenURI(String uri); public native void nativeFileChooser(int action, String type, String title, int requestCode); public void reportFullyDrawn() {} diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 9ebd0f7b..c0888154 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -663,11 +663,12 @@ public class Context extends Object { public void run() { try { if ((intent_.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 && intent_.getComponent() != null) { - Activity.nativeResumeActivity(Class.forName(intent_.getComponent().getClassName()).asSubclass(Activity.class), intent_); - } else { - Activity activity = Activity.internalCreateActivity(className_, this_application.native_window, intent_); - Activity.nativeStartActivity(activity); + boolean found = Activity.nativeResumeActivity(Class.forName(intent_.getComponent().getClassName()).asSubclass(Activity.class), intent_); + if (found) + return; } + Activity activity = Activity.internalCreateActivity(className_, this_application.native_window, intent_); + Activity.nativeStartActivity(activity); } catch (Exception e) { e.printStackTrace(); }