diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index afd3264cb..7af30ef4e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -62,20 +62,13 @@
-
-
-
-
-
@@ -89,6 +82,10 @@
+
+
+
+
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt
index 83d7dfd2c..fff558bc2 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt
@@ -22,8 +22,12 @@ import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
+import androidx.lifecycle.lifecycleScope
+import com.infomaniak.sentry.SentryLog
import com.infomaniak.swisstransfer.ui.utils.AccountUtils
+import com.infomaniak.swisstransfer.ui.utils.hasValidTransferDeeplink
import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint
@@ -38,16 +42,36 @@ class LaunchActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
- startTargetActivity()
- finish()
+ lifecycleScope.launch {
+ runCatching {
+ startTargetActivity()
+ }.onFailure { exception ->
+ SentryLog.e(TAG, "Failure for startTargetActivity", exception)
+ }
+ finish()
+ }
}
- private fun startTargetActivity() {
- startActivity(Intent(this, chooseTargetActivity()))
+ private suspend fun startTargetActivity() {
+ if (hasValidTransferDeeplink()) {
+ if (!accountUtils.isUserConnected()) accountUtils.login()
+ createDeeplink()
+ } else {
+ startActivity(Intent(this@LaunchActivity, chooseTargetActivity()))
+ }
}
private fun chooseTargetActivity(): Class = when {
accountUtils.isUserConnected() -> MainActivity::class
else -> OnboardingActivity::class
}.java
+
+ private fun createDeeplink() {
+ val deepLinkIntent = Intent(Intent.ACTION_VIEW, intent.data, /*context*/this, MainActivity::class.java)
+ startActivity(deepLinkIntent)
+ }
+
+ companion object {
+ private val TAG = LaunchActivity::class.java.simpleName
+ }
}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt
index 786b8b73f..56087b879 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt
@@ -30,6 +30,7 @@ import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
import com.infomaniak.swisstransfer.ui.screen.main.MainScreen
import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsViewModel
import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
+import com.infomaniak.swisstransfer.ui.utils.hasValidTransferDeeplink
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@@ -40,10 +41,11 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
+ val isTransferDeeplink = hasValidTransferDeeplink()
setContent {
val appSettings by settingsViewModel.appSettingsFlow.collectAsStateWithLifecycle(null)
SwissTransferTheme(isDarkTheme = isDarkTheme(getTheme = { appSettings?.theme })) {
- MainScreen()
+ MainScreen(isTransferDeeplink)
}
}
}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt
index 4d4e597ac..6d6a1b61e 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt
@@ -37,10 +37,11 @@ import com.infomaniak.swisstransfer.ui.screen.main.transfers.TransfersScreenWrap
fun MainNavHost(
navController: NavHostController,
currentDestination: MainNavigation,
+ isTransferDeeplink: Boolean,
) {
NavHost(
navController = navController,
- startDestination = MainNavigation.startDestination,
+ startDestination = if (isTransferDeeplink) ReceivedDestination() else MainNavigation.startDestination,
enterTransition = { if (currentDestination.enableTransition) fadeIn() else EnterTransition.None },
exitTransition = { if (currentDestination.enableTransition) fadeOut() else ExitTransition.None },
) {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
index fe06e199f..68b421157 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
@@ -31,7 +31,7 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows
@Composable
-fun MainScreen() {
+fun MainScreen(isTransferDeeplink: Boolean = false) {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
@@ -44,7 +44,7 @@ fun MainScreen() {
navController = navController,
currentDestination = currentDestination,
largeWindowTopAppBar = { BrandTopAppBar() },
- content = { MainNavHost(navController, currentDestination) },
+ content = { MainNavHost(navController, currentDestination, isTransferDeeplink) },
)
}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/DeeplinkExt.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/DeeplinkExt.kt
new file mode 100644
index 000000000..78273b8bb
--- /dev/null
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/DeeplinkExt.kt
@@ -0,0 +1,28 @@
+/*
+ * Infomaniak SwissTransfer - Android
+ * Copyright (C) 2024 Infomaniak Network SA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.infomaniak.swisstransfer.ui.utils
+
+import androidx.activity.ComponentActivity
+
+
+private val TRANSFER_DEEPLINK_REGEX = "https://.+/d/.+".toRegex()
+
+fun ComponentActivity.hasValidTransferDeeplink(): Boolean {
+ val deeplink = intent?.data?.toString()
+ return deeplink?.matches(TRANSFER_DEEPLINK_REGEX) == true
+}