improvement: Show a tip that you can generate disposable emails #724

This commit is contained in:
Artem Chepurnoy 2024-11-29 15:18:40 +02:00
parent a6eaf9178e
commit 72904b484b
No known key found for this signature in database
GPG Key ID: FAC37D0CF674043E
3 changed files with 57 additions and 16 deletions

View File

@ -230,6 +230,9 @@
<string name="bitwarden_premium_required">Requires Bitwarden premium</string>
<string name="bitwarden_unofficial_server">Unofficial Bitwarden server</string>
<string name="pro_tip">Pro tip: <xliff:g id="tip" example="Wake up early and work a lot!">%1$s</xliff:g></string>
<string name="pro_tip_generate_email_relay_title">Generate disposable emails for the better privacy.</string>
<string name="account_last_synced_at">Last synced at <xliff:g id="date" example="1 January 1970 12:30">%1$s</xliff:g></string>
<string name="account_action_change_name_title">Change name</string>
<string name="account_action_change_color_title">Change color</string>

View File

@ -92,6 +92,8 @@ import com.artemchep.keyguard.res.Res
import com.artemchep.keyguard.res.*
import com.artemchep.keyguard.ui.ContextItem
import com.artemchep.keyguard.ui.FlatItemAction
import com.artemchep.keyguard.ui.FlatSimpleNote
import com.artemchep.keyguard.ui.SimpleNote
import com.artemchep.keyguard.ui.buildContextItems
import com.artemchep.keyguard.ui.icons.KeyguardIcons
import com.artemchep.keyguard.ui.icons.icon
@ -1700,12 +1702,40 @@ private fun RememberStateFlowScope.flowOfGeneratorType(
typesAllFlow,
typeFlow,
) { allTypes, type ->
val shouldShowEmailRelayProTip = allTypes.none { it is GeneratorType2.EmailRelay }
val typeTitle = translate(type.title)
val typeItems = buildContextItems {
var prevGroup: String? = null
allTypes.forEachIndexed { index, item ->
if (index > 0) {
val groupChanged = allTypes[index - 1].group != item.group
val groupChanged = prevGroup != item.group
if (groupChanged) {
if (
prevGroup == GENERATOR_TYPE_GROUP_USERNAME &&
shouldShowEmailRelayProTip
) {
val tipBody = translate(Res.string.pro_tip_generate_email_relay_title)
val tip = translate(Res.string.pro_tip, tipBody)
val note = SimpleNote(
text = tip,
type = SimpleNote.Type.INFO,
)
this += ContextItem.Custom {
FlatSimpleNote(
type = note.type,
text = note.text,
onClick = {
val route = EmailRelayListRoute
val intent = NavigationIntent.NavigateToRoute(route)
navigate(intent)
},
icon = false,
)
}
}
this += when (item.group) {
GENERATOR_TYPE_GROUP_INTEGRATION ->
ContextItem.Section(
@ -1738,6 +1768,8 @@ private fun RememberStateFlowScope.flowOfGeneratorType(
)
}
}
prevGroup = item.group
}
}
GeneratorState.Type(

View File

@ -62,6 +62,7 @@ fun FlatSimpleNote(
content: (@Composable ColumnScope.() -> Unit)? = null,
onClick: (() -> Unit)? = null,
enabled: Boolean = true,
icon: Boolean = true,
) {
val tintColor = when (type) {
SimpleNote.Type.OK -> MaterialTheme.colorScheme.ok
@ -86,23 +87,28 @@ fun FlatSimpleNote(
backgroundColor = surfaceColor
.combineAlpha(DisabledEmphasisAlpha),
contentColor = contentColor,
leading = {
if (leading != null) {
leading.invoke(this)
return@FlatItemLayout
}
leading = if (icon) {
// composable
leading@{
if (leading != null) {
leading.invoke(this)
return@leading
}
val imageVector = when (type) {
SimpleNote.Type.OK -> Icons.Outlined.Check
SimpleNote.Type.INFO -> Icons.Outlined.Info
SimpleNote.Type.WARNING -> Icons.Outlined.Warning
SimpleNote.Type.ERROR -> Icons.Outlined.ErrorOutline
val imageVector = when (type) {
SimpleNote.Type.OK -> Icons.Outlined.Check
SimpleNote.Type.INFO -> Icons.Outlined.Info
SimpleNote.Type.WARNING -> Icons.Outlined.Warning
SimpleNote.Type.ERROR -> Icons.Outlined.ErrorOutline
}
Icon(
imageVector = imageVector,
contentDescription = null,
tint = tintColor,
)
}
Icon(
imageVector = imageVector,
contentDescription = null,
tint = tintColor,
)
} else {
null
},
content = {
if (title != null) {