From 9ceaa9797800a7209d64a499cf61686e0a9f1244 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 4 Mar 2024 16:23:57 +1100 Subject: [PATCH] Fix tab theming --- .../onboarding/LinkDeviceActivity.kt | 39 +++++------ .../thoughtcrime/securesms/ui/Components.kt | 5 ++ .../securesms/ui/components/SessionTabRow.kt | 64 +++++++++++++++++++ 3 files changed, 84 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/ui/components/SessionTabRow.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt index 596cf795b0..aee33be494 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt @@ -23,7 +23,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -37,15 +36,12 @@ import androidx.compose.material.LocalContentAlpha import androidx.compose.material.LocalContentColor import androidx.compose.material.MaterialTheme import androidx.compose.material.OutlinedTextField -import androidx.compose.material.Tab -import androidx.compose.material.TabRow import androidx.compose.material.Text import androidx.compose.material.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -79,11 +75,14 @@ import org.thoughtcrime.securesms.ui.AppTheme import org.thoughtcrime.securesms.ui.OutlineButton import org.thoughtcrime.securesms.ui.baseBold import org.thoughtcrime.securesms.ui.colorDestructive +import org.thoughtcrime.securesms.ui.components.SessionTabRow import java.util.concurrent.Executors import javax.inject.Inject private const val TAG = "LinkDeviceActivity" +private val TITLES = listOf(R.string.activity_recovery_password, R.string.activity_link_device_scan_qr_code) + @AndroidEntryPoint @androidx.annotation.OptIn(ExperimentalGetImage::class) class LinkDeviceActivity : BaseActionBarActivity() { @@ -122,29 +121,20 @@ class LinkDeviceActivity : BaseActionBarActivity() { }.let(::setContentView) } + + @OptIn(ExperimentalFoundationApi::class) @Composable fun LoadAccountScreen(state: LinkDeviceState, onChange: (String) -> Unit = {}, onContinue: () -> Unit = {}) { - val titles = listOf(R.string.activity_recovery_password, R.string.activity_link_device_scan_qr_code) - val pagerState = rememberPagerState { titles.size } + val pagerState = rememberPagerState { TITLES.size } Column { - TabRow( - selectedTabIndex = pagerState.currentPage, - modifier = Modifier.height(48.dp) - ) { - val animationScope = rememberCoroutineScope() - titles.forEachIndexed { i, it -> - Tab(i == pagerState.currentPage, onClick = { animationScope.launch { pagerState.animateScrollToPage(i) } }) { - Text(stringResource(id = it)) - } - } - } + SessionTabRow(pagerState, TITLES) HorizontalPager( state = pagerState, modifier = Modifier.weight(1f) ) { page -> - val title = titles[page] + val title = TITLES[page] val localContext = LocalContext.current val cameraProvider = remember { ProcessCameraProvider.getInstance(localContext) } @@ -180,7 +170,8 @@ class LinkDeviceActivity : BaseActionBarActivity() { ScanQrCode(preview) } else if (cameraPermissionState.status.shouldShowRationale) { Column( - modifier = Modifier.align(Alignment.Center) + modifier = Modifier + .align(Alignment.Center) .padding(horizontal = 60.dp) ) { Text( @@ -274,9 +265,9 @@ fun RecoveryPassword(state: LinkDeviceState, onChange: (String) -> Unit = {}, on OutlineButton( text = stringResource(id = R.string.continue_2), modifier = Modifier - .align(Alignment.CenterHorizontally) - .padding(horizontal = 64.dp, vertical = 20.dp) - .width(200.dp) + .align(Alignment.CenterHorizontally) + .padding(horizontal = 64.dp, vertical = 20.dp) + .width(200.dp) ) { onContinue() } } } @@ -306,8 +297,8 @@ class Analyzer( image.imageInfo.rotationDegrees ).let(scanner::process).apply { addOnSuccessListener { barcodes -> - barcodes.forEach { - it.takeIf { it.valueType == Barcode.TYPE_TEXT }?.rawValue?.let(onBarcodeScanned) + barcodes.filter { it.valueType == Barcode.TYPE_TEXT }.forEach { + it.rawValue?.let(onBarcodeScanned) } } addOnCompleteListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt index 27370e0482..92dbc7e7b0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt @@ -4,6 +4,7 @@ import androidx.annotation.DrawableRes import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Canvas import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.RowScope @@ -26,6 +27,9 @@ import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.OutlinedButton +import androidx.compose.material.Tab +import androidx.compose.material.TabRow +import androidx.compose.material.TabRowDefaults import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.runtime.Composable @@ -38,6 +42,7 @@ import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/components/SessionTabRow.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/components/SessionTabRow.kt new file mode 100644 index 0000000000..ce6446b124 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/components/SessionTabRow.kt @@ -0,0 +1,64 @@ +package org.thoughtcrime.securesms.ui.components + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Tab +import androidx.compose.material.TabRow +import androidx.compose.material.TabRowDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch +import network.loki.messenger.R +import org.thoughtcrime.securesms.ui.LocalExtraColors +import org.thoughtcrime.securesms.ui.PreviewTheme +import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider + +private val TITLES = listOf(R.string.activity_recovery_password, R.string.activity_link_device_scan_qr_code) + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun SessionTabRow(pagerState: PagerState, titles: List) { + TabRow( + backgroundColor = Color.Unspecified, + selectedTabIndex = pagerState.currentPage, + contentColor = LocalExtraColors.current.prominentButtonColor, + divider = { TabRowDefaults.Divider(color = MaterialTheme.colors.onPrimary.copy(alpha = TabRowDefaults.DividerOpacity)) }, + modifier = Modifier + .height(48.dp) + .background(color = Color.Unspecified) + ) { + val animationScope = rememberCoroutineScope() + titles.forEachIndexed { i, it -> + Tab( + i == pagerState.currentPage, + onClick = { animationScope.launch { pagerState.animateScrollToPage(i) } }, + selectedContentColor = MaterialTheme.colors.onPrimary, + unselectedContentColor = MaterialTheme.colors.onPrimary, + ) { + Text(stringResource(id = it)) + } + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@androidx.compose.ui.tooling.preview.Preview +@Composable +fun PreviewSessionTabRow( + @PreviewParameter(ThemeResPreviewParameterProvider::class) themeResId: Int +) { + PreviewTheme(themeResId) { + val pagerState = rememberPagerState { TITLES.size } + SessionTabRow(pagerState = pagerState, titles = TITLES) + } +}