Parcourir la source

Allow corner radius to be set dynamically

Aidan Follestad il y a 5 ans
Parent
commit
72cf3eadea

+ 36 - 3
core/src/main/java/com/afollestad/materialdialogs/MaterialDialog.kt

@@ -37,12 +37,14 @@ import com.afollestad.materialdialogs.internal.list.DialogAdapter
 import com.afollestad.materialdialogs.internal.main.DialogLayout
 import com.afollestad.materialdialogs.list.getListAdapter
 import com.afollestad.materialdialogs.utils.MDUtil.assertOneSet
+import com.afollestad.materialdialogs.utils.MDUtil.resolveDimen
+import com.afollestad.materialdialogs.utils.font
 import com.afollestad.materialdialogs.utils.hideKeyboard
 import com.afollestad.materialdialogs.utils.isVisible
 import com.afollestad.materialdialogs.utils.populateIcon
 import com.afollestad.materialdialogs.utils.populateText
 import com.afollestad.materialdialogs.utils.preShow
-import com.afollestad.materialdialogs.utils.setDefaults
+import com.afollestad.materialdialogs.utils.resolveColor
 
 typealias DialogCallback = (MaterialDialog) -> Unit
 
@@ -69,7 +71,6 @@ class MaterialDialog(
   /** Returns true if auto dismiss is enabled. */
   var autoDismissEnabled: Boolean = true
     internal set
-
   var titleFont: Typeface? = null
     internal set
   var bodyFont: Typeface? = null
@@ -78,6 +79,8 @@ class MaterialDialog(
     internal set
   var cancelOnTouchOutside: Boolean = true
     internal set
+  var cornerRadius: Float? = null
+    internal set
   @Px private var maxWidth: Int? = null
 
   /** The root layout of the dialog. */
@@ -103,7 +106,12 @@ class MaterialDialog(
     setContentView(rootView)
     this.view = dialogBehavior.getDialogLayout(rootView)
         .also { it.attachDialog(this) }
-    setDefaults()
+
+    // Set defaults
+    this.titleFont = font(attr = R.attr.md_font_title)
+    this.bodyFont = font(attr = R.attr.md_font_body)
+    this.buttonFont = font(attr = R.attr.md_font_button)
+    invalidateBackgroundColorAndRadius()
   }
 
   /**
@@ -326,6 +334,16 @@ class MaterialDialog(
     return this
   }
 
+  fun cornerRadius(
+    literal: Float? = null,
+    @DimenRes res: Int? = null
+  ): MaterialDialog {
+    assertOneSet("cornerRadius", literal, res)
+    this.cornerRadius = literal ?: windowContext.resources.getDimension(res!!)
+    invalidateBackgroundColorAndRadius()
+    return this
+  }
+
   /** Turns debug mode on or off. Draws spec guides over dialog views. */
   @CheckResult fun debugMode(debugMode: Boolean = true): MaterialDialog {
     this.view.debugMode = debugMode
@@ -394,4 +412,19 @@ class MaterialDialog(
       )
     }
   }
+
+  private fun invalidateBackgroundColorAndRadius() {
+    val backgroundColor = resolveColor(attr = R.attr.md_background_color) {
+      resolveColor(attr = R.attr.colorBackgroundFloating)
+    }
+    val cornerRadius =
+      cornerRadius ?: resolveDimen(windowContext, attr = R.attr.md_corner_radius)
+    dialogBehavior.setBackgroundColor(
+        context = windowContext,
+        window = window!!,
+        view = view,
+        color = backgroundColor,
+        cornerRounding = cornerRadius
+    )
+  }
 }

+ 0 - 28
core/src/main/java/com/afollestad/materialdialogs/utils/Dialogs.kt

@@ -22,33 +22,18 @@ import android.view.View
 import android.view.inputmethod.InputMethodManager
 import android.widget.ImageView
 import android.widget.TextView
-import androidx.annotation.ColorInt
 import androidx.annotation.DrawableRes
 import androidx.annotation.RestrictTo
 import androidx.annotation.RestrictTo.Scope
 import androidx.annotation.StringRes
 import com.afollestad.materialdialogs.MaterialDialog
-import com.afollestad.materialdialogs.R
 import com.afollestad.materialdialogs.callbacks.invokeAll
 import com.afollestad.materialdialogs.checkbox.getCheckBoxPrompt
 import com.afollestad.materialdialogs.customview.CUSTOM_VIEW_NO_VERTICAL_PADDING
 import com.afollestad.materialdialogs.utils.MDUtil.maybeSetTextColor
-import com.afollestad.materialdialogs.utils.MDUtil.resolveDimen
 import com.afollestad.materialdialogs.utils.MDUtil.resolveDrawable
 import com.afollestad.materialdialogs.utils.MDUtil.resolveString
 
-internal fun MaterialDialog.setDefaults() {
-  // Background color and corner radius
-  val backgroundColor = resolveColor(attr = R.attr.md_background_color) {
-    resolveColor(attr = R.attr.colorBackgroundFloating)
-  }
-  colorBackground(color = backgroundColor)
-  // Fonts
-  this.titleFont = font(attr = R.attr.md_font_title)
-  this.bodyFont = font(attr = R.attr.md_font_body)
-  this.buttonFont = font(attr = R.attr.md_font_button)
-}
-
 @RestrictTo(Scope.LIBRARY_GROUP)
 fun MaterialDialog.invalidateDividers(
   showTop: Boolean,
@@ -125,16 +110,3 @@ internal fun MaterialDialog.hideKeyboard() {
     imm.hideSoftInputFromWindow(it, 0)
   }
 }
-
-internal fun MaterialDialog.colorBackground(@ColorInt color: Int): MaterialDialog {
-  window?.let {
-    dialogBehavior.setBackgroundColor(
-        context = windowContext,
-        window = it,
-        view = view,
-        color = color,
-        cornerRounding = resolveDimen(windowContext, attr = R.attr.md_corner_radius)
-    )
-  }
-  return this
-}