From d6a61d5b2601b3849bf402e48fcf1c50a32cfcab Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Fri, 7 Jun 2019 09:39:33 -0400 Subject: Begin initial md port --- .../src/main/kotlin/ca/allanwang/kau/Versions.kt | 2 +- colorpicker/build.gradle | 2 +- .../ca/allanwang/kau/colorpicker/CircleView.kt | 2 +- .../ca/allanwang/kau/colorpicker/ColorPalette.kt | 2 + .../allanwang/kau/colorpicker/ColorPickerDialog.kt | 102 ++---- .../allanwang/kau/colorpicker/ColorPickerView.kt | 359 --------------------- .../main/res/values-da-rDK/strings_colorpicker.xml | 6 - .../main/res/values-de-rDE/strings_colorpicker.xml | 6 - .../main/res/values-es-rES/strings_colorpicker.xml | 6 - .../main/res/values-fr-rFR/strings_colorpicker.xml | 6 - .../main/res/values-gl-rES/strings_colorpicker.xml | 6 - .../main/res/values-hu-rHU/strings_colorpicker.xml | 6 - .../main/res/values-in-rID/strings_colorpicker.xml | 6 - .../main/res/values-it-rIT/strings_colorpicker.xml | 6 - .../main/res/values-ko-rKR/strings_colorpicker.xml | 6 - .../main/res/values-nl-rNL/strings_colorpicker.xml | 6 - .../main/res/values-no-rNO/strings_colorpicker.xml | 6 - .../main/res/values-pl-rPL/strings_colorpicker.xml | 6 - .../main/res/values-pt-rBR/strings_colorpicker.xml | 6 - .../main/res/values-pt-rPT/strings_colorpicker.xml | 6 - .../main/res/values-sr-rSP/strings_colorpicker.xml | 6 - .../main/res/values-sv-rSE/strings_colorpicker.xml | 6 - .../main/res/values-th-rTH/strings_colorpicker.xml | 6 - .../main/res/values-tr-rTR/strings_colorpicker.xml | 6 - .../main/res/values-uk-rUA/strings_colorpicker.xml | 6 - .../main/res/values-vi-rVN/strings_colorpicker.xml | 6 - .../main/res/values-zh-rCN/strings_colorpicker.xml | 6 - .../main/res/values-zh-rTW/strings_colorpicker.xml | 6 - colorpicker/src/main/res/values/dimens.xml | 3 - .../src/main/res/values/strings_colorpicker.xml | 5 - .../kotlin/ca/allanwang/kau/utils/ContextUtils.kt | 21 +- .../main/kotlin/ca/allanwang/kau/xml/Changelog.kt | 7 +- kpref-activity/build.gradle | 2 +- .../kau/kpref/activity/items/KPrefColorPicker.kt | 35 +- sample/build.gradle | 2 + .../kotlin/ca/allanwang/kau/sample/MainActivity.kt | 27 +- 36 files changed, 91 insertions(+), 612 deletions(-) delete mode 100644 colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerView.kt delete mode 100644 colorpicker/src/main/res/values-da-rDK/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-de-rDE/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-es-rES/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-fr-rFR/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-gl-rES/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-hu-rHU/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-in-rID/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-it-rIT/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-ko-rKR/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-nl-rNL/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-no-rNO/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-pl-rPL/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-pt-rBR/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-pt-rPT/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-sr-rSP/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-sv-rSE/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-th-rTH/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-tr-rTR/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-uk-rUA/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-vi-rVN/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-zh-rCN/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values-zh-rTW/strings_colorpicker.xml delete mode 100644 colorpicker/src/main/res/values/dimens.xml delete mode 100644 colorpicker/src/main/res/values/strings_colorpicker.xml diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt index 2bcedaa..8c14a92 100644 --- a/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt @@ -49,7 +49,7 @@ open class Versions { val iconicsCommunity = "3.5.95.1" // https://github.com/afollestad/material-dialogs/releases - val materialDialog = "0.9.6.0" + val materialDialog = "3.0.0-rc2" // https://mvnrepository.com/artifact/androidx.test.espresso/espresso-core?repo=google val espresso = "3.1.1" diff --git a/colorpicker/build.gradle b/colorpicker/build.gradle index 9b52cd4..4b89e10 100644 --- a/colorpicker/build.gradle +++ b/colorpicker/build.gradle @@ -7,7 +7,7 @@ apply from: '../android-lib.gradle' dependencies { implementation project(':core') - implementation "com.afollestad.material-dialogs:commons:${kau.materialDialog}" + implementation "com.afollestad.material-dialogs:color:${kau.materialDialog}" } apply from: '../artifacts.gradle' diff --git a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/CircleView.kt b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/CircleView.kt index 29257d8..e748677 100644 --- a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/CircleView.kt +++ b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/CircleView.kt @@ -238,4 +238,4 @@ class CircleView @JvmOverloads constructor(context: Context, attrs: AttributeSet @ColorInt fun shiftColorUp(@ColorInt color: Int): Int = shiftColor(color, 1.1f) } -} +} \ No newline at end of file diff --git a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPalette.kt b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPalette.kt index d9db160..113020c 100644 --- a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPalette.kt +++ b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPalette.kt @@ -19,6 +19,8 @@ import android.graphics.Color /** * @author Aidan Follestad (afollestad) + * + * Modified by Allan Wang */ internal object ColorPalette { diff --git a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerDialog.kt b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerDialog.kt index 4202db1..02a1fff 100644 --- a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerDialog.kt +++ b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerDialog.kt @@ -15,90 +15,52 @@ */ package ca.allanwang.kau.colorpicker -import android.content.Context +import android.annotation.SuppressLint import android.graphics.Color -import androidx.annotation.DimenRes -import androidx.annotation.StringRes -import ca.allanwang.kau.utils.INVALID_ID -import ca.allanwang.kau.utils.string +import androidx.annotation.ColorInt import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.Theme +import com.afollestad.materialdialogs.color.ColorCallback +import com.afollestad.materialdialogs.color.colorChooser + +sealed class ColorOptions(val colors: IntArray, val subColors: Array?) + +object PrimaryColors : ColorOptions(ColorPalette.PRIMARY_COLORS, ColorPalette.PRIMARY_COLORS_SUB) +object AccentColors : ColorOptions(ColorPalette.ACCENT_COLORS, ColorPalette.ACCENT_COLORS_SUB) +class CustomColors(colors: IntArray, subColors: Array? = null) : ColorOptions(colors, subColors) class ColorBuilder : ColorContract { - override var title: String? = null - override var titleRes: Int = INVALID_ID + override var colors: ColorOptions = PrimaryColors override var allowCustom: Boolean = true override var allowCustomAlpha: Boolean = false - override var isAccent: Boolean = false override var defaultColor: Int = Color.BLACK - override var doneText: Int = R.string.kau_done - override var backText: Int = R.string.kau_back - override var cancelText: Int = R.string.kau_cancel - override var presetText: Int = R.string.kau_md_presets - override var customText: Int = R.string.kau_custom - get() = if (allowCustom) field else 0 - override var dynamicButtonColors: Boolean = true - override var circleSizeRes: Int = R.dimen.kau_color_circle_size - override var colorCallback: ((selectedColor: Int) -> Unit)? = null - override var colorsTop: IntArray? = null - override var colorsSub: Array? = null - override var theme: Theme? = null + override var callback: ColorCallback = null } interface ColorContract { - var title: String? - @setparam:StringRes - var titleRes: Int + var colors: ColorOptions var allowCustom: Boolean var allowCustomAlpha: Boolean - var isAccent: Boolean - @setparam:StringRes + @setparam:ColorInt var defaultColor: Int - @setparam:StringRes - var doneText: Int - @setparam:StringRes - var backText: Int - @setparam:StringRes - var cancelText: Int - @setparam:StringRes - var presetText: Int - @setparam:StringRes - var customText: Int - var dynamicButtonColors: Boolean - @setparam:DimenRes - var circleSizeRes: Int - var colorCallback: ((selectedColor: Int) -> Unit)? - var colorsTop: IntArray? - var colorsSub: Array? - var theme: Theme? + var callback: ColorCallback } +@SuppressLint("CheckResult") +fun MaterialDialog.kauColorChooser(action: ColorContract.() -> Unit) = + kauColorChooser(ColorBuilder().apply(action)) + /** - * This is the extension that allows us to initialize the dialog - * Note that this returns just the dialog; you still need to call .show() to show it + * Thin wrapper that exposes color chooser options as [ColorContract] */ -fun Context.colorPickerDialog(action: ColorContract.() -> Unit): MaterialDialog { - val b = ColorBuilder() - b.action() - return colorPickerDialog(b) -} - -fun Context.colorPickerDialog(contract: ColorContract): MaterialDialog { - val view = ColorPickerView(this) - val dialog = with(MaterialDialog.Builder(this)) { - title(string(contract.titleRes, contract.title) ?: string(R.string.kau_md_color_palette)) - customView(view, false) - autoDismiss(false) - positiveText(contract.doneText) - negativeText(contract.cancelText) - if (contract.allowCustom) neutralText(contract.presetText) - onPositive { dialog, _ -> contract.colorCallback?.invoke(view.selectedColor); dialog.dismiss() } - onNegative { _, _ -> view.backOrCancel() } - if (contract.allowCustom) onNeutral { _, _ -> view.toggleCustom() } - showListener { view.refreshColors() } - if (contract.theme != null) theme(contract.theme!!) - build() - } - view.bind(contract, dialog) - return dialog -} +@SuppressLint("CheckResult") +fun MaterialDialog.kauColorChooser(c: ColorContract) { + colorChooser( + colors = c.colors.colors, + subColors = c.colors.subColors, + initialSelection = c.defaultColor, + allowCustomArgb = c.allowCustom, + showAlphaSelector = c.allowCustomAlpha, + selection = c.callback + ) + positiveButton(R.string.kau_done) +} \ No newline at end of file diff --git a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerView.kt b/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerView.kt deleted file mode 100644 index ab0b149..0000000 --- a/colorpicker/src/main/kotlin/ca/allanwang/kau/colorpicker/ColorPickerView.kt +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright 2018 Allan Wang - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ca.allanwang.kau.colorpicker - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.Color -import android.text.Editable -import android.text.InputFilter -import android.text.TextWatcher -import android.util.AttributeSet -import android.view.View -import android.view.ViewGroup -import android.widget.AbsListView -import android.widget.BaseAdapter -import android.widget.EditText -import android.widget.LinearLayout -import android.widget.ScrollView -import android.widget.SeekBar -import android.widget.TextView -import androidx.annotation.ColorInt -import androidx.core.content.res.ResourcesCompat -import ca.allanwang.kau.utils.colorToForeground -import ca.allanwang.kau.utils.dimen -import ca.allanwang.kau.utils.fadeIn -import ca.allanwang.kau.utils.fadeOut -import ca.allanwang.kau.utils.gone -import ca.allanwang.kau.utils.isColorDark -import ca.allanwang.kau.utils.isColorVisibleOn -import ca.allanwang.kau.utils.isVisible -import ca.allanwang.kau.utils.resolveColor -import ca.allanwang.kau.utils.tint -import ca.allanwang.kau.utils.toHexString -import ca.allanwang.kau.utils.visible -import com.afollestad.materialdialogs.DialogAction -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.color.FillGridView -import java.util.Locale - -/** - * Created by Allan Wang on 2017-06-08. - * - * ColorPicker component of the ColorPickerDialog - */ -internal class ColorPickerView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ScrollView(context, attrs, defStyleAttr) { - val selectedColor: Int - get() = _selectedColor - private var _selectedColor: Int = -1 - private var isInSub: Boolean = false - private var isInCustom: Boolean = false - private var circleSize: Int = context.dimen(R.dimen.kau_color_circle_size).toInt() - @SuppressLint("PrivateResource") - private val backgroundColor = context.resolveColor( - R.attr.md_background_color, - if (context.resolveColor(android.R.attr.textColorPrimary).isColorDark) Color.WHITE else 0xff424242.toInt() - ) - private val backgroundColorTint = backgroundColor.colorToForeground() - private lateinit var dialog: MaterialDialog - private lateinit var builder: ColorContract - private lateinit var colorsTop: IntArray - private var colorsSub: Array? = null - private var topIndex: Int = -1 - private var subIndex: Int = -1 - private var colorIndex: Int - get() = if (isInSub) subIndex else topIndex - set(value) { - if (isInSub) subIndex = value - else { - topIndex = value - if (colorsSub != null && colorsSub!!.size > value) { - dialog.setActionButton(DialogAction.NEGATIVE, builder.backText) - isInSub = true - invalidateGrid() - } - } - } - - private val gridView: FillGridView - private val customFrame: LinearLayout - private val customColorIndicator: View - private val hexInput: EditText - private val alphaLabel: TextView - private val alphaSeekbar: SeekBar - private val alphaValue: TextView - private val redSeekbar: SeekBar - private val redValue: TextView - private val greenSeekbar: SeekBar - private val greenValue: TextView - private val blueSeekbar: SeekBar - private val blueValue: TextView - - private var customHexTextWatcher: TextWatcher? = null - private var customRgbListener: SeekBar.OnSeekBarChangeListener? = null - - init { - //noinspection PrivateResource - View.inflate(context, R.layout.md_dialog_colorchooser, this) - gridView = findViewById(R.id.md_grid) - customFrame = findViewById(R.id.md_colorChooserCustomFrame) - customColorIndicator = findViewById(R.id.md_colorIndicator) - hexInput = findViewById(R.id.md_hexInput) - alphaLabel = findViewById(R.id.md_colorALabel) - alphaSeekbar = findViewById(R.id.md_colorA) - alphaValue = findViewById(R.id.md_colorAValue) - redSeekbar = findViewById(R.id.md_colorR) - redValue = findViewById(R.id.md_colorRValue) - greenSeekbar = findViewById(R.id.md_colorG) - greenValue = findViewById(R.id.md_colorGValue) - blueSeekbar = findViewById(R.id.md_colorB) - blueValue = findViewById(R.id.md_colorBValue) - } - - fun bind(builder: ColorContract, dialog: MaterialDialog) { - this.builder = builder - this.dialog = dialog - this.colorsTop = with(builder) { - when { - colorsTop != null -> colorsTop!! - isAccent -> ColorPalette.ACCENT_COLORS - else -> ColorPalette.PRIMARY_COLORS - } - } - this.colorsSub = with(builder) { - when { - colorsTop != null -> colorsSub - isAccent -> ColorPalette.ACCENT_COLORS_SUB - else -> ColorPalette.PRIMARY_COLORS_SUB - } - } - this._selectedColor = builder.defaultColor - if (builder.allowCustom) { - if (!builder.allowCustomAlpha) { - alphaLabel.gone() - alphaSeekbar.gone() - alphaValue.gone() - hexInput.hint = String.format("%06X", _selectedColor) - hexInput.filters = arrayOf(InputFilter.LengthFilter(6)) - } else { - hexInput.hint = String.format("%08X", _selectedColor) - hexInput.filters = arrayOf(InputFilter.LengthFilter(8)) - } - } - if (findColor(_selectedColor) || !builder.allowCustom) isInCustom = true // when toggled this will be false - toggleCustom() - } - - fun backOrCancel() { - if (isInSub) { - dialog.setActionButton(DialogAction.NEGATIVE, builder.cancelText) - //to top - isInSub = false - subIndex = -1 - invalidateGrid() - } else { - dialog.cancel() - } - } - - fun toggleCustom() { - isInCustom = !isInCustom - if (isInCustom) { - isInSub = false - if (builder.allowCustom) dialog.setActionButton(DialogAction.NEUTRAL, builder.presetText) - dialog.setActionButton(DialogAction.NEGATIVE, builder.cancelText) - customHexTextWatcher = object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} - - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - _selectedColor = try { - Color.parseColor("#$s") - } catch (e: IllegalArgumentException) { - Color.BLACK - } - customColorIndicator.setBackgroundColor(_selectedColor) - if (alphaSeekbar.isVisible) { - val alpha = Color.alpha(_selectedColor) - alphaSeekbar.progress = alpha - alphaValue.text = String.format(Locale.CANADA, "%d", alpha) - } - redSeekbar.progress = Color.red(_selectedColor) - greenSeekbar.progress = Color.green(_selectedColor) - blueSeekbar.progress = Color.blue(_selectedColor) - isInSub = false - topIndex = -1 - subIndex = -1 - refreshColors() - } - - override fun afterTextChanged(s: Editable?) {} - } - hexInput.setText(_selectedColor.toHexString(builder.allowCustomAlpha, false)) - hexInput.addTextChangedListener(customHexTextWatcher) - customRgbListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (fromUser) { - val color = if (builder.allowCustomAlpha) - Color.argb( - alphaSeekbar.progress, - redSeekbar.progress, - greenSeekbar.progress, - blueSeekbar.progress - ) - else Color.rgb( - redSeekbar.progress, - greenSeekbar.progress, - blueSeekbar.progress - ) - - hexInput.setText(color.toHexString(builder.allowCustomAlpha, false)) - } - if (builder.allowCustomAlpha) alphaValue.text = alphaSeekbar.progress.toString() - redValue.text = redSeekbar.progress.toString() - greenValue.text = greenSeekbar.progress.toString() - blueValue.text = blueSeekbar.progress.toString() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) = Unit - - override fun onStopTrackingTouch(seekBar: SeekBar) = Unit - } - redSeekbar.setOnSeekBarChangeListener(customRgbListener) - greenSeekbar.setOnSeekBarChangeListener(customRgbListener) - blueSeekbar.setOnSeekBarChangeListener(customRgbListener) - if (alphaSeekbar.isVisible) - alphaSeekbar.setOnSeekBarChangeListener(customRgbListener) - hexInput.setText(_selectedColor.toHexString(alphaSeekbar.isVisible, false)) - gridView.fadeOut(onFinish = { gridView.gone() }) - customFrame.fadeIn() - } else { - findColor(_selectedColor) - if (builder.allowCustom) dialog.setActionButton(DialogAction.NEUTRAL, builder.customText) - dialog.setActionButton(DialogAction.NEGATIVE, if (isInSub) builder.backText else builder.cancelText) - gridView.fadeIn(onStart = this::invalidateGrid) - customFrame.fadeOut(onFinish = { customFrame.gone() }) - hexInput.removeTextChangedListener(customHexTextWatcher) - customHexTextWatcher = null - alphaSeekbar.setOnSeekBarChangeListener(null) - redSeekbar.setOnSeekBarChangeListener(null) - greenSeekbar.setOnSeekBarChangeListener(null) - blueSeekbar.setOnSeekBarChangeListener(null) - customRgbListener = null - } - } - - fun refreshColors() { - if (!isInCustom) findColor(_selectedColor) - // Ensure that our tinted color is still visible against the background - val visibleColor = if (_selectedColor.isColorVisibleOn(backgroundColor)) _selectedColor else backgroundColorTint - if (builder.dynamicButtonColors) { - dialog.getActionButton(DialogAction.POSITIVE).setTextColor(visibleColor) - dialog.getActionButton(DialogAction.NEGATIVE).setTextColor(visibleColor) - dialog.getActionButton(DialogAction.NEUTRAL).setTextColor(visibleColor) - } - if (!builder.allowCustom || !isInCustom) return - if (builder.allowCustomAlpha) - alphaSeekbar.visible().tint(visibleColor) - redSeekbar.tint(visibleColor) - greenSeekbar.tint(visibleColor) - blueSeekbar.tint(visibleColor) - hexInput.tint(visibleColor) - } - - private fun findColor(@ColorInt color: Int): Boolean { - topIndex = -1 - subIndex = -1 - colorsTop.forEachIndexed { index, topColor -> - // First check for sub colors, then if the top color matches - if (findSubColor(color, index) || topColor == color) { - topIndex = index - return true - } - } - return false - } - - private fun findSubColor(@ColorInt color: Int, topIndex: Int): Boolean { - subIndex = colorsSub?.getOrNull(topIndex)?.indexOfFirst { color == it } ?: -1 - return subIndex != -1 - } - - private fun invalidateGrid() { - if (gridView.adapter == null) { - gridView.adapter = ColorGridAdapter() - gridView.selector = ResourcesCompat.getDrawable(resources, R.drawable.kau_transparent, null) - } else { - (gridView.adapter as BaseAdapter).notifyDataSetChanged() - } - } - - inner class ColorGridAdapter : BaseAdapter(), OnClickListener, OnLongClickListener { - override fun onClick(v: View) { - val (pos, color) = v.tagData ?: return - if (colorIndex == pos && isInSub) - return - circleAt(colorIndex)?.animateSelected(false) - _selectedColor = color - colorIndex = pos - refreshColors() - if (isInSub) - circleAt(colorIndex)?.animateSelected(true) - // Otherwise we are invalidating our grid, so there is no point in animating - } - - private fun circleAt(index: Int): CircleView? = - if (index == -1) null - else gridView.getChildAt(index) as? CircleView - - private val View.tagData: Pair? - get() { - val tags = (tag as? String)?.split(":") ?: return null - val pos = tags[0].toIntOrNull() ?: return null - val color = tags[1].toIntOrNull() ?: return null - return pos to color - } - - override fun onLongClick(v: View): Boolean { - val (_, color) = v.tagData ?: return false - (v as? CircleView)?.showHint(color) ?: return false - return true - } - - override fun getItem(position: Int): Int = if (isInSub) colorsSub!![topIndex][position] else colorsTop[position] - - override fun getCount(): Int = if (isInSub) colorsSub!![topIndex].size else colorsTop.size - - override fun getItemId(position: Int): Long = position.toLong() - - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val view: CircleView = convertView as? CircleView ?: CircleView(context).apply { - layoutParams = AbsListView.LayoutParams(circleSize, circleSize) - setOnClickListener(this@ColorGridAdapter) - setOnLongClickListener(this@ColorGridAdapter) - } - val color: Int = getItem(position) - return view.apply { - setBackgroundColor(color) - isSelected = colorIndex == position - tag = "$position:$color" - } - } - } -} diff --git a/colorpicker/src/main/res/values-da-rDK/strings_colorpicker.xml b/colorpicker/src/main/res/values-da-rDK/strings_colorpicker.xml deleted file mode 100644 index 334896f..0000000 --- a/colorpicker/src/main/res/values-da-rDK/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Farvepalette - Forhåndsvalg - diff --git a/colorpicker/src/main/res/values-de-rDE/strings_colorpicker.xml b/colorpicker/src/main/res/values-de-rDE/strings_colorpicker.xml deleted file mode 100644 index 5763d20..0000000 --- a/colorpicker/src/main/res/values-de-rDE/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Farbpalette - Vorlagen - diff --git a/colorpicker/src/main/res/values-es-rES/strings_colorpicker.xml b/colorpicker/src/main/res/values-es-rES/strings_colorpicker.xml deleted file mode 100644 index 2be5b2c..0000000 --- a/colorpicker/src/main/res/values-es-rES/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Paleta de colores - Ajustes preestablecidos - diff --git a/colorpicker/src/main/res/values-fr-rFR/strings_colorpicker.xml b/colorpicker/src/main/res/values-fr-rFR/strings_colorpicker.xml deleted file mode 100644 index 19c2935..0000000 --- a/colorpicker/src/main/res/values-fr-rFR/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Palette de couleurs - Réglages prédéfinis - diff --git a/colorpicker/src/main/res/values-gl-rES/strings_colorpicker.xml b/colorpicker/src/main/res/values-gl-rES/strings_colorpicker.xml deleted file mode 100644 index 5a42281..0000000 --- a/colorpicker/src/main/res/values-gl-rES/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Paleta de cores - Axustes predefinidos - diff --git a/colorpicker/src/main/res/values-hu-rHU/strings_colorpicker.xml b/colorpicker/src/main/res/values-hu-rHU/strings_colorpicker.xml deleted file mode 100644 index 69b3850..0000000 --- a/colorpicker/src/main/res/values-hu-rHU/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Színpaletta - Sablonok - diff --git a/colorpicker/src/main/res/values-in-rID/strings_colorpicker.xml b/colorpicker/src/main/res/values-in-rID/strings_colorpicker.xml deleted file mode 100644 index d7ddb5d..0000000 --- a/colorpicker/src/main/res/values-in-rID/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Palet warna - Preset - diff --git a/colorpicker/src/main/res/values-it-rIT/strings_colorpicker.xml b/colorpicker/src/main/res/values-it-rIT/strings_colorpicker.xml deleted file mode 100644 index b7c907d..0000000 --- a/colorpicker/src/main/res/values-it-rIT/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Tavolozza dei colori - Preimpostazioni - diff --git a/colorpicker/src/main/res/values-ko-rKR/strings_colorpicker.xml b/colorpicker/src/main/res/values-ko-rKR/strings_colorpicker.xml deleted file mode 100644 index 92ad098..0000000 --- a/colorpicker/src/main/res/values-ko-rKR/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 색상 팔레트 - 사전 설정 - diff --git a/colorpicker/src/main/res/values-nl-rNL/strings_colorpicker.xml b/colorpicker/src/main/res/values-nl-rNL/strings_colorpicker.xml deleted file mode 100644 index 83e4089..0000000 --- a/colorpicker/src/main/res/values-nl-rNL/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Kleurenpalet - Voorinstellingen - diff --git a/colorpicker/src/main/res/values-no-rNO/strings_colorpicker.xml b/colorpicker/src/main/res/values-no-rNO/strings_colorpicker.xml deleted file mode 100644 index fb15bbb..0000000 --- a/colorpicker/src/main/res/values-no-rNO/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Fargepalett - Forhåndsinnstillinger - diff --git a/colorpicker/src/main/res/values-pl-rPL/strings_colorpicker.xml b/colorpicker/src/main/res/values-pl-rPL/strings_colorpicker.xml deleted file mode 100644 index e9fea97..0000000 --- a/colorpicker/src/main/res/values-pl-rPL/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Paleta kolorów - Zdefiniowane - diff --git a/colorpicker/src/main/res/values-pt-rBR/strings_colorpicker.xml b/colorpicker/src/main/res/values-pt-rBR/strings_colorpicker.xml deleted file mode 100644 index 67d239d..0000000 --- a/colorpicker/src/main/res/values-pt-rBR/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Paleta de Cores - Predefinições - diff --git a/colorpicker/src/main/res/values-pt-rPT/strings_colorpicker.xml b/colorpicker/src/main/res/values-pt-rPT/strings_colorpicker.xml deleted file mode 100644 index 9346ff5..0000000 --- a/colorpicker/src/main/res/values-pt-rPT/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Paleta de cores - Predefinições - diff --git a/colorpicker/src/main/res/values-sr-rSP/strings_colorpicker.xml b/colorpicker/src/main/res/values-sr-rSP/strings_colorpicker.xml deleted file mode 100644 index 6459b1b..0000000 --- a/colorpicker/src/main/res/values-sr-rSP/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Палета боја - Предподешења - diff --git a/colorpicker/src/main/res/values-sv-rSE/strings_colorpicker.xml b/colorpicker/src/main/res/values-sv-rSE/strings_colorpicker.xml deleted file mode 100644 index 565bb71..0000000 --- a/colorpicker/src/main/res/values-sv-rSE/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Färgpalett - Förval - diff --git a/colorpicker/src/main/res/values-th-rTH/strings_colorpicker.xml b/colorpicker/src/main/res/values-th-rTH/strings_colorpicker.xml deleted file mode 100644 index 9dbf908..0000000 --- a/colorpicker/src/main/res/values-th-rTH/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - ชุดสี - ค่าที่ตั้งไว้ - diff --git a/colorpicker/src/main/res/values-tr-rTR/strings_colorpicker.xml b/colorpicker/src/main/res/values-tr-rTR/strings_colorpicker.xml deleted file mode 100644 index fd90b4a..0000000 --- a/colorpicker/src/main/res/values-tr-rTR/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Renk paleti - Hazır ayarlar - diff --git a/colorpicker/src/main/res/values-uk-rUA/strings_colorpicker.xml b/colorpicker/src/main/res/values-uk-rUA/strings_colorpicker.xml deleted file mode 100644 index 9120a10..0000000 --- a/colorpicker/src/main/res/values-uk-rUA/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Кольорова палітра - Пресети - diff --git a/colorpicker/src/main/res/values-vi-rVN/strings_colorpicker.xml b/colorpicker/src/main/res/values-vi-rVN/strings_colorpicker.xml deleted file mode 100644 index 68bacae..0000000 --- a/colorpicker/src/main/res/values-vi-rVN/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Bảng màu - Cài đặt sẵn - diff --git a/colorpicker/src/main/res/values-zh-rCN/strings_colorpicker.xml b/colorpicker/src/main/res/values-zh-rCN/strings_colorpicker.xml deleted file mode 100644 index 38f4aeb..0000000 --- a/colorpicker/src/main/res/values-zh-rCN/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 调色板 - 预设 - diff --git a/colorpicker/src/main/res/values-zh-rTW/strings_colorpicker.xml b/colorpicker/src/main/res/values-zh-rTW/strings_colorpicker.xml deleted file mode 100644 index a7fb17b..0000000 --- a/colorpicker/src/main/res/values-zh-rTW/strings_colorpicker.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 調色板 - 預設 - diff --git a/colorpicker/src/main/res/values/dimens.xml b/colorpicker/src/main/res/values/dimens.xml deleted file mode 100644 index 193940e..0000000 --- a/colorpicker/src/main/res/values/dimens.xml +++ /dev/null @@ -1,3 +0,0 @@ - - 56dp - diff --git a/colorpicker/src/main/res/values/strings_colorpicker.xml b/colorpicker/src/main/res/values/strings_colorpicker.xml deleted file mode 100644 index a470390..0000000 --- a/colorpicker/src/main/res/values/strings_colorpicker.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - Color Palette - Presets - diff --git a/core/src/main/kotlin/ca/allanwang/kau/utils/ContextUtils.kt b/core/src/main/kotlin/ca/allanwang/kau/utils/ContextUtils.kt index 94750e3..82d5608 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/utils/ContextUtils.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/utils/ContextUtils.kt @@ -45,7 +45,9 @@ import androidx.annotation.StringRes import androidx.core.content.ContextCompat import ca.allanwang.kau.R import ca.allanwang.kau.logging.KL +import com.afollestad.materialdialogs.DialogBehavior import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.ModalDialog /** * Created by Allan Wang on 2017-06-03. @@ -193,17 +195,20 @@ fun Context.resolveString(@AttrRes attr: Int, fallback: String = ""): String { } /** - * Wrapper function for the MaterialDialog adapterBuilder - * There is no need to call build() or show() as those are done by default + * Wrapper function for MaterialDialog + * + * Mainly handles invalid creations, such as showing a dialog when an activity is finishing + * See https://github.com/afollestad/material-dialogs/issues/1778 */ -inline fun Context.materialDialog(action: MaterialDialog.Builder.() -> Unit): MaterialDialog { - val builder = MaterialDialog.Builder(this) - builder.action() +inline fun Context.materialDialog( + dialogBehavior: DialogBehavior = ModalDialog, + action: MaterialDialog.() -> Unit +) { + val dialog = MaterialDialog(this, dialogBehavior) if (isFinishing) { - KL.d { "Material Dialog triggered from finishing context; did not show" } - return builder.build() + return KL.d { "Material Dialog triggered from finishing context; did not show" } } - return builder.show() + dialog.show(action) } fun Context.getDip(value: Float): Float = diff --git a/core/src/main/kotlin/ca/allanwang/kau/xml/Changelog.kt b/core/src/main/kotlin/ca/allanwang/kau/xml/Changelog.kt index 22e8e76..2e66a97 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/xml/Changelog.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/xml/Changelog.kt @@ -30,6 +30,7 @@ import ca.allanwang.kau.utils.ctxCoroutine import ca.allanwang.kau.utils.materialDialog import ca.allanwang.kau.utils.use import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.list.customListAdapter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -40,13 +41,13 @@ import org.xmlpull.v1.XmlPullParser * * Easy changelog loader */ -fun Context.showChangelog(@XmlRes xmlRes: Int, @ColorInt textColor: Int? = null, customize: MaterialDialog.Builder.() -> Unit = {}) { +fun Context.showChangelog(@XmlRes xmlRes: Int, @ColorInt textColor: Int? = null, customize: MaterialDialog.() -> Unit = {}) { ctxCoroutine.launch { val items = withContext(Dispatchers.Default) { parse(this@showChangelog, xmlRes) } materialDialog { title(R.string.kau_changelog) - positiveText(R.string.kau_great) - adapter(ChangelogAdapter(items, textColor), null) + positiveButton(R.string.kau_great) + customListAdapter(ChangelogAdapter(items, textColor), null) customize() } } diff --git a/kpref-activity/build.gradle b/kpref-activity/build.gradle index 8b2d12d..ef91e2b 100644 --- a/kpref-activity/build.gradle +++ b/kpref-activity/build.gradle @@ -6,8 +6,8 @@ apply from: '../android-lib.gradle' dependencies { implementation project(':core') - implementation project(':adapter') implementation project(':colorpicker') + implementation project(':adapter') } apply from: '../artifacts.gradle' diff --git a/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/items/KPrefColorPicker.kt b/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/items/KPrefColorPicker.kt index 0b53797..8b051c5 100644 --- a/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/items/KPrefColorPicker.kt +++ b/kpref-activity/src/main/kotlin/ca/allanwang/kau/kpref/activity/items/KPrefColorPicker.kt @@ -18,11 +18,12 @@ package ca.allanwang.kau.kpref.activity.items import ca.allanwang.kau.colorpicker.CircleView import ca.allanwang.kau.colorpicker.ColorBuilder import ca.allanwang.kau.colorpicker.ColorContract -import ca.allanwang.kau.colorpicker.colorPickerDialog +import ca.allanwang.kau.colorpicker.kauColorChooser import ca.allanwang.kau.kpref.activity.GlobalOptions import ca.allanwang.kau.kpref.activity.KClick import ca.allanwang.kau.kpref.activity.KPrefItemActions import ca.allanwang.kau.kpref.activity.R +import com.afollestad.materialdialogs.MaterialDialog /** * Created by Allan Wang on 2017-06-07. @@ -34,36 +35,37 @@ open class KPrefColorPicker(open val builder: KPrefColorContract) : KPrefItemBas override fun bindView(holder: ViewHolder, payloads: List) { super.bindView(holder, payloads) - builder.apply { - titleRes = core.titleFun() - colorCallback = { pref = it } - } if (builder.showPreview) { val preview = holder.bindInnerView(R.layout.kau_pref_color) preview.setBackgroundColor(pref) preview.withBorder = true - builder.apply { - colorCallback = { - pref = it - if (builder.showPreview) - preview.setBackgroundColor(it) - holder.updateTitle() - holder.updateDesc() - } + builder.callback = { _, color -> + pref = color + if (builder.showPreview) + preview.setBackgroundColor(color) + holder.updateTitle() + holder.updateDesc() } + } else { + builder.callback = { _, color -> pref = color } } } override fun KClick.defaultOnClick() { builder.defaultColor = pref - context.colorPickerDialog(builder).show() + MaterialDialog(context).show { + kauColorChooser(builder) + builder.dialogBuilder(this) + title(core.titleFun()) + } } /** * Extension of the base contract and [ColorContract] along with a showPreview option */ - interface KPrefColorContract : BaseContract, ColorContract { + interface KPrefColorContract : KPrefItemBase.BaseContract, ColorContract { var showPreview: Boolean + var dialogBuilder: MaterialDialog.() -> Unit } /** @@ -74,9 +76,10 @@ open class KPrefColorPicker(open val builder: KPrefColorContract) : KPrefItemBas titleId: Int, getter: () -> Int, setter: KPrefItemActions.(value: Int) -> Unit - ) : KPrefColorContract, BaseContract by BaseBuilder(globalOptions, titleId, getter, setter), + ) : KPrefColorContract, KPrefItemBase.BaseContract by BaseBuilder(globalOptions, titleId, getter, setter), ColorContract by ColorBuilder() { override var showPreview: Boolean = true + override var dialogBuilder: MaterialDialog.() -> Unit = {} } override fun getType(): Int = R.id.kau_item_pref_color_picker diff --git a/sample/build.gradle b/sample/build.gradle index 7316f1e..bb7cab0 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -122,6 +122,8 @@ dependencies { implementation project(':searchview') implementation project(':mediapicker') + implementation "com.afollestad.material-dialogs:input:${kau.materialDialog}" + testImplementation kauDependency.kotlinTest testImplementation kauDependency.junit diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt index d4a30bb..d9586c4 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt @@ -38,6 +38,7 @@ import ca.allanwang.kau.utils.string import ca.allanwang.kau.utils.toast import ca.allanwang.kau.utils.withSceneTransitionAnimation import ca.allanwang.kau.xml.showChangelog +import com.afollestad.materialdialogs.input.input import com.mikepenz.google_material_typeface_library.GoogleMaterial class MainActivity : KPrefActivity() { @@ -162,9 +163,10 @@ class MainActivity : KPrefActivity() { descRes = R.string.text_desc onClick = { itemView.context.materialDialog { - title("Type Text") - input("Type here", item.pref, { _, input -> item.pref = input.toString() }) - inputRange(0, 20) + title(text = "Type Text") + input("Type here", prefill = item.pref, maxLength = 20, allowEmpty = true) { _, input -> + item.pref = input.toString() + } } } } @@ -240,12 +242,11 @@ class MainActivity : KPrefActivity() { descRes = R.string.text_desc onClick = { itemView.context.materialDialog { - title("Type Text") - input("Type here", item.pref) { _, input -> + title(text = "Type Text") + input("Type here", prefill = item.pref, maxLength = 20, allowEmpty = true) { _, input -> item.pref = input.toString() reloadSelf() } - inputRange(0, 20) } } } @@ -260,9 +261,10 @@ class MainActivity : KPrefActivity() { KPrefSample.version = BuildConfig.VERSION_CODE if (!BuildConfig.DEBUG) showChangelog(R.xml.kau_changelog, KPrefSample.textColor) { - titleColor(KPrefSample.textColor) - backgroundColor(KPrefSample.bgColor) - positiveColor(KPrefSample.accentColor) + // TODO MD Color +// titleColor(KPrefSample.textColor) +// backgroundColor(KPrefSample.bgColor) +// positiveColor(KPrefSample.accentColor) } } supportActionBar?.apply { @@ -297,9 +299,10 @@ class MainActivity : KPrefActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.action_changelog -> showChangelog(R.xml.kau_changelog, KPrefSample.textColor) { - titleColor(KPrefSample.textColor) - backgroundColor(KPrefSample.bgColor) - positiveColor(KPrefSample.accentColor) + // TODO MD Color +// titleColor(KPrefSample.textColor) +// backgroundColor(KPrefSample.bgColor) +// positiveColor(KPrefSample.accentColor) } R.id.action_settings -> startActivity() R.id.action_email -> sendEmail(R.string.your_email, R.string.your_subject) -- cgit v1.2.3