Explorar o código

Add theme attributes for title and content color, resolves #1603

Aidan Follestad %!s(int64=6) %!d(string=hai) anos
pai
achega
fd0995106b

+ 17 - 1
README.md

@@ -33,7 +33,8 @@ versions will no longer receive support.**
     1. [Light and Dark](#light-and-dark)
     2. [Background Color](#background-color)
     3. [Corner Radius](#corner-radius)
-    4. [Fonts](#fonts)
+    4. [Text Color][#text-color]
+    5. [Fonts](#fonts)
 
 # Table of Contents - Input
 
@@ -664,6 +665,21 @@ it can be changed with an attribute in your app theme. It defaults to 2dp:
 </style>
 ```
 
+### Text Color
+
+By default, `android:textColorPrimary` and `android:textColorSecondary` attributes from your Activity
+theme are used for the title and content colors of dialogs. If you wish to override that, there 
+are two attributes provided:
+
+```xml
+<style name="AppTheme.Custom" parent="Theme.AppCompat">
+
+  <item name="md_color_title">@color/your_color</item>
+  <item name="md_color_content">@color/your_color</item>
+    
+</style>
+```
+
 ### Fonts
 
 This library supports using custom fonts, powered by the Support libraries `ResourcesCompat` class. 

+ 2 - 1
core/src/main/java/com/afollestad/materialdialogs/MaterialDialog.kt

@@ -135,7 +135,8 @@ class MaterialDialog(
         view.titleLayout.titleView,
         textRes = res,
         text = text,
-        typeface = this.titleFont
+        typeface = this.titleFont,
+        textColor = R.attr.md_color_title
     )
     return this
   }

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

@@ -12,8 +12,10 @@ import android.support.annotation.StringRes
 import android.view.View
 import android.widget.CheckBox
 import com.afollestad.materialdialogs.MaterialDialog
+import com.afollestad.materialdialogs.R
 import com.afollestad.materialdialogs.assertOneSet
 import com.afollestad.materialdialogs.utils.getString
+import com.afollestad.materialdialogs.utils.maybeSetTextColor
 
 typealias BooleanCallback = ((Boolean) -> Unit)?
 
@@ -46,6 +48,7 @@ fun MaterialDialog.checkBoxPrompt(
     this.setOnCheckedChangeListener { _, checked ->
       onToggle?.invoke(checked)
     }
+    maybeSetTextColor(windowContext, R.attr.md_color_content)
   }
   return this
 }

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

@@ -20,6 +20,7 @@ import com.afollestad.materialdialogs.list.MultiChoiceListener
 import com.afollestad.materialdialogs.list.getItemSelector
 import com.afollestad.materialdialogs.utils.appendAll
 import com.afollestad.materialdialogs.utils.inflate
+import com.afollestad.materialdialogs.utils.maybeSetTextColor
 import com.afollestad.materialdialogs.utils.pullIndices
 import com.afollestad.materialdialogs.utils.removeAll
 
@@ -107,10 +108,12 @@ internal class MultiChoiceDialogAdapter(
     viewType: Int
   ): MultiChoiceViewHolder {
     val listItemView: View = parent.inflate(dialog.windowContext, R.layout.md_listitem_multichoice)
-    return MultiChoiceViewHolder(
+    val viewHolder = MultiChoiceViewHolder(
         itemView = listItemView,
         adapter = this
     )
+    viewHolder.titleView.maybeSetTextColor(dialog.windowContext, R.attr.md_color_content)
+    return viewHolder
   }
 
   override fun getItemCount() = items.size

+ 4 - 1
core/src/main/java/com/afollestad/materialdialogs/internal/list/PlainListDialogAdapter.kt

@@ -16,6 +16,7 @@ import com.afollestad.materialdialogs.actions.hasActionButtons
 import com.afollestad.materialdialogs.list.ItemListener
 import com.afollestad.materialdialogs.list.getItemSelector
 import com.afollestad.materialdialogs.utils.inflate
+import com.afollestad.materialdialogs.utils.maybeSetTextColor
 
 private const val KEY_ACTIVATED_INDEX = "activated_index"
 
@@ -72,10 +73,12 @@ internal class PlainListDialogAdapter(
     viewType: Int
   ): PlainListViewHolder {
     val listItemView: View = parent.inflate(dialog.windowContext, R.layout.md_listitem)
-    return PlainListViewHolder(
+    val viewHolder = PlainListViewHolder(
         itemView = listItemView,
         adapter = this
     )
+    viewHolder.titleView.maybeSetTextColor(dialog.windowContext, R.attr.md_color_content)
+    return viewHolder
   }
 
   override fun getItemCount() = items.size

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

@@ -19,6 +19,7 @@ import com.afollestad.materialdialogs.actions.setActionButtonEnabled
 import com.afollestad.materialdialogs.list.SingleChoiceListener
 import com.afollestad.materialdialogs.list.getItemSelector
 import com.afollestad.materialdialogs.utils.inflate
+import com.afollestad.materialdialogs.utils.maybeSetTextColor
 
 /** @author Aidan Follestad (afollestad) */
 internal class SingleChoiceViewHolder(
@@ -87,10 +88,12 @@ internal class SingleChoiceDialogAdapter(
     viewType: Int
   ): SingleChoiceViewHolder {
     val listItemView: View = parent.inflate(dialog.windowContext, R.layout.md_listitem_singlechoice)
-    return SingleChoiceViewHolder(
+    val viewHolder = SingleChoiceViewHolder(
         itemView = listItemView,
         adapter = this
     )
+    viewHolder.titleView.maybeSetTextColor(dialog.windowContext, R.attr.md_color_content)
+    return viewHolder
   }
 
   override fun getItemCount() = items.size

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

@@ -11,6 +11,7 @@ import android.support.annotation.AttrRes
 import android.support.annotation.ColorInt
 import android.support.annotation.ColorRes
 import android.support.v4.content.ContextCompat
+import android.widget.TextView
 import com.afollestad.materialdialogs.MaterialDialog
 
 @ColorInt internal fun MaterialDialog.getColor(
@@ -40,3 +41,14 @@ internal fun Int.isColorDark(): Boolean {
     1 - (0.299 * Color.red(this) + 0.587 * Color.green(this) + 0.114 * Color.blue(this)) / 255
   return darkness >= 0.5
 }
+
+internal fun TextView?.maybeSetTextColor(
+  context: Context,
+  @AttrRes attrRes: Int?
+) {
+  if (attrRes == null) return
+  val color = getColor(context, attr = attrRes)
+  if (color != 0) {
+    this?.setTextColor(color)
+  }
+}

+ 4 - 1
core/src/main/java/com/afollestad/materialdialogs/utils/DialogExt.kt

@@ -90,6 +90,7 @@ internal fun MaterialDialog.addContentMessageView(@StringRes res: Int?, text: Ch
         R.layout.md_dialog_stub_message,
         this.contentScrollViewFrame!!
     )
+    this.textViewMessage.maybeSetTextColor(windowContext, R.attr.md_color_content)
     this.contentScrollViewFrame!!.addView(this.textViewMessage)
     if (this.bodyFont != null) {
       this.textViewMessage?.typeface = this.bodyFont
@@ -136,7 +137,8 @@ internal fun MaterialDialog.populateText(
   @StringRes textRes: Int? = null,
   text: CharSequence? = null,
   @StringRes fallback: Int = 0,
-  typeface: Typeface?
+  typeface: Typeface?,
+  textColor: Int? = null
 ) {
   val value = text ?: getString(textRes, fallback)
   if (value != null) {
@@ -146,6 +148,7 @@ internal fun MaterialDialog.populateText(
     if (typeface != null) {
       textView.typeface = typeface
     }
+    textView.maybeSetTextColor(windowContext, textColor)
   } else {
     textView.visibility = View.GONE
   }

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

@@ -1,5 +1,7 @@
 <resources>
   <attr format="color" name="md_background_color"/>
+  <attr format="color" name="md_color_title"/>
+  <attr format="color" name="md_color_content"/>
   <attr format="dimension" name="md_corner_radius"/>
   <attr format="reference" name="md_font_title"/>
   <attr format="reference" name="md_font_body"/>

+ 2 - 0
files/src/main/java/com/afollestad/materialdialogs/files/DialogFileChooserExt.kt

@@ -16,6 +16,7 @@ import com.afollestad.materialdialogs.actions.setActionButtonEnabled
 import com.afollestad.materialdialogs.customview.customView
 import com.afollestad.materialdialogs.customview.getCustomView
 import com.afollestad.materialdialogs.files.utilext.hasReadStoragePermission
+import com.afollestad.materialdialogs.files.utilext.maybeSetTextColor
 import com.afollestad.materialdialogs.internal.list.DialogRecyclerView
 import java.io.File
 
@@ -52,6 +53,7 @@ fun MaterialDialog.fileChooser(
   val list: DialogRecyclerView = customView.findViewById(R.id.list)
   val emptyText: TextView = customView.findViewById(R.id.empty_text)
   emptyText.setText(emptyTextRes)
+  emptyText.maybeSetTextColor(windowContext, R.attr.md_color_content)
 
   list.attach(this)
   list.layoutManager = LinearLayoutManager(windowContext)

+ 2 - 0
files/src/main/java/com/afollestad/materialdialogs/files/DialogFolderChooserExt.kt

@@ -16,6 +16,7 @@ import com.afollestad.materialdialogs.actions.setActionButtonEnabled
 import com.afollestad.materialdialogs.customview.customView
 import com.afollestad.materialdialogs.customview.getCustomView
 import com.afollestad.materialdialogs.files.utilext.hasReadStoragePermission
+import com.afollestad.materialdialogs.files.utilext.maybeSetTextColor
 import com.afollestad.materialdialogs.internal.list.DialogRecyclerView
 import java.io.File
 
@@ -49,6 +50,7 @@ fun MaterialDialog.folderChooser(
   val list: DialogRecyclerView = customView.findViewById(R.id.list)
   val emptyText: TextView = customView.findViewById(R.id.empty_text)
   emptyText.setText(emptyTextRes)
+  emptyText.maybeSetTextColor(windowContext, R.attr.md_color_content)
 
   list.attach(this)
   list.layoutManager = LinearLayoutManager(windowContext)

+ 5 - 1
files/src/main/java/com/afollestad/materialdialogs/files/FileChooserAdapter.kt

@@ -23,6 +23,7 @@ import com.afollestad.materialdialogs.files.utilext.getDrawable
 import com.afollestad.materialdialogs.files.utilext.hasParent
 import com.afollestad.materialdialogs.files.utilext.isColorDark
 import com.afollestad.materialdialogs.files.utilext.jumpOverEmulated
+import com.afollestad.materialdialogs.files.utilext.maybeSetTextColor
 import com.afollestad.materialdialogs.files.utilext.setVisible
 import java.io.File
 
@@ -127,7 +128,10 @@ internal class FileChooserAdapter(
     val view = LayoutInflater.from(parent.context)
         .inflate(R.layout.md_file_chooser_item, parent, false)
     view.background = getDrawable(dialog.context, attr = R.attr.md_item_selector)
-    return FileChooserViewHolder(view, this)
+
+    val viewHolder = FileChooserViewHolder(view, this)
+    viewHolder.nameView.maybeSetTextColor(dialog.windowContext, R.attr.md_color_content)
+    return viewHolder
   }
 
   override fun getItemCount(): Int {

+ 12 - 0
files/src/main/java/com/afollestad/materialdialogs/files/utilext/ColorUtilExt.kt

@@ -11,6 +11,7 @@ import android.support.annotation.AttrRes
 import android.support.annotation.ColorInt
 import android.support.annotation.ColorRes
 import android.support.v4.content.ContextCompat
+import android.widget.TextView
 
 @ColorInt
 internal fun getColor(
@@ -34,3 +35,14 @@ internal fun Int.isColorDark(): Boolean {
     1 - (0.299 * Color.red(this) + 0.587 * Color.green(this) + 0.114 * Color.blue(this)) / 255
   return darkness >= 0.5
 }
+
+internal fun TextView?.maybeSetTextColor(
+  context: Context,
+  @AttrRes attrRes: Int?
+) {
+  if (attrRes == null) return
+  val color = getColor(context, attr = attrRes)
+  if (color != 0) {
+    this?.setTextColor(color)
+  }
+}