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 +}