Skip to content

Commit

Permalink
(android) Add help message for swap in home
Browse files Browse the repository at this point in the history
Some wording in the swap-in wallet screen has also been updated.
The config for es_419 localisation has been fixed.

Also hightighted the button to bump unconfirmed transactions.
  • Loading branch information
dpad85 committed Nov 22, 2023
1 parent 5bd023e commit b5d17ed
Show file tree
Hide file tree
Showing 25 changed files with 299 additions and 124 deletions.
2 changes: 1 addition & 1 deletion phoenix-android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ android {
versionCode = 67
versionName = gitCommitHash()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
resourceConfigurations.addAll(listOf("en", "fr", "de", "es", "cs", "pt-rBR"))
resourceConfigurations.addAll(listOf("en", "fr", "de", "es", "b+es+419", "cs", "pt-rBR"))
}

buildTypes {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,6 @@ fun AppView(
onTorClick = { navController.navigate(Screen.TorConfig) },
onElectrumClick = { navController.navigate(Screen.ElectrumServer) },
onShowSwapInWallet = { navController.navigate(Screen.WalletInfo.SwapInWallet) },
onShowChannels = { navController.navigate(Screen.Channels) },
onShowNotifications = { navController.navigate(Screen.Notifications) }
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ fun InlineButton(
backgroundColor = Color.Transparent,
shape = RoundedCornerShape(6.dp),
maxLines = maxLines,
textStyle = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.primary, fontSize = fontSize, textDecoration = TextDecoration.Underline)
textStyle = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.primary, fontSize = fontSize, textDecoration = TextDecoration.Underline),
horizontalArrangement = Arrangement.Start,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,31 @@ package fr.acinq.phoenix.android.components
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
Expand Down Expand Up @@ -167,42 +182,56 @@ fun RowScope.IconPopup(
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
) {
var showPopup by remember { mutableStateOf(false) }
if (showPopup) {
Popup(
onDismissRequest = { showPopup = false },
offset = IntOffset(x = -200, y = 54)
spaceLeft?.let { Spacer(Modifier.width(it)) }
Box {
BorderButton(
icon = icon,
iconTint = if (showPopup) MaterialTheme.colors.onPrimary else colorAtRest,
backgroundColor = if (showPopup) MaterialTheme.colors.primary else MaterialTheme.colors.surface,
borderColor = if (showPopup) MaterialTheme.colors.primary else colorAtRest,
padding = PaddingValues(iconPadding),
modifier = modifier.size(iconSize),
interactionSource = interactionSource,
onClick = { showPopup = true }
)
if (showPopup) {
PopupDialog(onDismiss = { showPopup = false }, message = popupMessage, button = popupLink?.let { (text, link) ->
{ WebLink(text = text, url = link, fontSize = 14.sp, modifier = Modifier.fillMaxWidth(), padding = PaddingValues(horizontal = 10.dp, vertical = 8.dp)) }
})
}
}
spaceRight?.let { Spacer(Modifier.width(it)) }
}

@Composable
fun PopupDialog(
onDismiss: () -> Unit,
message: String,
button: @Composable (() -> Unit)? = null,
) {
Popup(
alignment = Alignment.TopCenter,
offset = IntOffset(x = 0, y = 58),
onDismissRequest = onDismiss,
) {
Surface(
modifier = Modifier.widthIn(min = 280.dp, max = 280.dp),
shape = RoundedCornerShape(8.dp),
border = BorderStroke(1.dp, MaterialTheme.colors.primary),
elevation = 6.dp,
) {
Surface(
modifier = Modifier
.padding(horizontal = 4.dp)
.widthIn(min = 280.dp, max = 280.dp),
shape = RoundedCornerShape(8.dp),
border = BorderStroke(1.dp, MaterialTheme.colors.primary),
elevation = 6.dp,
) {
Column(modifier = Modifier.padding(10.dp)) {
Text(
text = popupMessage,
style = MaterialTheme.typography.body1.copy(fontSize = 14.sp)
)
popupLink?.let { (text, link) ->
Spacer(modifier = Modifier.height(8.dp))
WebLink(text = text, url = link, fontSize = 14.sp)
}
Column() {
Text(
modifier = Modifier.padding(start = 10.dp, end = 10.dp, top = 8.dp),
text = message,
style = MaterialTheme.typography.body1.copy(fontSize = 14.sp)
)
button?.let {
it()
} ?: run {
Spacer(modifier = Modifier.height(8.dp))
}
}
}
}
spaceLeft?.let { Spacer(Modifier.width(it)) }
BorderButton(
icon = icon,
iconTint = if (showPopup) MaterialTheme.colors.onPrimary else colorAtRest,
backgroundColor = if (showPopup) MaterialTheme.colors.primary else MaterialTheme.colors.surface,
borderColor = if (showPopup) MaterialTheme.colors.primary else colorAtRest,
padding = PaddingValues(iconPadding),
modifier = modifier.size(iconSize),
interactionSource = interactionSource,
onClick = { showPopup = true }
)
spaceRight?.let { Spacer(Modifier.width(it)) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,22 @@

package fr.acinq.phoenix.android.home

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.acinq.lightning.MilliSatoshi
import fr.acinq.lightning.payment.LiquidityPolicy
import fr.acinq.lightning.utils.msat
import fr.acinq.lightning.utils.sat
import fr.acinq.lightning.utils.toMilliSatoshi
Expand All @@ -50,7 +54,6 @@ fun HomeBalance(
swapInBalance: WalletBalance,
unconfirmedChannelsBalance: MilliSatoshi,
onShowSwapInWallet: () -> Unit,
onShowChannels: () -> Unit,
balanceDisplayMode: HomeAmountDisplayMode,
) {
if (balance == null) {
Expand Down Expand Up @@ -92,25 +95,81 @@ private fun IncomingBalance(
onShowSwapInWallet: () -> Unit,
balanceDisplayMode: HomeAmountDisplayMode,
) {
var showSwapInHelp by remember { mutableStateOf(false) }
val balance = swapInBalance.total.toMilliSatoshi() + pendingChannelsBalance
if (balance > 0.msat) {
val nextSwapTimeout by business.peerManager.swapInNextTimeout.collectAsState(initial = null)
val undecidedSwapBalance = swapInBalance.unconfirmed + swapInBalance.weaklyConfirmed
FilledButton(
icon = when {
nextSwapTimeout?.let { it.second < 144 } ?: false -> R.drawable.ic_alert_triangle
undecidedSwapBalance == 0.sat && pendingChannelsBalance == 0.msat -> R.drawable.ic_sleep
else -> R.drawable.ic_clock
},
iconTint = MaterialTheme.typography.caption.color,
text = if (balanceDisplayMode == HomeAmountDisplayMode.REDACTED) "****" else {
stringResource(id = R.string.home__onchain_incoming, balance.toPrettyString(preferredAmountUnit, fiatRate, withUnit = true))
},
textStyle = MaterialTheme.typography.caption,
space = 4.dp,
padding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
backgroundColor = Color.Transparent,
onClick = onShowSwapInWallet,
)
val pendingSwapBalance = swapInBalance.unconfirmed + swapInBalance.weaklyConfirmed
Clickable(
modifier = Modifier.clip(CircleShape),
onClick = { showSwapInHelp = true },
) {
Row(
modifier = Modifier.padding(horizontal = 10.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
TextWithIcon(
text = if (balanceDisplayMode == HomeAmountDisplayMode.REDACTED) "****" else {
stringResource(id = R.string.home__onchain_incoming, balance.toPrettyString(preferredAmountUnit, fiatRate, withUnit = true))
},
textStyle = MaterialTheme.typography.caption,
icon = when {
nextSwapTimeout?.let { it.second < 144 } ?: false -> R.drawable.ic_alert_triangle
pendingSwapBalance == 0.sat && pendingChannelsBalance == 0.msat -> R.drawable.ic_sleep
else -> R.drawable.ic_clock
},
iconTint = MaterialTheme.typography.caption.color,
space = 4.dp,
)
Spacer(modifier = Modifier.width(6.dp))
PhoenixIcon(
resourceId = R.drawable.ic_help_circle,
modifier = Modifier
.size(18.dp)
.clip(CircleShape)
.then(if (showSwapInHelp) Modifier.background(MaterialTheme.colors.primary) else Modifier),
tint = if (showSwapInHelp) MaterialTheme.colors.onPrimary else MaterialTheme.colors.primary,
)

if (showSwapInHelp) {
val liquidityPolicyInPrefs by UserPrefs.getLiquidityPolicy(LocalContext.current).collectAsState(null)
val bitcoinUnit = LocalBitcoinUnit.current
PopupDialog(
onDismiss = { showSwapInHelp = false },
message = when {
swapInBalance.deeplyConfirmed > 0.sat -> {
when (val policy = liquidityPolicyInPrefs) {
is LiquidityPolicy.Disable -> {
stringResource(id = R.string.home_swapin_help_ready_disabled)
}
is LiquidityPolicy.Auto -> {
stringResource(id = R.string.home_swapin_help_ready_fee, policy.maxAbsoluteFee.toPrettyString(bitcoinUnit, withUnit = true))
}
else -> {
stringResource(id = R.string.home_swapin_help_generic)
}
}
}
pendingSwapBalance > 0.sat && swapInBalance.deeplyConfirmed == 0.sat -> {
stringResource(id = R.string.home_swapin_help_pending)
}
else -> {
stringResource(id = R.string.home_swapin_help_generic)
}
},
button = {
Button(
text = stringResource(id = R.string.home_swapin_help_button),
onClick = onShowSwapInWallet,
textStyle = MaterialTheme.typography.button.copy(color = MaterialTheme.colors.primary, fontSize = 14.sp, textDecoration = TextDecoration.Underline),
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start,
padding = PaddingValues(horizontal = 10.dp, vertical = 8.dp)
)
}
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
Expand Down Expand Up @@ -96,7 +95,6 @@ private fun FirstNoticeView(
) {
val context = LocalContext.current
val navController = LocalNavController.current
val scope = rememberCoroutineScope()

val onClick = if (messagesCount == 1) {
when (notice) {
Expand Down Expand Up @@ -158,7 +156,7 @@ private fun FirstNoticeView(
}

Notice.MempoolFull -> {
NoticeTextView(text = stringResource(id = R.string.inappnotif_mempool_full_message), icon = R.drawable.ic_alert_triangle)
NoticeTextView(text = stringResource(id = R.string.inappnotif_mempool_full_message), icon = R.drawable.ic_info)
}

Notice.UpdateAvailable -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,8 @@ fun ColumnScope.PaymentsList(
Column(modifier = modifier.weight(1f, fill = true), horizontalAlignment = Alignment.CenterHorizontally) {
if (payments.isEmpty()) {
Text(
text = when {
swapInBalance.unconfirmed + swapInBalance.weaklyConfirmed > 0.sat -> stringResource(id = R.string.home__payments_none_incoming)
else -> stringResource(id = R.string.home__payments_none)
},
style = MaterialTheme.typography.caption.copy(textAlign = TextAlign.Center),
text = stringResource(id = R.string.home__payments_none),
style = MaterialTheme.typography.caption.copy(textAlign = TextAlign.Center, fontSize = 14.sp),
modifier = Modifier
.padding(horizontal = 32.dp)
.widthIn(max = 250.dp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ fun HomeView(
onTorClick: () -> Unit,
onElectrumClick: () -> Unit,
onShowSwapInWallet: () -> Unit,
onShowChannels: () -> Unit,
onShowNotifications: () -> Unit,
) {
val log = logger("HomeView")
Expand Down Expand Up @@ -226,7 +225,6 @@ fun HomeView(
swapInBalance = swapInBalance.value,
unconfirmedChannelsBalance = pendingChannelsBalance.value,
onShowSwapInWallet = onShowSwapInWallet,
onShowChannels = onShowChannels,
)
PrimarySeparator(modifier = Modifier.layoutId("separator"))
HomeNotices(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,9 @@ fun ReceiveView(

// When a on-chain payment has been received, go back to the home screen (via the onSwapInReceived callback)
LaunchedEffect(key1 = Unit) {
var previousBalance: WalletBalance? = null
var previousBalance: WalletBalance = WalletBalance.empty()
balanceManager.swapInWalletBalance.collect {
if (previousBalance != null && it.total > 0.sat && it != previousBalance) {
if (previousBalance != WalletBalance.empty() && it.total > 0.sat && it != previousBalance) {
onSwapInReceived()
} else {
previousBalance = it
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
Expand Down Expand Up @@ -631,7 +632,7 @@ private fun ConfirmationView(
)
Text(
text = stringResource(id = R.string.paymentdetails_status_unconfirmed_zero_bump),
style = MaterialTheme.typography.caption.copy(fontSize = 14.sp)
style = MaterialTheme.typography.button.copy(fontSize = 14.sp, color = MaterialTheme.colors.primary, fontWeight = FontWeight.Bold),
)
}
} else {
Expand Down

0 comments on commit b5d17ed

Please sign in to comment.