From 8052a9a4b5f64191d19912d53e16d7e49a587a17 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Tue, 4 Jun 2019 01:02:35 -0400 Subject: Convert plugin to kotlin code --- .../kotlin/ca/allanwang/kau/ChangelogGenerator.kt | 104 +++++++++++++++++++++ .../main/kotlin/ca/allanwang/kau/Dependencies.kt | 14 +++ .../src/main/kotlin/ca/allanwang/kau/KauPlugin.kt | 17 ++++ .../src/main/kotlin/ca/allanwang/kau/Plugins.kt | 16 ++++ .../src/main/kotlin/ca/allanwang/kau/Versions.kt | 80 ++++++++++++++++ 5 files changed, 231 insertions(+) create mode 100644 buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt create mode 100644 buildSrc/src/main/kotlin/ca/allanwang/kau/Dependencies.kt create mode 100644 buildSrc/src/main/kotlin/ca/allanwang/kau/KauPlugin.kt create mode 100644 buildSrc/src/main/kotlin/ca/allanwang/kau/Plugins.kt create mode 100644 buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt (limited to 'buildSrc/src/main/kotlin/ca/allanwang') diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt new file mode 100644 index 0000000..8200484 --- /dev/null +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt @@ -0,0 +1,104 @@ +package ca.allanwang.kau + +import groovy.util.Node +import groovy.util.XmlParser +import org.gradle.api.GradleException +import org.gradle.api.Project +import java.io.File + +/** + * Given an xml of the format + * + * + * + * + * + * + * + * + * + * + * Outputs a changelog in markdown format + */ +open class ChangelogGenerator(private val project: Project) { + + class ChangelogException(message: String) : GradleException(message) + + private fun fail(message: String): Nothing = + throw ChangelogException(message) + + class ChangelogEntry(val version: String, val items: Array) + + private fun Node.forEachNode(action: (Node) -> Unit) { + children().forEach { + action(it as Node) + } + } + + fun read(inputUri: String): List { + val input = File(inputUri) + if (!input.exists()) { + fail("Could not generate changelog from ${input.absolutePath}") + } + + val parser = XmlParser().parse(inputUri) + + val entries: MutableList = mutableListOf() + var version: String? = null + val items: MutableList = mutableListOf() + + fun addEntry() { + version?.also { v -> + entries.add(ChangelogEntry(v, items.toTypedArray())) + items.clear() + } + } + + parser.depthFirst().mapNotNull { it as? Node }.forEach { n -> + when (n.name()) { + "version" -> { + addEntry() + version = n.attribute("title")?.toString() ?: "" + } + "item" -> { + n.attribute("text")?.toString()?.takeIf(String::isNotBlank)?.let { + items.add(it) + } + } + } + } + addEntry() + return entries + } + + @JvmOverloads + fun generate(inputUri: String, outputUri: String = "${project.rootDir}/docs/Changelog.md") { + val entries = read(inputUri) + val output = File(outputUri) + if (output.exists()) { + if (output.isDirectory) { + fail("Cannot save changelog at directory ${output.absolutePath}") + } + if (output.isFile && !output.delete()) { + fail("Could not delete changelog at ${output.absolutePath}") + } + } else { + output.parentFile.mkdirs() + } + + if (!output.createNewFile()) { + fail("Could not create changelog file at ${output.absolutePath}") + } + val markdown = buildString { + append("# Changelog\n") + entries.forEach { e -> + append("\n## ${e.version}\n") + e.items.forEach { + append("* $it\n") + } + } + } + output.writeText(markdown) + println("Generated changelog at ${output.absolutePath}") + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/Dependencies.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/Dependencies.kt new file mode 100644 index 0000000..9e23ac4 --- /dev/null +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/Dependencies.kt @@ -0,0 +1,14 @@ +package ca.allanwang.kau + +/** + * Some common dependencies, backed by the supplied versions + */ +open class Dependencies { + private val v = Versions() + val kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${v.kotlin}" + val kotlinTest = "org.jetbrains.kotlin:kotlin-test-junit:${v.kotlin}" + val junit = "junit:junit:${v.junit}" + val espresso = "androidx.test.espresso:espresso-core:${v.espresso}" + val testRunner = "androidx.test.ext:junit:${v.testRunner}" + val testRules = "androidx.test:rules:${v.testRules}" +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/KauPlugin.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/KauPlugin.kt new file mode 100644 index 0000000..6be15e5 --- /dev/null +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/KauPlugin.kt @@ -0,0 +1,17 @@ +package ca.allanwang.kau + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.create + +class KauPlugin : Plugin { + + override fun apply(project: Project) { + project.extensions.run { + create("kau") + create("kauDependency") + create("kauPlugin") + create("kauChangelog", project) + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/Plugins.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/Plugins.kt new file mode 100644 index 0000000..c8265ab --- /dev/null +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/Plugins.kt @@ -0,0 +1,16 @@ +package ca.allanwang.kau + +/** + * Some common buildscript plugins, backed by the supplied versions + */ +open class Plugins { + private val v = Versions() + val android = "com.android.tools.build:gradle:${v.gradlePlugin}" + val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:${v.kotlin}" + val androidMaven = "com.github.dcendents:android-maven-gradle-plugin:${v.mavenPlugin}" + val playPublisher = "com.github.triplet.gradle:play-publisher:${v.playPublishPlugin}" + val dexCount = "com.getkeepsafe.dexcount:dexcount-gradle-plugin:${v.dexCountPlugin}" + val gitVersion = + "gradle.plugin.com.gladed.gradle.androidgitversion:gradle-android-git-version:${v.gitVersionPlugin}" + val spotless = "com.diffplug.spotless:spotless-plugin-gradle:${v.spotless}" +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt new file mode 100644 index 0000000..2bcedaa --- /dev/null +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/Versions.kt @@ -0,0 +1,80 @@ +package ca.allanwang.kau + +open class Versions { + val coreMinSdk = 19 + val minSdk = 21 + val targetSdk = 28 + + // https://developer.android.com/studio/releases/build-tools + val buildTools = "28.0.3" + + // https://mvnrepository.com/artifact/androidx.appcompat/appcompat?repo=google + val appcompat = "1.0.2" + + // https://mvnrepository.com/artifact/com.google.android.material/material + val googleMaterial = "1.0.0" + + // https://mvnrepository.com/artifact/androidx.recyclerview/recyclerview + val recyclerView = "1.0.0" + + // https://mvnrepository.com/artifact/androidx.cardview/cardview + val cardView = "1.0.0" + + // https://mvnrepository.com/artifact/androidx.constraintlayout/constraintlayout + val constraintLayout = "1.1.3" + + // https://kotlinlang.org/docs/reference/using-gradle.html + val kotlin = "1.3.31" + + // https://github.com/Kotlin/kotlinx.coroutines/releases + val coroutines = "1.2.1" + + // https://github.com/mikepenz/AboutLibraries/releases + val aboutLibraries = "6.2.3" + + // https://github.com/wasabeef/Blurry/releases + val blurry = "3.0.0" + + // https://github.com/mikepenz/FastAdapter#using-maven + val fastAdapter = "3.3.1" + val fastAdapterCommons = fastAdapter + + // https://github.com/bumptech/glide/releases + val glide = "4.9.0" + + // https://github.com/mikepenz/Android-Iconics#1-provide-the-gradle-dependency + val iconics = "3.2.5" + val iconicsGoogle = "3.0.1.3" + val iconicsMaterial = "2.2.0.5" + val iconicsCommunity = "3.5.95.1" + + // https://github.com/afollestad/material-dialogs/releases + val materialDialog = "0.9.6.0" + + // https://mvnrepository.com/artifact/androidx.test.espresso/espresso-core?repo=google + val espresso = "3.1.1" + + // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api + val junit = "4.12" + + val testRunner = "1.1.0" + + // https://mvnrepository.com/artifact/androidx.test/rules?repo=google + val testRules = "1.1.1" + + // https://github.com/diffplug/spotless/blob/master/plugin-gradle/CHANGES.md + val spotless = "3.18.0" + + // https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google + val gradlePlugin = "3.4.1" + // https://github.com/dcendents/android-maven-gradle-plugin/releases + val mavenPlugin = "2.1" + // https://github.com/Triple-T/gradle-play-publisher/releases + val playPublishPlugin = "2.1.0" + + // https://github.com/KeepSafe/dexcount-gradle-plugin/releases + val dexCountPlugin = "0.8.6" + + // https://github.com/gladed/gradle-android-git-version/releases + val gitVersionPlugin = "0.4.7" +} \ No newline at end of file -- cgit v1.2.3 From 2475607338e6c4c0b70dbcb307f0dc7058950a4d Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Wed, 5 Jun 2019 23:54:17 -0400 Subject: Kotlin dsl (#199) * Add blank settings kts and maven to gradle plugin * Return entry list --- buildSrc/build.gradle.kts | 1 + buildSrc/settings.gradle.kts | 0 buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt | 3 ++- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 buildSrc/settings.gradle.kts (limited to 'buildSrc/src/main/kotlin/ca/allanwang') diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 5939d89..83a3370 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,6 @@ plugins { `kotlin-dsl` + maven } group = "ca.allanwang" diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 0000000..e69de29 diff --git a/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt b/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt index 8200484..5e21b7e 100644 --- a/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt +++ b/buildSrc/src/main/kotlin/ca/allanwang/kau/ChangelogGenerator.kt @@ -72,7 +72,7 @@ open class ChangelogGenerator(private val project: Project) { } @JvmOverloads - fun generate(inputUri: String, outputUri: String = "${project.rootDir}/docs/Changelog.md") { + fun generate(inputUri: String, outputUri: String = "${project.rootDir}/docs/Changelog.md"): List { val entries = read(inputUri) val output = File(outputUri) if (output.exists()) { @@ -100,5 +100,6 @@ open class ChangelogGenerator(private val project: Project) { } output.writeText(markdown) println("Generated changelog at ${output.absolutePath}") + return entries } } \ No newline at end of file -- cgit v1.2.3 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 (limited to 'buildSrc/src/main/kotlin/ca/allanwang') 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