mirror of
https://github.com/bitwarden/android.git
synced 2026-08-30 17:33:42 -05:00
Release prep and refinement (#64)
This commit is contained in:
@@ -10,7 +10,9 @@ import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
@@ -18,6 +20,7 @@ import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.ColorFilter
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
@@ -27,7 +30,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import com.bitwarden.authenticator.R
|
||||
import com.bitwarden.authenticator.ui.platform.base.util.EventsEffect
|
||||
import com.bitwarden.authenticator.ui.platform.base.util.asText
|
||||
import com.bitwarden.authenticator.ui.platform.components.button.BitwardenOutlinedButton
|
||||
import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledTonalButton
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BasicDialogState
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenBasicDialog
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenLoadingDialog
|
||||
@@ -107,7 +110,7 @@ fun UnlockScreen(
|
||||
|
||||
BitwardenScaffold(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.fillMaxSize(),
|
||||
) { innerPadding ->
|
||||
Box {
|
||||
Column(
|
||||
@@ -118,11 +121,17 @@ fun UnlockScreen(
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Image(
|
||||
modifier = Modifier
|
||||
.padding(horizontal = 16.dp)
|
||||
.width(220.dp)
|
||||
.height(74.dp)
|
||||
.fillMaxWidth(),
|
||||
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary),
|
||||
painter = painterResource(id = R.drawable.ic_logo_horizontal),
|
||||
contentDescription = stringResource(R.string.bitwarden_authenticator)
|
||||
contentDescription = stringResource(R.string.bitwarden_authenticator),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
BitwardenOutlinedButton(
|
||||
Spacer(modifier = Modifier.height(32.dp))
|
||||
BitwardenFilledTonalButton(
|
||||
label = stringResource(id = R.string.use_biometrics_to_unlock),
|
||||
onClick = {
|
||||
biometricsManager.promptBiometrics(
|
||||
|
||||
+1
-1
@@ -249,7 +249,7 @@ fun EditItemContent(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(horizontal = 16.dp),
|
||||
label = stringResource(id = R.string.secret_key),
|
||||
label = stringResource(id = R.string.key),
|
||||
value = viewState.itemData.totpCode,
|
||||
onValueChange = onTotpCodeTextChange,
|
||||
singleLine = true,
|
||||
|
||||
+4
-4
@@ -320,10 +320,10 @@ private fun ItemListingContent(
|
||||
onScanQrCodeClick = onScanQrCodeClick,
|
||||
),
|
||||
ItemListingExpandableFabAction.EnterSetupKey(
|
||||
label = R.string.enter_a_setup_key.asText(),
|
||||
label = R.string.enter_key_manually.asText(),
|
||||
icon = IconResource(
|
||||
iconPainter = painterResource(id = R.drawable.ic_keyboard_24px),
|
||||
contentDescription = stringResource(id = R.string.enter_a_setup_key),
|
||||
contentDescription = stringResource(id = R.string.enter_key_manually),
|
||||
testTag = "EnterSetupKeyButton",
|
||||
),
|
||||
onEnterSetupKeyClick = onEnterSetupKeyClick
|
||||
@@ -413,10 +413,10 @@ fun EmptyItemListingContent(
|
||||
onScanQrCodeClick = onScanQuCodeClick
|
||||
),
|
||||
ItemListingExpandableFabAction.EnterSetupKey(
|
||||
label = R.string.enter_a_setup_key.asText(),
|
||||
label = R.string.enter_key_manually.asText(),
|
||||
icon = IconResource(
|
||||
iconPainter = painterResource(id = R.drawable.ic_keyboard_24px),
|
||||
contentDescription = stringResource(id = R.string.enter_a_setup_key),
|
||||
contentDescription = stringResource(id = R.string.enter_key_manually),
|
||||
testTag = "EnterSetupKeyButton",
|
||||
),
|
||||
onEnterSetupKeyClick = onEnterSetupKeyClick,
|
||||
|
||||
+46
-15
@@ -35,7 +35,11 @@ import com.bitwarden.authenticator.ui.platform.base.util.EventsEffect
|
||||
import com.bitwarden.authenticator.ui.platform.base.util.toAnnotatedString
|
||||
import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar
|
||||
import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledTonalButton
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BasicDialogState
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenBasicDialog
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenLoadingDialog
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenTwoButtonDialog
|
||||
import com.bitwarden.authenticator.ui.platform.components.dialog.LoadingDialogState
|
||||
import com.bitwarden.authenticator.ui.platform.components.field.BitwardenTextField
|
||||
import com.bitwarden.authenticator.ui.platform.components.scaffold.BitwardenScaffold
|
||||
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
|
||||
@@ -108,11 +112,38 @@ fun ManualCodeEntryScreen(
|
||||
)
|
||||
}
|
||||
|
||||
when (val dialog = state.dialog) {
|
||||
|
||||
is ManualCodeEntryState.DialogState.Error -> {
|
||||
BitwardenBasicDialog(
|
||||
visibilityState = BasicDialogState.Shown(
|
||||
title = dialog.title,
|
||||
message = dialog.message
|
||||
),
|
||||
onDismissRequest = remember(state) {
|
||||
{ viewModel.trySendAction(ManualCodeEntryAction.DismissDialog) }
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
is ManualCodeEntryState.DialogState.Loading -> {
|
||||
BitwardenLoadingDialog(
|
||||
visibilityState = LoadingDialogState.Shown(
|
||||
dialog.message
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
null -> {
|
||||
Unit
|
||||
}
|
||||
}
|
||||
|
||||
BitwardenScaffold(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
topBar = {
|
||||
BitwardenTopAppBar(
|
||||
title = stringResource(id = R.string.authenticator_key_scanner),
|
||||
title = stringResource(id = R.string.create_verification_code),
|
||||
navigationIcon = painterResource(id = R.drawable.ic_close),
|
||||
navigationIconContentDescription = stringResource(id = R.string.close),
|
||||
onNavigationIconClick = remember(viewModel) {
|
||||
@@ -133,22 +164,22 @@ fun ManualCodeEntryScreen(
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
BitwardenTextField(
|
||||
label = stringResource(id = R.string.name),
|
||||
value = state.issuer,
|
||||
onValueChange = remember(viewModel) {
|
||||
{
|
||||
viewModel.trySendAction(
|
||||
ManualCodeEntryAction.IssuerTextChange(it),
|
||||
)
|
||||
}
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 16.dp),
|
||||
value = state.issuer,
|
||||
onValueChange = remember(viewModel) {
|
||||
{
|
||||
viewModel.trySendAction(
|
||||
ManualCodeEntryAction.IssuerTextChange(it),
|
||||
)
|
||||
}
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 16.dp),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
BitwardenTextField(
|
||||
singleLine = false,
|
||||
label = stringResource(id = R.string.authenticator_key_scanner),
|
||||
label = stringResource(id = R.string.key),
|
||||
value = state.code,
|
||||
onValueChange = remember(viewModel) {
|
||||
{
|
||||
@@ -164,7 +195,7 @@ fun ManualCodeEntryScreen(
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
BitwardenFilledTonalButton(
|
||||
label = stringResource(id = R.string.add_totp),
|
||||
label = stringResource(id = R.string.add_code),
|
||||
onClick = remember(viewModel) {
|
||||
{ viewModel.trySendAction(ManualCodeEntryAction.CodeSubmit) }
|
||||
},
|
||||
@@ -185,7 +216,7 @@ fun ManualCodeEntryScreen(
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(id = R.string.cannot_add_authenticator_key),
|
||||
text = stringResource(id = R.string.cannot_add_key),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
||||
+34
@@ -43,9 +43,17 @@ class ManualCodeEntryViewModel @Inject constructor(
|
||||
is ManualCodeEntryAction.Internal.CreateItemResultReceive -> {
|
||||
handleCreateItemReceive(action)
|
||||
}
|
||||
|
||||
ManualCodeEntryAction.DismissDialog -> {
|
||||
handleDialogDismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleDialogDismiss() {
|
||||
mutableStateFlow.update { it.copy(dialog = null) }
|
||||
}
|
||||
|
||||
private fun handleIssuerTextChange(action: ManualCodeEntryAction.IssuerTextChange) {
|
||||
mutableStateFlow.update {
|
||||
it.copy(issuer = action.issuer)
|
||||
@@ -63,6 +71,27 @@ class ManualCodeEntryViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun handleCodeSubmit() {
|
||||
if (state.code.isBlank()) {
|
||||
mutableStateFlow.update {
|
||||
it.copy(
|
||||
dialog = ManualCodeEntryState.DialogState.Error(
|
||||
message = R.string.key_is_required.asText()
|
||||
)
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (state.issuer.isBlank()) {
|
||||
mutableStateFlow.update {
|
||||
it.copy(
|
||||
dialog = ManualCodeEntryState.DialogState.Error(
|
||||
message = R.string.name_is_required.asText()
|
||||
)
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
viewModelScope.launch {
|
||||
val result = authenticatorRepository.createItem(
|
||||
AuthenticatorItemEntity(
|
||||
@@ -216,4 +245,9 @@ sealed class ManualCodeEntryAction {
|
||||
* The action for the user clicking the settings button.
|
||||
*/
|
||||
data object SettingsClick : ManualCodeEntryAction()
|
||||
|
||||
/**
|
||||
* The user has dismissed the dialog.
|
||||
*/
|
||||
data object DismissDialog : ManualCodeEntryAction()
|
||||
}
|
||||
|
||||
@@ -1,34 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M0,0h108v108h-108z"/>
|
||||
<path
|
||||
android:pathData="M71.57,34.63L113,76.06L89.71,119.08L40.65,70.02L53.53,77.45L70.88,60.11L71.57,34.63Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="37.85"
|
||||
android:startY="38.81"
|
||||
android:endX="89.01"
|
||||
android:endY="89.97"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#3F000000"/>
|
||||
<item android:offset="1" android:color="#00000000"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:pathData="M71.51,34.56C71.15,34.19 70.71,34 70.21,34H36.85C36.35,34 35.92,34.19 35.56,34.56C35.19,34.92 35,35.35 35,35.85V58.09C35,59.75 35.33,61.4 35.97,63.03C36.62,64.66 37.42,66.11 38.38,67.37C39.33,68.64 40.47,69.87 41.8,71.06C43.12,72.26 44.35,73.25 45.47,74.04C46.59,74.83 47.76,75.58 48.97,76.28C50.19,76.98 51.06,77.46 51.57,77.72C52.09,77.97 52.49,78.16 52.8,78.29C53.03,78.41 53.29,78.47 53.55,78.47C53.82,78.47 54.08,78.41 54.31,78.29C54.61,78.15 55.03,77.97 55.54,77.72C56.05,77.47 56.91,76.98 58.13,76.28C59.35,75.58 60.52,74.82 61.64,74.04C62.76,73.25 63.98,72.26 65.31,71.06C66.63,69.86 67.77,68.63 68.73,67.37C69.68,66.1 70.48,64.65 71.13,63.03C71.77,61.39 72.1,59.75 72.1,58.09V35.85C72.07,35.35 71.88,34.92 71.51,34.56ZM67.21,58.3C67.21,66.35 53.53,73.29 53.53,73.29V38.76H67.21C67.21,38.76 67.21,50.25 67.21,58.3Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M55,49C55,47.34 56.34,46 58,46H107C108.66,46 110,47.34 110,49V60C110,61.66 108.66,63 107,63H58C56.34,63 55,61.66 55,60V49Z"
|
||||
android:fillColor="#2DA49D"/>
|
||||
<path
|
||||
android:pathData="M64.22,54.63C64.22,55.6 64.04,56.41 63.67,57.05C63.3,57.7 62.77,58.19 62.07,58.51C61.37,58.84 60.53,59 59.54,59H57.12V50.43H59.81C60.7,50.43 61.48,50.59 62.14,50.91C62.8,51.23 63.32,51.7 63.68,52.33C64.04,52.95 64.22,53.72 64.22,54.63ZM62.34,54.68C62.34,54.05 62.24,53.53 62.06,53.12C61.87,52.71 61.6,52.41 61.24,52.21C60.88,52.02 60.43,51.92 59.9,51.92H58.93V57.5H59.71C60.6,57.5 61.26,57.26 61.69,56.79C62.12,56.32 62.34,55.62 62.34,54.68ZM70.93,59H66V50.43H70.93V51.92H67.82V53.8H70.72V55.29H67.82V57.5H70.93V59ZM79.45,50.43L76.53,59H74.55L71.65,50.43H73.48L75.09,55.53C75.12,55.62 75.16,55.78 75.23,56.02C75.29,56.25 75.35,56.5 75.41,56.77C75.48,57.03 75.53,57.25 75.55,57.42C75.57,57.25 75.61,57.03 75.67,56.77C75.74,56.51 75.8,56.26 75.85,56.02C75.92,55.79 75.96,55.62 75.99,55.53L77.61,50.43H79.45Z"
|
||||
android:fillColor="#212529"/>
|
||||
</group>
|
||||
android:viewportHeight="108"
|
||||
android:viewportWidth="108">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M63.95,56.33V43H54.5V66.69C56.17,65.81 57.67,64.86 58.99,63.83C62.3,61.28 63.95,58.78 63.95,56.33ZM68,40.33V56.33C68,57.53 67.76,58.71 67.29,59.89C66.82,61.06 66.24,62.1 65.54,63.01C64.85,63.92 64.02,64.81 63.05,65.67C62.09,66.53 61.2,67.24 60.39,67.81C59.57,68.38 58.72,68.92 57.83,69.43C56.95,69.93 56.32,70.28 55.94,70.46C55.57,70.64 55.27,70.78 55.05,70.88C54.88,70.96 54.7,71 54.5,71C54.3,71 54.12,70.96 53.95,70.88C53.73,70.78 53.43,70.64 53.06,70.46C52.68,70.28 52.05,69.93 51.17,69.43C50.28,68.92 49.43,68.38 48.61,67.81C47.8,67.24 46.91,66.53 45.95,65.67C44.98,64.81 44.15,63.92 43.46,63.01C42.76,62.1 42.18,61.06 41.71,59.89C41.24,58.71 41,57.53 41,56.33V40.33C41,39.97 41.13,39.66 41.4,39.4C41.67,39.13 41.98,39 42.35,39H66.65C67.02,39 67.33,39.13 67.6,39.4C67.87,39.66 68,39.97 68,40.33Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M38.02,32C34.69,32 32,34.63 32,37.87V45.91C32,46.57 32.55,47.11 33.23,47.11C33.9,47.11 34.45,46.57 34.45,45.91V37.87C34.45,35.95 36.05,34.39 38.02,34.39H46.26C46.94,34.39 47.48,33.86 47.48,33.2C47.48,32.54 46.94,32 46.26,32H38.02Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M69.98,32C73.31,32 76,34.63 76,37.87V45.91C76,46.57 75.45,47.11 74.77,47.11C74.1,47.11 73.55,46.57 73.55,45.91V37.87C73.55,35.95 71.95,34.39 69.98,34.39H61.74C61.06,34.39 60.52,33.86 60.52,33.2C60.52,32.54 61.06,32 61.74,32H69.98Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M32,70.13C32,73.37 34.69,76 38.02,76H46.26C46.94,76 47.48,75.46 47.48,74.8C47.48,74.14 46.94,73.61 46.26,73.61H38.02C36.05,73.61 34.45,72.05 34.45,70.13V62.09C34.45,61.43 33.9,60.89 33.23,60.89C32.55,60.89 32,61.43 32,62.09V70.13Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M69.98,76C73.31,76 76,73.37 76,70.13V62.09C76,61.43 75.45,60.89 74.77,60.89C74.1,60.89 73.55,61.43 73.55,62.09V70.13C73.55,72.05 71.95,73.61 69.98,73.61H61.74C61.06,73.61 60.52,74.14 60.52,74.8C60.52,75.46 61.06,76 61.74,76H69.98Z" />
|
||||
</vector>
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M0,0h108v108h-108z"/>
|
||||
<path
|
||||
android:pathData="M70.21,34C70.71,34 71.15,34.19 71.51,34.56C71.88,34.92 72.07,35.35 72.1,35.85V50.43H71.65L72.1,51.76V58.09C72.1,59.75 71.77,61.39 71.13,63.03C70.48,64.65 69.68,66.1 68.73,67.37C67.77,68.63 66.63,69.86 65.31,71.06C63.98,72.26 62.76,73.25 61.64,74.04C60.52,74.82 59.35,75.58 58.13,76.28C56.91,76.98 56.05,77.47 55.54,77.72C55.03,77.97 54.61,78.15 54.31,78.29C54.08,78.41 53.82,78.47 53.55,78.47C53.29,78.47 53.03,78.41 52.8,78.29C52.53,78.18 52.18,78.01 51.75,77.8C51.69,77.78 51.63,77.75 51.57,77.72C51.06,77.46 50.19,76.98 48.97,76.28C47.76,75.58 46.59,74.83 45.47,74.04C44.35,73.25 43.12,72.26 41.8,71.06C40.47,69.87 39.33,68.64 38.38,67.37C37.42,66.11 36.62,64.66 35.97,63.03C35.33,61.4 35,59.75 35,58.09V35.85C35,35.35 35.19,34.92 35.56,34.56C35.92,34.19 36.35,34 36.85,34H70.21ZM67.18,59C66.43,66.75 53.53,73.29 53.53,73.29V38.76H67.21V50.43H70.93V51.92H67.81V53.8H70.72V55.29H67.81V57.5H70.93V59H67.18Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M58,46C56.34,46 55,47.34 55,49V60C55,61.66 56.34,63 58,63H107C108.66,63 110,61.66 110,60V49C110,47.34 108.66,46 107,46H58ZM63.67,57.05C64.04,56.41 64.22,55.6 64.22,54.63C64.22,53.72 64.04,52.95 63.68,52.33C63.31,51.7 62.8,51.23 62.14,50.91C61.48,50.59 60.7,50.43 59.81,50.43H57.12V59H59.54C60.53,59 61.37,58.84 62.07,58.51C62.77,58.19 63.3,57.7 63.67,57.05ZM62.06,53.12C62.24,53.53 62.34,54.05 62.34,54.68C62.34,55.62 62.12,56.32 61.69,56.79C61.26,57.26 60.6,57.5 59.71,57.5H58.93V51.92H59.9C60.43,51.92 60.88,52.02 61.23,52.21C61.6,52.41 61.87,52.71 62.06,53.12ZM66,59H70.93V57.5H67.81V55.29H70.72V53.8H67.81V51.92H70.93V50.43H66V59ZM76.53,59L79.45,50.43H77.61L75.99,55.53C75.96,55.62 75.92,55.79 75.85,56.02C75.8,56.26 75.73,56.51 75.67,56.77C75.61,57.03 75.57,57.25 75.55,57.42C75.53,57.25 75.48,57.03 75.41,56.77C75.35,56.5 75.29,56.25 75.23,56.02C75.16,55.78 75.12,55.62 75.09,55.53L73.48,50.43H71.65L74.55,59H76.53Z"
|
||||
android:fillColor="#2DA49D"
|
||||
android:fillType="evenOdd"/>
|
||||
</group>
|
||||
android:viewportHeight="108"
|
||||
android:viewportWidth="108">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M63.95,56.33V43H54.5V66.69C56.17,65.81 57.67,64.86 58.99,63.83C62.3,61.28 63.95,58.78 63.95,56.33ZM68,40.33V56.33C68,57.53 67.76,58.71 67.29,59.89C66.82,61.06 66.24,62.1 65.54,63.01C64.85,63.92 64.02,64.81 63.05,65.67C62.09,66.53 61.2,67.24 60.39,67.81C59.57,68.38 58.72,68.92 57.83,69.43C56.95,69.93 56.32,70.28 55.94,70.46C55.57,70.64 55.27,70.78 55.05,70.88C54.88,70.96 54.7,71 54.5,71C54.3,71 54.12,70.96 53.95,70.88C53.73,70.78 53.43,70.64 53.06,70.46C52.68,70.28 52.05,69.93 51.17,69.43C50.28,68.92 49.43,68.38 48.61,67.81C47.8,67.24 46.91,66.53 45.95,65.67C44.98,64.81 44.15,63.92 43.46,63.01C42.76,62.1 42.18,61.06 41.71,59.89C41.24,58.71 41,57.53 41,56.33V40.33C41,39.97 41.13,39.66 41.4,39.4C41.67,39.13 41.98,39 42.35,39H66.65C67.02,39 67.33,39.13 67.6,39.4C67.87,39.66 68,39.97 68,40.33Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M38.02,32C34.69,32 32,34.63 32,37.87V45.91C32,46.57 32.55,47.11 33.23,47.11C33.9,47.11 34.45,46.57 34.45,45.91V37.87C34.45,35.95 36.05,34.39 38.02,34.39H46.26C46.94,34.39 47.48,33.86 47.48,33.2C47.48,32.54 46.94,32 46.26,32H38.02Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M69.98,32C73.31,32 76,34.63 76,37.87V45.91C76,46.57 75.45,47.11 74.77,47.11C74.1,47.11 73.55,46.57 73.55,45.91V37.87C73.55,35.95 71.95,34.39 69.98,34.39H61.74C61.06,34.39 60.52,33.86 60.52,33.2C60.52,32.54 61.06,32 61.74,32H69.98Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M32,70.13C32,73.37 34.69,76 38.02,76H46.26C46.94,76 47.48,75.46 47.48,74.8C47.48,74.14 46.94,73.61 46.26,73.61H38.02C36.05,73.61 34.45,72.05 34.45,70.13V62.09C34.45,61.43 33.9,60.89 33.23,60.89C32.55,60.89 32,61.43 32,62.09V70.13Z" />
|
||||
<path
|
||||
android:fillColor="#2CDDE9"
|
||||
android:pathData="M69.98,76C73.31,76 76,73.37 76,70.13V62.09C76,61.43 75.45,60.89 74.77,60.89C74.1,60.89 73.55,61.43 73.55,62.09V70.13C73.55,72.05 71.95,73.61 69.98,73.61H61.74C61.06,73.61 60.52,74.14 60.52,74.8C60.52,75.46 61.06,76 61.74,76H69.98Z" />
|
||||
</vector>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,14 +1,21 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<group android:scaleX="0.11454546"
|
||||
android:scaleY="0.11454546"
|
||||
android:translateX="31.663637"
|
||||
android:translateY="27.54">
|
||||
<path
|
||||
android:pathData="M376.4,12.2c-3.7,-3.7 -8.1,-5.6 -13.1,-5.6H26.7c-5.1,0 -9.4,1.9 -13.1,5.6C9.9,15.9 8,20.2 8,25.3v224.4c0,16.7 3.3,33.4 9.8,49.8c6.5,16.5 14.6,31.1 24.3,43.8c9.6,12.8 21.1,25.2 34.5,37.2c13.3,12.1 25.7,22.1 37,30.1c11.3,8 23.1,15.5 35.4,22.6c12.3,7.1 21,11.9 26.2,14.5c5.2,2.5 9.3,4.5 12.4,5.8c2.3,1.2 4.9,1.8 7.6,1.8c2.7,0 5.3,-0.6 7.6,-1.8c3.1,-1.4 7.3,-3.3 12.4,-5.8c5.2,-2.5 13.9,-7.4 26.2,-14.5c12.3,-7.1 24.1,-14.7 35.4,-22.6c11.3,-8 23.6,-18 37,-30.1c13.3,-12.1 24.8,-24.5 34.5,-37.2c9.6,-12.8 17.7,-27.4 24.2,-43.8c6.5,-16.5 9.8,-33.1 9.8,-49.8V25.3C382,20.2 380.1,15.9 376.4,12.2zM333,251.8C333,333 195,403 195,403V54.6h138C333,54.6 333,170.6 333,251.8z"
|
||||
android:fillColor="#FFFFFF"/>
|
||||
</group>
|
||||
android:pathData="M63.95,56.33V43H54.5V66.69C56.17,65.81 57.67,64.86 58.99,63.83C62.3,61.28 63.95,58.78 63.95,56.33ZM68,40.33V56.33C68,57.53 67.76,58.71 67.29,59.89C66.82,61.06 66.24,62.1 65.54,63.01C64.85,63.92 64.02,64.81 63.05,65.67C62.09,66.53 61.2,67.24 60.39,67.81C59.57,68.38 58.72,68.92 57.83,69.43C56.95,69.93 56.32,70.28 55.94,70.46C55.57,70.64 55.27,70.78 55.05,70.88C54.88,70.96 54.7,71 54.5,71C54.3,71 54.12,70.96 53.95,70.88C53.73,70.78 53.43,70.64 53.06,70.46C52.68,70.28 52.05,69.93 51.17,69.43C50.28,68.92 49.43,68.38 48.61,67.81C47.8,67.24 46.91,66.53 45.95,65.67C44.98,64.81 44.15,63.92 43.46,63.01C42.76,62.1 42.18,61.06 41.71,59.89C41.24,58.71 41,57.53 41,56.33V40.33C41,39.97 41.13,39.66 41.4,39.4C41.67,39.13 41.98,39 42.35,39H66.65C67.02,39 67.33,39.13 67.6,39.4C67.87,39.66 68,39.97 68,40.33Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M38.02,32C34.69,32 32,34.63 32,37.87V45.91C32,46.57 32.55,47.11 33.23,47.11C33.9,47.11 34.45,46.57 34.45,45.91V37.87C34.45,35.95 36.05,34.39 38.02,34.39H46.26C46.94,34.39 47.48,33.86 47.48,33.2C47.48,32.54 46.94,32 46.26,32H38.02Z"
|
||||
android:fillColor="#2CDDE9"/>
|
||||
<path
|
||||
android:pathData="M69.98,32C73.31,32 76,34.63 76,37.87V45.91C76,46.57 75.45,47.11 74.77,47.11C74.1,47.11 73.55,46.57 73.55,45.91V37.87C73.55,35.95 71.95,34.39 69.98,34.39H61.74C61.06,34.39 60.52,33.86 60.52,33.2C60.52,32.54 61.06,32 61.74,32H69.98Z"
|
||||
android:fillColor="#2CDDE9"/>
|
||||
<path
|
||||
android:pathData="M32,70.13C32,73.37 34.69,76 38.02,76H46.26C46.94,76 47.48,75.46 47.48,74.8C47.48,74.14 46.94,73.61 46.26,73.61H38.02C36.05,73.61 34.45,72.05 34.45,70.13V62.09C34.45,61.43 33.9,60.89 33.23,60.89C32.55,60.89 32,61.43 32,62.09V70.13Z"
|
||||
android:fillColor="#2CDDE9"/>
|
||||
<path
|
||||
android:pathData="M69.98,76C73.31,76 76,73.37 76,70.13V62.09C76,61.43 75.45,60.89 74.77,60.89C74.1,60.89 73.55,61.43 73.55,62.09V70.13C73.55,72.05 71.95,73.61 69.98,73.61H61.74C61.06,73.61 60.52,74.14 60.52,74.8C60.52,75.46 61.06,76 61.74,76H69.98Z"
|
||||
android:fillColor="#2CDDE9"/>
|
||||
</vector>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<color name="blue_002B74">#002B74</color>
|
||||
<color name="blue_002B73">#002B73</color>
|
||||
<color name="blue_001848">#001848</color>
|
||||
<color name="blue_020F66">#020F66</color>
|
||||
<color name="blue_151B2C">#151B2C</color>
|
||||
|
||||
<!-- Greys -->
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">@color/blue_175DDC</color>
|
||||
<color name="ic_launcher_background">@color/blue_020F66</color>
|
||||
</resources>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="app_name"> Bitwarden Authenticator</string>
|
||||
<string name="app_name">Authenticator</string>
|
||||
<string name="biometrics_direction">Biometric verification</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="add_item">Add item</string>
|
||||
@@ -21,7 +21,7 @@
|
||||
<string name="point_your_camera_at_the_qr_code">Point your camera at the QR code.</string>
|
||||
<string name="cannot_scan_qr_code">Cannot scan QR code.</string>
|
||||
<string name="enter_key_manually">Enter key manually.</string>
|
||||
<string name="cannot_add_authenticator_key">Cannot add authenticator key?</string>
|
||||
<string name="cannot_add_key">Cannot add key?</string>
|
||||
<string name="once_the_key_is_successfully_entered">Once the key is successfully entered,\nselect Add TOTP to store the key safely</string>
|
||||
<string name="add_totp">Add TOTP</string>
|
||||
<string name="authenticator_key_scanner">Authenticator key</string>
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="you_dont_have_items_to_display">You don\'t have any items to display.</string>
|
||||
<string name="empty_item_list_instruction">Add a new code to secure your accounts.</string>
|
||||
<string name="add_code">Add code</string>
|
||||
<string name="authenticator_key_read_error">Cannot read authenticator key.</string>
|
||||
<string name="authenticator_key_read_error">Cannot read key.</string>
|
||||
<string name="verification_code_added">Verification code added</string>
|
||||
<string name="username">Username</string>
|
||||
<string name="refresh_period">Refresh period</string>
|
||||
@@ -103,4 +103,8 @@
|
||||
<string name="privacy_policy">Privacy policy</string>
|
||||
<string name="continue_to_privacy_policy">Continue to privacy policy?</string>
|
||||
<string name="privacy_policy_description_long">Check out our privacy policy on bitwarden.com</string>
|
||||
<string name="key">Key</string>
|
||||
<string name="create_verification_code">Create Verification code</string>
|
||||
<string name="key_is_required">Key is required.</string>
|
||||
<string name="name_is_required">Name is required.</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user