@@ -29,6 +29,7 @@ import android.widget.*
2929import androidx.core.widget.doOnTextChanged
3030import androidx.fragment.app.activityViewModels
3131import com.google.android.material.slider.Slider
32+ import com.google.android.material.textfield.TextInputLayout
3233import com.kunzisoft.keepass.R
3334import com.kunzisoft.keepass.database.ContextualDatabase
3435import com.kunzisoft.keepass.password.PassphraseGenerator
@@ -46,10 +47,15 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
4647 private lateinit var charactersCountText: TextView
4748 private lateinit var wordSeparator: EditText
4849 private lateinit var wordCaseSpinner: Spinner
50+ private lateinit var separatorTypeSpinner: Spinner
51+ private lateinit var wordSeparatorLayout: TextInputLayout
52+ private lateinit var randomDigitsLayout: TextInputLayout
53+ private lateinit var randomDigitsCount: EditText
4954
5055 private var minSliderWordCount: Int = 0
5156 private var maxSliderWordCount: Int = 0
5257 private var wordCaseAdapter: ArrayAdapter <String >? = null
58+ private var separatorTypeAdapter: ArrayAdapter <String >? = null
5359
5460 private val mKeyGeneratorViewModel: KeyGeneratorViewModel by activityViewModels()
5561
@@ -69,6 +75,10 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
6975 charactersCountText = view.findViewById(R .id.character_count)
7076 wordSeparator = view.findViewById(R .id.word_separator)
7177 wordCaseSpinner = view.findViewById(R .id.word_case)
78+ separatorTypeSpinner = view.findViewById(R .id.separator_type)
79+ wordSeparatorLayout = view.findViewById(R .id.word_separator_layout)
80+ randomDigitsLayout = view.findViewById(R .id.random_digits_layout)
81+ randomDigitsCount = view.findViewById(R .id.random_digits_count)
7282
7383 minSliderWordCount = resources.getInteger(R .integer.passphrase_generator_word_count_min)
7484 maxSliderWordCount = resources.getInteger(R .integer.passphrase_generator_word_count_max)
@@ -90,6 +100,12 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
90100 setDropDownViewResource(android.R .layout.simple_spinner_dropdown_item)
91101 }
92102 wordCaseSpinner.adapter = wordCaseAdapter
103+
104+ separatorTypeAdapter = ArrayAdapter (context,
105+ android.R .layout.simple_spinner_item, resources.getStringArray(R .array.separator_type_array)).apply {
106+ setDropDownViewResource(android.R .layout.simple_spinner_dropdown_item)
107+ }
108+ separatorTypeSpinner.adapter = separatorTypeAdapter
93109 }
94110
95111 loadSettings()
@@ -142,6 +158,17 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
142158
143159 override fun onNothingSelected (parent : AdapterView <* >? ) {}
144160 }
161+ separatorTypeSpinner.onItemSelectedListener = object : AdapterView .OnItemSelectedListener {
162+ override fun onItemSelected (parent : AdapterView <* >? , view : View ? , position : Int , id : Long ) {
163+ updateSeparatorTypeVisibility()
164+ generatePassphrase()
165+ }
166+
167+ override fun onNothingSelected (parent : AdapterView <* >? ) {}
168+ }
169+ randomDigitsCount.doOnTextChanged { _, _, _, _ ->
170+ generatePassphrase()
171+ }
145172
146173 generatePassphrase()
147174
@@ -209,15 +236,50 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
209236 wordSeparator.setText(separator)
210237 }
211238
239+ private fun getSeparatorType (): PassphraseGenerator .SeparatorType {
240+ return when (separatorTypeSpinner.selectedItemPosition) {
241+ 1 -> PassphraseGenerator .SeparatorType .RANDOM_NUMBERS
242+ else -> PassphraseGenerator .SeparatorType .CUSTOM_VALUE
243+ }
244+ }
245+
246+ private fun setSeparatorType (separatorType : PassphraseGenerator .SeparatorType ) {
247+ separatorTypeSpinner.setSelection(if (separatorType == PassphraseGenerator .SeparatorType .RANDOM_NUMBERS ) 1 else 0 )
248+ }
249+
250+ private fun getRandomDigitsCount (): Int {
251+ return try {
252+ val text = randomDigitsCount.text.toString()
253+ if (text.isEmpty()) 1 else Integer .valueOf(text).coerceIn(1 , 9 )
254+ } catch (numberException: NumberFormatException ) {
255+ 1
256+ }
257+ }
258+
259+ private fun setRandomDigitsCount (count : Int ) {
260+ randomDigitsCount.setText(count.toString())
261+ }
262+
263+ private fun updateSeparatorTypeVisibility () {
264+ val separatorType = getSeparatorType()
265+ if (separatorType == PassphraseGenerator .SeparatorType .RANDOM_NUMBERS ) {
266+ randomDigitsLayout.visibility = View .VISIBLE
267+ wordSeparatorLayout.visibility = View .GONE
268+ } else {
269+ randomDigitsLayout.visibility = View .GONE
270+ wordSeparatorLayout.visibility = View .VISIBLE
271+ }
272+ }
273+
212274 private fun generatePassphrase () {
213275 var passphrase = " "
214276 try {
215277 passphrase = PassphraseGenerator ().generatePassphrase(
216278 getWordCount(),
217279 getWordSeparator(),
218280 getWordCase(),
219- PassphraseGenerator . SeparatorType . CUSTOM_VALUE ,
220- 1 )
281+ getSeparatorType() ,
282+ getRandomDigitsCount() )
221283 } catch (e: Exception ) {
222284 Log .e(TAG , " Unable to generate a passphrase" , e)
223285 }
@@ -235,6 +297,8 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
235297 PreferencesUtil .setDefaultPassphraseWordCount(context, getWordCount())
236298 PreferencesUtil .setDefaultPassphraseWordCase(context, getWordCase())
237299 PreferencesUtil .setDefaultPassphraseSeparator(context, getSeparator())
300+ PreferencesUtil .setDefaultPassphraseSeparatorType(context, getSeparatorType().toPreferenceString())
301+ PreferencesUtil .setDefaultPassphraseRandomDigitsCount(context, getRandomDigitsCount())
238302 }
239303 }
240304
@@ -243,6 +307,9 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
243307 setWordCount(PreferencesUtil .getDefaultPassphraseWordCount(context))
244308 setWordCase(PreferencesUtil .getDefaultPassphraseWordCase(context))
245309 setSeparator(PreferencesUtil .getDefaultPassphraseSeparator(context))
310+ setSeparatorType(PassphraseGenerator .SeparatorType .fromString(PreferencesUtil .getDefaultPassphraseSeparatorType(context)))
311+ setRandomDigitsCount(PreferencesUtil .getDefaultPassphraseRandomDigitsCount(context))
312+ updateSeparatorTypeVisibility()
246313 }
247314 }
248315
0 commit comments