@@ -2,14 +2,27 @@ package com.ladsers.passtable.android.activities
22
33import android.content.Intent
44import android.os.Bundle
5+ import android.view.KeyEvent
6+ import android.view.View
7+ import android.view.inputmethod.InputMethodManager
8+ import android.widget.EditText
9+ import android.widget.TextView
10+ import android.widget.Toast
511import androidx.appcompat.app.AppCompatActivity
612import androidx.core.content.ContextCompat
13+ import androidx.core.widget.doAfterTextChanged
714import com.ladsers.passtable.android.R
815import com.ladsers.passtable.android.components.PasswordGeneratorProcessor
16+ import com.ladsers.passtable.android.containers.Param
17+ import com.ladsers.passtable.android.containers.ParamStorage
918import com.ladsers.passtable.android.databinding.ActivityPasswordGeneratorBinding
19+ import com.ladsers.passtable.android.databinding.PasswordGeneratorCollectionBinding
20+ import com.ladsers.passtable.android.widgets.EditTextParam
21+ import com.ladsers.passtable.lib.PasswordGenerator
1022
1123class PasswordGeneratorActivity : AppCompatActivity () {
1224 private lateinit var binding: ActivityPasswordGeneratorBinding
25+ private lateinit var generator: PasswordGenerator
1326
1427 override fun onCreate (savedInstanceState : Bundle ? ) {
1528 super .onCreate(savedInstanceState)
@@ -27,10 +40,185 @@ class PasswordGeneratorActivity : AppCompatActivity() {
2740 if (y == 0 ) binding.toolbar.root.elevation = 0f
2841 }
2942
43+ generator = PasswordGenerator ()
44+
45+ configureEditParamInt(
46+ binding.passwordLength.editText,
47+ binding.passwordLength.textView,
48+ Param .GENERATOR_PASSWORD_LENGTH
49+ )
50+ configureEditParamExclude()
51+
52+ configureCollection(
53+ binding.lowercaseLetters,
54+ R .string.ui_ct_lowercaseLetters,
55+ Param .GENERATOR_LOWERCASE_LETTERS_ALLOW ,
56+ Param .GENERATOR_LOWERCASE_LETTERS_MINIMUM
57+ )
58+ configureCollection(
59+ binding.capitalLetters,
60+ R .string.ui_ct_capitalLetters,
61+ Param .GENERATOR_CAPITAL_LETTERS_ALLOW ,
62+ Param .GENERATOR_CAPITAL_LETTERS_MINIMUM
63+ )
64+ configureCollection(
65+ binding.numbers,
66+ R .string.ui_ct_numbers,
67+ Param .GENERATOR_NUMBERS_ALLOW ,
68+ Param .GENERATOR_NUMBERS_MINIMUM
69+ )
70+ configureCollection(
71+ binding.symbols,
72+ R .string.ui_ct_symbols,
73+ Param .GENERATOR_SYMBOLS_ALLOW ,
74+ Param .GENERATOR_SYMBOLS_MINIMUM
75+ )
76+
3077 binding.btOk.setOnClickListener {
3178 val intent = Intent ().putExtra(PasswordGeneratorProcessor .ResultKey , " some test string" )
3279 setResult(RESULT_OK , intent)
3380 finish()
3481 }
3582 }
83+
84+ override fun onResume () {
85+ super .onResume()
86+
87+ val imm = getSystemService(INPUT_METHOD_SERVICE ) as InputMethodManager
88+
89+ fun resetEditText (editText : EditText ) {
90+ editText.clearFocus()
91+ imm.hideSoftInputFromWindow(editText.windowToken, 0 )
92+ }
93+
94+ resetEditText(binding.passwordLength.editText)
95+ resetEditText(binding.exclude.editText)
96+
97+ resetEditText(binding.lowercaseLetters.etMinimumNumber)
98+ resetEditText(binding.capitalLetters.etMinimumNumber)
99+ resetEditText(binding.numbers.etMinimumNumber)
100+ resetEditText(binding.symbols.etMinimumNumber)
101+ }
102+
103+ private fun configureCollection (
104+ bin : PasswordGeneratorCollectionBinding ,
105+ collectionNameResId : Int ,
106+ paramAllow : Param ,
107+ paramMinimum : Param
108+ ) {
109+ bin.swCollectionAllow.text = getString(collectionNameResId)
110+ bin.swCollectionAllow.isChecked = ParamStorage .getBool(this , paramAllow)
111+
112+ bin.tvMinimumNumber.isClickable = bin.swCollectionAllow.isChecked
113+ bin.etMinimumNumber.isEnabled = bin.swCollectionAllow.isChecked
114+
115+ bin.swCollectionAllow.setOnCheckedChangeListener { _, isChecked ->
116+ ParamStorage .set(this , paramAllow, isChecked)
117+ bin.tvMinimumNumber.isClickable = isChecked
118+ bin.etMinimumNumber.isEnabled = isChecked
119+
120+ if (paramAllow == Param .GENERATOR_SYMBOLS_ALLOW ) {
121+ bin.rbBasicSet.isEnabled = isChecked
122+ bin.rbFullSet.isEnabled = isChecked
123+ }
124+
125+ generate()
126+ }
127+
128+ configureEditParamInt(bin.etMinimumNumber, bin.tvMinimumNumber, paramMinimum)
129+
130+ if (paramAllow != Param .GENERATOR_SYMBOLS_ALLOW ) return
131+
132+ bin.rbSymbolSet.visibility = View .VISIBLE
133+ bin.rbBasicSet.text = getString(
134+ R .string.ui_ct_basicSet,
135+ generator.easySymbolChars.joinToString(separator = " " )
136+ )
137+ bin.rbBasicSet.isEnabled = bin.swCollectionAllow.isChecked
138+ bin.rbFullSet.isEnabled = bin.swCollectionAllow.isChecked
139+ when (ParamStorage .getInt(this , Param .GENERATOR_SYMBOLS_SET )) {
140+ 0 -> bin.rbBasicSet.isChecked = true
141+ 1 -> bin.rbFullSet.isChecked = true
142+ }
143+
144+ bin.rbBasicSet.setOnCheckedChangeListener { _, isChecked ->
145+ if (! isChecked) return @setOnCheckedChangeListener
146+ ParamStorage .set(this , Param .GENERATOR_SYMBOLS_SET , 0 )
147+ generate()
148+ }
149+ bin.rbFullSet.setOnCheckedChangeListener { _, isChecked ->
150+ if (! isChecked) return @setOnCheckedChangeListener
151+ ParamStorage .set(this , Param .GENERATOR_SYMBOLS_SET , 1 )
152+ generate()
153+ }
154+ }
155+
156+ private fun configureEditParamInt (editText : EditTextParam , labelView : TextView , param : Param ) {
157+ editText.setText(ParamStorage .getInt(this , param).toString())
158+
159+ val imm = getSystemService(INPUT_METHOD_SERVICE ) as InputMethodManager
160+
161+ labelView.setOnClickListener {
162+ editText.requestFocus()
163+ imm.showSoftInput(editText, 0 )
164+ }
165+
166+ editText.setOnKeyListener { v, keyCode, _ ->
167+ if (keyCode == KeyEvent .KEYCODE_ENTER ) {
168+ imm.hideSoftInputFromWindow(v.windowToken, 0 )
169+
170+ if (editText.text.toString().isNotEmpty()) {
171+ ParamStorage .set(this , param, editText.text.toString().toInt())
172+ generate()
173+ }
174+ v.clearFocus()
175+ return @setOnKeyListener true
176+ }
177+ return @setOnKeyListener false
178+ }
179+ editText.doAfterTextChanged { x ->
180+ if (x!! .length > 1 && x.toString().startsWith(' 0' )) {
181+ editText.setText(x.toString().drop(1 ))
182+ editText.setSelection(1 )
183+ }
184+ }
185+ editText.setOnFocusChangeListener { _, hasFocus ->
186+ if (hasFocus) return @setOnFocusChangeListener
187+ editText.setText(ParamStorage .getInt(this , param).toString())
188+ }
189+ }
190+
191+ private fun configureEditParamExclude () {
192+ val bin = binding.exclude
193+ bin.editText.setText(ParamStorage .getStr(this , Param .GENERATOR_EXCLUDE ))
194+ val imm = getSystemService(INPUT_METHOD_SERVICE ) as InputMethodManager
195+
196+ bin.textView.setOnClickListener {
197+ bin.editText.requestFocus()
198+ imm.showSoftInput(bin.editText, 0 )
199+ }
200+
201+ bin.editText.setOnKeyListener { v, keyCode, _ ->
202+ if (keyCode == KeyEvent .KEYCODE_ENTER ) {
203+ imm.hideSoftInputFromWindow(v.windowToken, 0 )
204+ ParamStorage .set(this , Param .GENERATOR_EXCLUDE , bin.editText.text.toString())
205+ generate()
206+ v.clearFocus()
207+ return @setOnKeyListener true
208+ }
209+ return @setOnKeyListener false
210+ }
211+ bin.editText.setOnFocusChangeListener { _, hasFocus ->
212+ if (hasFocus) Toast .makeText(
213+ this ,
214+ R .string.ui_msg_enterCharsInRowOrSpace,
215+ Toast .LENGTH_LONG
216+ ).show()
217+ else bin.editText.setText(ParamStorage .getStr(this , Param .GENERATOR_EXCLUDE ))
218+ }
219+ }
220+
221+ private fun generate () {
222+
223+ }
36224}
0 commit comments