Fix 2 bugs in ValidatingEditTextPreference
This commit is contained in:
parent
0a68e8111f
commit
808927ee55
2 changed files with 68 additions and 34 deletions
|
@ -1,7 +1,6 @@
|
||||||
package info.nightscout.androidaps.utils.textValidator
|
package info.nightscout.androidaps.utils.textValidator
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.res.TypedArray
|
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
|
@ -37,25 +36,20 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
resetValidators(context)
|
resetValidators(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(editTextView: EditText, typedArray: TypedArray, context: Context) {
|
constructor(editTextView: EditText, parameters: Parameters, context: Context) {
|
||||||
emptyAllowed = typedArray.getBoolean(R.styleable.FormEditText_emptyAllowed, false)
|
emptyAllowed = parameters.emptyAllowed
|
||||||
testType = typedArray.getInt(R.styleable.FormEditText_testType, EditTextValidator.TEST_NOCHECK)
|
testType = parameters.testType
|
||||||
testErrorString = typedArray.getString(R.styleable.FormEditText_testErrorString)
|
testErrorString = parameters.testErrorString
|
||||||
classType = typedArray.getString(R.styleable.FormEditText_classType)
|
classType = parameters.classType
|
||||||
customRegexp = typedArray.getString(R.styleable.FormEditText_customRegexp)
|
customRegexp = parameters.customRegexp
|
||||||
emptyErrorStringDef = typedArray.getString(R.styleable.FormEditText_emptyErrorString)
|
emptyErrorStringDef = parameters.emptyErrorStringDef
|
||||||
customFormat = typedArray.getString(R.styleable.FormEditText_customFormat)
|
customFormat = parameters.customFormat
|
||||||
if (testType == EditTextValidator.TEST_MIN_LENGTH)
|
minLength = parameters.minLength
|
||||||
minLength = typedArray.getInt(R.styleable.FormEditText_minLength, 0)
|
minNumber = parameters.minNumber
|
||||||
if (testType == EditTextValidator.TEST_NUMERIC_RANGE) {
|
maxNumber = parameters.maxNumber
|
||||||
minNumber = typedArray.getInt(R.styleable.FormEditText_minNumber, Int.MIN_VALUE)
|
floatminNumber = parameters.floatminNumber
|
||||||
maxNumber = typedArray.getInt(R.styleable.FormEditText_maxNumber, Int.MAX_VALUE)
|
floatmaxNumber = parameters.floatmaxNumber
|
||||||
}
|
|
||||||
if (testType == EditTextValidator.TEST_FLOAT_NUMERIC_RANGE) {
|
|
||||||
floatminNumber = typedArray.getFloat(R.styleable.FormEditText_floatminNumber, Float.MIN_VALUE)
|
|
||||||
floatmaxNumber = typedArray.getFloat(R.styleable.FormEditText_floatmaxNumber, Float.MAX_VALUE)
|
|
||||||
}
|
|
||||||
typedArray.recycle()
|
|
||||||
setEditText(editTextView)
|
setEditText(editTextView)
|
||||||
resetValidators(context)
|
resetValidators(context)
|
||||||
}
|
}
|
||||||
|
@ -248,4 +242,19 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
!TextUtils.isEmpty(editTextView.error)
|
!TextUtils.isEmpty(editTextView.error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Parameters {
|
||||||
|
var testErrorString: String? = null
|
||||||
|
var emptyAllowed = false
|
||||||
|
var testType: Int = EditTextValidator.TEST_NOCHECK
|
||||||
|
var classType: String? = null
|
||||||
|
var customRegexp: String? = null
|
||||||
|
var customFormat: String? = null
|
||||||
|
var emptyErrorStringDef: String? = null
|
||||||
|
var minLength = 0
|
||||||
|
var minNumber = 0
|
||||||
|
var maxNumber = 0
|
||||||
|
var floatminNumber = 0f
|
||||||
|
var floatmaxNumber = 0f
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,22 +1,26 @@
|
||||||
package info.nightscout.androidaps.utils.textValidator
|
package info.nightscout.androidaps.utils.textValidator
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import androidx.preference.EditTextPreference
|
import androidx.preference.EditTextPreference
|
||||||
import androidx.preference.EditTextPreference.OnBindEditTextListener
|
|
||||||
import androidx.preference.PreferenceViewHolder
|
import androidx.preference.PreferenceViewHolder
|
||||||
import info.nightscout.androidaps.core.R
|
import info.nightscout.androidaps.core.R
|
||||||
|
|
||||||
class ValidatingEditTextPreference(ctx: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int)
|
class ValidatingEditTextPreference(ctx: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int)
|
||||||
: EditTextPreference(ctx, attrs, defStyleAttr, defStyleRes) {
|
: EditTextPreference(ctx, attrs, defStyleAttr, defStyleRes) {
|
||||||
|
|
||||||
|
private lateinit var validatorParameters: DefaultEditTextValidator.Parameters
|
||||||
|
private var validator: DefaultEditTextValidator? = null
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.FormEditText, 0, 0)
|
obtainValidatorParameters(attrs)
|
||||||
val onBindEditTextListener = OnBindEditTextListener { editText ->
|
|
||||||
editTextValidator = DefaultEditTextValidator(editText, typedArray, context)
|
setOnBindEditTextListener { editText ->
|
||||||
|
validator = DefaultEditTextValidator(editText, validatorParameters, context)
|
||||||
|
}
|
||||||
|
setOnPreferenceChangeListener { preference, newValue ->
|
||||||
|
validator?.testValidity(false) ?: true
|
||||||
}
|
}
|
||||||
setOnBindEditTextListener(onBindEditTextListener)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(ctx: Context, attrs: AttributeSet, defStyle: Int)
|
constructor(ctx: Context, attrs: AttributeSet, defStyle: Int)
|
||||||
|
@ -25,11 +29,32 @@ class ValidatingEditTextPreference(ctx: Context, attrs: AttributeSet, defStyleAt
|
||||||
constructor(ctx: Context, attrs: AttributeSet)
|
constructor(ctx: Context, attrs: AttributeSet)
|
||||||
: this(ctx, attrs, R.attr.editTextPreferenceStyle)
|
: this(ctx, attrs, R.attr.editTextPreferenceStyle)
|
||||||
|
|
||||||
private lateinit var editTextValidator: EditTextValidator
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: PreferenceViewHolder?) {
|
override fun onBindViewHolder(holder: PreferenceViewHolder?) {
|
||||||
super.onBindViewHolder(holder)
|
super.onBindViewHolder(holder)
|
||||||
holder?.isDividerAllowedAbove = false
|
holder?.isDividerAllowedAbove = false
|
||||||
holder?.isDividerAllowedBelow = false
|
holder?.isDividerAllowedBelow = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun obtainValidatorParameters(attrs: AttributeSet) {
|
||||||
|
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.FormEditText, 0, 0)
|
||||||
|
validatorParameters = DefaultEditTextValidator.Parameters()
|
||||||
|
validatorParameters.emptyAllowed = typedArray.getBoolean(R.styleable.FormEditText_emptyAllowed, false)
|
||||||
|
validatorParameters.testType = typedArray.getInt(R.styleable.FormEditText_testType, EditTextValidator.TEST_NOCHECK)
|
||||||
|
validatorParameters.testErrorString = typedArray.getString(R.styleable.FormEditText_testErrorString)
|
||||||
|
validatorParameters.classType = typedArray.getString(R.styleable.FormEditText_classType)
|
||||||
|
validatorParameters.customRegexp = typedArray.getString(R.styleable.FormEditText_customRegexp)
|
||||||
|
validatorParameters.emptyErrorStringDef = typedArray.getString(R.styleable.FormEditText_emptyErrorString)
|
||||||
|
validatorParameters.customFormat = typedArray.getString(R.styleable.FormEditText_customFormat)
|
||||||
|
if (validatorParameters.testType == EditTextValidator.TEST_MIN_LENGTH)
|
||||||
|
validatorParameters.minLength = typedArray.getInt(R.styleable.FormEditText_minLength, 0)
|
||||||
|
if (validatorParameters.testType == EditTextValidator.TEST_NUMERIC_RANGE) {
|
||||||
|
validatorParameters.minNumber = typedArray.getInt(R.styleable.FormEditText_minNumber, Int.MIN_VALUE)
|
||||||
|
validatorParameters.maxNumber = typedArray.getInt(R.styleable.FormEditText_maxNumber, Int.MAX_VALUE)
|
||||||
|
}
|
||||||
|
if (validatorParameters.testType == EditTextValidator.TEST_FLOAT_NUMERIC_RANGE) {
|
||||||
|
validatorParameters.floatminNumber = typedArray.getFloat(R.styleable.FormEditText_floatminNumber, Float.MIN_VALUE)
|
||||||
|
validatorParameters.floatmaxNumber = typedArray.getFloat(R.styleable.FormEditText_floatmaxNumber, Float.MAX_VALUE)
|
||||||
|
}
|
||||||
|
typedArray.recycle()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue