Browse Source

Make the link open the policy url in the analytics setting screen.

pull/1177/head
Benoit Marty 1 year ago
parent
commit
ff47629f6c
  1. 1
      features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesState.kt
  2. 1
      features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt
  3. 30
      features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt
  4. 2
      features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/DefaultAnalyticsPreferencesPresenter.kt
  5. 1
      features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt
  6. 11
      features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt
  7. 3
      features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsView.kt

1
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 @@ -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,
)

1
features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt

@ -28,5 +28,6 @@ open class AnalyticsPreferencesStateProvider : PreviewParameterProvider<Analytic @@ -28,5 +28,6 @@ open class AnalyticsPreferencesStateProvider : PreviewParameterProvider<Analytic
fun aAnalyticsPreferencesState() = AnalyticsPreferencesState(
applicationName = "Element X",
isEnabled = false,
policyUrl = "https://element.io",
eventSink = {}
)

30
features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package io.element.android.features.analytics.api.preferences
import androidx.annotation.StringRes
import androidx.compose.foundation.text.ClickableText
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -39,6 +40,7 @@ import io.element.android.libraries.ui.strings.CommonStrings @@ -39,6 +40,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
fun AnalyticsPreferencesView(
state: AnalyticsPreferencesState,
modifier: Modifier = Modifier,
onOpenAnalyticsPolicy: (url: String) -> Unit,
) {
fun onEnabledChanged(isEnabled: Boolean) {
state.eventSink(AnalyticsOptInEvents.EnableAnalytics(isEnabled = isEnabled))
@ -47,7 +49,8 @@ fun AnalyticsPreferencesView( @@ -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( @@ -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( @@ -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( @@ -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 @@ -101,5 +124,8 @@ internal fun AnalyticsPreferencesViewDarkPreview(@PreviewParameter(AnalyticsPref
@Composable
private fun ContentToPreview(state: AnalyticsPreferencesState) {
AnalyticsPreferencesView(state)
AnalyticsPreferencesView(
state = state,
onOpenAnalyticsPolicy = {},
)
}

2
features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/DefaultAnalyticsPreferencesPresenter.kt

@ -21,6 +21,7 @@ import androidx.compose.runtime.collectAsState @@ -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( @@ -51,6 +52,7 @@ class DefaultAnalyticsPreferencesPresenter @Inject constructor(
return AnalyticsPreferencesState(
applicationName = buildMeta.applicationName,
isEnabled = isEnabled.value,
policyUrl = Config.POLICY_LINK,
eventSink = ::handleEvents
)
}

1
features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt

@ -39,6 +39,7 @@ class AnalyticsPreferencesPresenterTest { @@ -39,6 +39,7 @@ class AnalyticsPreferencesPresenterTest {
skipItems(1)
val initialState = awaitItem()
assertThat(initialState.isEnabled).isTrue()
assertThat(initialState.policyUrl).isNotEmpty()
}
}

11
features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt

@ -16,15 +16,19 @@ @@ -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( @@ -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
)
}

3
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 @@ -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( @@ -40,6 +41,7 @@ fun AnalyticsSettingsView(
) {
AnalyticsPreferencesView(
state = state.analyticsState,
onOpenAnalyticsPolicy = onOpenAnalyticsPolicy,
)
}
}
@ -59,5 +61,6 @@ private fun ContentToPreview(state: AnalyticsSettingsState) { @@ -59,5 +61,6 @@ private fun ContentToPreview(state: AnalyticsSettingsState) {
AnalyticsSettingsView(
state = state,
onBackPressed = {},
onOpenAnalyticsPolicy = {},
)
}

Loading…
Cancel
Save