diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt index a54f8d8d4..f6ed06016 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/MainNavigationController.kt @@ -1,8 +1,12 @@ package com.habitrpg.android.habitica.helpers +import android.content.Intent +import android.net.Uri import android.os.Bundle import android.util.Log import androidx.navigation.NavController +import androidx.navigation.NavDeepLink +import androidx.navigation.NavDeepLinkRequest import androidx.navigation.NavDirections import java.lang.ref.WeakReference import java.util.* @@ -11,17 +15,20 @@ import kotlin.math.abs object MainNavigationController { var lastNavigation: Date? = null - var navController: WeakReference? = null + private var controllerReference: WeakReference? = null + + private val navController: NavController? + get() { return controllerReference?.get() } fun setup(navController: NavController) { - this.navController = WeakReference(navController) + this.controllerReference = WeakReference(navController) } fun navigate(transactionId: Int, args: Bundle? = null) { if (abs((lastNavigation?.time ?: 0) - Date().time) > 500) { lastNavigation = Date() try { - navController?.get()?.navigate(transactionId, args) + navController?.navigate(transactionId, args) } catch (e: IllegalArgumentException) { Log.e("Main Navigation", e.localizedMessage ?: "") } catch (error: Exception) { @@ -34,8 +41,29 @@ object MainNavigationController { if (abs((lastNavigation?.time ?: 0) - Date().time) > 500) { lastNavigation = Date() try { - navController?.get()?.navigate(directions) + navController?.navigate(directions) } catch (_: IllegalArgumentException) {} } } + + fun navigate(uriString: String) { + val uri = Uri.parse(uriString) + navigate(uri) + } + + fun navigate(uri: Uri) { + if (navController?.graph?.hasDeepLink(uri) == true) { + navController?.navigate(uri) + } + } + + fun navigate(request: NavDeepLinkRequest) { + if (navController?.graph?.hasDeepLink(request) == true) { + navController?.navigate(request) + } + } + + fun handle(deeplink: Intent) { + navController?.handleDeepLink(deeplink) + } } \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt index 0cb6bae89..29d9632c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationOpenHandler.kt @@ -26,6 +26,11 @@ class NotificationOpenHandler { PushNotificationManager.CHAT_MENTION_NOTIFICATION_KEY -> handleChatMessage(intent.getStringExtra("type"), intent.getStringExtra("groupID")) PushNotificationManager.GROUP_ACTIVITY_NOTIFICATION_KEY -> handleChatMessage(intent.getStringExtra("type"), intent.getStringExtra("groupID")) PushNotificationManager.G1G1_PROMO_KEY -> openGiftOneGetOneInfoScreen() + else -> { + if (intent.hasExtra("openURL")) { + MainNavigationController.navigate(intent.getStringExtra("openURL")) + } + } } } }