2022-06-22 02:48:19 -07:00
|
|
|
@file:Suppress("TooManyFunctions")
|
2021-12-31 05:28:16 -08:00
|
|
|
|
2022-06-22 02:48:19 -07:00
|
|
|
package co.electriccoin.zcash.ui.screen.address.view
|
2021-12-31 05:28:16 -08:00
|
|
|
|
|
|
|
import androidx.compose.foundation.Image
|
|
|
|
import androidx.compose.foundation.border
|
|
|
|
import androidx.compose.foundation.clickable
|
|
|
|
import androidx.compose.foundation.layout.Box
|
|
|
|
import androidx.compose.foundation.layout.Column
|
|
|
|
import androidx.compose.foundation.layout.IntrinsicSize
|
|
|
|
import androidx.compose.foundation.layout.Row
|
|
|
|
import androidx.compose.foundation.layout.Spacer
|
|
|
|
import androidx.compose.foundation.layout.defaultMinSize
|
|
|
|
import androidx.compose.foundation.layout.fillMaxHeight
|
2023-04-04 05:21:18 -07:00
|
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
2021-12-31 05:28:16 -08:00
|
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
|
|
import androidx.compose.foundation.layout.height
|
2023-04-04 05:21:18 -07:00
|
|
|
import androidx.compose.foundation.layout.padding
|
2021-12-31 05:28:16 -08:00
|
|
|
import androidx.compose.foundation.layout.width
|
2023-04-04 05:21:18 -07:00
|
|
|
import androidx.compose.foundation.rememberScrollState
|
|
|
|
import androidx.compose.foundation.verticalScroll
|
2021-12-31 05:28:16 -08:00
|
|
|
import androidx.compose.material.icons.Icons
|
|
|
|
import androidx.compose.material.icons.filled.ArrowBack
|
|
|
|
import androidx.compose.material.icons.filled.ArrowDropDownCircle
|
2022-02-21 06:33:40 -08:00
|
|
|
import androidx.compose.material3.Divider
|
2022-09-22 06:55:34 -07:00
|
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
2022-02-21 06:33:40 -08:00
|
|
|
import androidx.compose.material3.Icon
|
|
|
|
import androidx.compose.material3.IconButton
|
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
|
import androidx.compose.material3.Text
|
2022-09-22 06:55:34 -07:00
|
|
|
import androidx.compose.material3.TopAppBar
|
2021-12-31 05:28:16 -08:00
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
import androidx.compose.runtime.getValue
|
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
|
import androidx.compose.runtime.saveable.rememberSaveable
|
|
|
|
import androidx.compose.runtime.setValue
|
|
|
|
import androidx.compose.ui.Alignment
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
import androidx.compose.ui.draw.rotate
|
|
|
|
import androidx.compose.ui.graphics.Color
|
|
|
|
import androidx.compose.ui.graphics.painter.ColorPainter
|
|
|
|
import androidx.compose.ui.res.stringResource
|
|
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
|
|
import androidx.compose.ui.unit.dp
|
2023-02-17 03:05:23 -08:00
|
|
|
import cash.z.ecc.android.sdk.fixture.WalletAddressesFixture
|
|
|
|
import cash.z.ecc.android.sdk.model.WalletAddresses
|
2022-03-08 11:05:03 -08:00
|
|
|
import co.electriccoin.zcash.ui.R
|
|
|
|
import co.electriccoin.zcash.ui.design.MINIMAL_WEIGHT
|
|
|
|
import co.electriccoin.zcash.ui.design.component.Body
|
|
|
|
import co.electriccoin.zcash.ui.design.component.GradientSurface
|
|
|
|
import co.electriccoin.zcash.ui.design.component.ListHeader
|
|
|
|
import co.electriccoin.zcash.ui.design.component.ListItem
|
|
|
|
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
|
2022-01-13 09:49:08 -08:00
|
|
|
import kotlinx.coroutines.runBlocking
|
2021-12-31 05:28:16 -08:00
|
|
|
|
2023-06-18 23:59:00 -07:00
|
|
|
@Preview("WalletAddresses")
|
2021-12-31 05:28:16 -08:00
|
|
|
@Composable
|
2023-06-18 23:59:00 -07:00
|
|
|
private fun ComposablePreview() {
|
2021-12-31 05:28:16 -08:00
|
|
|
ZcashTheme(darkTheme = true) {
|
|
|
|
GradientSurface {
|
|
|
|
WalletAddresses(
|
2022-01-13 09:49:08 -08:00
|
|
|
runBlocking { WalletAddressesFixture.new() },
|
2021-12-31 05:28:16 -08:00
|
|
|
onBack = {}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
fun WalletAddresses(walletAddresses: WalletAddresses, onBack: () -> Unit) {
|
|
|
|
Column {
|
|
|
|
WalletDetailTopAppBar(onBack)
|
2023-04-04 05:21:18 -07:00
|
|
|
WalletDetailAddresses(
|
|
|
|
walletAddresses,
|
|
|
|
Modifier
|
|
|
|
.fillMaxSize()
|
|
|
|
.verticalScroll(rememberScrollState())
|
|
|
|
)
|
2021-12-31 05:28:16 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
2022-09-22 06:55:34 -07:00
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
2021-12-31 05:28:16 -08:00
|
|
|
private fun WalletDetailTopAppBar(onBack: () -> Unit) {
|
2022-09-22 06:55:34 -07:00
|
|
|
TopAppBar(
|
2021-12-31 05:28:16 -08:00
|
|
|
title = {
|
|
|
|
Text(
|
|
|
|
text = stringResource(id = R.string.wallet_address_title)
|
|
|
|
)
|
|
|
|
},
|
|
|
|
navigationIcon = {
|
|
|
|
IconButton(
|
|
|
|
onClick = onBack
|
|
|
|
) {
|
|
|
|
Icon(
|
|
|
|
imageVector = Icons.Filled.ArrowBack,
|
2022-05-13 04:58:28 -07:00
|
|
|
contentDescription = stringResource(R.string.wallet_address_back_content_description)
|
2021-12-31 05:28:16 -08:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
private val BIG_INDICATOR_WIDTH = 24.dp
|
|
|
|
private val SMALL_INDICATOR_WIDTH = 16.dp
|
|
|
|
|
|
|
|
@Composable
|
2023-04-04 05:21:18 -07:00
|
|
|
private fun WalletDetailAddresses(
|
|
|
|
walletAddresses: WalletAddresses,
|
|
|
|
modifier: Modifier = Modifier
|
|
|
|
) {
|
|
|
|
Column(modifier) {
|
2021-12-31 05:28:16 -08:00
|
|
|
Row(
|
|
|
|
Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.height(IntrinsicSize.Min)
|
|
|
|
) {
|
|
|
|
Image(
|
|
|
|
painter = ColorPainter(ZcashTheme.colors.highlight),
|
|
|
|
contentDescription = "",
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxHeight()
|
|
|
|
.width(BIG_INDICATOR_WIDTH)
|
|
|
|
)
|
|
|
|
|
|
|
|
Column(Modifier.fillMaxWidth()) {
|
|
|
|
ExpandableRow(
|
|
|
|
title = stringResource(R.string.wallet_address_unified),
|
2022-01-13 09:49:08 -08:00
|
|
|
content = walletAddresses.unified.address,
|
2023-04-04 05:21:18 -07:00
|
|
|
isInitiallyExpanded = true,
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.padding(
|
|
|
|
horizontal = ZcashTheme.dimens.spacingDefault,
|
|
|
|
vertical = ZcashTheme.dimens.spacingTiny
|
|
|
|
)
|
2021-12-31 05:28:16 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
Box(Modifier.height(IntrinsicSize.Min)) {
|
|
|
|
Divider(modifier = Modifier.fillMaxHeight())
|
2023-04-04 05:21:18 -07:00
|
|
|
ListHeader(
|
|
|
|
text = stringResource(R.string.wallet_address_header_includes),
|
|
|
|
modifier = Modifier.padding(all = ZcashTheme.dimens.spacingSmall)
|
|
|
|
)
|
2021-12-31 05:28:16 -08:00
|
|
|
}
|
|
|
|
|
2023-04-04 05:21:18 -07:00
|
|
|
SaplingAddress(
|
|
|
|
saplingAddress = walletAddresses.sapling.address,
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.height(IntrinsicSize.Min)
|
|
|
|
)
|
|
|
|
|
|
|
|
TransparentAddress(
|
|
|
|
transparentAddress = walletAddresses.transparent.address,
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.height(IntrinsicSize.Min)
|
|
|
|
)
|
2021-12-31 05:28:16 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Note: The addresses code below has opportunities to be made more DRY.
|
|
|
|
// Refactoring that is being held off until issue #160 is fixed, since knowledge
|
|
|
|
// of row position will be needed.
|
|
|
|
|
|
|
|
@Composable
|
2023-04-04 05:21:18 -07:00
|
|
|
private fun SaplingAddress(
|
|
|
|
saplingAddress: String,
|
|
|
|
modifier: Modifier = Modifier
|
|
|
|
) {
|
|
|
|
Row(modifier) {
|
2021-12-31 05:28:16 -08:00
|
|
|
SmallIndicator(ZcashTheme.colors.addressHighlightSapling)
|
|
|
|
|
|
|
|
ExpandableRow(
|
2022-11-25 00:30:27 -08:00
|
|
|
title = stringResource(R.string.wallet_address_sapling),
|
2021-12-31 05:28:16 -08:00
|
|
|
content = saplingAddress,
|
2023-04-04 05:21:18 -07:00
|
|
|
isInitiallyExpanded = false,
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.padding(
|
|
|
|
horizontal = ZcashTheme.dimens.spacingDefault,
|
|
|
|
vertical = ZcashTheme.dimens.spacingTiny
|
|
|
|
)
|
2021-12-31 05:28:16 -08:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
2023-04-04 05:21:18 -07:00
|
|
|
private fun TransparentAddress(
|
|
|
|
transparentAddress: String,
|
|
|
|
modifier: Modifier = Modifier
|
|
|
|
) {
|
|
|
|
Row(modifier) {
|
2021-12-31 05:28:16 -08:00
|
|
|
SmallIndicator(ZcashTheme.colors.addressHighlightTransparent)
|
|
|
|
ExpandableRow(
|
|
|
|
title = stringResource(R.string.wallet_address_transparent),
|
|
|
|
content = transparentAddress,
|
2023-04-04 05:21:18 -07:00
|
|
|
isInitiallyExpanded = false,
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.padding(
|
|
|
|
horizontal = ZcashTheme.dimens.spacingDefault,
|
|
|
|
vertical = ZcashTheme.dimens.spacingTiny
|
|
|
|
)
|
2021-12-31 05:28:16 -08:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
private fun ExpandableRow(
|
|
|
|
title: String,
|
|
|
|
content: String,
|
|
|
|
isInitiallyExpanded: Boolean,
|
|
|
|
modifier: Modifier = Modifier
|
|
|
|
) {
|
|
|
|
var expandedState by rememberSaveable { mutableStateOf(isInitiallyExpanded) }
|
|
|
|
|
|
|
|
Column(
|
2023-04-04 05:21:18 -07:00
|
|
|
Modifier
|
|
|
|
.clickable { expandedState = !expandedState }
|
|
|
|
.then(modifier) // To have proper ripple effect
|
2021-12-31 05:28:16 -08:00
|
|
|
) {
|
|
|
|
Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.defaultMinSize(minHeight = 48.dp)) {
|
|
|
|
ListItem(text = title)
|
|
|
|
Spacer(
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.weight(MINIMAL_WEIGHT)
|
|
|
|
)
|
|
|
|
ExpandableArrow(expandedState)
|
|
|
|
}
|
|
|
|
if (expandedState) {
|
|
|
|
Body(content)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
private fun SmallIndicator(color: Color) {
|
|
|
|
// TODO [#160]: Border is not the right implementation here, as it causes double thickness for the middle item
|
|
|
|
Image(
|
|
|
|
modifier = Modifier
|
|
|
|
.fillMaxHeight()
|
|
|
|
.width(SMALL_INDICATOR_WIDTH)
|
|
|
|
.border(1.dp, ZcashTheme.colors.addressHighlightBorder),
|
|
|
|
painter = ColorPainter(color),
|
|
|
|
contentDescription = ""
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
private const val NINETY_DEGREES = 90f
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
private fun ExpandableArrow(isExpanded: Boolean) {
|
|
|
|
Icon(
|
|
|
|
imageVector = Icons.Filled.ArrowDropDownCircle,
|
|
|
|
contentDescription = if (isExpanded) {
|
|
|
|
stringResource(id = R.string.wallet_address_hide)
|
|
|
|
} else {
|
|
|
|
stringResource(id = R.string.wallet_address_show)
|
|
|
|
},
|
|
|
|
modifier = if (isExpanded) {
|
|
|
|
Modifier
|
|
|
|
} else {
|
|
|
|
Modifier.rotate(NINETY_DEGREES)
|
|
|
|
},
|
2022-02-21 06:33:40 -08:00
|
|
|
tint = MaterialTheme.colorScheme.onBackground
|
2021-12-31 05:28:16 -08:00
|
|
|
)
|
|
|
|
}
|