From c849d5bfa1fd4a5a0703aef4ec0d0fadd540ff52 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 09:59:50 +0100 Subject: [PATCH 1/7] chore: Register deeplink from LaunchActivity --- app/src/main/AndroidManifest.xml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) 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 @@ + + + + From 259ccfbd5ba97bdc0daf9f2fe0b172afff3d9752 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 10:01:14 +0100 Subject: [PATCH 2/7] feat: Handle deeplink from LaunchActivity --- .../swisstransfer/ui/LaunchActivity.kt | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) 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..873417b2f 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,11 @@ 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 dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch import javax.inject.Inject @AndroidEntryPoint @@ -38,16 +41,41 @@ 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 (isValidTransferDeeplink()) { + createDeeplink() + } else { + startActivity(Intent(this@LaunchActivity, chooseTargetActivity())) + } } private fun chooseTargetActivity(): Class = when { accountUtils.isUserConnected() -> MainActivity::class else -> OnboardingActivity::class }.java + + private fun isValidTransferDeeplink(): Boolean { + val deeplink = intent?.data?.toString() + return deeplink?.matches(TRANSFER_DEEPLINK_REGEX) == true + } + + 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 + private val TRANSFER_DEEPLINK_REGEX = "https://.+/d/.+".toRegex() + } } From f8f9bcd765075cc2a4def37e9e04fc7b8e1fc1f6 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 10:01:39 +0100 Subject: [PATCH 3/7] feat: Auto login if deeplink --- .../main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt | 1 + 1 file changed, 1 insertion(+) 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 873417b2f..3a4781ba9 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt @@ -53,6 +53,7 @@ class LaunchActivity : ComponentActivity() { private suspend fun startTargetActivity() { if (isValidTransferDeeplink()) { + if (!accountUtils.isUserConnected()) accountUtils.login() createDeeplink() } else { startActivity(Intent(this@LaunchActivity, chooseTargetActivity())) From 7c2fa4a0a596ea25de59d262d0c09fac425d2014 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 10:02:30 +0100 Subject: [PATCH 4/7] chore: Dynamique startDestination if deeplink --- .../main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt | 3 ++- .../infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt | 3 ++- .../com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) 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..20372d03b 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt @@ -40,10 +40,11 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) + val isReceivedDeeplink = intent.data != null setContent { val appSettings by settingsViewModel.appSettingsFlow.collectAsStateWithLifecycle(null) SwissTransferTheme(isDarkTheme = isDarkTheme(getTheme = { appSettings?.theme })) { - MainScreen() + MainScreen(isReceivedDeeplink) } } } 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..197197bd2 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, + isReceivedDeeplink: Boolean, ) { NavHost( navController = navController, - startDestination = MainNavigation.startDestination, + startDestination = if (isReceivedDeeplink) 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..fa1697a42 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(isReceivedDeeplink: 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, isReceivedDeeplink) }, ) } From 829ca5deb54fa6a5d38cfc21358907e204a6fc82 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 10:20:41 +0100 Subject: [PATCH 5/7] chore: Add DeeplinkExt to handle transferDeeplinks --- .../swisstransfer/ui/utils/DeeplinkExt.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/utils/DeeplinkExt.kt 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 +} From e2c32e713554b3f0b26da2e17a88f5d55e0af017 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 10:21:29 +0100 Subject: [PATCH 6/7] chore: Use Deeplink extensions --- .../com/infomaniak/swisstransfer/ui/LaunchActivity.kt | 9 ++------- .../java/com/infomaniak/swisstransfer/ui/MainActivity.kt | 5 +++-- 2 files changed, 5 insertions(+), 9 deletions(-) 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 3a4781ba9..fff558bc2 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/LaunchActivity.kt @@ -25,6 +25,7 @@ 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 @@ -52,7 +53,7 @@ class LaunchActivity : ComponentActivity() { } private suspend fun startTargetActivity() { - if (isValidTransferDeeplink()) { + if (hasValidTransferDeeplink()) { if (!accountUtils.isUserConnected()) accountUtils.login() createDeeplink() } else { @@ -65,11 +66,6 @@ class LaunchActivity : ComponentActivity() { else -> OnboardingActivity::class }.java - private fun isValidTransferDeeplink(): Boolean { - val deeplink = intent?.data?.toString() - return deeplink?.matches(TRANSFER_DEEPLINK_REGEX) == true - } - private fun createDeeplink() { val deepLinkIntent = Intent(Intent.ACTION_VIEW, intent.data, /*context*/this, MainActivity::class.java) startActivity(deepLinkIntent) @@ -77,6 +73,5 @@ class LaunchActivity : ComponentActivity() { companion object { private val TAG = LaunchActivity::class.java.simpleName - private val TRANSFER_DEEPLINK_REGEX = "https://.+/d/.+".toRegex() } } 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 20372d03b..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,11 +41,11 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) - val isReceivedDeeplink = intent.data != null + val isTransferDeeplink = hasValidTransferDeeplink() setContent { val appSettings by settingsViewModel.appSettingsFlow.collectAsStateWithLifecycle(null) SwissTransferTheme(isDarkTheme = isDarkTheme(getTheme = { appSettings?.theme })) { - MainScreen(isReceivedDeeplink) + MainScreen(isTransferDeeplink) } } } From 08c7f74bcfbb6d517763c2465540091a0fd9fb7a Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 27 Dec 2024 10:21:59 +0100 Subject: [PATCH 7/7] refactor: Rename isReceivedDeeplink into isTransferDeeplink --- .../infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt | 4 ++-- .../com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 197197bd2..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,11 +37,11 @@ import com.infomaniak.swisstransfer.ui.screen.main.transfers.TransfersScreenWrap fun MainNavHost( navController: NavHostController, currentDestination: MainNavigation, - isReceivedDeeplink: Boolean, + isTransferDeeplink: Boolean, ) { NavHost( navController = navController, - startDestination = if (isReceivedDeeplink) ReceivedDestination() else 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 fa1697a42..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(isReceivedDeeplink: Boolean = false) { +fun MainScreen(isTransferDeeplink: Boolean = false) { val navController = rememberNavController() val navBackStackEntry by navController.currentBackStackEntryAsState() @@ -44,7 +44,7 @@ fun MainScreen(isReceivedDeeplink: Boolean = false) { navController = navController, currentDestination = currentDestination, largeWindowTopAppBar = { BrandTopAppBar() }, - content = { MainNavHost(navController, currentDestination, isReceivedDeeplink) }, + content = { MainNavHost(navController, currentDestination, isTransferDeeplink) }, ) }