From 3f04b7a177d769c51edaf7ca287852886defc14f Mon Sep 17 00:00:00 2001 From: catalinradoiu Date: Fri, 21 Aug 2026 19:02:37 +0300 Subject: [PATCH] Rename screenName to deeplinkScreenName and widen deeplink coverage Rename the @ContributeToActivityStarter parameter to deeplinkScreenName so it reads as what it is, and declare a name for the screens that make sense as a deeplink entry point. Screens deliberately left without a name: mid-flow screens, screens needing caller context, WebView hosts that load a caller-provided URL, and everything in internal/dev modules. Sync had no deeplink at all because its mapper is handwritten to switch between SyncActivity and SyncActivityV2; it now resolves "sync". The generated mapper only built params from an object instance or a non-empty payload, so a params type whose values all default (subscriptions.restore) could not resolve. It now falls back to parsing an empty payload. Task/Issue URL: https://app.asana.com/1/137249556945/project/1211724162604201/task/1213980692214675 Co-Authored-By: Claude Opus 5 (1M context) --- .claude/docs/navigation.md | 11 ++++- .../duckplayer/DuckPlayerSettingsActivity.kt | 2 +- .../ContributeToActivityStarter.kt | 16 ++++--- .../ContributeToActivityStarterProcessor.kt | 42 +++++++++++++++---- ...ontributeToActivityStarterProcessorTest.kt | 10 ++--- ...=> ActivityMapper_NoDeeplinkScreenName.kt} | 0 ... ActivityMapper_WithDeeplinkScreenName.kt} | 7 ++++ .../ui/onboarding/VpnOnboardingActivity.kt | 2 +- .../DeviceShieldTrackerActivity.kt | 2 +- .../app/about/AboutDuckDuckGoActivity.kt | 2 +- .../accessibility/AccessibilityActivity.kt | 4 +- .../app/appearance/AppearanceActivity.kt | 4 +- .../ThreatProtectionSettingsActivity.kt | 2 +- .../GetDesktopBrowserActivity.kt | 2 +- .../DataClearingSettingsActivity.kt | 2 +- .../GeneralSettingsActivity.kt | 2 +- .../ShowOnAppLaunchActivity.kt | 2 +- .../app/permissions/PermissionsActivity.kt | 2 +- .../privatesearch/PrivateSearchActivity.kt | 2 +- .../app/settings/SettingsActivity.kt | 2 +- .../app/tabs/ui/TabSwitcherActivity.kt | 4 +- .../WebTrackingProtectionActivity.kt | 2 +- .../ui/TabSwitcherScreenDeeplinkMapperTest.kt | 2 +- .../ImportGoogleBookmarksWebFlowActivity.kt | 2 +- .../management/AutofillManagementActivity.kt | 2 +- .../importpassword/ImportPasswordsActivity.kt | 2 +- .../ui/settings/AutofillSettingsActivity.kt | 2 +- .../downloads/impl/DownloadsActivity.kt | 2 +- .../impl/history/ChatHistoryActivity.kt | 2 +- .../DuckAiPaidSettingsActivity.kt | 2 +- .../ui/settings/DuckChatSettingsActivity.kt | 4 +- .../impl/ui/common/FeedbackActivity.kt | 2 +- .../duckduckgo/macos/impl/MacOsActivity.kt | 2 +- .../ui/NetpAppExclusionListActivity.kt | 2 +- .../NetworkProtectionManagementActivity.kt | 6 +-- .../impl/settings/NetPVpnSettingsActivity.kt | 2 +- .../custom_dns/VpnCustomDnsActivity.kt | 2 +- .../geoswitching/NetpGeoswitchingActivity.kt | 2 +- .../impl/settings/NewTabSettingsActivity.kt | 2 +- .../dashboard/PirDashboardWebViewActivity.kt | 2 +- .../impl/bookmarks/BookmarksActivity.kt | 2 +- .../impl/ui/SerpEasterEggLogoActivity.kt | 2 +- .../impl/ui/SitePermissionsActivity.kt | 2 +- .../feedback/SubscriptionFeedbackActivity.kt | 2 +- .../SubscriptionOnboardingActivity.kt | 2 +- .../subscriptions/impl/pir/PirActivity.kt | 2 +- .../impl/ui/ChangePlanActivity.kt | 2 +- .../impl/ui/RestoreSubscriptionActivity.kt | 2 +- .../impl/ui/SubscriptionSettingsActivity.kt | 2 +- .../impl/ui/SubscriptionsWebViewActivity.kt | 4 +- .../sync/impl/ui/SyncActivityParamMapper.kt | 14 ++++++- .../impl/ui/SyncActivityParamMapperTest.kt | 13 ++++++ .../windows/impl/ui/WindowsActivity.kt | 2 +- 53 files changed, 144 insertions(+), 73 deletions(-) rename anvil/anvil-ksp/src/test/resources/golden/{ActivityMapper_NoScreenName.kt => ActivityMapper_NoDeeplinkScreenName.kt} (100%) rename anvil/anvil-ksp/src/test/resources/golden/{ActivityMapper_WithScreenName.kt => ActivityMapper_WithDeeplinkScreenName.kt} (87%) diff --git a/.claude/docs/navigation.md b/.claude/docs/navigation.md index 36c555b4fca8..0cdd9fbccb5f 100644 --- a/.claude/docs/navigation.md +++ b/.claude/docs/navigation.md @@ -18,12 +18,19 @@ class MyActivity : DuckDuckGoActivity() { } ``` -Use `screenName` to opt into deeplink support: +Use `deeplinkScreenName` to opt into deeplink support: ```kotlin -@ContributeToActivityStarter(MyScreenParams::class, screenName = "myScreen") +@ContributeToActivityStarter(MyScreenParams::class, deeplinkScreenName = "myScreen") ``` +Only declare one for screens that are a sensible entry point — settings screens, feature landing +screens. Do not declare one for screens in the middle of a flow, screens that need caller context +(a tab, a credential), screens that load a caller-provided URL, or screens in `*-internal` modules +and internal build variants. Names follow `.` with each segment camelCase +(`vpn.geoswitching`), or a single segment when the screen has no parent feature (`bookmarks`), and +must be unique: when two mappers claim the same name the winner is undefined. + ## Choosing the overload For `ActivityParams`: diff --git a/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/duckplayer/DuckPlayerSettingsActivity.kt b/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/duckplayer/DuckPlayerSettingsActivity.kt index 9f7c8decbc38..71234476a810 100644 --- a/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/duckplayer/DuckPlayerSettingsActivity.kt +++ b/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/duckplayer/DuckPlayerSettingsActivity.kt @@ -50,7 +50,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(DuckPlayerSettingsNoParams::class) +@ContributeToActivityStarter(DuckPlayerSettingsNoParams::class, deeplinkScreenName = "duckplayer.settings") class DuckPlayerSettingsActivity : DuckDuckGoActivity() { private val viewModel: DuckPlayerSettingsViewModel by bindViewModel() diff --git a/anvil/anvil-annotations/src/main/java/com/duckduckgo/anvil/annotations/ContributeToActivityStarter.kt b/anvil/anvil-annotations/src/main/java/com/duckduckgo/anvil/annotations/ContributeToActivityStarter.kt index e94127ab98a8..a37f3a485c91 100644 --- a/anvil/anvil-annotations/src/main/java/com/duckduckgo/anvil/annotations/ContributeToActivityStarter.kt +++ b/anvil/anvil-annotations/src/main/java/com/duckduckgo/anvil/annotations/ContributeToActivityStarter.kt @@ -20,15 +20,19 @@ import kotlin.reflect.KClass /** * Anvil annotation to generate and contribute the Map> to the activity starter. - * It is also possible to define a [screenName], that can be used to deeplink to a screen from RMF. + * It is also possible to define a [deeplinkScreenName], that can be used to deeplink to a screen from RMF. * - * The [screenName] should be named as [feature].. For instance, for the VPN feature has many sub-screens, eg. main, settings and so - * they could be named "vpn.main", "vpn.settings" etc. - * Not all screens will have a parent feature, for instance the main settings screen would be named just "settings" + * The [deeplinkScreenName] should be named as ., each segment camelCase. For instance the VPN feature has many + * sub-screens, eg. "vpn.main", "vpn.settings", "vpn.geoswitching". Not all screens will have a parent feature, for instance the main + * settings screen is named just "settings". + * The name must be unique across the app: several mappers claiming the same name are resolved in an undefined order. + * + * Only screens that make sense as a deeplink entry point should declare one. Screens in the middle of a flow, screens that need caller + * context, screens loading a caller-provided URL, and screens in internal/dev modules must not be deeplinkable. * * Usage: * ```kotlin - * @ContributeToActivityStarter(ExampleActivityParams::class, screenName = "example") + * @ContributeToActivityStarter(ExampleActivityParams::class, deeplinkScreenName = "example") * class MyActivity { * * } @@ -43,5 +47,5 @@ annotation class ContributeToActivityStarter( /** The type of the input parameters received by the Activity */ val paramsType: KClass<*>, /** Declares the deeplink name for the Activity */ - val screenName: String = "", + val deeplinkScreenName: String = "", ) diff --git a/anvil/anvil-ksp/src/main/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessor.kt b/anvil/anvil-ksp/src/main/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessor.kt index 50714dd63cdf..686d88da37b4 100644 --- a/anvil/anvil-ksp/src/main/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessor.kt +++ b/anvil/anvil-ksp/src/main/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessor.kt @@ -122,7 +122,7 @@ class ContributeToActivityStarterProcessor( return } val paramsClassName = paramsType.toClassName() - val screenName = annotation.getArgumentString("screenName").orEmpty() + val deeplinkScreenName = annotation.getArgumentString("deeplinkScreenName").orEmpty() val mapperClassName = "${className}_${paramsClassName.simpleName}_Mapper" @@ -130,7 +130,7 @@ class ContributeToActivityStarterProcessor( mapperClassName = mapperClassName, activityClassName = activityClassName, paramsClassName = paramsClassName, - screenName = screenName, + deeplinkScreenName = deeplinkScreenName, ) fileSpecBuilder.addType(typeSpec) @@ -152,7 +152,7 @@ class ContributeToActivityStarterProcessor( mapperClassName: String, activityClassName: ClassName, paramsClassName: ClassName, - screenName: String, + deeplinkScreenName: String, ): TypeSpec { val constructor = FunSpec.constructorBuilder() .addAnnotation(INJECT_CLASS) @@ -194,11 +194,12 @@ class ContributeToActivityStarterProcessor( .addProperty(moshiProperty) .addFunction(mapActivityParamsFun) .apply { - if (screenName.isBlank()) { + if (deeplinkScreenName.isBlank()) { addFunction(emptyDeeplinkMapper()) } else { - addFunction(createDeeplinkMapper(paramsClassName, screenName)) + addFunction(createDeeplinkMapper(paramsClassName, deeplinkScreenName)) addFunction(createTryCreateObjectInstance()) + addFunction(createTryCreateDefaultParams()) addFunction(createTryCreateActivityParams()) } } @@ -214,7 +215,7 @@ class ContributeToActivityStarterProcessor( .build() } - private fun createDeeplinkMapper(paramsClassName: ClassName, screenName: String): FunSpec { + private fun createDeeplinkMapper(paramsClassName: ClassName, deeplinkScreenName: String): FunSpec { return FunSpec.builder("map") .addModifiers(KModifier.OVERRIDE) .addParameter("deeplinkActivityParams", DEEPLINK_ACTIVITY_PARAMS_CLASS) @@ -237,13 +238,16 @@ class ContributeToActivityStarterProcessor( if (instance != null) { return instance } + val defaultParams = tryCreateDefaultParams(%T::class.java) + return defaultParams } tryCreateActivityParams(%T::class.java, deeplinkActivityParams) } else { null } """.trimIndent(), - screenName, + deeplinkScreenName, + paramsClassName, paramsClassName, paramsClassName, ) @@ -275,6 +279,30 @@ class ContributeToActivityStarterProcessor( .build() } + private fun createTryCreateDefaultParams(): FunSpec { + // Lets params types whose values all have defaults be deeplinked without a payload + return FunSpec.builder("tryCreateDefaultParams") + .addModifiers(KModifier.PRIVATE) + .addParameter( + "clazz", + Class::class.asClassName().parameterizedBy( + WildcardTypeName.producerOf(ACTIVITY_PARAMS_CLASS), + ), + ) + .returns(ACTIVITY_PARAMS_CLASS.copy(nullable = true)) + .addCode( + CodeBlock.builder() + .add( + """ + return kotlin.runCatching { + moshi.adapter(clazz).fromJson("{}") + }.getOrNull() + """.trimIndent(), + ).build(), + ) + .build() + } + private fun createTryCreateActivityParams(): FunSpec { return FunSpec.builder("tryCreateActivityParams") .addModifiers(KModifier.PRIVATE) diff --git a/anvil/anvil-ksp/src/test/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessorTest.kt b/anvil/anvil-ksp/src/test/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessorTest.kt index f8a5032f0bd4..2ac44a1d64f9 100644 --- a/anvil/anvil-ksp/src/test/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessorTest.kt +++ b/anvil/anvil-ksp/src/test/java/com/duckduckgo/anvil/ksp/ContributeToActivityStarterProcessorTest.kt @@ -113,7 +113,7 @@ class ContributeToActivityStarterProcessorTest { ) @Test - fun `basic mapper without screenName generates correct code`() { + fun `basic mapper without deeplinkScreenName generates correct code`() { val source = SourceFile.kotlin( "TestActivity.kt", """ @@ -131,12 +131,12 @@ class ContributeToActivityStarterProcessorTest { val result = compile(source, *commonStubs) val generated = result.findGeneratedSource("TestActivity_ActivityMapper.kt") - val golden = loadGolden("ActivityMapper_NoScreenName.kt") + val golden = loadGolden("ActivityMapper_NoDeeplinkScreenName.kt") assertEquals(golden, generated) } @Test - fun `mapper with screenName generates deeplink handling code`() { + fun `mapper with deeplinkScreenName generates deeplink handling code`() { val source = SourceFile.kotlin( "TestActivity.kt", """ @@ -147,14 +147,14 @@ class ContributeToActivityStarterProcessorTest { data class TestParams(val id: String) : ActivityParams - @ContributeToActivityStarter(TestParams::class, screenName = "example") + @ContributeToActivityStarter(TestParams::class, deeplinkScreenName = "example") class TestActivity : DuckDuckGoActivity() """.trimIndent(), ) val result = compile(source, *commonStubs) val generated = result.findGeneratedSource("TestActivity_ActivityMapper.kt") - val golden = loadGolden("ActivityMapper_WithScreenName.kt") + val golden = loadGolden("ActivityMapper_WithDeeplinkScreenName.kt") assertEquals(golden, generated) } diff --git a/anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_NoScreenName.kt b/anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_NoDeeplinkScreenName.kt similarity index 100% rename from anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_NoScreenName.kt rename to anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_NoDeeplinkScreenName.kt diff --git a/anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_WithScreenName.kt b/anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_WithDeeplinkScreenName.kt similarity index 87% rename from anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_WithScreenName.kt rename to anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_WithDeeplinkScreenName.kt index ec84119b8ba9..7b05f010309b 100644 --- a/anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_WithScreenName.kt +++ b/anvil/anvil-ksp/src/test/resources/golden/ActivityMapper_WithDeeplinkScreenName.kt @@ -40,6 +40,8 @@ public class TestActivity_TestParams_Mapper @Inject constructor() : if (instance != null) { return instance } + val defaultParams = tryCreateDefaultParams(TestParams::class.java) + return defaultParams } tryCreateActivityParams(TestParams::class.java, deeplinkActivityParams) } else { @@ -52,6 +54,11 @@ public class TestActivity_TestParams_Mapper @Inject constructor() : Types.getRawType(clazz).kotlin.objectInstance as GlobalActivityStarter.ActivityParams }.getOrNull() + private fun tryCreateDefaultParams(clazz: Class): + GlobalActivityStarter.ActivityParams? = kotlin.runCatching { + moshi.adapter(clazz).fromJson("{}") + }.getOrNull() + private fun tryCreateActivityParams(clazz: Class, deeplinkActivityParams: GlobalActivityStarter.DeeplinkActivityParams): GlobalActivityStarter.ActivityParams? = kotlin.runCatching { diff --git a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/onboarding/VpnOnboardingActivity.kt b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/onboarding/VpnOnboardingActivity.kt index 6ffb90abde41..df95a0759c35 100644 --- a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/onboarding/VpnOnboardingActivity.kt +++ b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/onboarding/VpnOnboardingActivity.kt @@ -58,7 +58,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(AppTrackerOnboardingActivityWithEmptyParamsParams::class) +@ContributeToActivityStarter(AppTrackerOnboardingActivityWithEmptyParamsParams::class, deeplinkScreenName = "apptp.onboarding") class VpnOnboardingActivity : DuckDuckGoActivity() { @Inject diff --git a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/tracker_activity/DeviceShieldTrackerActivity.kt b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/tracker_activity/DeviceShieldTrackerActivity.kt index 75244e38e985..56d576734406 100644 --- a/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/tracker_activity/DeviceShieldTrackerActivity.kt +++ b/app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/ui/tracker_activity/DeviceShieldTrackerActivity.kt @@ -93,7 +93,7 @@ import javax.inject.Inject import javax.inject.Provider @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(AppTrackerActivityWithEmptyParams::class, screenName = "apptp.main") +@ContributeToActivityStarter(AppTrackerActivityWithEmptyParams::class, deeplinkScreenName = "apptp.main") class DeviceShieldTrackerActivity : DuckDuckGoActivity(), DeviceShieldActivityFeedFragment.DeviceShieldActivityFeedListener { diff --git a/app/src/main/java/com/duckduckgo/app/about/AboutDuckDuckGoActivity.kt b/app/src/main/java/com/duckduckgo/app/about/AboutDuckDuckGoActivity.kt index d86c93bbed69..abee99280c36 100644 --- a/app/src/main/java/com/duckduckgo/app/about/AboutDuckDuckGoActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/about/AboutDuckDuckGoActivity.kt @@ -58,7 +58,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(AboutScreenNoParams::class) +@ContributeToActivityStarter(AboutScreenNoParams::class, deeplinkScreenName = "about") class AboutDuckDuckGoActivity : DuckDuckGoActivity() { private val viewModel: AboutDuckDuckGoViewModel by bindViewModel() diff --git a/app/src/main/java/com/duckduckgo/app/accessibility/AccessibilityActivity.kt b/app/src/main/java/com/duckduckgo/app/accessibility/AccessibilityActivity.kt index 194a53c2f077..c81af65ec439 100644 --- a/app/src/main/java/com/duckduckgo/app/accessibility/AccessibilityActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/accessibility/AccessibilityActivity.kt @@ -49,8 +49,8 @@ import java.text.NumberFormat import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(Default::class, screenName = "accessibility") -@ContributeToActivityStarter(HighlightedItem::class, screenName = "accessibility") +@ContributeToActivityStarter(Default::class, deeplinkScreenName = "accessibility") +@ContributeToActivityStarter(HighlightedItem::class, deeplinkScreenName = "accessibility") class AccessibilityActivity : DuckDuckGoActivity() { @Inject diff --git a/app/src/main/java/com/duckduckgo/app/appearance/AppearanceActivity.kt b/app/src/main/java/com/duckduckgo/app/appearance/AppearanceActivity.kt index 92107d6ef1b6..c82b57abdb43 100644 --- a/app/src/main/java/com/duckduckgo/app/appearance/AppearanceActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/appearance/AppearanceActivity.kt @@ -65,8 +65,8 @@ import javax.inject.Inject import com.duckduckgo.mobile.android.R as CommonR @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(Default::class, screenName = "appearance") -@ContributeToActivityStarter(HighlightedItem::class, screenName = "appearance") +@ContributeToActivityStarter(Default::class, deeplinkScreenName = "appearance") +@ContributeToActivityStarter(HighlightedItem::class, deeplinkScreenName = "appearance") class AppearanceActivity : DuckDuckGoActivity() { @Inject lateinit var appTheme: AppTheme diff --git a/app/src/main/java/com/duckduckgo/app/browser/threatprotection/ThreatProtectionSettingsActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/threatprotection/ThreatProtectionSettingsActivity.kt index 411446ef7c49..b28f4019edc6 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/threatprotection/ThreatProtectionSettingsActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/threatprotection/ThreatProtectionSettingsActivity.kt @@ -55,7 +55,7 @@ import javax.inject.Inject import com.duckduckgo.mobile.android.R as CommonR @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(ThreatProtectionSettingsNoParams::class) +@ContributeToActivityStarter(ThreatProtectionSettingsNoParams::class, deeplinkScreenName = "threatProtection") class ThreatProtectionSettingsActivity : DuckDuckGoActivity() { private val viewModel: ThreatProtectionSettingsViewModel by bindViewModel() diff --git a/app/src/main/java/com/duckduckgo/app/desktopbrowser/GetDesktopBrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/desktopbrowser/GetDesktopBrowserActivity.kt index 5dcd7a92acd9..b954518dbdc4 100644 --- a/app/src/main/java/com/duckduckgo/app/desktopbrowser/GetDesktopBrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/desktopbrowser/GetDesktopBrowserActivity.kt @@ -47,7 +47,7 @@ import logcat.logcat import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(GetDesktopBrowserActivityParams::class, screenName = "getDesktopBrowser") +@ContributeToActivityStarter(GetDesktopBrowserActivityParams::class, deeplinkScreenName = "getDesktopBrowser") class GetDesktopBrowserActivity : DuckDuckGoActivity() { @Inject diff --git a/app/src/main/java/com/duckduckgo/app/firebutton/DataClearingSettingsActivity.kt b/app/src/main/java/com/duckduckgo/app/firebutton/DataClearingSettingsActivity.kt index 436f8c8f60e0..82dd83e2736d 100644 --- a/app/src/main/java/com/duckduckgo/app/firebutton/DataClearingSettingsActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/firebutton/DataClearingSettingsActivity.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(DataClearingSettingsScreenNoParams::class) +@ContributeToActivityStarter(DataClearingSettingsScreenNoParams::class, deeplinkScreenName = "dataClearing") class DataClearingSettingsActivity : DuckDuckGoActivity() { @Inject diff --git a/app/src/main/java/com/duckduckgo/app/generalsettings/GeneralSettingsActivity.kt b/app/src/main/java/com/duckduckgo/app/generalsettings/GeneralSettingsActivity.kt index cf5cd7b35cad..c46031762b5e 100644 --- a/app/src/main/java/com/duckduckgo/app/generalsettings/GeneralSettingsActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/generalsettings/GeneralSettingsActivity.kt @@ -54,7 +54,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(GeneralSettingsScreenNoParams::class, screenName = "settingsGeneral") +@ContributeToActivityStarter(GeneralSettingsScreenNoParams::class, deeplinkScreenName = "settingsGeneral") class GeneralSettingsActivity : DuckDuckGoActivity() { @Inject diff --git a/app/src/main/java/com/duckduckgo/app/generalsettings/showonapplaunch/ShowOnAppLaunchActivity.kt b/app/src/main/java/com/duckduckgo/app/generalsettings/showonapplaunch/ShowOnAppLaunchActivity.kt index 3f71a59bedd4..82ded0194a8d 100644 --- a/app/src/main/java/com/duckduckgo/app/generalsettings/showonapplaunch/ShowOnAppLaunchActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/generalsettings/showonapplaunch/ShowOnAppLaunchActivity.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(ShowOnAppLaunchScreenNoParams::class, screenName = "settingsAfterInactivity") +@ContributeToActivityStarter(ShowOnAppLaunchScreenNoParams::class, deeplinkScreenName = "settingsAfterInactivity") class ShowOnAppLaunchActivity : DuckDuckGoActivity() { private val viewModel: ShowOnAppLaunchViewModel by bindViewModel() diff --git a/app/src/main/java/com/duckduckgo/app/permissions/PermissionsActivity.kt b/app/src/main/java/com/duckduckgo/app/permissions/PermissionsActivity.kt index 37d32a767619..58549a0d705f 100644 --- a/app/src/main/java/com/duckduckgo/app/permissions/PermissionsActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/permissions/PermissionsActivity.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(PermissionsScreenNoParams::class) +@ContributeToActivityStarter(PermissionsScreenNoParams::class, deeplinkScreenName = "permissions") class PermissionsActivity : DuckDuckGoActivity() { @Inject diff --git a/app/src/main/java/com/duckduckgo/app/privatesearch/PrivateSearchActivity.kt b/app/src/main/java/com/duckduckgo/app/privatesearch/PrivateSearchActivity.kt index 74bbdb57141a..727f8c6f3e0c 100644 --- a/app/src/main/java/com/duckduckgo/app/privatesearch/PrivateSearchActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/privatesearch/PrivateSearchActivity.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(PrivateSearchScreenNoParams::class) +@ContributeToActivityStarter(PrivateSearchScreenNoParams::class, deeplinkScreenName = "privateSearch") class PrivateSearchActivity : DuckDuckGoActivity() { @Inject lateinit var globalActivityStarter: GlobalActivityStarter diff --git a/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt b/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt index c4dcd61120ed..8b976ca22ece 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt @@ -119,7 +119,7 @@ import javax.inject.Inject private const val OTHER_PLATFORMS_URL = "https://duckduckgo.com/app" @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(SettingsScreenNoParams::class, screenName = "settings") +@ContributeToActivityStarter(SettingsScreenNoParams::class, deeplinkScreenName = "settings") class SettingsActivity : DuckDuckGoActivity() { private val viewModel: SettingsViewModel by bindViewModel() diff --git a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt index 79769d2ec88b..8a4531369427 100644 --- a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt @@ -123,8 +123,8 @@ import kotlin.math.max import com.duckduckgo.mobile.android.R as CommonR @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(TabSwitcherScreenNoParams::class, screenName = "tabSwitcher") -@ContributeToActivityStarter(TabSwitcherScreenWithParams::class, screenName = "tabSwitcherWithParams") +@ContributeToActivityStarter(TabSwitcherScreenNoParams::class, deeplinkScreenName = "tabSwitcher") +@ContributeToActivityStarter(TabSwitcherScreenWithParams::class, deeplinkScreenName = "tabSwitcherWithParams") class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, diff --git a/app/src/main/java/com/duckduckgo/app/webtrackingprotection/WebTrackingProtectionActivity.kt b/app/src/main/java/com/duckduckgo/app/webtrackingprotection/WebTrackingProtectionActivity.kt index ee12e934566b..9178fd2ba2e6 100644 --- a/app/src/main/java/com/duckduckgo/app/webtrackingprotection/WebTrackingProtectionActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/webtrackingprotection/WebTrackingProtectionActivity.kt @@ -54,7 +54,7 @@ import javax.inject.Inject import com.duckduckgo.mobile.android.R as CommonR @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(WebTrackingProtectionScreenNoParams::class) +@ContributeToActivityStarter(WebTrackingProtectionScreenNoParams::class, deeplinkScreenName = "webTrackingProtection") class WebTrackingProtectionActivity : DuckDuckGoActivity() { @Inject diff --git a/app/src/test/java/com/duckduckgo/app/tabs/ui/TabSwitcherScreenDeeplinkMapperTest.kt b/app/src/test/java/com/duckduckgo/app/tabs/ui/TabSwitcherScreenDeeplinkMapperTest.kt index c7bc3facce1b..33c7b007c0a2 100644 --- a/app/src/test/java/com/duckduckgo/app/tabs/ui/TabSwitcherScreenDeeplinkMapperTest.kt +++ b/app/src/test/java/com/duckduckgo/app/tabs/ui/TabSwitcherScreenDeeplinkMapperTest.kt @@ -30,7 +30,7 @@ import org.junit.Test * resolves the deeplink through [GlobalActivityStarter], which delegates to the mapper generated here. * * The mapper under test is generated by [com.duckduckgo.anvil.ksp.ContributeToActivityStarterProcessor] - * from the `@ContributeToActivityStarter(TabSwitcherScreenWithParams::class, screenName = ...)` annotation on + * from the `@ContributeToActivityStarter(TabSwitcherScreenWithParams::class, deeplinkScreenName = ...)` annotation on * [TabSwitcherActivity]. */ class TabSwitcherScreenDeeplinkMapperTest { diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/importing/takeout/webflow/ImportGoogleBookmarksWebFlowActivity.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/importing/takeout/webflow/ImportGoogleBookmarksWebFlowActivity.kt index 664372f487bf..7264e4dc02f4 100644 --- a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/importing/takeout/webflow/ImportGoogleBookmarksWebFlowActivity.kt +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/importing/takeout/webflow/ImportGoogleBookmarksWebFlowActivity.kt @@ -45,7 +45,7 @@ import javax.inject.Inject data class ImportBookmarksViaGoogleTakeoutScreen(val launchSource: String) : GlobalActivityStarter.ActivityParams @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(ImportBookmarksViaGoogleTakeoutScreen::class, screenName = "importGoogleBookmarks") +@ContributeToActivityStarter(ImportBookmarksViaGoogleTakeoutScreen::class, deeplinkScreenName = "importGoogleBookmarks") class ImportGoogleBookmarksWebFlowActivity : DuckDuckGoActivity(), ImportGoogleBookmarksWebFlowFragment.WebViewVisibilityListener { diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/AutofillManagementActivity.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/AutofillManagementActivity.kt index 4ae5f4e9a8f2..603df893352d 100644 --- a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/AutofillManagementActivity.kt +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/AutofillManagementActivity.kt @@ -84,7 +84,7 @@ import logcat.logcat import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(AutofillPasswordsManagementScreen::class) +@ContributeToActivityStarter(AutofillPasswordsManagementScreen::class, deeplinkScreenName = "passwords") @ContributeToActivityStarter(AutofillPasswordsManagementScreenWithSuggestions::class) @ContributeToActivityStarter(AutofillPasswordsManagementViewCredential::class) class AutofillManagementActivity : DuckDuckGoActivity(), PasswordsScreenPromotionPlugin.Callback { diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/importpassword/ImportPasswordsActivity.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/importpassword/ImportPasswordsActivity.kt index 5c1e1edf5e64..b673dea1ba64 100644 --- a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/importpassword/ImportPasswordsActivity.kt +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/importpassword/ImportPasswordsActivity.kt @@ -39,7 +39,7 @@ import com.duckduckgo.sync.api.SyncActivityWithEmptyParams import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(ImportPasswordActivityParams::class) +@ContributeToActivityStarter(ImportPasswordActivityParams::class, deeplinkScreenName = "passwords.import") class ImportPasswordsActivity : DuckDuckGoActivity() { private val viewModel: ImportPasswordsViewModel by bindViewModel() diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/settings/AutofillSettingsActivity.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/settings/AutofillSettingsActivity.kt index 48110a5cadae..2248b5d17aad 100644 --- a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/settings/AutofillSettingsActivity.kt +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/settings/AutofillSettingsActivity.kt @@ -61,7 +61,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(AutofillSettingsScreen::class) +@ContributeToActivityStarter(AutofillSettingsScreen::class, deeplinkScreenName = "autofill.settings") class AutofillSettingsActivity : DuckDuckGoActivity() { @Inject diff --git a/downloads/downloads-impl/src/main/java/com/duckduckgo/downloads/impl/DownloadsActivity.kt b/downloads/downloads-impl/src/main/java/com/duckduckgo/downloads/impl/DownloadsActivity.kt index 431ad2b207e1..ea3b5d3483db 100644 --- a/downloads/downloads-impl/src/main/java/com/duckduckgo/downloads/impl/DownloadsActivity.kt +++ b/downloads/downloads-impl/src/main/java/com/duckduckgo/downloads/impl/DownloadsActivity.kt @@ -63,7 +63,7 @@ import java.io.File import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(DownloadsScreenNoParams::class) +@ContributeToActivityStarter(DownloadsScreenNoParams::class, deeplinkScreenName = "downloads") class DownloadsActivity : DuckDuckGoActivity() { private val viewModel: DownloadsViewModel by bindViewModel() diff --git a/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/history/ChatHistoryActivity.kt b/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/history/ChatHistoryActivity.kt index 2b1b0576ef4e..367db5a0e799 100644 --- a/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/history/ChatHistoryActivity.kt +++ b/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/history/ChatHistoryActivity.kt @@ -32,7 +32,7 @@ import javax.inject.Inject * Thin host for chat-history-related fragments. */ @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(DuckChatHistoryNoParams::class, screenName = "duckai.history") +@ContributeToActivityStarter(DuckChatHistoryNoParams::class, deeplinkScreenName = "duckai.history") class ChatHistoryActivity : DuckDuckGoActivity() { @Inject diff --git a/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/subscription/DuckAiPaidSettingsActivity.kt b/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/subscription/DuckAiPaidSettingsActivity.kt index c1004283ccde..e447ba147fb3 100644 --- a/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/subscription/DuckAiPaidSettingsActivity.kt +++ b/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/subscription/DuckAiPaidSettingsActivity.kt @@ -58,7 +58,7 @@ import com.duckduckgo.mobile.android.R as CommonR object DuckAiPaidSettingsNoParams : GlobalActivityStarter.ActivityParams @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(DuckAiPaidSettingsNoParams::class) +@ContributeToActivityStarter(DuckAiPaidSettingsNoParams::class, deeplinkScreenName = "duckai.paidSettings") class DuckAiPaidSettingsActivity : DuckDuckGoActivity() { @Inject lateinit var globalActivityStarter: GlobalActivityStarter diff --git a/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/settings/DuckChatSettingsActivity.kt b/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/settings/DuckChatSettingsActivity.kt index 3164df8571d7..d3fdfd608147 100644 --- a/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/settings/DuckChatSettingsActivity.kt +++ b/duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/settings/DuckChatSettingsActivity.kt @@ -72,8 +72,8 @@ import javax.inject.Inject import com.duckduckgo.mobile.android.R as CommonR @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(DuckChatSettingsNoParams::class, screenName = "duckai.settings") -@ContributeToActivityStarter(DuckChatNativeSettingsNoParams::class, screenName = "duckai.settings") +@ContributeToActivityStarter(DuckChatSettingsNoParams::class, deeplinkScreenName = "duckai.settings") +@ContributeToActivityStarter(DuckChatNativeSettingsNoParams::class, deeplinkScreenName = "duckai.settings") class DuckChatSettingsActivity : DuckDuckGoActivity() { @Inject diff --git a/feedback/feedback-impl/src/main/java/com/duckduckgo/feedback/impl/ui/common/FeedbackActivity.kt b/feedback/feedback-impl/src/main/java/com/duckduckgo/feedback/impl/ui/common/FeedbackActivity.kt index 03849c318bd0..f39398f69c1e 100644 --- a/feedback/feedback-impl/src/main/java/com/duckduckgo/feedback/impl/ui/common/FeedbackActivity.kt +++ b/feedback/feedback-impl/src/main/java/com/duckduckgo/feedback/impl/ui/common/FeedbackActivity.kt @@ -46,7 +46,7 @@ import logcat.logcat import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(FeedbackScreenNoParams::class, screenName = "feedback") +@ContributeToActivityStarter(FeedbackScreenNoParams::class, deeplinkScreenName = "feedback") class FeedbackActivity : DuckDuckGoActivity(), InitialFeedbackFragment.InitialFeedbackListener, diff --git a/macos/macos-impl/src/main/java/com/duckduckgo/macos/impl/MacOsActivity.kt b/macos/macos-impl/src/main/java/com/duckduckgo/macos/impl/MacOsActivity.kt index aafdf371b1b2..99102c3a978b 100644 --- a/macos/macos-impl/src/main/java/com/duckduckgo/macos/impl/MacOsActivity.kt +++ b/macos/macos-impl/src/main/java/com/duckduckgo/macos/impl/MacOsActivity.kt @@ -48,7 +48,7 @@ import logcat.logcat import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(MacOsScreenWithEmptyParams::class) +@ContributeToActivityStarter(MacOsScreenWithEmptyParams::class, deeplinkScreenName = "macos") class MacOsActivity : DuckDuckGoActivity() { private val viewModel: MacOsViewModel by bindViewModel() diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/exclusion/ui/NetpAppExclusionListActivity.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/exclusion/ui/NetpAppExclusionListActivity.kt index 0c2d4533fa41..1bd06bd271ba 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/exclusion/ui/NetpAppExclusionListActivity.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/exclusion/ui/NetpAppExclusionListActivity.kt @@ -60,7 +60,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(NetPAppExclusionListNoParams::class) +@ContributeToActivityStarter(NetPAppExclusionListNoParams::class, deeplinkScreenName = "vpn.exclusions") class NetpAppExclusionListActivity : DuckDuckGoActivity(), ManuallyDisableAppProtectionDialog.ManuallyDisableAppProtectionDialogListener, diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/management/NetworkProtectionManagementActivity.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/management/NetworkProtectionManagementActivity.kt index ba703ef1d608..fa4145f8603c 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/management/NetworkProtectionManagementActivity.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/management/NetworkProtectionManagementActivity.kt @@ -81,9 +81,9 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(NetworkProtectionManagementScreenNoParams::class, screenName = "vpn.main") -@ContributeToActivityStarter(NetworkProtectionManagementScreenAndEnable::class, screenName = "vpn.main") -@ContributeToActivityStarter(NetworkProtectionManagementScreenWithLaunchPixel::class, screenName = "vpn.main") +@ContributeToActivityStarter(NetworkProtectionManagementScreenNoParams::class, deeplinkScreenName = "vpn.main") +@ContributeToActivityStarter(NetworkProtectionManagementScreenAndEnable::class, deeplinkScreenName = "vpn.main") +@ContributeToActivityStarter(NetworkProtectionManagementScreenWithLaunchPixel::class, deeplinkScreenName = "vpn.main") class NetworkProtectionManagementActivity : DuckDuckGoActivity() { @Inject diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/NetPVpnSettingsActivity.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/NetPVpnSettingsActivity.kt index dedab50892b4..d1b35769d420 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/NetPVpnSettingsActivity.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/NetPVpnSettingsActivity.kt @@ -54,7 +54,7 @@ import kotlin.math.absoluteValue scope = ActivityScope::class, delayGeneration = true, // VpnSettingPlugin can be contributed from other modules ) -@ContributeToActivityStarter(NetPVpnSettingsScreenNoParams::class, screenName = "vpn.settings") +@ContributeToActivityStarter(NetPVpnSettingsScreenNoParams::class, deeplinkScreenName = "vpn.settings") class NetPVpnSettingsActivity : DuckDuckGoActivity() { @Inject diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/custom_dns/VpnCustomDnsActivity.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/custom_dns/VpnCustomDnsActivity.kt index d06e14992cd7..a497fddd1947 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/custom_dns/VpnCustomDnsActivity.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/custom_dns/VpnCustomDnsActivity.kt @@ -67,7 +67,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(Default::class) +@ContributeToActivityStarter(Default::class, deeplinkScreenName = "vpn.customDns") class VpnCustomDnsActivity : DuckDuckGoActivity() { @Inject lateinit var globalActivityStarter: GlobalActivityStarter diff --git a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/geoswitching/NetpGeoswitchingActivity.kt b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/geoswitching/NetpGeoswitchingActivity.kt index c9b57653ba98..7ffdb86d337b 100644 --- a/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/geoswitching/NetpGeoswitchingActivity.kt +++ b/network-protection/network-protection-impl/src/main/java/com/duckduckgo/networkprotection/impl/settings/geoswitching/NetpGeoswitchingActivity.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(NetpGeoswitchingScreenNoParams::class) +@ContributeToActivityStarter(NetpGeoswitchingScreenNoParams::class, deeplinkScreenName = "vpn.geoswitching") class NetpGeoswitchingActivity : DuckDuckGoActivity() { @Inject diff --git a/new-tab-page/new-tab-page-impl/src/main/java/com/duckduckgo/newtabpage/impl/settings/NewTabSettingsActivity.kt b/new-tab-page/new-tab-page-impl/src/main/java/com/duckduckgo/newtabpage/impl/settings/NewTabSettingsActivity.kt index 0d45a8e97be3..9fd93cb39f2e 100644 --- a/new-tab-page/new-tab-page-impl/src/main/java/com/duckduckgo/newtabpage/impl/settings/NewTabSettingsActivity.kt +++ b/new-tab-page/new-tab-page-impl/src/main/java/com/duckduckgo/newtabpage/impl/settings/NewTabSettingsActivity.kt @@ -46,7 +46,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(NewTabSettingsScreenNoParams::class, screenName = "newtabsettings") +@ContributeToActivityStarter(NewTabSettingsScreenNoParams::class, deeplinkScreenName = "newtabsettings") class NewTabSettingsActivity : DuckDuckGoActivity() { private val viewModel: NewTabSettingsViewModel by bindViewModel() diff --git a/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/PirDashboardWebViewActivity.kt b/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/PirDashboardWebViewActivity.kt index fc670456f10e..df7ac0c5db32 100644 --- a/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/PirDashboardWebViewActivity.kt +++ b/pir/pir-impl/src/main/java/com/duckduckgo/pir/impl/dashboard/PirDashboardWebViewActivity.kt @@ -52,7 +52,7 @@ import javax.inject.Inject import javax.inject.Named @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(PirDashboardWebViewScreen::class) +@ContributeToActivityStarter(PirDashboardWebViewScreen::class, deeplinkScreenName = "pir.dashboard") class PirDashboardWebViewActivity : DuckDuckGoActivity() { @Inject diff --git a/saved-sites/saved-sites-impl/src/main/java/com/duckduckgo/savedsites/impl/bookmarks/BookmarksActivity.kt b/saved-sites/saved-sites-impl/src/main/java/com/duckduckgo/savedsites/impl/bookmarks/BookmarksActivity.kt index efdbc21b7882..3082aae7a63f 100644 --- a/saved-sites/saved-sites-impl/src/main/java/com/duckduckgo/savedsites/impl/bookmarks/BookmarksActivity.kt +++ b/saved-sites/saved-sites-impl/src/main/java/com/duckduckgo/savedsites/impl/bookmarks/BookmarksActivity.kt @@ -112,7 +112,7 @@ import javax.inject.Inject import com.duckduckgo.mobile.android.R as commonR @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(BookmarksScreenNoParams::class, screenName = "bookmarks") +@ContributeToActivityStarter(BookmarksScreenNoParams::class, deeplinkScreenName = "bookmarks") class BookmarksActivity : DuckDuckGoActivity(), BookmarksScreenPromotionPlugin.Callback { @Inject diff --git a/serp-logos/serp-logos-impl/src/main/kotlin/com/duckduckgo/serp/logos/impl/ui/SerpEasterEggLogoActivity.kt b/serp-logos/serp-logos-impl/src/main/kotlin/com/duckduckgo/serp/logos/impl/ui/SerpEasterEggLogoActivity.kt index 45e2d1e959ee..8364ed213ba8 100644 --- a/serp-logos/serp-logos-impl/src/main/kotlin/com/duckduckgo/serp/logos/impl/ui/SerpEasterEggLogoActivity.kt +++ b/serp-logos/serp-logos-impl/src/main/kotlin/com/duckduckgo/serp/logos/impl/ui/SerpEasterEggLogoActivity.kt @@ -49,7 +49,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(EasterEggLogoScreen::class, screenName = "easterEggLogo") +@ContributeToActivityStarter(EasterEggLogoScreen::class, deeplinkScreenName = "easterEggLogo") class SerpEasterEggLogoActivity : DuckDuckGoActivity() { private val viewModel: SerpEasterEggLogoViewModel by bindViewModel() diff --git a/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/ui/SitePermissionsActivity.kt b/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/ui/SitePermissionsActivity.kt index ff29e97099f3..8aed43cb2a1e 100644 --- a/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/ui/SitePermissionsActivity.kt +++ b/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/ui/SitePermissionsActivity.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(SitePermissionScreenNoParams::class) +@ContributeToActivityStarter(SitePermissionScreenNoParams::class, deeplinkScreenName = "sitePermissions") class SitePermissionsActivity : DuckDuckGoActivity() { @Inject diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackActivity.kt index 77adfe2e4a1c..3750f385c90e 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackActivity.kt @@ -59,7 +59,7 @@ import javax.inject.Inject @InjectWith(ActivityScope::class) @ContributeToActivityStarter(SubscriptionFeedbackScreenWithParams::class) @ContributeToActivityStarter(SubscriptionAppFeedbackScreenWithParams::class) -@ContributeToActivityStarter(GeneralSubscriptionFeedbackScreenNoParams::class) +@ContributeToActivityStarter(GeneralSubscriptionFeedbackScreenNoParams::class, deeplinkScreenName = "ppro.feedback") class SubscriptionFeedbackActivity : DuckDuckGoActivity(), SubscriptionFeedbackGeneralFragment.Listener, diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/onboarding/SubscriptionOnboardingActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/onboarding/SubscriptionOnboardingActivity.kt index abd62a89f4c1..5c3bd675f5a2 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/onboarding/SubscriptionOnboardingActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/onboarding/SubscriptionOnboardingActivity.kt @@ -51,7 +51,7 @@ import javax.inject.Inject * back through [SubscriptionOnboardingController]. */ @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(SubscriptionOnboardingScreenWithEmptyParams::class, screenName = "subscriptions.onboarding") +@ContributeToActivityStarter(SubscriptionOnboardingScreenWithEmptyParams::class, deeplinkScreenName = "subscriptions.onboarding") class SubscriptionOnboardingActivity : DuckDuckGoActivity() { @Inject diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/pir/PirActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/pir/PirActivity.kt index baf7cb53c6dd..b779d10675a1 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/pir/PirActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/pir/PirActivity.kt @@ -35,7 +35,7 @@ import com.duckduckgo.windows.api.ui.WindowsScreenWithEmptyParams import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(PirScreenWithEmptyParams::class) +@ContributeToActivityStarter(PirScreenWithEmptyParams::class, deeplinkScreenName = "pir") class PirActivity : DuckDuckGoActivity() { @Inject diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/ChangePlanActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/ChangePlanActivity.kt index d157d59faf73..5cca15151c3d 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/ChangePlanActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/ChangePlanActivity.kt @@ -31,7 +31,7 @@ import com.duckduckgo.subscriptions.impl.ui.ChangePlanActivity.Companion.ChangeP import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(ChangePlanScreenWithEmptyParams::class) +@ContributeToActivityStarter(ChangePlanScreenWithEmptyParams::class, deeplinkScreenName = "subscriptions.changePlan") class ChangePlanActivity : DuckDuckGoActivity() { private val binding: ActivityChangePlanBinding by viewBinding() diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/RestoreSubscriptionActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/RestoreSubscriptionActivity.kt index e76f605c3f2b..526fc3314079 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/RestoreSubscriptionActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/RestoreSubscriptionActivity.kt @@ -50,7 +50,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(RestoreSubscriptionScreenWithParams::class) +@ContributeToActivityStarter(RestoreSubscriptionScreenWithParams::class, deeplinkScreenName = "subscriptions.restore") class RestoreSubscriptionActivity : DuckDuckGoActivity() { @Inject diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionSettingsActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionSettingsActivity.kt index 274b34eb2eca..1b00d9374640 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionSettingsActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionSettingsActivity.kt @@ -73,7 +73,7 @@ import kotlinx.coroutines.flow.onEach import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(SubscriptionsSettingsScreenWithEmptyParams::class, screenName = "ppro.settings") +@ContributeToActivityStarter(SubscriptionsSettingsScreenWithEmptyParams::class, deeplinkScreenName = "ppro.settings") class SubscriptionSettingsActivity : DuckDuckGoActivity() { @Inject diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionsWebViewActivity.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionsWebViewActivity.kt index 151da9caa293..1b976d3b0607 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionsWebViewActivity.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionsWebViewActivity.kt @@ -148,8 +148,8 @@ data class SubscriptionsWebViewActivityWithParams( scope = ActivityScope::class, delayGeneration = true, // Delayed because it has a dependency on DownloadConfirmationFragment from another module ) -@ContributeToActivityStarter(SubscriptionPurchase::class, screenName = "subscriptions.purchase") -@ContributeToActivityStarter(SubscriptionUpgrade::class, screenName = "subscriptions.upgrade") +@ContributeToActivityStarter(SubscriptionPurchase::class, deeplinkScreenName = "subscriptions.purchase") +@ContributeToActivityStarter(SubscriptionUpgrade::class, deeplinkScreenName = "subscriptions.upgrade") @ContributeToActivityStarter(SubscriptionsWebViewActivityWithParams::class) class SubscriptionsWebViewActivity : DuckDuckGoActivity(), DownloadConfirmationDialogListener { diff --git a/sync/sync-impl/src/main/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapper.kt b/sync/sync-impl/src/main/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapper.kt index 06f71f5e6c21..7cfeb2b15925 100644 --- a/sync/sync-impl/src/main/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapper.kt +++ b/sync/sync-impl/src/main/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapper.kt @@ -70,7 +70,13 @@ class SyncActivityParamMapper @Inject constructor( } } - override fun map(deeplinkActivityParams: DeeplinkActivityParams): ActivityParams? = null + override fun map(deeplinkActivityParams: DeeplinkActivityParams): ActivityParams? { + return if (deeplinkActivityParams.screenName == SYNC_DEEPLINK_SCREEN_NAME) { + SyncActivityWithEmptyParams + } else { + null + } + } override fun onCreate(owner: LifecycleOwner) { // We don't read useSimplifiedSync().isEnabled() directly when mapping Activity params @@ -82,4 +88,10 @@ class SyncActivityParamMapper @Inject constructor( .collect { useSimplifiedSync = it } } } + + companion object { + // Declared here rather than via @ContributeToActivityStarter's deeplinkScreenName because this mapper is handwritten. + // It must stay unique against every annotated screen name. + private const val SYNC_DEEPLINK_SCREEN_NAME = "sync" + } } diff --git a/sync/sync-impl/src/test/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapperTest.kt b/sync/sync-impl/src/test/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapperTest.kt index 6485d121cc37..3ef36c7f8e4f 100644 --- a/sync/sync-impl/src/test/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapperTest.kt +++ b/sync/sync-impl/src/test/java/com/duckduckgo/sync/impl/ui/SyncActivityParamMapperTest.kt @@ -103,6 +103,19 @@ class SyncActivityParamMapperTest { assertNull(testee.map(object : GlobalActivityStarter.ActivityParams {})) } + @Test + fun `map sync deeplink to 'with empty params' activity params`() { + assertEquals( + SyncActivityWithEmptyParams, + testee.map(GlobalActivityStarter.DeeplinkActivityParams(screenName = "sync")), + ) + } + + @Test + fun `map unknown deeplink to null`() { + assertNull(testee.map(GlobalActivityStarter.DeeplinkActivityParams(screenName = "unknown"))) + } + private fun enableSimplifiedSync(enable: Boolean) { syncFeature.useSimplifiedSync().setRawStoredState(State(enable)) } diff --git a/windows/windows-impl/src/main/java/com/duckduckgo/windows/impl/ui/WindowsActivity.kt b/windows/windows-impl/src/main/java/com/duckduckgo/windows/impl/ui/WindowsActivity.kt index 60cdc1eb3fa8..3d33e7720c5c 100644 --- a/windows/windows-impl/src/main/java/com/duckduckgo/windows/impl/ui/WindowsActivity.kt +++ b/windows/windows-impl/src/main/java/com/duckduckgo/windows/impl/ui/WindowsActivity.kt @@ -48,7 +48,7 @@ import logcat.logcat import javax.inject.Inject @InjectWith(ActivityScope::class) -@ContributeToActivityStarter(WindowsScreenWithEmptyParams::class) +@ContributeToActivityStarter(WindowsScreenWithEmptyParams::class, deeplinkScreenName = "windows") class WindowsActivity : DuckDuckGoActivity() { private val viewModel: WindowsViewModel by bindViewModel()