diff --git a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/Config.kt b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/Config.kt new file mode 100644 index 0000000000..883e0d1dc3 --- /dev/null +++ b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/Config.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.analytics.api + +object Config { + const val POLICY_LINK = "https://element.io/cookie-policy" +} + diff --git a/features/analytics/impl/build.gradle.kts b/features/analytics/impl/build.gradle.kts index b72d8dbbec..60b4887a88 100644 --- a/features/analytics/impl/build.gradle.kts +++ b/features/analytics/impl/build.gradle.kts @@ -41,6 +41,7 @@ dependencies { api(projects.features.analytics.api) api(projects.services.analytics.api) implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.browser) ksp(libs.showkase.processor) testImplementation(libs.test.junit) diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInNode.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInNode.kt index aafb3d4490..ab060a51cf 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInNode.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInNode.kt @@ -16,14 +16,19 @@ package io.element.android.features.analytics.impl +import android.app.Activity +import androidx.compose.material.MaterialTheme 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.features.analytics.api.Config +import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.di.AppScope @ContributesNode(AppScope::class) @@ -33,12 +38,19 @@ class AnalyticsOptInNode @AssistedInject constructor( private val presenter: AnalyticsOptInPresenter, ) : Node(buildContext, plugins = plugins) { + private fun onClickTerms(activity: Activity, darkTheme: Boolean) { + activity.openUrlInChromeCustomTab(null, darkTheme, Config.POLICY_LINK) + } + @Composable override fun View(modifier: Modifier) { + val activity = LocalContext.current as Activity + val isDark = MaterialTheme.colors.isLight.not() val state = presenter.present() AnalyticsOptInView( state = state, modifier = modifier, + onClickTerms = { onClickTerms(activity, isDark) }, ) } } diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt index aac025ed68..908eb4a329 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt @@ -17,6 +17,7 @@ package io.element.android.features.analytics.impl import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -34,8 +35,10 @@ import androidx.compose.material.icons.filled.Poll import androidx.compose.material.icons.rounded.Check import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.BiasAlignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -63,6 +66,7 @@ import io.element.android.libraries.ui.strings.R as StringR @Composable fun AnalyticsOptInView( state: AnalyticsOptInState, + onClickTerms: () -> Unit, modifier: Modifier = Modifier, ) { LogCompositions(tag = "Analytics", msg = "Root") @@ -72,16 +76,19 @@ fun AnalyticsOptInView( .fillMaxSize() .systemBarsPadding() .imePadding(), - header = { AnalyticsOptInHeader(state) }, + header = { AnalyticsOptInHeader(state, onClickTerms) }, content = { AnalyticsOptInContent() }, footer = { AnalyticsOptInFooter(eventSink) }) } @Composable -fun AnalyticsOptInHeader(state: AnalyticsOptInState) { - Column { +fun AnalyticsOptInHeader( + state: AnalyticsOptInState, + onClickTerms: () -> Unit, +) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { IconTitleSubtitleMolecule( - modifier = Modifier.padding(top = 60.dp), + modifier = Modifier.padding(top = 60.dp, bottom = 12.dp), title = stringResource(id = R.string.screen_analytics_prompt_title, state.applicationName), subTitle = stringResource(id = R.string.screen_analytics_prompt_help_us_improve), iconImageVector = Icons.Filled.Poll @@ -95,8 +102,9 @@ fun AnalyticsOptInHeader(state: AnalyticsOptInState) { bold = true, ), modifier = Modifier - .fillMaxWidth() - .padding(top = 20.dp), + .clip(shape = RoundedCornerShape(8.dp)) + .clickable { onClickTerms() } + .padding(8.dp), style = ElementTextStyles.Regular.subheadline, textAlign = TextAlign.Center, color = MaterialTheme.colorScheme.secondary, @@ -204,5 +212,8 @@ fun AnalyticsOptInViewDarkPreview(@PreviewParameter(AnalyticsOptInStateProvider: @Composable private fun ContentToPreview(state: AnalyticsOptInState) { - AnalyticsOptInView(state = state) + AnalyticsOptInView( + state = state, + onClickTerms = {}, + ) }