From f6fef171fa458cc5450e880ebb93b1a66e6df1b2 Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Thu, 2 Apr 2026 10:31:43 +0200 Subject: [PATCH] Enhance deep link handling for Android with pending link consumption and JavaScript interface --- android/app/build.gradle | 2 +- .../compassconnections/app/MainActivity.java | 45 ++++++++++++------- common/src/envs/constants.ts | 2 +- web/pages/_app.tsx | 6 +++ web/pages/_document.tsx | 1 + 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 391b4ce3..8d85feda 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -11,7 +11,7 @@ android { applicationId "com.compassconnections.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 76 + versionCode 77 versionName "1.15.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { diff --git a/android/app/src/main/java/com/compassconnections/app/MainActivity.java b/android/app/src/main/java/com/compassconnections/app/MainActivity.java index 533d0158..081c8896 100644 --- a/android/app/src/main/java/com/compassconnections/app/MainActivity.java +++ b/android/app/src/main/java/com/compassconnections/app/MainActivity.java @@ -82,6 +82,13 @@ public class MainActivity extends BridgeActivity implements ModifiedMainActivity this.context = context; } + @JavascriptInterface + public String getPendingDeepLink() { + String link = pendingDeepLink; + pendingDeepLink = null; // consume it + return link; + } + @JavascriptInterface public void downloadFile(String filename, String content) { try { @@ -202,29 +209,35 @@ public class MainActivity extends BridgeActivity implements ModifiedMainActivity } @Override - protected void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { Log.i("CompassApp", "onCreate called"); super.onCreate(savedInstanceState); WebView webView = this.bridge.getWebView(); - webView.setWebViewClient(new BridgeWebViewClient(this.bridge) { - @Override - public void onPageFinished(WebView view, String url) { - super.onPageFinished(view, url); - if (pendingDeepLink != null) { - handleDeepLink(pendingDeepLink); - pendingDeepLink = null; - } - } - }); + webView.setWebViewClient(new BridgeWebViewClient(this.bridge)); + +// WebView.setWebContentsDebuggingEnabled(true); + + // Set a recognizable User-Agent (always reliable) + WebSettings settings = webView.getSettings(); + settings.setUserAgentString(settings.getUserAgentString() + " CompassAppWebView"); + + settings.setJavaScriptEnabled(true); + webView.addJavascriptInterface(new WebAppInterface(this), "AndroidBridge"); + + registerPlugin(PushNotificationsPlugin.class); + // Initialize the Bridge with Push Notifications plugin +// this.init(savedInstanceState, new ArrayList>() {{ +// add(com.getcapacitor.plugin.PushNotifications.class); +// }}); + + askNotificationPermission(); + + appUpdateManager = AppUpdateManagerFactory.create(this); + checkForUpdates(); Uri data = getIntent().getData(); if (data != null) pendingDeepLink = data.toString(); - - if (pendingDeepLink != null) { - handleDeepLink(pendingDeepLink); - pendingDeepLink = null; - } } private void handleDeepLink(String url) { diff --git a/common/src/envs/constants.ts b/common/src/envs/constants.ts index 733d6c66..8e98b39e 100644 --- a/common/src/envs/constants.ts +++ b/common/src/envs/constants.ts @@ -54,7 +54,7 @@ export const LOCAL_WEB_DOMAIN = `localhost:3000` export const LOCAL_BACKEND_DOMAIN = `${IS_WEBVIEW_DEV_PHONE ? '192.168.1.3' : IS_LOCAL_ANDROID ? '10.0.2.2' : 'localhost'}:8088` export const DOMAIN = IS_LOCAL ? LOCAL_WEB_DOMAIN : ENV_CONFIG.domain -export const DEPLOYED_WEB_URL = `https://www.${ENV_CONFIG.domain}` +export const DEPLOYED_WEB_URL = `https://${ENV_CONFIG.domain}` export const WEB_URL = IS_LOCAL ? `http://${LOCAL_WEB_DOMAIN}` : `https://${DOMAIN}` export const BACKEND_DOMAIN = IS_LOCAL ? LOCAL_BACKEND_DOMAIN : ENV_CONFIG.backendDomain export const FIREBASE_CONFIG = ENV_CONFIG.firebaseConfig diff --git a/web/pages/_app.tsx b/web/pages/_app.tsx index 27d79af6..82ee9574 100644 --- a/web/pages/_app.tsx +++ b/web/pages/_app.tsx @@ -150,6 +150,7 @@ function MyApp(props: AppProps) { }, [router]) useEffect(() => { + if (!Capacitor.isNativePlatform()) return const handleAppLink = (payload: any) => { debug('handleAppLink', payload) const {endpoint} = payload @@ -158,6 +159,11 @@ function MyApp(props: AppProps) { } } ;(window as any).handleAppLink = handleAppLink + + const link = window.AndroidBridge?.getPendingDeepLink?.() + if (link) { + handleAppLink({url: link, endpoint: new URL(link).pathname}) + } }, []) const title = 'Compass' diff --git a/web/pages/_document.tsx b/web/pages/_document.tsx index a01910ab..8d69c6e8 100644 --- a/web/pages/_document.tsx +++ b/web/pages/_document.tsx @@ -8,6 +8,7 @@ declare global { interface Window { AndroidBridge?: { downloadFile: (filename: string, content: string) => void + getPendingDeepLink: () => string | null } } }