Fix tab theming

pull/1331/head
Andrew 1 year ago
parent 88f4f219f6
commit 9ceaa97978

@ -23,7 +23,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
@ -37,15 +36,12 @@ import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.LocalContentColor import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedTextField import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Tab
import androidx.compose.material.TabRow
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.TextFieldDefaults import androidx.compose.material.TextFieldDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip 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.OutlineButton
import org.thoughtcrime.securesms.ui.baseBold import org.thoughtcrime.securesms.ui.baseBold
import org.thoughtcrime.securesms.ui.colorDestructive import org.thoughtcrime.securesms.ui.colorDestructive
import org.thoughtcrime.securesms.ui.components.SessionTabRow
import java.util.concurrent.Executors import java.util.concurrent.Executors
import javax.inject.Inject import javax.inject.Inject
private const val TAG = "LinkDeviceActivity" private const val TAG = "LinkDeviceActivity"
private val TITLES = listOf(R.string.activity_recovery_password, R.string.activity_link_device_scan_qr_code)
@AndroidEntryPoint @AndroidEntryPoint
@androidx.annotation.OptIn(ExperimentalGetImage::class) @androidx.annotation.OptIn(ExperimentalGetImage::class)
class LinkDeviceActivity : BaseActionBarActivity() { class LinkDeviceActivity : BaseActionBarActivity() {
@ -122,29 +121,20 @@ class LinkDeviceActivity : BaseActionBarActivity() {
}.let(::setContentView) }.let(::setContentView)
} }
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun LoadAccountScreen(state: LinkDeviceState, onChange: (String) -> Unit = {}, onContinue: () -> Unit = {}) { 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 { Column {
TabRow( SessionTabRow(pagerState, TITLES)
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))
}
}
}
HorizontalPager( HorizontalPager(
state = pagerState, state = pagerState,
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
) { page -> ) { page ->
val title = titles[page] val title = TITLES[page]
val localContext = LocalContext.current val localContext = LocalContext.current
val cameraProvider = remember { ProcessCameraProvider.getInstance(localContext) } val cameraProvider = remember { ProcessCameraProvider.getInstance(localContext) }
@ -180,7 +170,8 @@ class LinkDeviceActivity : BaseActionBarActivity() {
ScanQrCode(preview) ScanQrCode(preview)
} else if (cameraPermissionState.status.shouldShowRationale) { } else if (cameraPermissionState.status.shouldShowRationale) {
Column( Column(
modifier = Modifier.align(Alignment.Center) modifier = Modifier
.align(Alignment.Center)
.padding(horizontal = 60.dp) .padding(horizontal = 60.dp)
) { ) {
Text( Text(
@ -274,9 +265,9 @@ fun RecoveryPassword(state: LinkDeviceState, onChange: (String) -> Unit = {}, on
OutlineButton( OutlineButton(
text = stringResource(id = R.string.continue_2), text = stringResource(id = R.string.continue_2),
modifier = Modifier modifier = Modifier
.align(Alignment.CenterHorizontally) .align(Alignment.CenterHorizontally)
.padding(horizontal = 64.dp, vertical = 20.dp) .padding(horizontal = 64.dp, vertical = 20.dp)
.width(200.dp) .width(200.dp)
) { onContinue() } ) { onContinue() }
} }
} }
@ -306,8 +297,8 @@ class Analyzer(
image.imageInfo.rotationDegrees image.imageInfo.rotationDegrees
).let(scanner::process).apply { ).let(scanner::process).apply {
addOnSuccessListener { barcodes -> addOnSuccessListener { barcodes ->
barcodes.forEach { barcodes.filter { it.valueType == Barcode.TYPE_TEXT }.forEach {
it.takeIf { it.valueType == Barcode.TYPE_TEXT }?.rawValue?.let(onBarcodeScanned) it.rawValue?.let(onBarcodeScanned)
} }
} }
addOnCompleteListener { addOnCompleteListener {

@ -4,6 +4,7 @@ import androidx.annotation.DrawableRes
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Canvas import androidx.compose.foundation.Canvas
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.RowScope
@ -26,6 +27,9 @@ import androidx.compose.material.Icon
import androidx.compose.material.IconButton import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedButton 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.Text
import androidx.compose.material.TextButton import androidx.compose.material.TextButton
import androidx.compose.runtime.Composable 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.StrokeCap
import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnit

@ -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<Int>) {
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)
}
}
Loading…
Cancel
Save