Browse Source

Apply font and text colors to input dialogs. Resolves #1767.

Aidan Follestad 6 years ago
parent
commit
af466bebd4

+ 3 - 3
core/src/main/java/com/afollestad/materialdialogs/checkbox/DialogCheckboxExt.kt

@@ -25,9 +25,9 @@ import androidx.core.widget.CompoundButtonCompat
 import com.afollestad.materialdialogs.MaterialDialog
 import com.afollestad.materialdialogs.R
 import com.afollestad.materialdialogs.assertOneSet
+import com.afollestad.materialdialogs.utils.MDUtil.createColorSelector
 import com.afollestad.materialdialogs.utils.MDUtil.maybeSetTextColor
 import com.afollestad.materialdialogs.utils.MDUtil.resolveString
-import com.afollestad.materialdialogs.utils.createColorSelector
 import com.afollestad.materialdialogs.utils.resolveColors
 
 typealias BooleanCallback = ((Boolean) -> Unit)?
@@ -59,13 +59,13 @@ typealias BooleanCallback = ((Boolean) -> Unit)?
       onToggle?.invoke(checked)
     }
     maybeSetTextColor(windowContext, R.attr.md_color_content)
-    bodyFont?.let { this.typeface = it }
+    bodyFont?.let(this::setTypeface)
 
     val widgetAttrs = intArrayOf(R.attr.md_color_widget, R.attr.md_color_widget_unchecked)
     resolveColors(attrs = widgetAttrs).let {
       CompoundButtonCompat.setButtonTintList(
           this,
-          createColorSelector(checked = it[0], unchecked = it[1])
+          createColorSelector(windowContext, checked = it[0], unchecked = it[1])
       )
     }
   }

+ 2 - 2
core/src/main/java/com/afollestad/materialdialogs/internal/list/MultiChoiceDialogAdapter.kt

@@ -29,9 +29,9 @@ import com.afollestad.materialdialogs.actions.hasActionButtons
 import com.afollestad.materialdialogs.actions.setActionButtonEnabled
 import com.afollestad.materialdialogs.list.MultiChoiceListener
 import com.afollestad.materialdialogs.list.getItemSelector
+import com.afollestad.materialdialogs.utils.MDUtil.createColorSelector
 import com.afollestad.materialdialogs.utils.MDUtil.maybeSetTextColor
 import com.afollestad.materialdialogs.utils.appendAll
-import com.afollestad.materialdialogs.utils.createColorSelector
 import com.afollestad.materialdialogs.utils.inflate
 import com.afollestad.materialdialogs.utils.pullIndices
 import com.afollestad.materialdialogs.utils.removeAll
@@ -133,7 +133,7 @@ internal class MultiChoiceDialogAdapter(
         .let {
           CompoundButtonCompat.setButtonTintList(
               viewHolder.controlView,
-              dialog.createColorSelector(checked = it[0], unchecked = it[1])
+              createColorSelector(dialog.windowContext, checked = it[0], unchecked = it[1])
           )
         }
 

+ 2 - 2
core/src/main/java/com/afollestad/materialdialogs/internal/list/SingleChoiceDialogAdapter.kt

@@ -29,8 +29,8 @@ import com.afollestad.materialdialogs.actions.hasActionButtons
 import com.afollestad.materialdialogs.actions.setActionButtonEnabled
 import com.afollestad.materialdialogs.list.SingleChoiceListener
 import com.afollestad.materialdialogs.list.getItemSelector
+import com.afollestad.materialdialogs.utils.MDUtil.createColorSelector
 import com.afollestad.materialdialogs.utils.MDUtil.maybeSetTextColor
-import com.afollestad.materialdialogs.utils.createColorSelector
 import com.afollestad.materialdialogs.utils.inflate
 import com.afollestad.materialdialogs.utils.resolveColors
 
@@ -112,7 +112,7 @@ internal class SingleChoiceDialogAdapter(
         .let {
           CompoundButtonCompat.setButtonTintList(
               viewHolder.controlView,
-              dialog.createColorSelector(checked = it[0], unchecked = it[1])
+              createColorSelector(dialog.windowContext, checked = it[0], unchecked = it[1])
           )
         }
 

+ 0 - 24
core/src/main/java/com/afollestad/materialdialogs/utils/ColorExt.kt

@@ -17,16 +17,12 @@
 
 package com.afollestad.materialdialogs.utils
 
-import android.content.res.ColorStateList
 import android.graphics.Color
 import androidx.annotation.AttrRes
 import androidx.annotation.CheckResult
 import androidx.annotation.ColorInt
 import androidx.annotation.ColorRes
-import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
 import com.afollestad.materialdialogs.MaterialDialog
-import com.afollestad.materialdialogs.R
 import com.afollestad.materialdialogs.utils.MDUtil.resolveColor
 import com.afollestad.materialdialogs.utils.MDUtil.resolveColors
 
@@ -46,23 +42,3 @@ internal inline fun MaterialDialog.resolveColors(
 internal inline fun Int.adjustAlpha(alpha: Float): Int {
   return Color.argb((255 * alpha).toInt(), Color.red(this), Color.green(this), Color.blue(this))
 }
-
-@RestrictTo(LIBRARY_GROUP) internal fun MaterialDialog.createColorSelector(
-  @ColorInt unchecked: Int = 0,
-  @ColorInt checked: Int = 0
-): ColorStateList {
-  return ColorStateList(
-      arrayOf(
-          intArrayOf(-android.R.attr.state_checked),
-          intArrayOf(android.R.attr.state_checked)
-      ),
-      intArrayOf(
-          if (unchecked == 0) resolveColor(
-              windowContext, attr = R.attr.colorControlNormal
-          ) else unchecked,
-          if (checked == 0) resolveColor(
-              windowContext, attr = R.attr.colorControlActivated
-          ) else checked
-      )
-  )
-}

+ 37 - 4
core/src/main/java/com/afollestad/materialdialogs/utils/MDUtil.kt

@@ -17,7 +17,9 @@
 
 package com.afollestad.materialdialogs.utils
 
+import android.R.attr
 import android.content.Context
+import android.content.res.ColorStateList
 import android.content.res.Configuration.ORIENTATION_LANDSCAPE
 import android.graphics.Color
 import android.graphics.drawable.Drawable
@@ -37,6 +39,7 @@ import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
 import androidx.annotation.StringRes
 import androidx.core.content.ContextCompat
 import com.afollestad.materialdialogs.MaterialDialog
+import com.afollestad.materialdialogs.R
 
 @RestrictTo(LIBRARY_GROUP)
 object MDUtil {
@@ -187,11 +190,17 @@ object MDUtil {
 
   @RestrictTo(LIBRARY_GROUP) fun TextView?.maybeSetTextColor(
     context: Context,
-    @AttrRes attrRes: Int?
+    @AttrRes attrRes: Int?,
+    @AttrRes hintAttrRes: Int? = null
   ) {
-    if (attrRes == null) return
-    resolveColor(context, attr = attrRes).ifNotZero {
-      this?.setTextColor(it)
+    if (this == null || (attrRes == null && hintAttrRes == null)) return
+    if (attrRes != null) {
+      resolveColor(context, attr = attrRes)
+          .ifNotZero(this::setTextColor)
+    }
+    if (hintAttrRes != null) {
+      resolveColor(context, attr = hintAttrRes)
+          .ifNotZero(this::setHintTextColor)
     }
   }
 
@@ -201,4 +210,28 @@ object MDUtil {
       block(this)
     }
   }
+
+  @RestrictTo(LIBRARY_GROUP) fun createColorSelector(
+    context: Context,
+    @ColorInt unchecked: Int = 0,
+    @ColorInt checked: Int = 0
+  ): ColorStateList {
+    val checkedColor = if (checked == 0) resolveColor(
+        context, attr = R.attr.colorControlActivated
+    ) else checked
+    return ColorStateList(
+        arrayOf(
+            intArrayOf(-attr.state_checked, -attr.state_focused),
+            intArrayOf(attr.state_checked),
+            intArrayOf(attr.state_focused)
+        ),
+        intArrayOf(
+            if (unchecked == 0) resolveColor(
+                context, attr = R.attr.colorControlNormal
+            ) else unchecked,
+            checkedColor,
+            checkedColor
+        )
+    )
+  }
 }

+ 1 - 0
core/src/main/res-public/values/public.xml

@@ -2,6 +2,7 @@
   <attr format="color" name="md_background_color"/>
   <attr format="color" name="md_color_title"/>
   <attr format="color" name="md_color_content"/>
+  <attr format="color" name="md_color_hint"/>
   <attr format="color" name="md_ripple_color"/>
   <attr format="color" name="md_color_button_text"/>
   <attr format="color" name="md_color_widget"/>

+ 7 - 0
input/src/main/java/com/afollestad/materialdialogs/input/DialogInputExt.kt

@@ -30,6 +30,7 @@ import com.afollestad.materialdialogs.callbacks.onPreShow
 import com.afollestad.materialdialogs.callbacks.onShow
 import com.afollestad.materialdialogs.customview.customView
 import com.afollestad.materialdialogs.customview.getCustomView
+import com.afollestad.materialdialogs.utils.MDUtil.maybeSetTextColor
 import com.afollestad.materialdialogs.utils.MDUtil.textChanged
 import com.google.android.material.textfield.TextInputLayout
 
@@ -115,6 +116,12 @@ fun MaterialDialog.input(
 
   editText.hint = hint ?: if (hintRes != null) resources.getString(hintRes) else null
   editText.inputType = inputType
+  editText.maybeSetTextColor(
+      windowContext,
+      attrRes = R.attr.md_color_content,
+      hintAttrRes = R.attr.md_color_hint
+  )
+  bodyFont?.let(editText::setTypeface)
 
   if (maxLength != null) {
     getInputLayout().run {

+ 2 - 2
sample/src/main/res/values/styles.xml

@@ -28,8 +28,8 @@
     <item name="md_ripple_color">@color/primary_custom_translucent</item>
     <item name="md_color_button_text">@color/accent_custom</item>
 
-    <item name="md_color_widget">#00CC00</item>
-    <item name="md_color_widget_unchecked">#CC0000</item>
+    <item name="md_color_widget_unchecked">#00CC00</item>
+    <item name="md_color_widget">#CC0000</item>
 
   </style>