diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewModel.kt index 3b2378cb..2f4bdf47 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewModel.kt @@ -47,7 +47,8 @@ class GeneratePasswordViewModel @Inject constructor( includeUpperCaseLetters = currentViewState.includeUppercaseLetters, includeLowerCaseLetters = currentViewState.includeLowercaseLetters, includeSymbols = currentViewState.includeSymbols, - includeNumbers = currentViewState.includeNumbers + includeNumbers = currentViewState.includeNumbers, + includeBlankSpaces = currentViewState.includeBlankSpaces ) _viewState.update { @@ -86,6 +87,12 @@ class GeneratePasswordViewModel @Inject constructor( } } + fun onBlankSpacesCheckedChange(checked: Boolean) { + _viewState.update { + it.copy(includeBlankSpaces = checked) + } + } + @OptIn(FlowPreview::class) private fun observeState(context: Context) { viewModelScope.launch { @@ -97,4 +104,5 @@ class GeneratePasswordViewModel @Inject constructor( } } } + } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewState.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewState.kt index 35ce7c68..b32f0683 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewState.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/GeneratePasswordViewState.kt @@ -8,8 +8,8 @@ data class GeneratePasswordViewState( val includeLowercaseLetters: Boolean, val includeSymbols: Boolean, val includeNumbers: Boolean, - val password: String -) { + val includeBlankSpaces: Boolean, + val password: String) { companion object { val Initial = GeneratePasswordViewState( length = DEFAULT_PASSWORD_LENGTH, @@ -17,6 +17,7 @@ data class GeneratePasswordViewState( includeLowercaseLetters = true, includeSymbols = true, includeNumbers = true, + includeBlankSpaces = true, password = "" ) } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordContent.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordContent.kt index ab4b19e1..6106579d 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordContent.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordContent.kt @@ -36,7 +36,8 @@ fun GeneratePasswordContent( onUppercaseCheckedChange: (Boolean) -> Unit, onLowercaseCheckedChange: (Boolean) -> Unit, onNumbersCheckedChange: (Boolean) -> Unit, - onSymbolsCheckedChange: (Boolean) -> Unit + onSymbolsCheckedChange: (Boolean) -> Unit, + onBlankSpacesCheckedChange: (Boolean) -> Unit ) { Scaffold( floatingActionButton = { GeneratePasswordFab(onGeneratePasswordClick) } @@ -54,7 +55,8 @@ fun GeneratePasswordContent( onUppercaseCheckedChange = onUppercaseCheckedChange, onLowercaseCheckedChange = onLowercaseCheckedChange, onNumbersCheckedChange = onNumbersCheckedChange, - onSymbolsCheckedChange = onSymbolsCheckedChange + onSymbolsCheckedChange = onSymbolsCheckedChange, + onBlankSpacesCheckedChange = onBlankSpacesCheckedChange ) } } @@ -81,7 +83,8 @@ private fun FormInputCard( onUppercaseCheckedChange: (Boolean) -> Unit, onLowercaseCheckedChange: (Boolean) -> Unit, onNumbersCheckedChange: (Boolean) -> Unit, - onSymbolsCheckedChange: (Boolean) -> Unit + onSymbolsCheckedChange: (Boolean) -> Unit, + onBlankSpacesCheckedChange: (Boolean) -> Unit ) { OutlinedCard( colors = CardDefaults.outlinedCardColors(), @@ -105,6 +108,9 @@ private fun FormInputCard( NumberInput(viewState.includeNumbers, onNumbersCheckedChange) SymbolInput(viewState.includeSymbols, onSymbolsCheckedChange) + + BlankSpaceInput(viewState.includeBlankSpaces, onBlankSpacesCheckedChange) + } } } @@ -183,6 +189,19 @@ private fun SymbolInput( ) } +@Composable +private fun BlankSpaceInput( + includeBlankSpaces: Boolean, + onBlankSpacesCheckedChange: (Boolean) -> Unit +) { + CheckboxWithLabel( + label = "Blank Spaces", + checked = includeBlankSpaces, + onCheckedChange = onBlankSpacesCheckedChange + ) +} + + @Preview( name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES @@ -205,7 +224,8 @@ private fun GeneratePasswordContentPreview() { onUppercaseCheckedChange = {}, onLowercaseCheckedChange = {}, onNumbersCheckedChange = {}, - onSymbolsCheckedChange = {} + onSymbolsCheckedChange = {}, + onBlankSpacesCheckedChange = {} ) } } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordScreen.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordScreen.kt index c1d243fe..dc6bf10e 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordScreen.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/generate/ui/GeneratePasswordScreen.kt @@ -30,7 +30,8 @@ fun GeneratePasswordScreen(viewModel: GeneratePasswordViewModel) { onUppercaseCheckedChange = viewModel::onUppercaseCheckedChange, onLowercaseCheckedChange = viewModel::onLowercaseCheckedChange, onNumbersCheckedChange = viewModel::onNumbersCheckedChange, - onSymbolsCheckedChange = viewModel::onSymbolsCheckedChange + onSymbolsCheckedChange = viewModel::onSymbolsCheckedChange, + onBlankSpacesCheckedChange = viewModel::onBlankSpacesCheckedChange ) } diff --git a/common/src/main/java/com/yogeshpaliyal/common/utils/PasswordGenerator.kt b/common/src/main/java/com/yogeshpaliyal/common/utils/PasswordGenerator.kt index 607ffcdf..432722ee 100644 --- a/common/src/main/java/com/yogeshpaliyal/common/utils/PasswordGenerator.kt +++ b/common/src/main/java/com/yogeshpaliyal/common/utils/PasswordGenerator.kt @@ -5,15 +5,17 @@ class PasswordGenerator( private var includeUpperCaseLetters: Boolean, private var includeLowerCaseLetters: Boolean, private var includeSymbols: Boolean, - private var includeNumbers: Boolean + private var includeNumbers: Boolean, + private var includeBlankSpaces: Boolean ) { - constructor() : this(10, true, true, true, true) + constructor() : this(10, true, true, true, true, true) private val UPPER_CASE = 0 private val LOWER_CASE = 1 private val NUMBERS = 2 private val SYMBOLS = 3 + private val BLANKSPACES = 4 fun generatePassword(): String { var password = "" @@ -31,6 +33,10 @@ class PasswordGenerator( list.add(SYMBOLS) } + if (includeBlankSpaces) { + list.add(BLANKSPACES) + } + for (i in 1..length) { if (list.isNotEmpty()) { when (list.random()) { @@ -38,6 +44,7 @@ class PasswordGenerator( LOWER_CASE -> password += ('a'..'z').random().toString() NUMBERS -> password += ('0'..'9').random().toString() SYMBOLS -> password += listOf('!', '@', '#', '$', '%', '&', '*', '+', '=', '-', '~', '?', '/', '_').random().toString() + BLANKSPACES -> password += (' ').toString() } } }