diff --git a/library/src/main/java/com/telefonica/mistica/feedback/error/LoadErrorFeedbackView.kt b/library/src/main/java/com/telefonica/mistica/feedback/error/LoadErrorFeedbackView.kt index c80c721ff..fb4699e33 100644 --- a/library/src/main/java/com/telefonica/mistica/feedback/error/LoadErrorFeedbackView.kt +++ b/library/src/main/java/com/telefonica/mistica/feedback/error/LoadErrorFeedbackView.kt @@ -5,48 +5,13 @@ import android.util.AttributeSet import android.view.Gravity import android.view.LayoutInflater import android.view.View -import android.view.View.OnClickListener import android.widget.LinearLayout import android.widget.TextView import androidx.annotation.StringRes -import androidx.databinding.BindingMethod -import androidx.databinding.BindingMethods import com.telefonica.mistica.R import com.telefonica.mistica.button.ProgressButton import com.telefonica.mistica.util.convertDpToPx -@BindingMethods( - BindingMethod( - type = LoadErrorFeedbackView::class, - attribute = "loadErrorFeedbackTitle", - method = "setTitle" - ), - BindingMethod( - type = LoadErrorFeedbackView::class, - attribute = "loadErrorFeedbackDescription", - method = "setDescription" - ), - BindingMethod( - type = LoadErrorFeedbackView::class, - attribute = "loadErrorFeedbackIsLoading", - method = "setIsLoading" - ), - BindingMethod( - type = LoadErrorFeedbackView::class, - attribute = "loadErrorFeedbackButtonOnClick", - method = "setButtonOnClick" - ), - BindingMethod( - type = LoadErrorFeedbackView::class, - attribute = "loadErrorFeedbackButtonText", - method = "setButtonText" - ), - BindingMethod( - type = LoadErrorFeedbackView::class, - attribute = "loadErrorFeedbackIsButtonVisible", - method = "setIsButtonVisible" - ) -) class LoadErrorFeedbackView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, diff --git a/library/src/main/java/com/telefonica/mistica/feedback/error/README.md b/library/src/main/java/com/telefonica/mistica/feedback/error/README.md index 3348e3d9d..0083d794a 100644 --- a/library/src/main/java/com/telefonica/mistica/feedback/error/README.md +++ b/library/src/main/java/com/telefonica/mistica/feedback/error/README.md @@ -4,7 +4,7 @@

-Implemented as a custom view, `com.telefonica.mistica.feedback.error.LoadErrorFeedbackView` can be used inside any layout like a regular view. It supports both **attribute configuration** and **databinding for all properties**. +Implemented as a custom view, `com.telefonica.mistica.feedback.error.LoadErrorFeedbackView` can be used inside any layout like a regular view. It supports **attribute-based configuration for all properties**. ```xml diff --git a/library/src/main/java/com/telefonica/mistica/feedback/screen/README.md b/library/src/main/java/com/telefonica/mistica/feedback/screen/README.md index 1f68919bb..0034c103b 100644 --- a/library/src/main/java/com/telefonica/mistica/feedback/screen/README.md +++ b/library/src/main/java/com/telefonica/mistica/feedback/screen/README.md @@ -8,7 +8,7 @@ It can be used inside any layout like a regular view. When adding it to the view hierarchy, entry animations will be performed. -In order to configure it for the specific purpose, it supports both **attribute configuration and databinding for all properties** +In order to configure it for the specific purpose, it supports **attribute-based configuration for all properties**. ## Available fields diff --git a/library/src/main/java/com/telefonica/mistica/header/HeaderView.kt b/library/src/main/java/com/telefonica/mistica/header/HeaderView.kt index 1a932d70e..2249d998d 100644 --- a/library/src/main/java/com/telefonica/mistica/header/HeaderView.kt +++ b/library/src/main/java/com/telefonica/mistica/header/HeaderView.kt @@ -15,8 +15,6 @@ import androidx.annotation.ColorInt import androidx.annotation.LayoutRes import androidx.annotation.StringRes import androidx.core.graphics.drawable.toDrawable -import androidx.databinding.BindingMethod -import androidx.databinding.BindingMethods import com.telefonica.mistica.R import com.telefonica.mistica.util.children import com.telefonica.mistica.util.convertDpToPx @@ -24,88 +22,6 @@ import com.telefonica.mistica.util.getMisticaThemeDrawable import com.telefonica.mistica.util.getThemeColor import com.telefonica.mistica.util.setTextAndVisibility -@BindingMethods( - BindingMethod( - type = HeaderView::class, - attribute = "headerInverse", - method = "setInverse" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerHasTopPadding", - method = "setHasTopPadding" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerFirstPretitle", - method = "setFirstPretitle" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerFirstPretitleHasSecondaryColor", - method = "setFirstPretitleHasSecondaryColor" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerTitle", - method = "setTitle" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerSecondPretitle", - method = "setSecondPretitle" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerSecondPretitleHasSecondaryColor", - method = "setSecondPretitleHasSecondaryColor" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerNumeral", - method = "setNumeral" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerNumeralHasErrorColor", - method = "setNumeralHasDangerColor" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerActionButtonText", - method = "setActionButtonText" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerSecondaryActionButtonText", - method = "setSecondaryActionButtonText" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerActionButtonOnClick", - method = "setActionButtonOnClick" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerSecondaryActionButtonOnClick", - method = "setSecondaryActionButtonOnClick" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerSubtitle", - method = "setHeaderSubtitle" - ), - BindingMethod( - type = HeaderView::class, - attribute = "headerSubtitleHasSecondaryColor", - method = "setSubtitleHasSecondaryColor" - ), - BindingMethod( - type = HeaderView::class, - attribute = "bottomLayout", - method = "setBottomLayout" - ), -) class HeaderView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @@ -319,6 +235,36 @@ class HeaderView @JvmOverloads constructor( configureTextsColors() } + fun setHeaderFirstPretitle(@StringRes textRes: Int?) = setFirstPretitle(textRes) + fun setHeaderTitle(text: CharSequence?) = setTitle(text) + + fun setHeaderInverse(value: Boolean) = setInverse(value) + fun setHeaderHasTopPadding(value: Boolean) = setHasTopPadding(value) + + fun setHeaderFirstPretitle(text: CharSequence?) = setFirstPretitle(text) + fun setHeaderFirstPretitleHasSecondaryColor(value: Boolean) = + setFirstPretitleHasSecondaryColor(value) + + fun setHeaderSecondPretitle(text: CharSequence?) = setSecondPretitle(text) + fun setHeaderSecondPretitleHasSecondaryColor(value: Boolean) = + setSecondPretitleHasSecondaryColor(value) + + fun setHeaderNumeral(text: CharSequence?) = setNumeral(text) + fun setHeaderNumeralHasErrorColor(value: Boolean) = setNumeralHasDangerColor(value) + + fun setHeaderSubtitle(text: CharSequence?) = setSubtitle(text) + fun setHeaderSubtitleHasSecondaryColor(value: Boolean) = setSubtitleHasSecondaryColor(value) + + fun setHeaderActionButtonText(text: CharSequence?) = setActionButtonText(text) + fun setHeaderSecondaryActionButtonText(text: CharSequence?) = setSecondaryActionButtonText(text) + + fun setHeaderActionButtonOnClick(listener: OnClickListener?) = setActionButtonOnClick(listener) + fun setHeaderSecondaryActionButtonOnClick(listener: OnClickListener?) = + setSecondaryActionButtonOnClick(listener) + + fun setHeaderBottomLayout(@LayoutRes layoutRes: Int) = setBottomLayout(layoutRes) + + private fun configureTextsColors() { val backgroundDrawable = if (isInverse) { context.getMisticaThemeDrawable(R.attr.drawableBackgroundBrand) diff --git a/library/src/main/java/com/telefonica/mistica/header/README.md b/library/src/main/java/com/telefonica/mistica/header/README.md index 27268f7e1..981a40f4f 100644 --- a/library/src/main/java/com/telefonica/mistica/header/README.md +++ b/library/src/main/java/com/telefonica/mistica/header/README.md @@ -5,7 +5,7 @@

-Implemented as a custom view, `com.telefonica.mistica.header.HeaderView` can be used inside any layout like a regular view. It supports both **attribute configuration and databinding for all properties**. +Implemented as a custom view, `com.telefonica.mistica.header.HeaderView` can be used inside any layout like a regular view. It supports **attribute-based configuration for all properties**. ```xml diff --git a/library/src/main/java/com/telefonica/mistica/highlightedcard/HighlightedCardView.kt b/library/src/main/java/com/telefonica/mistica/highlightedcard/HighlightedCardView.kt index 3e358d0aa..fd9eb4e7a 100644 --- a/library/src/main/java/com/telefonica/mistica/highlightedcard/HighlightedCardView.kt +++ b/library/src/main/java/com/telefonica/mistica/highlightedcard/HighlightedCardView.kt @@ -23,84 +23,15 @@ import androidx.annotation.IntDef import androidx.annotation.StringRes import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.graphics.createBitmap import androidx.core.graphics.drawable.toDrawable -import androidx.databinding.BindingMethod -import androidx.databinding.BindingMethods import com.telefonica.mistica.R import com.telefonica.mistica.util.getDimension import com.telefonica.mistica.util.getMisticaThemeDrawableBuilder import com.telefonica.mistica.util.getThemeColor import com.telefonica.mistica.util.hide import com.telefonica.mistica.util.show -import androidx.core.graphics.createBitmap -@BindingMethods( - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardBackground", - method = "setCustomBackground" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardInverse", - method = "setInverse" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardTitle", - method = "setTitle" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardContent", - method = "setContent" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardButtonStyle", - method = "setButtonStyle" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardImageStyle", - method = "setImageStyle" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardImage", - method = "setImage" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardButton", - method = "setButtonText" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardImageVisibility", - method = "setImageVisibility" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardCloseButtonVisibility", - method = "setCloseVisibility" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardButtonOnClick", - method = "setButtonOnClick" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardCloseButton", - method = "setCloseButton" - ), - BindingMethod( - type = HighlightedCardView::class, - attribute = "highlightedCardCloseButtonOnClick", - method = "setCloseButtonOnClick" - ) -) class HighlightedCardView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, diff --git a/library/src/main/java/com/telefonica/mistica/highlightedcard/README.md b/library/src/main/java/com/telefonica/mistica/highlightedcard/README.md index 4af63e201..5567999d0 100644 --- a/library/src/main/java/com/telefonica/mistica/highlightedcard/README.md +++ b/library/src/main/java/com/telefonica/mistica/highlightedcard/README.md @@ -8,7 +8,7 @@

-Implemented as a custom view, `com.telefonica.mistica.highlightedcard.HighlightedCardView` can be used inside any layout like a regular view. It supports both **attribute configuration and databinding for all properties**. +Implemented as a custom view, `com.telefonica.mistica.highlightedcard.HighlightedCardView` can be used inside any layout like a regular view. It supports **attribute-based configuration for all properties**. ```xml diff --git a/library/src/main/java/com/telefonica/mistica/input/CheckBoxInput.kt b/library/src/main/java/com/telefonica/mistica/input/CheckBoxInput.kt index ebbb06824..def1aa303 100644 --- a/library/src/main/java/com/telefonica/mistica/input/CheckBoxInput.kt +++ b/library/src/main/java/com/telefonica/mistica/input/CheckBoxInput.kt @@ -7,36 +7,12 @@ import android.text.method.MovementMethod import android.util.AttributeSet import android.view.LayoutInflater import android.widget.CompoundButton +import androidx.annotation.StringRes import androidx.appcompat.widget.AppCompatCheckBox -import androidx.databinding.BindingAdapter -import androidx.databinding.BindingMethod -import androidx.databinding.BindingMethods -import androidx.databinding.InverseBindingListener -import androidx.databinding.InverseBindingMethod -import androidx.databinding.InverseBindingMethods import com.google.android.material.textfield.TextInputLayout import com.telefonica.mistica.R import com.telefonica.mistica.util.getThemeColor -@BindingMethods( - BindingMethod( - type = CheckBoxInput::class, - attribute = "inputCheckText", - method = "setText" - ), - BindingMethod( - type = CheckBoxInput::class, - attribute = "inputChecked", - method = "setChecked" - ) -) -@InverseBindingMethods( - InverseBindingMethod( - type = CheckBoxInput::class, - attribute = "inputChecked", - method = "isChecked" - ) -) class CheckBoxInput @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @@ -102,6 +78,28 @@ class CheckBoxInput @JvmOverloads constructor( checkBox.buttonTintList = ColorStateList(states, colors) } + fun setInputError(@StringRes errorRes: Int?) { + if (errorRes == null) { + error = null + setErrorEnabled(false) + } else { + error = context.getString(errorRes) + setErrorEnabled(true) + } + } + + fun setInputEnabled(enabled: Boolean) { + isEnabled = enabled + } + + fun setInputCheckText(text: CharSequence?) { + setText(text) + } + + fun getInputCheckText(): CharSequence? { + return getText() + } + fun setChecked(checked: Boolean) { checkBox.isChecked = checked } @@ -131,14 +129,4 @@ class CheckBoxInput @JvmOverloads constructor( super.setEnabled(enabled) checkBox.isEnabled = enabled } - - companion object { - @BindingAdapter( - value = ["inputCheckedAttrChanged"] - ) - @JvmStatic - fun setCheckWatcher(input: CheckBoxInput, listener: InverseBindingListener) { - input.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { _, _ -> listener.onChange() }) - } - } } diff --git a/library/src/main/java/com/telefonica/mistica/input/Input.kt b/library/src/main/java/com/telefonica/mistica/input/Input.kt index 126ff2dc3..426f969dd 100644 --- a/library/src/main/java/com/telefonica/mistica/input/Input.kt +++ b/library/src/main/java/com/telefonica/mistica/input/Input.kt @@ -7,40 +7,11 @@ import android.text.style.ForegroundColorSpan import android.util.AttributeSet import android.widget.FrameLayout import androidx.annotation.StringRes -import androidx.databinding.BindingMethod -import androidx.databinding.BindingMethods import com.google.android.material.textfield.TextInputLayout import com.telefonica.mistica.R import com.telefonica.mistica.util.getThemeColor import com.telefonica.mistica.util.setAlpha -@BindingMethods( - BindingMethod( - type = Input::class, - attribute = "inputHint", - method = "setHint" - ), - BindingMethod( - type = Input::class, - attribute = "inputError", - method = "setError" - ), - BindingMethod( - type = Input::class, - attribute = "inputHelperText", - method = "setHelperText" - ), - BindingMethod( - type = Input::class, - attribute = "inputEnabled", - method = "setEnabled" - ), - BindingMethod( - type = Input::class, - attribute = "inputInverse", - method = "setInverse" - ) -) abstract class Input @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, diff --git a/library/src/main/java/com/telefonica/mistica/input/README.md b/library/src/main/java/com/telefonica/mistica/input/README.md index 1247533b2..2b3c8efef 100644 --- a/library/src/main/java/com/telefonica/mistica/input/README.md +++ b/library/src/main/java/com/telefonica/mistica/input/README.md @@ -10,7 +10,7 @@ There are three input types. For each one, a component is provided: * Check Box Input --> `com.telefonica.mistica.input.CheckBoxInput` * Drop Down Input --> `com.telefonica.mistica.input.DropDownInput` -All them can be placed directly on any layout, and can be configured with the following attributes (**All atributes for all types support databinding**): +All of them can be placed directly on any layout, and can be configured with the following attributes (**All attributes are supported for all types**): ```xml @@ -33,7 +33,7 @@ All them can be placed directly on any layout, and can be configured with the fo - + @@ -44,7 +44,7 @@ And `com.telefonica.mistica.input.CheckBoxInput` provides also: ```xml - + ``` @@ -67,4 +67,8 @@ dropDownInput.dropDown.setOnItemClickListener { parent, view, position, id -> // do something } dropDownInput.dropDown.setText("First option") // Select first option -``` \ No newline at end of file +``` + +> [!NOTE] +> Form input components are implemented as standard Android Views and do not provide Android DataBinding or inverse DataBinding support. +> State changes can be handled through the exposed APIs and listeners. \ No newline at end of file diff --git a/library/src/main/java/com/telefonica/mistica/input/TextInput.kt b/library/src/main/java/com/telefonica/mistica/input/TextInput.kt index 6a17fa494..ec327a544 100644 --- a/library/src/main/java/com/telefonica/mistica/input/TextInput.kt +++ b/library/src/main/java/com/telefonica/mistica/input/TextInput.kt @@ -14,13 +14,6 @@ import android.view.inputmethod.InputConnection import android.widget.TextView import androidx.annotation.IntDef import androidx.annotation.LayoutRes -import androidx.databinding.BindingAdapter -import androidx.databinding.BindingMethod -import androidx.databinding.BindingMethods -import androidx.databinding.InverseBindingListener -import androidx.databinding.InverseBindingMethod -import androidx.databinding.InverseBindingMethods -import androidx.databinding.adapters.ListenerUtil import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.telefonica.mistica.R @@ -29,35 +22,6 @@ import com.telefonica.mistica.input.validations.TextInputValidation import com.telefonica.mistica.input.validations.TextInputValidationResult import com.telefonica.mistica.util.padding -@BindingMethods( - BindingMethod( - type = TextInput::class, - attribute = "inputCounterEnabled", - method = "setCounterEnabled" - ), - BindingMethod( - type = TextInput::class, - attribute = "inputMaxLength", - method = "setMaxLength" - ), - BindingMethod( - type = TextInput::class, - attribute = "inputAutofillEnabled", - method = "setAutofillEnabled" - ), - BindingMethod( - type = TextInput::class, - attribute = "inputText", - method = "setText" - ) -) -@InverseBindingMethods( - InverseBindingMethod( - type = TextInput::class, - attribute = "inputText", - method = "getText" - ) -) class TextInput @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @@ -200,6 +164,7 @@ class TextInput @JvmOverloads constructor( TextInputValidationResult.Success -> { setErrorEnabled(false) } + is TextInputValidationResult.Invalid -> { error = result.invalidMessage setErrorEnabled(true) @@ -269,32 +234,5 @@ class TextInput @JvmOverloads constructor( const val TYPE_NUMBER = 5 const val NO_MAX_LENGTH = 0 - - @BindingAdapter( - value = ["inputTextAttrChanged"] - ) - @JvmStatic - fun setTextWatcher(input: TextInput, listener: InverseBindingListener) { - val textWatcher: TextWatcher = object : TextWatcher { - override fun afterTextChanged(s: Editable?) { - listener.onChange() - } - - override fun beforeTextChanged( - s: CharSequence?, - start: Int, - count: Int, - after: Int - ) { - } - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} - } - val oldTextWatcher = ListenerUtil.trackListener(input, textWatcher, R.id.textWatcher) - if (oldTextWatcher != null) { - input.removeTextChangedListener(oldTextWatcher) - } - input.addTextChangedListener(textWatcher) - } } }