Skip to content

Commit 5840bcd

Browse files
PM-14179: Create and apply card style to UI (#4567)
1 parent 2672f42 commit 5840bcd

File tree

110 files changed

+3435
-2003
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+3435
-2003
lines changed

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupAutofillScreen.kt

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton
4242
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog
4343
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog
4444
import com.x8bit.bitwarden.ui.platform.components.image.BitwardenGifImage
45+
import com.x8bit.bitwarden.ui.platform.components.model.CardStyle
4546
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
4647
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
4748
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
@@ -167,6 +168,7 @@ private fun SetupAutoFillContent(
167168
),
168169
isChecked = state.autofillEnabled,
169170
onCheckedChange = onAutofillServiceChanged,
171+
cardStyle = CardStyle.Full,
170172
modifier = Modifier
171173
.fillMaxWidth()
172174
.standardHorizontalMargin(),

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockScreen.kt

+10-1
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,13 @@ import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton
4646
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog
4747
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog
4848
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog
49+
import com.x8bit.bitwarden.ui.platform.components.model.CardStyle
4950
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
5051
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenUnlockWithBiometricsSwitch
5152
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenUnlockWithPinSwitch
5253
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
5354
import com.x8bit.bitwarden.ui.platform.composition.LocalBiometricsManager
55+
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricSupportStatus
5456
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
5557
import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
5658
import com.x8bit.bitwarden.ui.platform.util.isPortrait
@@ -156,11 +158,13 @@ private fun SetupUnlockScreenContent(
156158
}
157159

158160
Spacer(modifier = Modifier.height(height = 24.dp))
161+
val biometricSupportStatus = biometricsManager.biometricSupportStatus
159162
BitwardenUnlockWithBiometricsSwitch(
160-
biometricSupportStatus = biometricsManager.biometricSupportStatus,
163+
biometricSupportStatus = biometricSupportStatus,
161164
isChecked = state.isUnlockWithBiometricsEnabled || showBiometricsPrompt,
162165
onDisableBiometrics = handler.onDisableBiometrics,
163166
onEnableBiometrics = handler.onEnableBiometrics,
167+
cardStyle = CardStyle.Top(),
164168
modifier = Modifier
165169
.testTag(tag = "UnlockWithBiometricsSwitch")
166170
.fillMaxWidth()
@@ -170,6 +174,11 @@ private fun SetupUnlockScreenContent(
170174
isUnlockWithPasswordEnabled = state.isUnlockWithPasswordEnabled,
171175
isUnlockWithPinEnabled = state.isUnlockWithPinEnabled,
172176
onUnlockWithPinToggleAction = handler.onUnlockWithPinToggle,
177+
cardStyle = if (biometricSupportStatus == BiometricSupportStatus.NOT_SUPPORTED) {
178+
CardStyle.Full
179+
} else {
180+
CardStyle.Bottom
181+
},
173182
modifier = Modifier
174183
.testTag(tag = "UnlockWithPinSwitch")
175184
.fillMaxWidth()

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreen.kt

+44-33
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.widget.Toast
55
import androidx.activity.compose.BackHandler
66
import androidx.compose.foundation.Image
77
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.PaddingValues
89
import androidx.compose.foundation.layout.Row
910
import androidx.compose.foundation.layout.Spacer
1011
import androidx.compose.foundation.layout.fillMaxSize
@@ -52,6 +53,7 @@ import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog
5253
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog
5354
import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField
5455
import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField
56+
import com.x8bit.bitwarden.ui.platform.components.model.CardStyle
5557
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
5658
import com.x8bit.bitwarden.ui.platform.components.text.BitwardenClickableText
5759
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
@@ -162,6 +164,7 @@ fun CompleteRegistrationScreen(
162164
.fillMaxSize()
163165
.verticalScroll(rememberScrollState()),
164166
) {
167+
Spacer(modifier = Modifier.height(height = 12.dp))
165168
CompleteRegistrationContent(
166169
passwordInput = state.passwordInput,
167170
passwordStrengthState = state.passwordStrengthState,
@@ -175,6 +178,7 @@ fun CompleteRegistrationScreen(
175178
showNewOnboardingUi = state.onboardingEnabled,
176179
userEmail = state.userEmail,
177180
)
181+
Spacer(modifier = Modifier.height(height = 16.dp))
178182
Spacer(modifier = Modifier.navigationBarsPadding())
179183
}
180184
}
@@ -200,7 +204,6 @@ private fun CompleteRegistrationContent(
200204
modifier = modifier
201205
.fillMaxWidth(),
202206
) {
203-
Spacer(modifier = Modifier.height(8.dp))
204207
if (showNewOnboardingUi) {
205208
CompleteRegistrationContentHeader(
206209
modifier = Modifier
@@ -242,23 +245,22 @@ private fun CompleteRegistrationContent(
242245
showPasswordChange = { showPassword = it },
243246
value = passwordInput,
244247
onValueChange = handler.onPasswordInputChange,
245-
hint = stringResource(id = R.string.master_password_important_hint)
246-
.takeIf { !showNewOnboardingUi },
248+
showPasswordTestTag = "PasswordVisibilityToggle",
249+
imeAction = ImeAction.Next,
250+
supportingTextContent = {
251+
PasswordStrengthIndicator(
252+
state = passwordStrengthState,
253+
currentCharacterCount = passwordInput.length,
254+
minimumCharacterCount = minimumPasswordLength.takeIf { showNewOnboardingUi },
255+
modifier = Modifier.fillMaxWidth(),
256+
)
257+
},
258+
cardStyle = CardStyle.Top(dividerPadding = 0.dp),
247259
modifier = Modifier
248260
.testTag("MasterPasswordEntry")
249261
.fillMaxWidth()
250262
.standardHorizontalMargin(),
251-
showPasswordTestTag = "PasswordVisibilityToggle",
252-
imeAction = ImeAction.Next,
253263
)
254-
Spacer(modifier = Modifier.height(8.dp))
255-
PasswordStrengthIndicator(
256-
state = passwordStrengthState,
257-
currentCharacterCount = passwordInput.length,
258-
minimumCharacterCount = minimumPasswordLength.takeIf { showNewOnboardingUi },
259-
modifier = Modifier.standardHorizontalMargin(),
260-
)
261-
Spacer(modifier = Modifier.height(16.dp))
262264
BitwardenPasswordField(
263265
label = stringResource(
264266
id = R.string.retype_master_password_required
@@ -269,13 +271,13 @@ private fun CompleteRegistrationContent(
269271
showPassword = showPassword,
270272
showPasswordChange = { showPassword = it },
271273
onValueChange = handler.onConfirmPasswordInputChange,
274+
showPasswordTestTag = "ConfirmPasswordVisibilityToggle",
275+
cardStyle = CardStyle.Middle(dividerPadding = 0.dp),
272276
modifier = Modifier
273277
.testTag("ConfirmMasterPasswordEntry")
274278
.fillMaxWidth()
275279
.standardHorizontalMargin(),
276-
showPasswordTestTag = "ConfirmPasswordVisibilityToggle",
277280
)
278-
Spacer(modifier = Modifier.height(16.dp))
279281
BitwardenTextField(
280282
label = stringResource(
281283
id = R.string.master_password_hint_not_specified
@@ -284,37 +286,46 @@ private fun CompleteRegistrationContent(
284286
),
285287
value = passwordHintInput,
286288
onValueChange = handler.onPasswordHintChange,
287-
hint = stringResource(
288-
id = R.string.bitwarden_cannot_recover_a_lost_or_forgotten_master_password
289-
.takeIf { showNewOnboardingUi }
290-
?: R.string.master_password_hint_description,
291-
),
289+
supportingTextContent = {
290+
Text(
291+
text = stringResource(
292+
id = R.string.bitwarden_cannot_recover_a_lost_or_forgotten_master_password
293+
.takeIf { showNewOnboardingUi }
294+
?: R.string.master_password_hint_description,
295+
),
296+
style = BitwardenTheme.typography.bodySmall,
297+
color = BitwardenTheme.colorScheme.text.secondary,
298+
modifier = Modifier.fillMaxWidth(),
299+
)
300+
if (showNewOnboardingUi) {
301+
BitwardenClickableText(
302+
label = stringResource(
303+
id = R.string.learn_about_other_ways_to_prevent_account_lockout,
304+
),
305+
onClick = handler.onLearnToPreventLockout,
306+
style = BitwardenTheme.typography.labelMedium,
307+
innerPadding = PaddingValues(vertical = 4.dp),
308+
)
309+
}
310+
},
311+
textFieldTestTag = "MasterPasswordHintLabel",
312+
cardStyle = CardStyle.Bottom,
292313
modifier = Modifier
293314
.fillMaxWidth()
294315
.standardHorizontalMargin(),
295-
textFieldTestTag = "MasterPasswordHintLabel",
296316
)
297-
if (showNewOnboardingUi) {
298-
BitwardenClickableText(
299-
label = stringResource(
300-
id = R.string.learn_about_other_ways_to_prevent_account_lockout,
301-
),
302-
onClick = handler.onLearnToPreventLockout,
303-
style = BitwardenTheme.typography.labelMedium,
304-
modifier = Modifier.standardHorizontalMargin(),
305-
)
306-
}
307-
Spacer(modifier = Modifier.height(24.dp))
317+
Spacer(modifier = Modifier.height(height = 8.dp))
308318
BitwardenSwitch(
309319
label = stringResource(id = R.string.check_known_data_breaches_for_this_password),
310320
isChecked = isCheckDataBreachesToggled,
311321
onCheckedChange = handler.onCheckDataBreachesToggle,
322+
cardStyle = CardStyle.Full,
312323
modifier = Modifier
313324
.testTag("CheckExposedMasterPasswordToggle")
314325
.standardHorizontalMargin(),
315326
)
316327
if (showNewOnboardingUi) {
317-
Spacer(modifier = Modifier.height(24.dp))
328+
Spacer(modifier = Modifier.height(height = 16.dp))
318329
BitwardenFilledButton(
319330
label = callToActionText,
320331
isEnabled = nextButtonEnabled,

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/completeregistration/PasswordStrengthIndicator.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.compose.runtime.Composable
2020
import androidx.compose.runtime.getValue
2121
import androidx.compose.ui.Alignment
2222
import androidx.compose.ui.Modifier
23+
import androidx.compose.ui.draw.clip
2324
import androidx.compose.ui.draw.drawBehind
2425
import androidx.compose.ui.graphics.TransformOrigin
2526
import androidx.compose.ui.graphics.graphicsLayer
@@ -37,9 +38,9 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
3738
@Suppress("LongMethod", "CyclomaticComplexMethod", "MagicNumber")
3839
@Composable
3940
fun PasswordStrengthIndicator(
40-
modifier: Modifier = Modifier,
4141
state: PasswordStrengthState,
4242
currentCharacterCount: Int,
43+
modifier: Modifier = Modifier,
4344
minimumCharacterCount: Int? = null,
4445
) {
4546
val minimumRequirementMet = (minimumCharacterCount == null) ||
@@ -86,6 +87,7 @@ fun PasswordStrengthIndicator(
8687
Modifier
8788
.fillMaxWidth()
8889
.height(4.dp)
90+
.clip(shape = BitwardenTheme.shapes.progressIndicator)
8991
.background(BitwardenTheme.colorScheme.sliderButton.unfilled),
9092
) {
9193
Box(

0 commit comments

Comments
 (0)