From 03864b3eb05d8300534fbc316aba3338d28d76b2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 29 Aug 2023 16:32:29 +0200 Subject: [PATCH] Make the link open the policy url in the analytics setting screen. --- .../preferences/AnalyticsPreferencesState.kt | 1 + .../AnalyticsPreferencesStateProvider.kt | 1 + .../preferences/AnalyticsPreferencesView.kt | 30 +++++++++++++++++-- .../DefaultAnalyticsPreferencesPresenter.kt | 2 ++ .../AnalyticsPreferencesPresenterTest.kt | 1 + .../impl/analytics/AnalyticsSettingsNode.kt | 11 +++++++ .../impl/analytics/AnalyticsSettingsView.kt | 3 ++ 7 files changed, 47 insertions(+), 2 deletions(-) diff --git a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesState.kt b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesState.kt index 7cf0f51dfd..e03796297e 100644 --- a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesState.kt +++ b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesState.kt @@ -21,5 +21,6 @@ import io.element.android.features.analytics.api.AnalyticsOptInEvents data class AnalyticsPreferencesState( val applicationName: String, val isEnabled: Boolean, + val policyUrl: String, val eventSink: (AnalyticsOptInEvents) -> Unit, ) diff --git a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt index ea397b4d67..18f902a6fd 100644 --- a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt +++ b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt @@ -28,5 +28,6 @@ open class AnalyticsPreferencesStateProvider : PreviewParameterProvider Unit, ) { fun onEnabledChanged(isEnabled: Boolean) { state.eventSink(AnalyticsOptInEvents.EnableAnalytics(isEnabled = isEnabled)) @@ -47,7 +49,8 @@ fun AnalyticsPreferencesView( val firstPart = stringResource(id = CommonStrings.screen_analytics_settings_help_us_improve, state.applicationName) val secondPart = buildAnnotatedStringWithColoredPart( CommonStrings.screen_analytics_settings_read_terms, - CommonStrings.screen_analytics_settings_read_terms_content_link + CommonStrings.screen_analytics_settings_read_terms_content_link, + link = state.policyUrl, ) val subtitle = buildAnnotatedString { append(firstPart) @@ -60,6 +63,16 @@ fun AnalyticsPreferencesView( Text(stringResource(id = CommonStrings.screen_analytics_settings_share_data)) }, supportingContent = { + ClickableText( + text = subtitle, + onClick = { + subtitle + .getStringAnnotations("link", it, it) + .firstOrNull()?.let { stringAnnotation -> + onOpenAnalyticsPolicy(stringAnnotation.item) + } + } + ) Text(text = subtitle) }, leadingContent = null, @@ -68,12 +81,14 @@ fun AnalyticsPreferencesView( ) } +// TODO Use buildAnnotatedStringWithStyledPart. @Composable fun buildAnnotatedStringWithColoredPart( @StringRes fullTextRes: Int, @StringRes coloredTextRes: Int, color: Color = LinkColor, underline: Boolean = true, + link: String? = null, ) = buildAnnotatedString { val coloredPart = stringResource(coloredTextRes) val fullText = stringResource(fullTextRes, coloredPart) @@ -87,6 +102,14 @@ fun buildAnnotatedStringWithColoredPart( start = startIndex, end = startIndex + coloredPart.length, ) + if (link != null) { + addStringAnnotation( + tag = "link", + annotation = link, + start = startIndex, + end = startIndex + coloredPart.length + ) + } } @Preview @@ -101,5 +124,8 @@ internal fun AnalyticsPreferencesViewDarkPreview(@PreviewParameter(AnalyticsPref @Composable private fun ContentToPreview(state: AnalyticsPreferencesState) { - AnalyticsPreferencesView(state) + AnalyticsPreferencesView( + state = state, + onOpenAnalyticsPolicy = {}, + ) } diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/DefaultAnalyticsPreferencesPresenter.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/DefaultAnalyticsPreferencesPresenter.kt index 6debe4c232..06431402a6 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/DefaultAnalyticsPreferencesPresenter.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/DefaultAnalyticsPreferencesPresenter.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.rememberCoroutineScope import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.analytics.api.AnalyticsOptInEvents +import io.element.android.features.analytics.api.Config import io.element.android.features.analytics.api.preferences.AnalyticsPreferencesPresenter import io.element.android.features.analytics.api.preferences.AnalyticsPreferencesState import io.element.android.libraries.core.meta.BuildMeta @@ -51,6 +52,7 @@ class DefaultAnalyticsPreferencesPresenter @Inject constructor( return AnalyticsPreferencesState( applicationName = buildMeta.applicationName, isEnabled = isEnabled.value, + policyUrl = Config.POLICY_LINK, eventSink = ::handleEvents ) } diff --git a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt index 843e5b5532..29c4579d8f 100644 --- a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt +++ b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt @@ -39,6 +39,7 @@ class AnalyticsPreferencesPresenterTest { skipItems(1) val initialState = awaitItem() assertThat(initialState.isEnabled).isTrue() + assertThat(initialState.policyUrl).isNotEmpty() } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt index adc917b7e6..18bb99e8e1 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt @@ -16,15 +16,19 @@ package io.element.android.features.preferences.impl.analytics +import android.app.Activity import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.theme.ElementTheme @ContributesNode(SessionScope::class) class AnalyticsSettingsNode @AssistedInject constructor( @@ -33,12 +37,19 @@ class AnalyticsSettingsNode @AssistedInject constructor( private val presenter: AnalyticsSettingsPresenter, ) : Node(buildContext, plugins = plugins) { + private fun onOpenAnalyticsPolicy(activity: Activity, darkTheme: Boolean, url: String) { + activity.openUrlInChromeCustomTab(null, darkTheme, url) + } + @Composable override fun View(modifier: Modifier) { + val activity = LocalContext.current as Activity + val isDark = ElementTheme.colors.isLight.not() val state = presenter.present() AnalyticsSettingsView( state = state, onBackPressed = ::navigateUp, + onOpenAnalyticsPolicy = { onOpenAnalyticsPolicy(activity, darkTheme = isDark, it) }, modifier = modifier ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsView.kt index 3ee7365122..83dd5554fd 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsView.kt @@ -31,6 +31,7 @@ import io.element.android.libraries.ui.strings.CommonStrings fun AnalyticsSettingsView( state: AnalyticsSettingsState, onBackPressed: () -> Unit, + onOpenAnalyticsPolicy: (url: String) -> Unit, modifier: Modifier = Modifier, ) { PreferenceView( @@ -40,6 +41,7 @@ fun AnalyticsSettingsView( ) { AnalyticsPreferencesView( state = state.analyticsState, + onOpenAnalyticsPolicy = onOpenAnalyticsPolicy, ) } } @@ -59,5 +61,6 @@ private fun ContentToPreview(state: AnalyticsSettingsState) { AnalyticsSettingsView( state = state, onBackPressed = {}, + onOpenAnalyticsPolicy = {}, ) }