From 2269a400adeecaa3ca3ea03c19c4ef4b24afb89a Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Tue, 30 Sep 2025 21:33:51 +0200 Subject: [PATCH] Try to start all external Services over DBus No need to hardcode this only for Cloud Messaging --- .../content/android_content_Context.c | 3 +- .../android_content_Context.h | 4 +-- src/api-impl/android/content/Context.java | 33 ++++++++++--------- src/api-impl/android/content/Intent.java | 6 ++-- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/api-impl-jni/content/android_content_Context.c b/src/api-impl-jni/content/android_content_Context.c index 6c6e91af..dbfba0a5 100644 --- a/src/api-impl-jni/content/android_content_Context.c +++ b/src/api-impl-jni/content/android_content_Context.c @@ -176,9 +176,10 @@ JNIEXPORT void JNICALL Java_android_content_Context_nativeRegisterUnifiedPush(JN (*env)->ReleaseStringUTFChars(env, application_jstr, application); } -JNIEXPORT void JNICALL Java_android_content_Context_nativeStartExternalService(JNIEnv *env, jclass this, jstring package_jstr, jobject intent) +JNIEXPORT void JNICALL Java_android_content_Context_nativeStartExternalService(JNIEnv *env, jclass this, jobject intent) { GVariant *variant = intent_serialize(env, intent); + jstring package_jstr = _GET_OBJ_FIELD(intent, "packageName", "Ljava/lang/String;"); const char *package = (*env)->GetStringUTFChars(env, package_jstr, NULL); char *object_path = g_strdup_printf("/%s", package); g_strdelimit(object_path, ".", '/'); diff --git a/src/api-impl-jni/generated_headers/android_content_Context.h b/src/api-impl-jni/generated_headers/android_content_Context.h index f63fd855..2731f984 100644 --- a/src/api-impl-jni/generated_headers/android_content_Context.h +++ b/src/api-impl-jni/generated_headers/android_content_Context.h @@ -52,10 +52,10 @@ JNIEXPORT void JNICALL Java_android_content_Context_nativeRegisterUnifiedPush /* * Class: android_content_Context * Method: nativeStartExternalService - * Signature: (Ljava/lang/String;Landroid/content/Intent;)V + * Signature: (Landroid/content/Intent;)V */ JNIEXPORT void JNICALL Java_android_content_Context_nativeStartExternalService - (JNIEnv *, jclass, jstring, jobject); + (JNIEnv *, jclass, jobject); #ifdef __cplusplus } diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 6160662b..9ebd0f7b 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -154,7 +154,7 @@ public class Context extends Object { private static native void nativeOpenFile(int fd); private static native void nativeExportUnifiedPush(String packageName); private static native void nativeRegisterUnifiedPush(String token, String application); - private static native void nativeStartExternalService(String packageName, Intent service); + private static native void nativeStartExternalService(Intent service); static Application createApplication(long native_window) throws Exception { Application application; @@ -482,23 +482,24 @@ public class Context extends Object { } } } - if (intent.getAction() != null && intent.getAction().startsWith("com.google.android.c2dm")) { - nativeStartExternalService("com.google.android.c2dm", intent); - // Newer applications use a Messenger instead of a BroadcastReceiver for the return Intent. - // To support new and old apps with a common interface, we wrap the Messenger in a BroadcastReceiver + // Newer applications use a Messenger instead of a BroadcastReceiver for the GCM token return Intent. + // To support new and old apps with a common interface, we wrap the Messenger in a BroadcastReceiver + if ("com.google.android.c2dm.intent.REGISTER".equals(intent.getAction()) && intent.getParcelableExtra("google.messenger") instanceof Messenger) { final Messenger messenger = (Messenger)intent.getParcelableExtra("google.messenger"); - if (messenger != null) { - receiverMap.put(new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"), new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent resultIntent) { - try { - messenger.send(Message.obtain(null, 0, resultIntent)); - } catch (RemoteException e) { - e.printStackTrace(); - } + receiverMap.put(new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"), new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent resultIntent) { + try { + messenger.send(Message.obtain(null, 0, resultIntent)); + } catch (RemoteException e) { + e.printStackTrace(); } - }); - } + } + }); + } + if (intent.getPackage() != null && !intent.getPackage().equals(getPackageName())) { + // External package. Try to start using DBus Action + nativeStartExternalService(intent); return null; } if (component == null) { diff --git a/src/api-impl/android/content/Intent.java b/src/api-impl/android/content/Intent.java index abe5c3ba..37e214b6 100644 --- a/src/api-impl/android/content/Intent.java +++ b/src/api-impl/android/content/Intent.java @@ -25,6 +25,7 @@ public class Intent implements Parcelable { private Uri data; private int flags; private String type; + private String packageName; public Intent() {} public Intent(Intent o) { @@ -63,7 +64,8 @@ public class Intent implements Parcelable { } public Intent setPackage(String packageName) { - return this; //?? + this.packageName = packageName; + return this; } public Intent setType(String type) { @@ -328,7 +330,7 @@ public class Intent implements Parcelable { } public String getPackage() { - return component == null ? null : component.getPackageName(); + return packageName; } public String getScheme() {