BG unit preference
This commit is contained in:
parent
8c4378c455
commit
6e7b5ab7db
9 changed files with 195 additions and 137 deletions
|
@ -16,7 +16,7 @@
|
||||||
android:summary="@string/patientage_summary"
|
android:summary="@string/patientage_summary"
|
||||||
android:title="@string/patientage" />
|
android:title="@string/patientage" />
|
||||||
|
|
||||||
<EditTextPreference
|
<info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference
|
||||||
android:defaultValue="3"
|
android:defaultValue="3"
|
||||||
android:inputType="numberDecimal"
|
android:inputType="numberDecimal"
|
||||||
android:key="@string/key_treatmentssafety_maxbolus"
|
android:key="@string/key_treatmentssafety_maxbolus"
|
||||||
|
@ -25,9 +25,9 @@
|
||||||
validate:floatminNumber="0.1"
|
validate:floatminNumber="0.1"
|
||||||
validate:testType="floatNumericRange" />
|
validate:testType="floatNumericRange" />
|
||||||
|
|
||||||
<EditTextPreference
|
<info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference
|
||||||
android:defaultValue="48"
|
android:defaultValue="48"
|
||||||
android:inputType="numberDecimal"
|
android:inputType="number"
|
||||||
android:key="@string/key_treatmentssafety_maxcarbs"
|
android:key="@string/key_treatmentssafety_maxcarbs"
|
||||||
android:title="@string/treatmentssafety_maxcarbs_title"
|
android:title="@string/treatmentssafety_maxcarbs_title"
|
||||||
validate:floatmaxNumber="200"
|
validate:floatmaxNumber="200"
|
||||||
|
|
|
@ -14,7 +14,8 @@ import javax.inject.Singleton
|
||||||
includes = [
|
includes = [
|
||||||
CoreReceiversModule::class,
|
CoreReceiversModule::class,
|
||||||
CoreFragmentsModule::class,
|
CoreFragmentsModule::class,
|
||||||
CoreDataClassesModule::class
|
CoreDataClassesModule::class,
|
||||||
|
ValidatorsModule::class
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
open class CoreModule {
|
open class CoreModule {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package info.nightscout.androidaps.di
|
||||||
|
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.android.ContributesAndroidInjector
|
||||||
|
import info.nightscout.androidaps.utils.textValidator.DefaultEditTextValidator
|
||||||
|
import info.nightscout.androidaps.utils.textValidator.EditTextValidator
|
||||||
|
import info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@Suppress("unused")
|
||||||
|
abstract class ValidatorsModule {
|
||||||
|
|
||||||
|
@ContributesAndroidInjector abstract fun defaultEditTextValidatorInjector(): DefaultEditTextValidator
|
||||||
|
@ContributesAndroidInjector abstract fun editTextValidatorInjector(): EditTextValidator
|
||||||
|
@ContributesAndroidInjector abstract fun validatingEditTextPreferenceInjector(): ValidatingEditTextPreference
|
||||||
|
}
|
|
@ -6,8 +6,12 @@ import android.text.TextUtils
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
import com.google.android.material.textfield.TextInputLayout
|
||||||
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.core.R
|
import info.nightscout.androidaps.core.R
|
||||||
|
import info.nightscout.androidaps.interfaces.Profile
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
import info.nightscout.androidaps.utils.textValidator.validators.*
|
import info.nightscout.androidaps.utils.textValidator.validators.*
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
@Suppress("SpellCheckingInspection")
|
@Suppress("SpellCheckingInspection")
|
||||||
class DefaultEditTextValidator : EditTextValidator {
|
class DefaultEditTextValidator : EditTextValidator {
|
||||||
|
@ -27,17 +31,23 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
private var minLength = 0
|
private var minLength = 0
|
||||||
private var minNumber = 0
|
private var minNumber = 0
|
||||||
private var maxNumber = 0
|
private var maxNumber = 0
|
||||||
|
private var minMgdl = 0
|
||||||
|
private var maxMgdl = 0
|
||||||
private var floatminNumber = 0f
|
private var floatminNumber = 0f
|
||||||
private var floatmaxNumber = 0f
|
private var floatmaxNumber = 0f
|
||||||
|
|
||||||
|
@Inject lateinit var profileFunction: ProfileFunction
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
constructor(editTextView: EditText, context: Context) {
|
constructor(editTextView: EditText, context: Context) {
|
||||||
|
(context.applicationContext as HasAndroidInjector).androidInjector().inject(this)
|
||||||
testType = EditTextValidator.TEST_NOCHECK
|
testType = EditTextValidator.TEST_NOCHECK
|
||||||
setEditText(editTextView)
|
setEditText(editTextView)
|
||||||
resetValidators(context)
|
resetValidators(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(editTextView: EditText, parameters: Parameters, context: Context) {
|
constructor(editTextView: EditText, parameters: Parameters, context: Context) {
|
||||||
|
(context.applicationContext as HasAndroidInjector).androidInjector().inject(this)
|
||||||
emptyAllowed = parameters.emptyAllowed
|
emptyAllowed = parameters.emptyAllowed
|
||||||
testType = parameters.testType
|
testType = parameters.testType
|
||||||
testErrorString = parameters.testErrorString
|
testErrorString = parameters.testErrorString
|
||||||
|
@ -48,6 +58,8 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
minLength = parameters.minLength
|
minLength = parameters.minLength
|
||||||
minNumber = parameters.minNumber
|
minNumber = parameters.minNumber
|
||||||
maxNumber = parameters.maxNumber
|
maxNumber = parameters.maxNumber
|
||||||
|
minMgdl = parameters.minMgdl
|
||||||
|
maxMgdl = parameters.maxMgdl
|
||||||
floatminNumber = parameters.floatminNumber
|
floatminNumber = parameters.floatminNumber
|
||||||
floatmaxNumber = parameters.floatmaxNumber
|
floatmaxNumber = parameters.floatmaxNumber
|
||||||
|
|
||||||
|
@ -63,10 +75,10 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
private fun setEditText(editText: EditText) {
|
private fun setEditText(editText: EditText) {
|
||||||
//editTextView?.removeTextChangedListener(textWatcher)
|
//editTextView?.removeTextChangedListener(textWatcher)
|
||||||
editTextView = editText
|
editTextView = editText
|
||||||
editText.addTextChangedListener(textWatcher)
|
editText.addTextChangedListener(getTextWatcher())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getTextWatcher(): TextWatcher {
|
override fun getTextWatcher(): TextWatcher? {
|
||||||
if (tw == null) {
|
if (tw == null) {
|
||||||
tw = object : TextWatcher {
|
tw = object : TextWatcher {
|
||||||
override fun afterTextChanged(s: Editable) {
|
override fun afterTextChanged(s: Editable) {
|
||||||
|
@ -98,28 +110,31 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
defaultEmptyErrorString = context.getString(R.string.error_field_must_not_be_empty)
|
defaultEmptyErrorString = context.getString(R.string.error_field_must_not_be_empty)
|
||||||
setEmptyErrorString(emptyErrorStringDef)
|
setEmptyErrorString(emptyErrorStringDef)
|
||||||
mValidator = AndValidator()
|
mValidator = AndValidator()
|
||||||
val toAdd: Validator
|
val toAdd: Validator =
|
||||||
when (testType) {
|
when (testType) {
|
||||||
EditTextValidator.TEST_NOCHECK -> toAdd = DummyValidator()
|
EditTextValidator.TEST_NOCHECK -> DummyValidator()
|
||||||
EditTextValidator.TEST_ALPHA -> toAdd = AlphaValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_standard_letters_are_allowed) else testErrorString)
|
EditTextValidator.TEST_ALPHA -> AlphaValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_standard_letters_are_allowed) else testErrorString)
|
||||||
EditTextValidator.TEST_ALPHANUMERIC -> toAdd = AlphaNumericValidator(
|
EditTextValidator.TEST_ALPHANUMERIC -> AlphaNumericValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_this_field_cannot_contain_special_character) else testErrorString)
|
||||||
if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_this_field_cannot_contain_special_character) else testErrorString)
|
EditTextValidator.TEST_NUMERIC -> NumericValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_allowed) else testErrorString)
|
||||||
EditTextValidator.TEST_NUMERIC -> toAdd = NumericValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_allowed) else testErrorString)
|
EditTextValidator.TEST_NUMERIC_RANGE -> NumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, minNumber.toString(), maxNumber.toString()) else testErrorString, minNumber, maxNumber)
|
||||||
EditTextValidator.TEST_NUMERIC_RANGE -> toAdd = NumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, minNumber.toString(), maxNumber.toString()) else testErrorString, minNumber, maxNumber)
|
EditTextValidator.TEST_FLOAT_NUMERIC_RANGE -> FloatNumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, floatminNumber.toString(), floatmaxNumber.toString()) else testErrorString, floatminNumber, floatmaxNumber)
|
||||||
EditTextValidator.TEST_FLOAT_NUMERIC_RANGE -> toAdd = FloatNumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, floatminNumber.toString(), floatmaxNumber.toString()) else testErrorString, floatminNumber, floatmaxNumber)
|
EditTextValidator.TEST_REGEXP -> RegexpValidator(testErrorString, customRegexp ?: "")
|
||||||
EditTextValidator.TEST_REGEXP -> toAdd = RegexpValidator(testErrorString, customRegexp ?: "")
|
EditTextValidator.TEST_CREDITCARD -> CreditCardValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_creditcard_number_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_CREDITCARD -> toAdd = CreditCardValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_creditcard_number_not_valid) else testErrorString)
|
EditTextValidator.TEST_EMAIL -> EmailValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_email_address_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_EMAIL -> toAdd = EmailValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_email_address_not_valid) else testErrorString)
|
EditTextValidator.TEST_PHONE -> PhoneValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_phone_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_PHONE -> toAdd = PhoneValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_phone_not_valid) else testErrorString)
|
EditTextValidator.TEST_MULTI_PHONE -> MultiPhoneValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_phone_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_MULTI_PHONE -> toAdd = MultiPhoneValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_phone_not_valid) else testErrorString)
|
EditTextValidator.TEST_PIN_STRENGTH -> PinStrengthValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_pin_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_PIN_STRENGTH -> toAdd = PinStrengthValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_pin_not_valid) else testErrorString)
|
EditTextValidator.TEST_DOMAINNAME -> DomainValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_domain_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_DOMAINNAME -> toAdd = DomainValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_domain_not_valid) else testErrorString)
|
EditTextValidator.TEST_IPADDRESS -> IpAddressValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_ip_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_IPADDRESS -> toAdd = IpAddressValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_ip_not_valid) else testErrorString)
|
EditTextValidator.TEST_WEBURL -> WebUrlValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_url_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_WEBURL -> toAdd = WebUrlValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_url_not_valid) else testErrorString)
|
EditTextValidator.TEST_HTTPS_URL -> HttpsUrlValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_url_not_valid) else testErrorString)
|
||||||
EditTextValidator.TEST_HTTPS_URL -> toAdd = HttpsUrlValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_url_not_valid) else testErrorString)
|
EditTextValidator.TEST_PERSONNAME -> PersonNameValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_notvalid_personname) else testErrorString)
|
||||||
EditTextValidator.TEST_PERSONNAME -> toAdd = PersonNameValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_notvalid_personname) else testErrorString)
|
EditTextValidator.TEST_PERSONFULLNAME -> PersonFullNameValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_notvalid_personfullname) else testErrorString)
|
||||||
EditTextValidator.TEST_PERSONFULLNAME -> toAdd = PersonFullNameValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_notvalid_personfullname) else testErrorString)
|
EditTextValidator.TEST_MIN_LENGTH -> MinDigitLengthValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_not_a_minimum_length) else testErrorString, minLength)
|
||||||
EditTextValidator.TEST_MIN_LENGTH -> toAdd = MinDigitLengthValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_not_a_minimum_length) else testErrorString, minLength)
|
EditTextValidator.TEST_BG_RANGE -> BgRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed,
|
||||||
|
Profile.fromMgdlToUnits(minMgdl.toDouble(), profileFunction
|
||||||
|
.getUnits()).toString(), Profile.fromMgdlToUnits(maxMgdl.toDouble(), profileFunction.getUnits()).toString()) else
|
||||||
|
testErrorString, minMgdl, maxMgdl, profileFunction)
|
||||||
|
|
||||||
EditTextValidator.TEST_CUSTOM -> {
|
EditTextValidator.TEST_CUSTOM -> {
|
||||||
// must specify the fully qualified class name & an error message
|
// must specify the fully qualified class name & an error message
|
||||||
|
@ -139,16 +154,15 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
} catch (e: ClassNotFoundException) {
|
} catch (e: ClassNotFoundException) {
|
||||||
throw RuntimeException(String.format("Unable to load class for custom validator (%s).", classType))
|
throw RuntimeException(String.format("Unable to load class for custom validator (%s).", classType))
|
||||||
}
|
}
|
||||||
toAdd = try {
|
try {
|
||||||
customValidatorClass.getConstructor(String::class.java).newInstance(testErrorString)
|
customValidatorClass.getConstructor(String::class.java).newInstance(testErrorString)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
throw RuntimeException(String.format("Unable to construct custom validator (%s) with argument: %s", classType,
|
throw RuntimeException(String.format("Unable to construct custom validator (%s) with argument: %s", classType, testErrorString))
|
||||||
testErrorString))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EditTextValidator.TEST_DATE -> toAdd = DateValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_date_not_valid) else testErrorString, customFormat)
|
EditTextValidator.TEST_DATE -> DateValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_date_not_valid) else testErrorString, customFormat)
|
||||||
else -> toAdd = DummyValidator()
|
else -> DummyValidator()
|
||||||
}
|
}
|
||||||
val tmpValidator: MultiValidator
|
val tmpValidator: MultiValidator
|
||||||
if (!emptyAllowed) { // If the xml tells us that this is a required field, we will add the EmptyValidator.
|
if (!emptyAllowed) { // If the xml tells us that this is a required field, we will add the EmptyValidator.
|
||||||
|
@ -255,6 +269,8 @@ class DefaultEditTextValidator : EditTextValidator {
|
||||||
var minLength: Int = 0,
|
var minLength: Int = 0,
|
||||||
var minNumber: Int = 0,
|
var minNumber: Int = 0,
|
||||||
var maxNumber: Int = 0,
|
var maxNumber: Int = 0,
|
||||||
|
var minMgdl: Int = 0,
|
||||||
|
var maxMgdl: Int = 0,
|
||||||
var floatminNumber: Float = 0f,
|
var floatminNumber: Float = 0f,
|
||||||
var floatmaxNumber: Float = 0f
|
var floatmaxNumber: Float = 0f
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
package info.nightscout.androidaps.utils.textValidator;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextWatcher;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.utils.textValidator.validators.Validator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for encapsulating validation of an EditText control
|
|
||||||
*/
|
|
||||||
public interface EditTextValidator {
|
|
||||||
/**
|
|
||||||
* Add a validator to this FormEditText. The validator will be added in the
|
|
||||||
* queue of the current validators.
|
|
||||||
*
|
|
||||||
* @throws IllegalArgumentException if the validator is null
|
|
||||||
*/
|
|
||||||
void addValidator(Validator theValidator)
|
|
||||||
throws IllegalArgumentException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This should be used with { #addTextChangedListener(TextWatcher)}. It
|
|
||||||
* fixes the non-hiding error popup behaviour.
|
|
||||||
*/
|
|
||||||
TextWatcher getTextWatcher();
|
|
||||||
|
|
||||||
@SuppressWarnings("unused") boolean isEmptyAllowed();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the {@link Validator}s
|
|
||||||
*/
|
|
||||||
void resetValidators(Context context);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calling *testValidity()* will cause the EditText to go through
|
|
||||||
* customValidators and call {#Validator.isValid(EditText)}
|
|
||||||
* Same as {@link #testValidity(boolean)} with first parameter true
|
|
||||||
*
|
|
||||||
* @return true if the validity passes false otherwise.
|
|
||||||
*/
|
|
||||||
boolean testValidity();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calling *testValidity()* will cause the EditText to go through
|
|
||||||
* customValidators and call {#Validator.isValid(EditText)}
|
|
||||||
*
|
|
||||||
* @param showUIError determines if this call should show the UI error.
|
|
||||||
* @return true if the validity passes false otherwise.
|
|
||||||
*/
|
|
||||||
boolean testValidity(boolean showUIError);
|
|
||||||
|
|
||||||
void showUIError();
|
|
||||||
|
|
||||||
int TEST_REGEXP = 0;
|
|
||||||
|
|
||||||
int TEST_NUMERIC = 1;
|
|
||||||
|
|
||||||
int TEST_ALPHA = 2;
|
|
||||||
|
|
||||||
int TEST_ALPHANUMERIC = 3;
|
|
||||||
|
|
||||||
int TEST_EMAIL = 4;
|
|
||||||
|
|
||||||
int TEST_CREDITCARD = 5;
|
|
||||||
|
|
||||||
int TEST_PHONE = 6;
|
|
||||||
|
|
||||||
int TEST_DOMAINNAME = 7;
|
|
||||||
|
|
||||||
int TEST_IPADDRESS = 8;
|
|
||||||
|
|
||||||
int TEST_WEBURL = 9;
|
|
||||||
|
|
||||||
int TEST_NOCHECK = 10;
|
|
||||||
|
|
||||||
int TEST_CUSTOM = 11;
|
|
||||||
|
|
||||||
int TEST_PERSONNAME = 12;
|
|
||||||
|
|
||||||
int TEST_PERSONFULLNAME = 13;
|
|
||||||
|
|
||||||
int TEST_DATE = 14;
|
|
||||||
|
|
||||||
int TEST_NUMERIC_RANGE = 15;
|
|
||||||
|
|
||||||
int TEST_FLOAT_NUMERIC_RANGE = 16;
|
|
||||||
|
|
||||||
int TEST_HTTPS_URL = 17;
|
|
||||||
|
|
||||||
int TEST_MIN_LENGTH = 18;
|
|
||||||
|
|
||||||
int TEST_MULTI_PHONE = 19;
|
|
||||||
|
|
||||||
int TEST_PIN_STRENGTH = 20;
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
package info.nightscout.androidaps.utils.textValidator
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import kotlin.Throws
|
||||||
|
import android.text.TextWatcher
|
||||||
|
import info.nightscout.androidaps.utils.textValidator.validators.Validator
|
||||||
|
import java.lang.IllegalArgumentException
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for encapsulating validation of an EditText control
|
||||||
|
*/
|
||||||
|
interface EditTextValidator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a validator to this FormEditText. The validator will be added in the
|
||||||
|
* queue of the current validators.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if the validator is null
|
||||||
|
*/
|
||||||
|
@Throws(IllegalArgumentException::class)
|
||||||
|
fun addValidator(theValidator: Validator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This should be used with { #addTextChangedListener(TextWatcher)}. It
|
||||||
|
* fixes the non-hiding error popup behaviour.
|
||||||
|
*/
|
||||||
|
fun getTextWatcher(): TextWatcher?
|
||||||
|
fun isEmptyAllowed(): Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the [Validator]s
|
||||||
|
*/
|
||||||
|
fun resetValidators(context: Context)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calling *testValidity()* will cause the EditText to go through
|
||||||
|
* customValidators and call {#Validator.isValid(EditText)}
|
||||||
|
* Same as [.testValidity] with first parameter true
|
||||||
|
*
|
||||||
|
* @return true if the validity passes false otherwise.
|
||||||
|
*/
|
||||||
|
fun testValidity(): Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calling *testValidity()* will cause the EditText to go through
|
||||||
|
* customValidators and call {#Validator.isValid(EditText)}
|
||||||
|
*
|
||||||
|
* @param showUIError determines if this call should show the UI error.
|
||||||
|
* @return true if the validity passes false otherwise.
|
||||||
|
*/
|
||||||
|
fun testValidity(showUIError: Boolean): Boolean
|
||||||
|
fun showUIError()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
const val TEST_REGEXP = 0
|
||||||
|
const val TEST_NUMERIC = 1
|
||||||
|
const val TEST_ALPHA = 2
|
||||||
|
const val TEST_ALPHANUMERIC = 3
|
||||||
|
const val TEST_EMAIL = 4
|
||||||
|
const val TEST_CREDITCARD = 5
|
||||||
|
const val TEST_PHONE = 6
|
||||||
|
const val TEST_DOMAINNAME = 7
|
||||||
|
const val TEST_IPADDRESS = 8
|
||||||
|
const val TEST_WEBURL = 9
|
||||||
|
const val TEST_NOCHECK = 10
|
||||||
|
const val TEST_CUSTOM = 11
|
||||||
|
const val TEST_PERSONNAME = 12
|
||||||
|
const val TEST_PERSONFULLNAME = 13
|
||||||
|
const val TEST_DATE = 14
|
||||||
|
const val TEST_NUMERIC_RANGE = 15
|
||||||
|
const val TEST_FLOAT_NUMERIC_RANGE = 16
|
||||||
|
const val TEST_HTTPS_URL = 17
|
||||||
|
const val TEST_MIN_LENGTH = 18
|
||||||
|
const val TEST_MULTI_PHONE = 19
|
||||||
|
const val TEST_PIN_STRENGTH = 20
|
||||||
|
const val TEST_BG_RANGE = 21
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,21 +4,23 @@ import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import androidx.preference.EditTextPreference
|
import androidx.preference.EditTextPreference
|
||||||
import androidx.preference.PreferenceViewHolder
|
import androidx.preference.PreferenceViewHolder
|
||||||
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.core.R
|
import info.nightscout.androidaps.core.R
|
||||||
|
import info.nightscout.androidaps.interfaces.Profile
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
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 val validatorParameters: DefaultEditTextValidator.Parameters = obtainValidatorParameters(attrs)
|
private val validatorParameters: DefaultEditTextValidator.Parameters = obtainValidatorParameters(attrs)
|
||||||
private var validator: DefaultEditTextValidator? = null
|
private var validator: DefaultEditTextValidator? = null
|
||||||
|
|
||||||
|
@Inject lateinit var profileFunction: ProfileFunction
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setOnBindEditTextListener { editText ->
|
(ctx.applicationContext as HasAndroidInjector).androidInjector().inject(this)
|
||||||
validator = DefaultEditTextValidator(editText, validatorParameters, context)
|
setOnBindEditTextListener { editText -> validator = DefaultEditTextValidator(editText, validatorParameters, context) }
|
||||||
}
|
setOnPreferenceChangeListener { _, _ -> validator?.testValidity(false) ?: true }
|
||||||
setOnPreferenceChangeListener { _, _ ->
|
|
||||||
validator?.testValidity(false) ?: true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(ctx: Context, attrs: AttributeSet, defStyle: Int)
|
constructor(ctx: Context, attrs: AttributeSet, defStyle: Int)
|
||||||
|
@ -42,7 +44,8 @@ class ValidatingEditTextPreference(ctx: Context, attrs: AttributeSet, defStyleAt
|
||||||
classType = typedArray.getString(R.styleable.FormEditText_classType),
|
classType = typedArray.getString(R.styleable.FormEditText_classType),
|
||||||
customRegexp = typedArray.getString(R.styleable.FormEditText_customRegexp),
|
customRegexp = typedArray.getString(R.styleable.FormEditText_customRegexp),
|
||||||
emptyErrorStringDef = typedArray.getString(R.styleable.FormEditText_emptyErrorString),
|
emptyErrorStringDef = typedArray.getString(R.styleable.FormEditText_emptyErrorString),
|
||||||
customFormat = typedArray.getString(R.styleable.FormEditText_customFormat)).also { params ->
|
customFormat = typedArray.getString(R.styleable.FormEditText_customFormat)
|
||||||
|
).also { params ->
|
||||||
if (params.testType == EditTextValidator.TEST_MIN_LENGTH)
|
if (params.testType == EditTextValidator.TEST_MIN_LENGTH)
|
||||||
params.minLength = typedArray.getInt(R.styleable.FormEditText_minLength, 0)
|
params.minLength = typedArray.getInt(R.styleable.FormEditText_minLength, 0)
|
||||||
if (params.testType == EditTextValidator.TEST_NUMERIC_RANGE) {
|
if (params.testType == EditTextValidator.TEST_NUMERIC_RANGE) {
|
||||||
|
@ -53,7 +56,25 @@ class ValidatingEditTextPreference(ctx: Context, attrs: AttributeSet, defStyleAt
|
||||||
params.floatminNumber = typedArray.getFloat(R.styleable.FormEditText_floatminNumber, Float.MIN_VALUE)
|
params.floatminNumber = typedArray.getFloat(R.styleable.FormEditText_floatminNumber, Float.MIN_VALUE)
|
||||||
params.floatmaxNumber = typedArray.getFloat(R.styleable.FormEditText_floatmaxNumber, Float.MAX_VALUE)
|
params.floatmaxNumber = typedArray.getFloat(R.styleable.FormEditText_floatmaxNumber, Float.MAX_VALUE)
|
||||||
}
|
}
|
||||||
|
if (params.testType == EditTextValidator.TEST_BG_RANGE) {
|
||||||
|
params.minMgdl = typedArray.getInt(R.styleable.FormEditText_minMgdl, Int.MIN_VALUE)
|
||||||
|
params.maxMgdl = typedArray.getInt(R.styleable.FormEditText_maxMgdl, Int.MAX_VALUE)
|
||||||
|
}
|
||||||
typedArray.recycle()
|
typedArray.recycle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onSetInitialValue(defaultValue: Any?) {
|
||||||
|
text =
|
||||||
|
if (validatorParameters.testType == EditTextValidator.TEST_BG_RANGE)
|
||||||
|
Profile.fromMgdlToUnits(getPersistedString(defaultValue as String?).toDouble(), profileFunction.getUnits()).toString()
|
||||||
|
else
|
||||||
|
getPersistedString(defaultValue as String?)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun persistString(value: String?): Boolean =
|
||||||
|
if (validatorParameters.testType == EditTextValidator.TEST_BG_RANGE)
|
||||||
|
super.persistString(Profile.toMgdl(value?.toDouble() ?: 0.0, profileFunction.getUnits()).toString())
|
||||||
|
else
|
||||||
|
super.persistString(value)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package info.nightscout.androidaps.utils.textValidator.validators
|
||||||
|
|
||||||
|
import android.widget.EditText
|
||||||
|
import info.nightscout.androidaps.interfaces.Profile
|
||||||
|
import info.nightscout.androidaps.interfaces.ProfileFunction
|
||||||
|
|
||||||
|
class BgRangeValidator(_customErrorMessage: String?, private val min: Int, private val max: Int, private val profileFunction: ProfileFunction) : Validator(_customErrorMessage) {
|
||||||
|
|
||||||
|
override fun isValid(editText: EditText): Boolean {
|
||||||
|
return try {
|
||||||
|
val value = editText.text.toString().toDouble()
|
||||||
|
value in Profile.fromMgdlToUnits(min.toDouble(), profileFunction.getUnits())..Profile.fromMgdlToUnits(max.toDouble(), profileFunction.getUnits())
|
||||||
|
} catch (e: NumberFormatException) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -24,6 +24,7 @@
|
||||||
<enum name="minLength" value="18" />
|
<enum name="minLength" value="18" />
|
||||||
<enum name="multiPhone" value="19" />
|
<enum name="multiPhone" value="19" />
|
||||||
<enum name="pinStrength" value="20" />
|
<enum name="pinStrength" value="20" />
|
||||||
|
<enum name="bgRange" value="21" />
|
||||||
</attr>
|
</attr>
|
||||||
<attr name="testErrorString" format="string" />
|
<attr name="testErrorString" format="string" />
|
||||||
<attr name="emptyErrorString" format="string" />
|
<attr name="emptyErrorString" format="string" />
|
||||||
|
@ -36,6 +37,8 @@
|
||||||
<attr name="maxNumber" format="integer" />
|
<attr name="maxNumber" format="integer" />
|
||||||
<attr name="floatminNumber" format="float" />
|
<attr name="floatminNumber" format="float" />
|
||||||
<attr name="floatmaxNumber" format="float" />
|
<attr name="floatmaxNumber" format="float" />
|
||||||
|
<attr name="minMgdl" format="integer" />
|
||||||
|
<attr name="maxMgdl" format="integer" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in a new issue