UnifiedPush: add support for link activity

Daniel Gultsch created

Change summary

src/main/AndroidManifest.xml                                         | 13 
src/main/java/eu/siacs/conversations/services/UnifiedPushBroker.java | 30 
src/main/java/eu/siacs/conversations/ui/UnifiedPushDistributor.java  | 35 
3 files changed, 68 insertions(+), 10 deletions(-)

Detailed changes

src/main/AndroidManifest.xml 🔗

@@ -140,6 +140,19 @@
             </intent-filter>
         </receiver>
 
+        <activity
+            android:enabled="false"
+            android:name=".ui.UnifiedPushDistributor"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data
+                    android:host="link"
+                    android:scheme="unifiedpush" />
+            </intent-filter>
+        </activity>
+
         <receiver
             android:name=".receiver.UnifiedPushDistributor"
             android:enabled="false"

src/main/java/eu/siacs/conversations/services/UnifiedPushBroker.java 🔗

@@ -34,6 +34,7 @@ import im.conversations.android.xmpp.model.stanza.Iq;
 import im.conversations.android.xmpp.model.up.Push;
 import java.nio.charset.StandardCharsets;
 import java.text.ParseException;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -263,19 +264,28 @@ public class UnifiedPushBroker {
 
     private void setUnifiedPushDistributorEnabled(final boolean enabled) {
         final PackageManager packageManager = service.getPackageManager();
-        final ComponentName componentName =
-                new ComponentName(service, UnifiedPushDistributor.class);
+        final var componentNames =
+                Arrays.asList(
+                        new ComponentName(
+                                service.getApplicationContext(),
+                                eu.siacs.conversations.ui.UnifiedPushDistributor.class),
+                        new ComponentName(
+                                service.getApplicationContext(), UnifiedPushDistributor.class));
         if (enabled) {
-            packageManager.setComponentEnabledSetting(
-                    componentName,
-                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
-                    PackageManager.DONT_KILL_APP);
+            for (final var componentName : componentNames) {
+                packageManager.setComponentEnabledSetting(
+                        componentName,
+                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                        PackageManager.DONT_KILL_APP);
+            }
             Log.d(Config.LOGTAG, "UnifiedPushDistributor has been enabled");
         } else {
-            packageManager.setComponentEnabledSetting(
-                    componentName,
-                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                    PackageManager.DONT_KILL_APP);
+            for (final var componentName : componentNames) {
+                packageManager.setComponentEnabledSetting(
+                        componentName,
+                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                        PackageManager.DONT_KILL_APP);
+            }
             Log.d(Config.LOGTAG, "UnifiedPushDistributor has been disabled");
         }
     }

src/main/java/eu/siacs/conversations/ui/UnifiedPushDistributor.java 🔗

@@ -0,0 +1,35 @@
+package eu.siacs.conversations.ui;
+
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import androidx.appcompat.app.AppCompatActivity;
+import com.google.common.base.Strings;
+import eu.siacs.conversations.Config;
+
+public class UnifiedPushDistributor extends AppCompatActivity {
+
+    private static final String DUMMY_APP = "org.unifiedpush.dummy_app";
+    private static final String EXTRA_PENDING_INTENT = "pi";
+
+    @Override
+    public void onCreate(final Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        final var intent = getIntent();
+        final var callingPackage = getCallingPackage();
+        final var result = new Intent();
+        if (intent == null || Strings.isNullOrEmpty(callingPackage)) {
+            setResult(RESULT_CANCELED, result);
+            finish();
+            ;
+        }
+        Log.d(Config.LOGTAG, "a package (" + callingPackage + ") called our link activity");
+        final var pendingIntent =
+                PendingIntent.getBroadcast(
+                        this, 0, new Intent(DUMMY_APP), PendingIntent.FLAG_IMMUTABLE);
+        result.putExtra(EXTRA_PENDING_INTENT, pendingIntent);
+        setResult(RESULT_OK, result);
+        finish();
+    }
+}