From 96f452c7bdd1abbd6fc1abf5c94f4895edb0a8ea Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Tue, 1 Apr 2025 11:56:58 +0800 Subject: [PATCH] =?UTF-8?q?6.6.2=20-=20Alpha5=20-=20=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=89=B2=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=9D=A2=E6=96=B0=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=94=AF=E6=8C=81=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changelog/lang_zh-Hans.json | 2 +- .../annotation/ReservedForCompatibility.kt | 5 +- .../autojs/extension/ArrayExtensions.kt | 6 + .../autojs/extension/NumberExtensions.kt | 23 +- .../autojs/extension/StringExtensions.kt | 26 ++ .../autojs/autojs/runtime/ConsoleTimeTable.kt | 4 +- .../runtime/api/augment/colors/Colors.kt | 177 +++++++++-- .../runtime/api/augment/global/Global.kt | 4 +- .../runtime/api/augment/jsox/Numberx.kt | 10 +- .../runtime/api/augment/util/Inspect.kt | 4 +- .../autojs/runtime/api/augment/util/Util.kt | 4 +- .../runtime/api/augment/util/VersionCodes.kt | 6 +- .../autojs/autojs/theme/ThemeColorManager.kt | 5 + .../autojs/theme/app/ColorItemAdapter.kt | 128 ++++++++ .../autojs/theme/app/ColorItemViewHolder.kt | 51 +++ .../theme/app/ColorLibrariesActivity.kt | 283 +++++++---------- .../autojs/theme/app/ColorLibraryActivity.kt | 234 +++----------- .../autojs/theme/app/ColorLibraryAdapter.kt | 34 ++ .../theme/app/ColorLibraryViewHolder.kt | 39 +++ .../autojs/theme/app/ColorSelectActivity.kt | 2 +- .../theme/app/ColorSelectBaseActivity.kt | 298 ++++++++++++++---- .../theme/app/ColorSettingRecyclerView.kt | 27 +- .../autojs/theme/widget/ThemeColorToolbar.kt | 2 - .../java/org/autojs/autojs/ui/BaseActivity.kt | 2 +- .../floating/layoutinspector/NodeInfoView.kt | 8 +- .../autojs/ui/main/FloatingActionMenu.java | 2 +- .../org/autojs/autojs/ui/main/MainActivity.kt | 8 +- .../ui/main/scripts/ExplorerFragment.kt | 2 +- .../autojs/ui/widget/SearchViewItem.java | 55 ++-- .../java/org/autojs/autojs/util/ColorUtils.kt | 29 +- .../java/org/autojs/autojs/util/ViewUtils.kt | 58 +++- ...ic_add_rounded_rectangle_outline_black.png | Bin 0 -> 13030 bytes .../res/drawable/ic_color_library_cloned.png | Bin 0 -> 33303 bytes .../res/drawable/ic_color_library_created.png | Bin 0 -> 6385 bytes .../res/drawable/ic_color_library_custom.png | Bin 6806 -> 0 bytes .../drawable/ic_color_library_imported.png | Bin 0 -> 14242 bytes .../drawable/ic_color_library_intelligent.png | Bin 0 -> 11956 bytes .../res/drawable/ic_color_palette_vector.xml | 10 +- app/src/main/res/drawable/ic_customize.png | Bin 0 -> 4116 bytes .../res/drawable/ic_file_download_black.png | Bin 0 -> 7515 bytes .../res/drawable/ic_file_download_white.png | Bin 0 -> 8898 bytes .../ic_file_download_white_cropped.png | Bin 0 -> 7184 bytes app/src/main/res/drawable/ic_filter.png | Bin 0 -> 24190 bytes .../main/res/drawable/ic_import_from_top.png | Bin 0 -> 6428 bytes .../res/drawable/ic_import_from_top_thick.png | Bin 0 -> 5751 bytes app/src/main/res/drawable/ic_regex.png | Bin 0 -> 9518 bytes .../mt_color_libraries_recycler_view_item.xml | 2 +- .../main/res/menu/menu_color_libraries.xml | 51 ++- app/src/main/res/menu/menu_color_library.xml | 5 +- app/src/main/res/values-ar/strings.xml | 15 + app/src/main/res/values-en/strings.xml | 15 + app/src/main/res/values-es/strings.xml | 15 + app/src/main/res/values-fr/strings.xml | 15 + app/src/main/res/values-ja/strings.xml | 15 + app/src/main/res/values-ko/strings.xml | 15 + app/src/main/res/values-ru/strings.xml | 15 + app/src/main/res/values-zh-rHK/strings.xml | 15 + app/src/main/res/values-zh-rTW/strings.xml | 15 + app/src/main/res/values-zh/strings.xml | 15 + app/src/main/res/values/colors.xml | 8 + app/src/main/res/values/strings.xml | 15 + app/src/main/res/values/styles.xml | 3 +- version.properties | 6 +- 63 files changed, 1220 insertions(+), 568 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/theme/app/ColorItemAdapter.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/app/ColorItemViewHolder.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryAdapter.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryViewHolder.kt create mode 100644 app/src/main/res/drawable/ic_add_rounded_rectangle_outline_black.png create mode 100644 app/src/main/res/drawable/ic_color_library_cloned.png create mode 100644 app/src/main/res/drawable/ic_color_library_created.png delete mode 100644 app/src/main/res/drawable/ic_color_library_custom.png create mode 100644 app/src/main/res/drawable/ic_color_library_imported.png create mode 100644 app/src/main/res/drawable/ic_color_library_intelligent.png create mode 100644 app/src/main/res/drawable/ic_customize.png create mode 100644 app/src/main/res/drawable/ic_file_download_black.png create mode 100644 app/src/main/res/drawable/ic_file_download_white.png create mode 100644 app/src/main/res/drawable/ic_file_download_white_cropped.png create mode 100644 app/src/main/res/drawable/ic_filter.png create mode 100644 app/src/main/res/drawable/ic_import_from_top.png create mode 100644 app/src/main/res/drawable/ic_import_from_top_thick.png create mode 100644 app/src/main/res/drawable/ic_regex.png diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 591d972c..f09a437f 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -5,7 +5,7 @@ "feature": [ "ui.statusBarAppearanceLight/statusBarAppearanceLightBy/navigationBarColor 等方法", "设置页面增加 \"文件扩展名\" 设置选项", - "主题色设置页面增加新布局支持" + "主题色设置页面增加新布局支持 (颜色库分组/主题色定位/颜色搜索)" ], "fix": [ "Android 15 状态栏背景颜色与主题色不一致的问题", diff --git a/app/src/main/java/org/autojs/autojs/annotation/ReservedForCompatibility.kt b/app/src/main/java/org/autojs/autojs/annotation/ReservedForCompatibility.kt index a35a332b..a7d7ddb5 100644 --- a/app/src/main/java/org/autojs/autojs/annotation/ReservedForCompatibility.kt +++ b/app/src/main/java/org/autojs/autojs/annotation/ReservedForCompatibility.kt @@ -1,4 +1,3 @@ -package org.autojs.autojs.annotation; +package org.autojs.autojs.annotation -public @interface ReservedForCompatibility { -} +annotation class ReservedForCompatibility diff --git a/app/src/main/java/org/autojs/autojs/extension/ArrayExtensions.kt b/app/src/main/java/org/autojs/autojs/extension/ArrayExtensions.kt index 8b4e83ec..76eb581a 100644 --- a/app/src/main/java/org/autojs/autojs/extension/ArrayExtensions.kt +++ b/app/src/main/java/org/autojs/autojs/extension/ArrayExtensions.kt @@ -1,5 +1,6 @@ package org.autojs.autojs.extension +import org.autojs.autojs.extension.AnyExtensions.jsBrief import org.autojs.autojs.util.RhinoUtils.UNDEFINED import org.autojs.autojs.util.RhinoUtils.newNativeObject import org.autojs.autojs.util.RhinoUtils.withRhinoContext @@ -84,4 +85,9 @@ object ArrayExtensions { } } + fun Array.jsArrayBrief(separator: String = ", ", appendPaddingSpace: Boolean = true) = when (appendPaddingSpace) { + true -> "[ ${this.joinToString(separator) { it.jsBrief() }} ]" + else -> "[${this.joinToString(separator) { it.jsBrief() }}]" + } + } diff --git a/app/src/main/java/org/autojs/autojs/extension/NumberExtensions.kt b/app/src/main/java/org/autojs/autojs/extension/NumberExtensions.kt index 7e1d00c8..5caadec1 100644 --- a/app/src/main/java/org/autojs/autojs/extension/NumberExtensions.kt +++ b/app/src/main/java/org/autojs/autojs/extension/NumberExtensions.kt @@ -1,8 +1,10 @@ package org.autojs.autojs.extension +import java.math.RoundingMode + object NumberExtensions { - val Number.string + val Number.jsString get() = when (this) { is Double -> when { this % 1.0 == 0.0 -> "%.0f".format(this) @@ -15,4 +17,23 @@ object NumberExtensions { else -> this.toString() } + @JvmStatic + @JvmOverloads + fun Double.roundToString(scale: Int, stripTrailingZeros: Boolean = true): String { + return toBigDecimal() + .setScale(scale, RoundingMode.HALF_UP) + .let { if (stripTrailingZeros) it.stripTrailingZeros() else it } + .toPlainString() + } + + @JvmStatic + @JvmOverloads + fun Double.roundToAlphaString(scale: Int = 2, keepTrailingZeroForFullAlpha: Boolean = true): String { + return toBigDecimal() + .setScale(scale, RoundingMode.HALF_UP) + .stripTrailingZeros() + .toPlainString() + .let { if (keepTrailingZeroForFullAlpha && it == "1") "1.0" else it } + } + } diff --git a/app/src/main/java/org/autojs/autojs/extension/StringExtensions.kt b/app/src/main/java/org/autojs/autojs/extension/StringExtensions.kt index c6e0a324..ea688345 100644 --- a/app/src/main/java/org/autojs/autojs/extension/StringExtensions.kt +++ b/app/src/main/java/org/autojs/autojs/extension/StringExtensions.kt @@ -4,6 +4,22 @@ import java.text.Normalizer object StringExtensions { + val String.estimateVisualWidth: Int + get() { + var width = 0 + var i = 0 + while (i < length) { + // 取 code point (可能是两位 surrogates 拼成一个 code point) + val cp = codePointAt(i) + // 移动下标, 跳过组合过的 surrogate + i += Character.charCount(cp) + + // 简易判断: 东亚全宽/Emoji 等 + width += if (isLikelyFullwidth(cp)) 2 else 1 + } + return width + } + fun String.toDoubleOrNaN() = this.toDoubleOrNull() ?: Double.NaN fun String.padStart(length: Int, padStr: String) = when { @@ -34,4 +50,14 @@ object StringExtensions { .lowercase() } + private fun isLikelyFullwidth(codePoint: Int) = when (codePoint) { + // CJK 中日韩统一表意文字 + in 0x4E00..0x9FFF -> true + // 常见的 Emoji 起始, 又或者判断 Character.getType(cp) + in 0x1F300..0x1FAFF -> true + // East Asian Fullwidth, Wide 等范围, 可参考 EastAsianWidth.txt + else -> false + } + + } diff --git a/app/src/main/java/org/autojs/autojs/runtime/ConsoleTimeTable.kt b/app/src/main/java/org/autojs/autojs/runtime/ConsoleTimeTable.kt index 05354296..f55c7571 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/ConsoleTimeTable.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/ConsoleTimeTable.kt @@ -1,7 +1,7 @@ package org.autojs.autojs.runtime import android.os.SystemClock -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.runtime.api.augment.console.Console import java.util.concurrent.ConcurrentHashMap @@ -17,7 +17,7 @@ class ConsoleTimeTable(private val scriptRuntime: ScriptRuntime) { @Synchronized fun print(label: String? = null) { val gap = SystemClock.uptimeMillis() - (mData[parseLabel(label)] ?: Double.NaN) - Console.log(scriptRuntime, arrayOf("${parseLabel(label)}: ${gap.string}ms")) + Console.log(scriptRuntime, arrayOf("${parseLabel(label)}: ${gap.jsString}ms")) mData.remove(parseLabel(label)) } diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/colors/Colors.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/colors/Colors.kt index b7ac08ef..0b1883e8 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/colors/Colors.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/colors/Colors.kt @@ -14,17 +14,23 @@ import org.autojs.autojs.core.image.ColorDetector import org.autojs.autojs.core.image.ColorTable import org.autojs.autojs.extension.AnyExtensions.isJsNullish import org.autojs.autojs.extension.AnyExtensions.jsSpecies +import org.autojs.autojs.extension.ArrayExtensions.jsArrayBrief import org.autojs.autojs.extension.ArrayExtensions.toNativeArray import org.autojs.autojs.extension.ArrayExtensions.toNativeObject -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.FlexibleArray.Companion.component1 +import org.autojs.autojs.extension.FlexibleArray.Companion.component2 +import org.autojs.autojs.extension.NumberExtensions.jsString +import org.autojs.autojs.extension.NumberExtensions.roundToAlphaString import org.autojs.autojs.extension.ScriptableExtensions.prop +import org.autojs.autojs.extension.ScriptableObjectExtensions.inquire import org.autojs.autojs.runtime.api.augment.Augmentable import org.autojs.autojs.runtime.api.augment.SimpleGetterProxy import org.autojs.autojs.runtime.api.augment.jsox.Numberx -import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException import org.autojs.autojs.runtime.exception.ShouldNeverHappenException +import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException import org.autojs.autojs.theme.ThemeColor import org.autojs.autojs.util.ColorUtils +import org.autojs.autojs.util.RhinoUtils.coerceBoolean import org.autojs.autojs.util.RhinoUtils.ensureNativeArrayLength import org.autojs.autojs.util.RhinoUtils.newNativeObject import org.mozilla.javascript.Context @@ -32,7 +38,6 @@ import org.mozilla.javascript.NativeArray import org.mozilla.javascript.NativeObject import org.mozilla.javascript.Scriptable import org.mozilla.javascript.Scriptable.NOT_FOUND -import java.math.RoundingMode import java.util.function.Supplier import kotlin.math.abs import kotlin.math.roundToInt @@ -122,6 +127,13 @@ object Colors : Augmentable(), SimpleGetterProxy { ::toHsva.name, ::toHsl.name, ::toHsla.name, + ::toRgbString.name, + ::toRgbaString.name, + // ::toArgbString.name, + // ::toHsvString.name, + // ::toHsvaString.name, + // ::toHslString.name, + // ::toHslaString.name, ::isSimilar.name, ::isEqual.name, ::toColorStateList.name, @@ -609,7 +621,7 @@ object Colors : Augmentable(), SimpleGetterProxy { when (it.size) { 1 -> rgbRhino(it[0]) 3 -> rgbRhino(it[0], it[1], it[2]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.rgb") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.rgb") } } @@ -647,7 +659,7 @@ object Colors : Augmentable(), SimpleGetterProxy { when (it.size) { 1 -> argbRhino(it[0]) 4 -> argbRhino(it[0], it[1], it[2], it[3]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.argb") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.argb") } } @@ -687,7 +699,7 @@ object Colors : Augmentable(), SimpleGetterProxy { 1 -> rgbaRhino(it[0]) 2 -> rgbaRhino(it[0], it[1]) 4 -> rgbaRhino(it[0], it[1], it[2], it[3]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.rgba") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.rgba") } } @@ -744,7 +756,7 @@ object Colors : Augmentable(), SimpleGetterProxy { when (it.size) { 1 -> hsvRhino(it[0]) 3 -> hsvRhino(it[0], it[1], it[2]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.hsv") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.hsv") } } @@ -780,7 +792,7 @@ object Colors : Augmentable(), SimpleGetterProxy { 1 -> hsvaRhino(it[0]) 2 -> hsvaRhino(it[0], it[1]) 4 -> hsvaRhino(it[0], it[1], it[2], it[3]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.hsva") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.hsva") } } @@ -829,7 +841,7 @@ object Colors : Augmentable(), SimpleGetterProxy { when (it.size) { 1 -> hslRhino(it[0]) 3 -> hslRhino(it[0], it[1], it[2]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.hsl") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.hsl") } } @@ -865,7 +877,7 @@ object Colors : Augmentable(), SimpleGetterProxy { 1 -> hslaRhino(it[0]) 2 -> hslaRhino(it[0], it[1]) 4 -> hslaRhino(it[0], it[1], it[2], it[3]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.hsla") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.hsla") } } @@ -914,7 +926,7 @@ object Colors : Augmentable(), SimpleGetterProxy { when (it.size) { 1 -> toRgbRhino(it[0]) 3 -> toRgbRhino(it[0], it[1], it[2]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.rgb") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.rgb") }.toNativeArray() } @@ -949,9 +961,9 @@ object Colors : Augmentable(), SimpleGetterProxy { @JvmStatic @RhinoSingletonFunctionInterface - fun toArgb(args: Array): List = ensureArgumentsLengthInRange(args, 1..2) { + fun toArgb(args: Array): NativeArray = ensureArgumentsLengthInRange(args, 1..2) { val (colorArg, optionsArg) = it - toArgbRhino(colorArg, optionsArg) + toArgbRhino(colorArg, optionsArg).toNativeArray() } @JvmStatic @@ -964,14 +976,14 @@ object Colors : Augmentable(), SimpleGetterProxy { @JvmStatic @RhinoSingletonFunctionInterface - fun toHsv(args: Array) = ensureArgumentsLengthInRange(args, 1..4) { + fun toHsv(args: Array): NativeArray = ensureArgumentsLengthInRange(args, 1..4) { when (it.size) { 1 -> toHsvRhino(it[0]) 2 -> toHsvRhino(it[0], it[1]) 3 -> toHsvRhino(it[0], it[1], it[2]) 4 -> toHsvRhino(it[0], it[1], it[2], it[3]) - else -> ShouldNeverHappenException() - } + else -> throw ShouldNeverHappenException() + }.toNativeArray() } /** @@ -1030,14 +1042,14 @@ object Colors : Augmentable(), SimpleGetterProxy { @JvmStatic @RhinoSingletonFunctionInterface - fun toHsva(args: Array) = ensureArgumentsLengthInRange(args, 1..5) { + fun toHsva(args: Array): NativeArray = ensureArgumentsLengthInRange(args, 1..5) { when (it.size) { 1 -> toHsvaRhino(it[0]) 2 -> toHsvaRhino(it[0], it[1]) 4 -> toHsvaRhino(it[0], it[1], it[2], it[3]) 5 -> toHsvaRhino(it[0], it[1], it[2], it[3], it[4]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.toHsva") - } + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.toHsva") + }.toNativeArray() } /** @@ -1100,14 +1112,14 @@ object Colors : Augmentable(), SimpleGetterProxy { @JvmStatic @RhinoSingletonFunctionInterface - fun toHsl(args: Array) = ensureArgumentsLengthInRange(args, 1..4) { + fun toHsl(args: Array): NativeArray = ensureArgumentsLengthInRange(args, 1..4) { when (it.size) { 1 -> toHslRhino(it[0]) 2 -> toHslRhino(it[0], it[1]) 3 -> toHslRhino(it[0], it[1], it[2]) 4 -> toHslRhino(it[0], it[1], it[2], it[3]) - else -> ShouldNeverHappenException() - } + else -> throw ShouldNeverHappenException() + }.toNativeArray() } /** @@ -1166,12 +1178,12 @@ object Colors : Augmentable(), SimpleGetterProxy { @JvmStatic @RhinoSingletonFunctionInterface - fun toHsla(args: Array) = ensureArgumentsLengthInRange(args, 1..4) { + fun toHsla(args: Array): NativeArray = ensureArgumentsLengthInRange(args, 1..4) { when (it.size) { 1 -> toHslaRhino(it[0]) 4 -> toHslaRhino(it[0], it[1], it[2], it[3]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.toHsla") - } + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.toHsla") + }.toNativeArray() } /** @@ -1205,7 +1217,7 @@ object Colors : Augmentable(), SimpleGetterProxy { 2 -> isSimilarRhino(it[0], it[1]) 3 -> isSimilarRhino(it[0], it[1], it[2]) 4 -> isSimilarRhino(it[0], it[1], it[2], it[3]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.isSimilar") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.isSimilar") } } @@ -1268,7 +1280,7 @@ object Colors : Augmentable(), SimpleGetterProxy { when (it.size) { 2 -> isSimilarRhino(it[0], it[1]) 3 -> isSimilarRhino(it[0], it[1], it[2]) - else -> throw WrappedIllegalArgumentException("Invalid arguments \"[$it]\" for colors.isEqual") + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.isEqual") } } @@ -1342,12 +1354,11 @@ object Colors : Augmentable(), SimpleGetterProxy { @JvmStatic @RhinoFunctionBody fun summaryRhino(color: Any?): String { - val (r, g, b, a) = toRgbaRhino(color) - val niceA = when (val doubleA = toDoubleComponent(a)) { - 1.0 -> "1.0" - else -> doubleA.toBigDecimal().setScale(2, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString() + var (r, g, b, a) = toRgbaRhino(color) + return when (val doubleA = toDoubleComponent(a)) { + 1.0 -> "Color { ${toHexRhino(color)} | rgb(${r.jsString}, ${g.jsString}, ${b.jsString}) | int(${toIntRhino(color)}) }" + else -> "Color { ${toHexRhino(color)} | rgba(${r.jsString}, ${g.jsString}, ${b.jsString}, ${doubleA.roundToAlphaString()}) | int(${toIntRhino(color)}) }" } - return "Color { hex(${toHexRhino(color)}), rgba(${r.string},${g.string},${b.string}/$niceA), int(${toIntRhino(color)}) }" } internal fun parseRelativePercentage(percentage: Any?): Double { @@ -1432,4 +1443,106 @@ object Colors : Augmentable(), SimpleGetterProxy { return Numberx.clampToRhino(x, listOf(0, 360), 360).toFloat() } + @JvmStatic + @RhinoSingletonFunctionInterface + fun toRgbString(args: Array): String = ensureArgumentsLengthInRange(args, 1..3) { + when (it.size) { + 1 -> toRgbStringRhino(it[0]) + 3 -> toRgbStringRhino(it[0], it[1], it[2]) + else -> throw WrappedIllegalArgumentException("Invalid arguments ${it.jsArrayBrief()} for colors.toRgbString") + } + } + + @JvmStatic + @RhinoFunctionBody + fun toRgbStringRhino(color: Any?): String { + return toRgbRhino(color).joinToString(", ", prefix = "rgb(", postfix = ")") { + it.roundToInt().coerceIn(0..255).toString() + } + } + + @JvmStatic + @RhinoFunctionBody + fun toRgbStringRhino(r: Any?, g: Any?, b: Any?): String { + return toRgbRhino(r, g, b).joinToString(", ", prefix = "rgb(", postfix = ")") { + it.roundToInt().coerceIn(0..255).toString() + } + } + + @JvmStatic + @RhinoSingletonFunctionInterface + fun toRgbaString(args: Array): String = ensureArgumentsAtMost(args, 2) { argList -> + val (color, options) = argList + + var keepTrailingZeroForFullAlpha = true + + when (options) { + is NativeObject -> { + options.inquire("keepTrailingZeroForFullAlpha", ::coerceBoolean)?.let { + keepTrailingZeroForFullAlpha = it + } + } + is Boolean -> { + keepTrailingZeroForFullAlpha = options + } + } + + val list = listOf(redRhino(color), greenRhino(color), blueRhino(color)).map { + it.roundToInt().coerceIn(0..255).toString() + } + alphaDoubleRhino(color).roundToAlphaString(2, keepTrailingZeroForFullAlpha) + list.joinToString(", ", prefix = "rgba(", postfix = ")") + } + + // // 格式化 argb 格式为 "argb(a, r, g, b)" + // fun toArgbString(color: Int): String { + // val arr = rawToArgb(color) + // return "argb(${arr[0]}, ${arr[1]}, ${arr[2]}, ${arr[3]})" + // } + // + // // 格式化 hsv 格式为 "hsv(h, s%, v%)",其中 h 取整,s 和 v 转换为百分比(整数) + // fun toHsvString(color: Int): String { + // val arr = rawToHsv(color) + // val h = arr[0].roundToInt() + // val s = (arr[1] * 100).roundToInt() + // val v = (arr[2] * 100).roundToInt() + // return "hsv($h, ${s}%, ${v}%)" + // } + // + // // 格式化 hsva 格式为 "hsva(h, s%, v%, a)",其中 a 保留两位小数(或整数) + // fun toHsvaString(color: Int): String { + // val arr = rawToHsva(color) + // val h = arr[0].roundToInt() + // val s = (arr[1] * 100).roundToInt() + // val v = (arr[2] * 100).roundToInt() + // val a = arr[3] + // val aStr = if (a % 1.0 == 0.0) + // a.roundToInt().toString() + // else + // String.format("%.2f", a) + // return "hsva($h, ${s}%, ${v}%, $aStr)" + // } + // + // // 格式化 hsl 格式为 "hsl(h, s%, l%)" + // fun toHslString(color: Int): String { + // val arr = rawToHsl(color) + // val h = arr[0].roundToInt() + // val s = (arr[1] * 100).roundToInt() + // val l = (arr[2] * 100).roundToInt() + // return "hsl($h, ${s}%, ${l}%)" + // } + // + // // 格式化 hsla 格式为 "hsla(h, s%, l%, a)" + // fun toHslaString(color: Int): String { + // val arr = rawToHsla(color) + // val h = arr[0].roundToInt() + // val s = (arr[1] * 100).roundToInt() + // val l = (arr[2] * 100).roundToInt() + // val a = arr[3] + // val aStr = if (a % 1.0 == 0.0) + // a.roundToInt().toString() + // else + // String.format("%.2f", a) + // return "hsla($h, ${s}%, ${l}%, $aStr)" + // } + } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/global/Global.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/global/Global.kt index 7f7c4847..e54a4e2f 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/global/Global.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/global/Global.kt @@ -6,7 +6,7 @@ import org.autojs.autojs.annotation.RhinoRuntimeFunctionInterface import org.autojs.autojs.core.automator.UiObject import org.autojs.autojs.extension.AnyExtensions.isJsNullish import org.autojs.autojs.extension.AnyExtensions.jsBrief -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.extension.ScriptableExtensions.defineProp import org.autojs.autojs.extension.ScriptableExtensions.prop import org.autojs.autojs.extension.ScriptableObjectExtensions.inquire @@ -500,7 +500,7 @@ class Global(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRunti "指定的 AutoJs6 应用版本号需大于 461" } require(BuildConfig.VERSION_CODE >= num.toInt()) { - "AutoJs6 应用版本号需不低于 ${num.string}" + "AutoJs6 应用版本号需不低于 ${num.jsString}" } } } diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/jsox/Numberx.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/jsox/Numberx.kt index 4bcec2f3..ea09f557 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/jsox/Numberx.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/jsox/Numberx.kt @@ -8,7 +8,7 @@ import org.autojs.autojs.extension.AnyExtensions.jsBrief import org.autojs.autojs.extension.ArrayExtensions.toNativeArray import org.autojs.autojs.extension.ArrayExtensions.unshiftWith import org.autojs.autojs.extension.FlexibleArray -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.extension.StringExtensions.padEnd import org.autojs.autojs.extension.StringExtensions.padStart import org.autojs.autojs.extension.StringExtensions.toDoubleOrNaN @@ -276,10 +276,10 @@ class Numberx(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRunt require(!niceTargetLength.isNaN() && niceTargetLength.isFinite()) { "Argument \"targetLength\" for Numberx.padStart must be a number" } val nicePad: String = when { pad.isJsNullish() -> DEFAULT_PADDING_STRING - pad is Number -> pad.toDouble().string + pad is Number -> pad.toDouble().jsString else -> pad.toString() } - return parseAnyRhino(num).string.padStart(niceTargetLength.roundToInt(), nicePad) + return parseAnyRhino(num).jsString.padStart(niceTargetLength.roundToInt(), nicePad) } @JvmStatic @@ -297,10 +297,10 @@ class Numberx(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRunt require(!niceTargetLength.isNaN() && niceTargetLength.isFinite()) { "Argument \"targetLength\" for Numberx.padEnd must be a number" } val nicePad: String = when { pad.isJsNullish() -> DEFAULT_PADDING_STRING - pad is Number -> pad.toDouble().string + pad is Number -> pad.toDouble().jsString else -> pad.toString() } - return parseAnyRhino(num).string.padEnd(niceTargetLength.roundToInt(), nicePad) + return parseAnyRhino(num).jsString.padEnd(niceTargetLength.roundToInt(), nicePad) } @JvmStatic diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Inspect.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Inspect.kt index c776410f..78485071 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Inspect.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Inspect.kt @@ -7,7 +7,7 @@ import org.autojs.autojs.extension.AnyExtensions.isJsNullish import org.autojs.autojs.extension.ArrayExtensions.toNativeObject import org.autojs.autojs.extension.FlexibleArray.Companion.component1 import org.autojs.autojs.extension.FlexibleArray.Companion.component2 -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.extension.ScriptableExtensions.prop import org.autojs.autojs.rhino.ProxyObject.Companion.PROXY_GETTER_KEY import org.autojs.autojs.rhino.ProxyObject.Companion.PROXY_SETTER_KEY @@ -542,7 +542,7 @@ object Inspect : Augmentable(), Invokable { ctx.stylize(content, "string") } value is Number -> { - ctx.stylize(value.string, "number") + ctx.stylize(value.jsString, "number") } value is Boolean -> { ctx.stylize(Context.toString(value), "boolean") diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Util.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Util.kt index 68cc185e..bda079b1 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Util.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/Util.kt @@ -20,7 +20,7 @@ import org.autojs.autojs.extension.AnyExtensions.isJsSymbol import org.autojs.autojs.extension.AnyExtensions.isJsUndefined import org.autojs.autojs.extension.AnyExtensions.jsBrief import org.autojs.autojs.extension.FlexibleArray -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.extension.ScriptableExtensions.prop import org.autojs.autojs.extension.ScriptableExtensions.defineProp import org.autojs.autojs.runtime.api.augment.Augmentable @@ -352,7 +352,7 @@ object Util : Augmentable() { when (matchResult.value) { "%s" -> Context.toString(args[index++]) - "%d" -> Context.toNumber(args[index++]).string + "%d" -> Context.toNumber(args[index++]).jsString "%j" -> try { Context.toString(js_json_stringify(args[index++])) } catch (e: Exception) { diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt index cb98ea54..e293d050 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt @@ -5,7 +5,7 @@ import org.autojs.autojs.annotation.RhinoStandardFunctionInterface import org.autojs.autojs.extension.AnyExtensions.isJsNullish import org.autojs.autojs.extension.ArrayExtensions.toNativeArray import org.autojs.autojs.extension.FlexibleArray -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.extension.ScriptableExtensions.prop import org.autojs.autojs.runtime.api.augment.Augmentable import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException @@ -81,7 +81,7 @@ object VersionCodes : Augmentable() { val releaseDate: String, ) { private val releaseTimestampLong = parseTimestamp(releaseDate) - val releaseTimestamp = releaseTimestampLong.string + val releaseTimestamp = releaseTimestampLong.jsString fun toNativeObject() = newNativeObject().also { it.put("versionCode", it, versionCode) @@ -171,7 +171,7 @@ object VersionCodes : Augmentable() { private fun normalizeSearcherSource(o: Any) = when (o) { is NativeDate -> wrapNumber(o.date).toString() - is Number -> o.string + is Number -> o.jsString is String -> o else -> throw WrappedIllegalArgumentException("Invalid argument type: $o for versionCodes.search") } diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt b/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt index bf52dfb1..3f39ed53 100644 --- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt +++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt @@ -94,6 +94,11 @@ object ThemeColorManager { ViewUtils.setStatusBarBackgroundColor(activity, colorPrimary) } + @JvmStatic + fun setStatusBarAppearanceLight(activity: Activity) { + ViewUtils.setStatusBarAppearanceLight(activity, isLuminanceDark()) + } + private object BackgroundColorManager { private val views: MutableList> = LinkedList() diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorItemAdapter.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorItemAdapter.kt new file mode 100644 index 00000000..0e7f5bd3 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorItemAdapter.kt @@ -0,0 +1,128 @@ +package org.autojs.autojs.theme.app + +import android.animation.ValueAnimator +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.autojs.autojs.core.image.ColorItems +import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.theme.ThemeChangeNotifier +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_DEFAULT +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_MATERIAL +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.PresetColorItem +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.KEY_LEGACY_SELECTED_COLOR_INDEX +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.KEY_SELECTED_COLOR_LIBRARY_ID +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.KEY_SELECTED_COLOR_LIBRARY_ITEM_ID +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.SELECT_NONE +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.customColorPosition +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.defaultColorPosition +import org.autojs.autojs6.R + +@SuppressLint("NotifyDataSetChanged") +class ColorItemAdapter( + var items: List, + var isLibraryIdentifierAppendedToDesc: Boolean = false, + private val onItemClick: ((PresetColorItem, View) -> Unit)? = null, +) : RecyclerView.Adapter() { + + var selectedItemId = SELECT_NONE + var selectedLibraryId = SELECT_NONE + + fun updateData(newItems: List) { + items = newItems + notifyDataSetChanged() + } + + fun items() = items + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColorItemViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.mt_color_library_recycler_view_item, parent, false) + return ColorItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ColorItemViewHolder, position: Int) { + val itemView = holder.itemView + val context = itemView.context + val item = items[position] + + when (val tag = itemView.tag) { + is ValueAnimator -> { + tag.cancel() + itemView.tag = null + itemView.setBackgroundColor(context.getColor(R.color.window_background)) + } + } + + holder.bind(item, selectedLibraryId, selectedItemId, isLibraryIdentifierAppendedToDesc) + + itemView.setOnClickListener { + savePrefsForLibraries(item) + savePrefsForLegacy(context, item) + + when (selectedItemId) { + SELECT_NONE -> { + selectedLibraryId = item.libraryId + selectedItemId = item.itemId + notifyItemChanged(holder.bindingAdapterPosition) + } + else -> { + val positionBeforeSelection = items().indexOfFirst { + it.libraryId == selectedLibraryId && it.itemId == selectedItemId + } + val positionOfCurrentSelection = holder.bindingAdapterPosition + if (positionBeforeSelection != positionOfCurrentSelection && positionBeforeSelection >= 0) { + notifyItemChanged(positionBeforeSelection) + } + selectedLibraryId = item.libraryId + selectedItemId = item.itemId + notifyItemChanged(positionOfCurrentSelection) + } + } + + ThemeColorManager.setThemeColor(context.getColor(item.colorRes)) + ThemeChangeNotifier.notifyThemeChanged() + + onItemClick?.let { it(item, itemView) } + } + } + + override fun getItemCount() = items.size + + private fun savePrefsForLibraries(colorItem: PresetColorItem) { + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, colorItem.libraryId) + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, colorItem.itemId) + } + + private fun savePrefsForLegacy(context: Context, colorItem: PresetColorItem) { + when (colorItem.libraryId) { + COLOR_LIBRARY_ID_DEFAULT -> { + if (context.getColor(colorItem.colorRes) == context.getColor(R.color.theme_color_default)) { + Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, defaultColorPosition) + } else { + Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) + } + } + COLOR_LIBRARY_ID_MATERIAL -> { + val index = colorItem.itemId + if (index !in ColorItems.MATERIAL_COLORS.indices) { + Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) + } else { + val fixedIndex = maxOf( + defaultColorPosition, + customColorPosition, + ) + 1 + index + Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, fixedIndex) + } + } + else -> { + Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorItemViewHolder.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorItemViewHolder.kt new file mode 100644 index 00000000..9d61ceea --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorItemViewHolder.kt @@ -0,0 +1,51 @@ +package org.autojs.autojs.theme.app + +import android.content.res.ColorStateList +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.recyclerview.widget.RecyclerView +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.PresetColorItem +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.presetColorLibraries +import org.autojs.autojs.util.ViewUtils +import org.autojs.autojs6.R + +class ColorItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + private val context = itemView.context + + private val colorView: ImageView = itemView.findViewById(R.id.color) + private val nameView: TextView = itemView.findViewById(R.id.name) + private val descView: TextView = itemView.findViewById(R.id.description) + + fun bind(item: PresetColorItem, selectedLibraryId: Int, selectedItemId: Int, isLibraryIdentifierAppendedToDesc: Boolean) { + val color = context.getColor(item.colorRes) + val colorName = context.getString(item.nameRes) + val colorDesc = String.format("#%06X", 0xFFFFFF and color) + + ThemeColorHelper.setBackgroundColor(colorView, color) + nameView.text = colorName + descView.text = when { + isLibraryIdentifierAppendedToDesc -> { + presetColorLibraries.find { it.id == item.libraryId }?.let { + "${context.getString(it.identifierRes)} | $colorDesc" + } ?: colorDesc + } + else -> colorDesc + } + setChecked(color, selectedLibraryId == item.libraryId && selectedItemId == item.itemId) + } + + fun setChecked(@ColorInt color: Int, checked: Boolean) { + if (checked) { + colorView.setImageResource(R.drawable.mt_ic_check_white_36dp) + val tintRes = if (ViewUtils.isLuminanceLight(color)) R.color.day else R.color.night + colorView.imageTintList = ColorStateList.valueOf(context.getColor(tintRes)) + } else { + colorView.setImageDrawable(null) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorLibrariesActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibrariesActivity.kt index 223ba383..0cc1605a 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorLibrariesActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibrariesActivity.kt @@ -2,26 +2,18 @@ package org.autojs.autojs.theme.app import android.annotation.SuppressLint import android.content.Intent -import android.content.res.ColorStateList import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuItem -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.appcompat.widget.SearchView +import androidx.core.view.forEach import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.VERTICAL -import com.jaredrummler.android.colorpicker.ColorPickerDialog +import androidx.recyclerview.widget.ThemeColorRecyclerView import org.autojs.autojs.core.image.ColorItems import org.autojs.autojs.core.pref.Pref import org.autojs.autojs.theme.ThemeChangeNotifier import org.autojs.autojs.theme.ThemeColorManager -import org.autojs.autojs.util.ColorUtils import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByColorLuminance import org.autojs.autojs6.R @@ -32,17 +24,27 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { private lateinit var binding: MtActivityColorLibrariesBinding - private lateinit var mAdapter: ColorLibraryAdapter + private lateinit var mRecyclerView: ThemeColorRecyclerView - private val customColor: Int - get() = Pref.getInt(KEY_CUSTOM_COLOR, getColor(R.color.custom_color_default)) + private val libraryAdapter: ColorLibraryAdapter by lazy { + ColorLibraryAdapter(presetColorLibraries) { library -> + val intent = Intent(this, ColorLibraryActivity::class.java) + intent.putExtra(INTENT_IDENTIFIER_LIBRARY_ID, library.id) + startActivity(intent) + } + } + + private val colorItemAdapter: ColorItemAdapter by lazy { + ColorItemAdapter(presetColorItems, isLibraryIdentifierAppendedToDesc = true) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeChangeNotifier.themeChanged.observe(this) { - setColor(ThemeColorManager.colorPrimary) - mAdapter.notifyDataSetChanged() + updateAppBarColorContent(ThemeColorManager.colorPrimary) + libraryAdapter.notifyDataSetChanged() + colorItemAdapter.notifyDataSetChanged() } MtActivityColorLibrariesBinding.inflate(layoutInflater).let { @@ -53,12 +55,9 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { } binding.colorLibrariesRecyclerView.let { + mRecyclerView = it it.layoutManager = LinearLayoutManager(this) - it.adapter = ColorLibraryAdapter(colorLibraries) { library -> - val intent = Intent(this, ColorLibraryActivity::class.java) - intent.putExtra(INTENT_IDENTIFIER_LIBRARY_ID, library.id) - startActivity(intent) - }.also { mAdapter = it } + it.adapter = libraryAdapter it.addItemDecoration(DividerItemDecoration(this, VERTICAL)) ViewUtils.excludePaddingClippableViewFromNavigationBar(it) } @@ -69,32 +68,50 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { binding.toolbar.setMenuIconsColorByColorLuminance(this, currentColor) - val searchItem = menu.findItem(R.id.action_search_color) - val searchView = searchItem.actionView as? SearchView - searchView?.queryHint = "搜索颜色库" - searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String?): Boolean { - filterLibraries(query) - return true + setUpSearchMenu( + menu, + onQueryTextSimpleListener = { query -> + filterColorsFromColorItems(query, presetColorItems, colorItemAdapter) + }, + onMenuItemActionExpand = { + mRecyclerView.adapter = colorItemAdapter + setUpSelectedPosition(colorItemAdapter) + menu.forEach { it.isVisible = it.isVisible.not() } + }, + onMenuItemActionCollapse = { + mRecyclerView.adapter = libraryAdapter + menu.forEach { it.isVisible = it.isVisible.not() } } + )?.apply { queryHint = getString(R.string.text_search_all_colors) } - override fun onQueryTextChange(newText: String?): Boolean { - filterLibraries(newText) - return true - } - }) - return true + return super.onCreateOptionsMenu(menu) } - private fun filterLibraries(query: String?) { - val filteredLibraries = when { - query.isNullOrBlank() -> colorLibraries - else -> colorLibraries.filter { - val name = it.nameString ?: getString(it.nameRes) - name.contains(query, ignoreCase = true) + private fun setUpSelectedPosition(adapter: ColorItemAdapter) { + when (Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE)) { + SELECT_NONE -> when (val legacyIndex = Pref.getInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE)) { + customColorPosition -> Unit + SELECT_NONE, defaultColorPosition -> { + adapter.selectedLibraryId = COLOR_LIBRARY_ID_DEFAULT + adapter.selectedItemId = adapter.items.firstOrNull { + it.libraryId == COLOR_LIBRARY_ID_DEFAULT && getColor(it.colorRes) == getColor(R.color.theme_color_default) + }?.itemId ?: SELECT_NONE + } + else -> when (val calculatedIndex = legacyIndex - maxOf(customColorPosition, defaultColorPosition) - 1) { + in ColorItems.MATERIAL_COLORS.indices -> { + val (colorRes, _) = ColorItems.MATERIAL_COLORS[calculatedIndex] + adapter.selectedLibraryId = COLOR_LIBRARY_ID_MATERIAL + adapter.selectedItemId = adapter.items.firstOrNull { + it.libraryId == COLOR_LIBRARY_ID_MATERIAL && it.colorRes == colorRes + }?.itemId ?: SELECT_NONE + } + } + } + else -> { + adapter.selectedLibraryId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE) + adapter.selectedItemId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, SELECT_NONE) } } - mAdapter.updateData(filteredLibraries) } override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { @@ -102,11 +119,15 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { showColorPicker() true } - R.id.action_search_color -> { + R.id.action_new_color_library -> { ViewUtils.showToast(this, R.string.text_under_development_title) true } - R.id.action_new_color_library -> { + R.id.action_import_color_library -> { + ViewUtils.showToast(this, R.string.text_under_development_title) + true + } + R.id.action_clone_color_library -> { ViewUtils.showToast(this, R.string.text_under_development_title) true } @@ -122,39 +143,6 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { else -> super.onOptionsItemSelected(item) } - private fun showColorPicker() { - ColorPickerDialog.newBuilder() - .setAllowCustom(true) - .setAllowPresets(true) - .setDialogType(ColorPickerDialog.TYPE_CUSTOM) - .setShowAlphaSlider(false) - .setDialogTitle(R.string.dialog_title_color_palette) - .setColor(customColor) - .create() - .setColorPickerDialogListener { dialogId: Int, color: Int -> - savePrefsForLibraries() - savePrefsForLegacy(color) - - binding.toolbar.post { binding.toolbar.subtitle = getCurrentColorSummary(this, true) } - - setColorWithAnimation(color) - - ThemeColorManager.setThemeColor(color) - ThemeChangeNotifier.notifyThemeChanged() - } - .show(supportFragmentManager, "ColorPickerTagForColorLibraries") - } - - private fun savePrefsForLibraries() { - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_CUSTOM_COLOR_ID) - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, 0) - } - - private fun savePrefsForLegacy(color: Int) { - Pref.putInt(KEY_CUSTOM_COLOR, color or -0x1000000) - Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, customColorPosition) - } - private fun locateCurrentThemeColor() { checkAndGetTargetInfoForThemeColorLocate()?.let { target -> Intent(this, ColorLibraryActivity::class.java).apply { @@ -166,73 +154,24 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { override fun getSubtitle() = getCurrentColorSummary(this) - inner class ColorLibraryAdapter( - private var libraries: List, - private val onItemClick: (ColorLibrary) -> Unit, - ) : RecyclerView.Adapter() { - - // 当上层需要搜索过滤时调用该方法更新数据 - fun updateData(newLibraries: List) { - libraries = newLibraries - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LibraryViewHolder { - val view = LayoutInflater.from(parent.context) - .inflate(R.layout.mt_color_libraries_recycler_view_item, parent, false) - return LibraryViewHolder(view) - } - - override fun onBindViewHolder(holder: LibraryViewHolder, position: Int) { - val library = libraries[position] - holder.bind(library) - holder.itemView.setOnClickListener { onItemClick(library) } - } - - override fun getItemCount() = libraries.size - - } - - inner class LibraryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - - private val colorItemView: ImageView = itemView.findViewById(R.id.library_item) - private val libraryName: TextView = itemView.findViewById(R.id.name) - private val description: TextView = itemView.findViewById(R.id.description) - - fun bind(library: ColorLibrary) { - libraryName.text = library.nameString ?: getString(library.nameRes) - - val size = library.colors.size - description.text = resources.getQuantityString(R.plurals.text_items_total_sum, size, size) - - val adjustedContrastColor = ColorUtils.adjustColorForContrast(getColor(R.color.window_background), ThemeColorManager.colorPrimary, 2.3) - when { - library.id == COLOR_LIBRARY_DEFAULT_COLORS_ID -> { - colorItemView.setImageResource(R.drawable.ic_color_library_default) - } - !library.isUserDefined -> { - colorItemView.setImageResource(R.drawable.ic_color_library_preset) - } - } - colorItemView.imageTintList = ColorStateList.valueOf(adjustedContrastColor) - } - - } - companion object { - const val COLOR_LIBRARY_CUSTOM_COLOR_ID = 0x10001 + const val COLOR_LIBRARY_ID_PALETTE = 0x10001 + const val COLOR_LIBRARY_ID_INTELLIGENT = 0x10002 + const val COLOR_LIBRARY_ID_CREATED = 0x10003 + const val COLOR_LIBRARY_ID_IMPORTED = 0x10004 + const val COLOR_LIBRARY_ID_CLONED = 0x10005 - const val COLOR_LIBRARY_DEFAULT_COLORS_ID = 0x20001 - const val COLOR_LIBRARY_MATERIAL_COLORS_ID = 0x20002 - const val COLOR_LIBRARY_ANDROID_COLORS_ID = 0x20003 - const val COLOR_LIBRARY_CSS_COLORS_ID = 0x20004 - const val COLOR_LIBRARY_WEB_COLORS_ID = 0x20005 + const val COLOR_LIBRARY_ID_DEFAULT = 0x20001 + const val COLOR_LIBRARY_ID_MATERIAL = 0x20002 + const val COLOR_LIBRARY_ID_ANDROID = 0x20003 + const val COLOR_LIBRARY_ID_CSS = 0x20004 + const val COLOR_LIBRARY_ID_WEB = 0x20005 - val colorLibraries by lazy { + val presetColorLibraries by lazy { listOf( - ColorLibrary( - id = COLOR_LIBRARY_DEFAULT_COLORS_ID, + PresetColorLibrary( + id = COLOR_LIBRARY_ID_DEFAULT, nameRes = R.string.color_library_default_colors, titleRes = R.string.color_library_title_default_colors, identifierRes = R.string.color_library_identifier_default_colors, @@ -242,66 +181,80 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() { R.color.window_background_light to R.string.window_background_light, R.color.window_background_night to R.string.window_background_night, ).mapIndexed { index, (colorRes, nameRes) -> - ColorItem(index, colorRes, nameRes) + PresetColorItem(index, COLOR_LIBRARY_ID_DEFAULT, colorRes, nameRes) }, ), - ColorLibrary( - id = COLOR_LIBRARY_MATERIAL_COLORS_ID, + PresetColorLibrary( + id = COLOR_LIBRARY_ID_INTELLIGENT, + nameRes = R.string.color_library_intelligent_colors, + titleRes = R.string.color_library_title_intelligent_colors, + identifierRes = R.string.color_library_identifier_intelligent_colors, + colors = emptyList(), + ), + PresetColorLibrary( + id = COLOR_LIBRARY_ID_MATERIAL, nameRes = R.string.color_library_material_design_colors, titleRes = R.string.color_library_title_material_design_colors, identifierRes = R.string.color_library_identifier_material_design_colors, colors = ColorItems.MATERIAL_COLORS.mapIndexed { index, (colorRes, nameRes) -> - ColorItem(index, colorRes, nameRes) + PresetColorItem(index, COLOR_LIBRARY_ID_MATERIAL, colorRes, nameRes) }, ), - ColorLibrary( - id = COLOR_LIBRARY_ANDROID_COLORS_ID, + PresetColorLibrary( + id = COLOR_LIBRARY_ID_ANDROID, nameRes = R.string.color_library_android_colors, titleRes = R.string.color_library_title_android_colors, identifierRes = R.string.color_library_identifier_android_colors, colors = ColorItems.ANDROID_COLORS.mapIndexed { index, (colorRes, nameRes) -> - ColorItem(index, colorRes, nameRes) + PresetColorItem(index, COLOR_LIBRARY_ID_ANDROID, colorRes, nameRes) }, ), - ColorLibrary( - id = COLOR_LIBRARY_CSS_COLORS_ID, + PresetColorLibrary( + id = COLOR_LIBRARY_ID_CSS, nameRes = R.string.color_library_css_colors, titleRes = R.string.color_library_title_css_colors, identifierRes = R.string.color_library_identifier_css_colors, colors = ColorItems.CSS_COLORS.mapIndexed { index, (colorRes, nameRes) -> - ColorItem(index, colorRes, nameRes) + PresetColorItem(index, COLOR_LIBRARY_ID_CSS, colorRes, nameRes) }, ), - ColorLibrary( - id = COLOR_LIBRARY_WEB_COLORS_ID, + PresetColorLibrary( + id = COLOR_LIBRARY_ID_WEB, nameRes = R.string.color_library_web_colors, titleRes = R.string.color_library_title_web_colors, identifierRes = R.string.color_library_identifier_web_colors, colors = ColorItems.WEB_COLORS.mapIndexed { index, (colorRes, nameRes) -> - ColorItem(index, colorRes, nameRes) + PresetColorItem(index, COLOR_LIBRARY_ID_WEB, colorRes, nameRes) }, ), ) } - data class ColorItem( - val id: Int, - val colorRes: Int = R.color.md_black_1000, - val nameRes: Int = R.string.text_unknown, - val colorInt: Int? = null, - val nameString: String? = null, + val presetColorItems by lazy { + presetColorLibraries.flatMap { it.colors } + } + + data class PresetColorItem( + val itemId: Int, + val libraryId: Int, + val colorRes: Int, + val nameRes: Int, ) - data class ColorLibrary( + data class PresetColorLibrary( val id: Int, - val nameRes: Int = R.string.text_color_library, - val titleRes: Int? = null, - val identifierRes: Int? = null, - val nameString: String? = null, - val titleString: String? = null, - val colors: List = emptyList(), - var isUserDefined: Boolean = false, - ) + val nameRes: Int, + val titleRes: Int, + val identifierRes: Int, + val colors: List = emptyList(), + ) { + val isIntelligent get() = id == COLOR_LIBRARY_ID_INTELLIGENT + val isCreated get() = id == COLOR_LIBRARY_ID_CREATED + val isImported get() = id == COLOR_LIBRARY_ID_IMPORTED + val isCloned get() = id == COLOR_LIBRARY_ID_CLONED + val isDefault get() = id == COLOR_LIBRARY_ID_DEFAULT + val isMaterial get() = id == COLOR_LIBRARY_ID_MATERIAL + } } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryActivity.kt index c1c70235..1b6f6df2 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryActivity.kt @@ -6,18 +6,12 @@ import android.animation.ArgbEvaluator import android.animation.ValueAnimator import android.annotation.SuppressLint import android.content.Intent -import android.content.res.ColorStateList import android.graphics.drawable.ColorDrawable import android.os.Bundle -import android.view.LayoutInflater import android.view.Menu import android.view.MenuItem import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.annotation.ColorInt -import androidx.appcompat.widget.SearchView +import androidx.core.view.forEach import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller @@ -26,14 +20,11 @@ import androidx.recyclerview.widget.RecyclerView.VERTICAL import androidx.recyclerview.widget.ThemeColorRecyclerView import org.autojs.autojs.core.image.ColorItems import org.autojs.autojs.core.pref.Pref -import org.autojs.autojs.theme.ThemeChangeNotifier -import org.autojs.autojs.theme.ThemeColorHelper -import org.autojs.autojs.theme.ThemeColorManager -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_DEFAULT_COLORS_ID -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_MATERIAL_COLORS_ID -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.ColorItem -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.ColorLibrary -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.colorLibraries +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_DEFAULT +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_MATERIAL +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.PresetColorItem +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.PresetColorLibrary +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.presetColorLibraries import org.autojs.autojs.util.ColorUtils import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.ViewUtils.onceGlobalLayout @@ -49,69 +40,39 @@ class ColorLibraryActivity : ColorSelectBaseActivity() { private lateinit var binding: MtActivityColorLibraryBinding private lateinit var mAdapter: ColorItemAdapter - private lateinit var mLibrary: ColorLibrary + private lateinit var mLibrary: PresetColorLibrary - private var mInitiallyIdScrollTo by Delegates.notNull() - - private var mSelectedPosition = SELECT_NONE - private var mSelectedColor: Int? = null + private var mInitiallyItemIdScrollTo by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val libraryId = intent.getIntExtra(INTENT_IDENTIFIER_LIBRARY_ID, -1) - val library = colorLibraries.find { it.id == libraryId }?.also { lib -> + val library = presetColorLibraries.find { it.id == libraryId }?.also { lib -> mLibrary = lib } ?: throw RuntimeException("Unknown library id: $libraryId") - mInitiallyIdScrollTo = intent.getIntExtra(INTENT_IDENTIFIER_COLOR_ITEM_ID_SCROLL_TO, -1) + mInitiallyItemIdScrollTo = intent.getIntExtra(INTENT_IDENTIFIER_COLOR_ITEM_ID_SCROLL_TO, -1) MtActivityColorLibraryBinding.inflate(layoutInflater).let { binding = it setContentView(it.root) setUpToolbar(it.toolbar) setUpAppBar(it.appBar, it.appBarContainer) - it.toolbar.title = library.let { - it.titleString - ?: it.titleRes?.let { resId -> getString(resId) } - ?: it.nameString - ?: getString(it.nameRes) - } - if (library.id == Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE)) { - it.toolbar.subtitle = getCurrentColorSummary(this, true) - } + it.toolbar.title = getString(library.titleRes) + updateSubtitle() } binding.colorLibraryRecyclerView.let { it -> it.layoutManager = LinearLayoutManager(this) it.adapter = ColorItemAdapter(library.colors) { colorItem, itemView -> - savePrefsForLibraries(library, colorItem) - savePrefsForLegacy(library, colorItem) - - it.post { binding.toolbar.subtitle = getCurrentColorSummary(this, true) } - - val selectedColor = getColor(colorItem.colorRes).also { mSelectedColor = it } - setColorWithAnimation(selectedColor) - - val adapter = it.adapter as ColorItemAdapter - val currentPosition = it.getChildViewHolder(itemView).bindingAdapterPosition - if (mSelectedPosition != SELECT_NONE) { - adapter.notifyItemChanged(mSelectedPosition) - mSelectedPosition = currentPosition - adapter.notifyItemChanged(currentPosition) - } else { - mSelectedPosition = currentPosition - adapter.notifyDataSetChanged() - } - - ThemeColorManager.setThemeColor(selectedColor) - ThemeChangeNotifier.notifyThemeChanged() + updateAppBarColorContent(getColor(colorItem.colorRes)) }.also { mAdapter = it } it.addItemDecoration(DividerItemDecoration(this, VERTICAL)) ViewUtils.excludePaddingClippableViewFromNavigationBar(it) - setUpSelectedPosition() + setUpSelectedPosition(mAdapter) it.onceGlobalLayout { scrollToPositionOnceIfNeeded(it) @@ -119,36 +80,43 @@ class ColorLibraryActivity : ColorSelectBaseActivity() { } } - private fun setUpSelectedPosition() { + override fun getSubtitle(): String? = when (mLibrary.id) { + Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE) -> { + getCurrentColorSummary(this, true) + } + else -> null + } + + private fun setUpSelectedPosition(adapter: ColorItemAdapter) { when (Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE)) { SELECT_NONE -> when (val legacyIndex = Pref.getInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE)) { customColorPosition -> Unit SELECT_NONE, defaultColorPosition -> when (mLibrary.id) { - COLOR_LIBRARY_DEFAULT_COLORS_ID -> { - val index = mLibrary.colors.indexOfFirst { getColor(it.colorRes) == getColor(R.color.theme_color_default) } - if (index >= 0) mSelectedPosition = index + COLOR_LIBRARY_ID_DEFAULT -> { + adapter.selectedLibraryId = COLOR_LIBRARY_ID_DEFAULT + adapter.selectedItemId = mLibrary.colors.firstOrNull { getColor(it.colorRes) == getColor(R.color.theme_color_default) }?.itemId ?: SELECT_NONE } } else -> when (val calculatedIndex = legacyIndex - maxOf(customColorPosition, defaultColorPosition) - 1) { in ColorItems.MATERIAL_COLORS.indices -> { val (colorRes, _) = ColorItems.MATERIAL_COLORS[calculatedIndex] - val index = mLibrary.colors.indexOfFirst { it.colorRes == colorRes } - if (index >= 0) mSelectedPosition = index + adapter.selectedLibraryId = COLOR_LIBRARY_ID_MATERIAL + adapter.selectedItemId = mLibrary.colors.firstOrNull { it.colorRes == colorRes }?.itemId ?: SELECT_NONE } } } mLibrary.id -> { - val libraryItemId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, SELECT_NONE) - mSelectedPosition = mLibrary.colors.indexOfFirst { it.id == libraryItemId }.takeIf { it != SELECT_NONE } ?: SELECT_NONE + adapter.selectedLibraryId = mLibrary.id + adapter.selectedItemId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, SELECT_NONE) } } } private fun scrollToPositionOnceIfNeeded(recyclerView: ThemeColorRecyclerView) { - if (mInitiallyIdScrollTo < 0) return - val targetPosition = mLibrary.colors.indexOfFirst { it.id == mInitiallyIdScrollTo } + if (mInitiallyItemIdScrollTo < 0) return + val targetPosition = mLibrary.colors.indexOfFirst { it.itemId == mInitiallyItemIdScrollTo } if (targetPosition < 0) { - mInitiallyIdScrollTo = -1 + mInitiallyItemIdScrollTo = -1 return } val targetItem = mLibrary.colors[targetPosition] @@ -174,10 +142,10 @@ class ColorLibraryActivity : ColorSelectBaseActivity() { manager.startSmoothScroll(smoothScroller) } ?: recyclerView.smoothScrollToPosition(targetPosition) - mInitiallyIdScrollTo = -1 + mInitiallyItemIdScrollTo = -1 } - private fun highlightColorItem(recyclerView: RecyclerView, targetPosition: Int, targetItem: ColorItem) { + private fun highlightColorItem(recyclerView: RecyclerView, targetPosition: Int, targetItem: PresetColorItem) { val viewHolder = recyclerView.findViewHolderForAdapterPosition(targetPosition) viewHolder?.itemView?.let { itemView -> val originalColor = (itemView.background as? ColorDrawable)?.color ?: getColor(R.color.window_background) @@ -229,79 +197,22 @@ class ColorLibraryActivity : ColorSelectBaseActivity() { animator.start() } - private fun savePrefsForLibraries(library: ColorLibrary?, colorItem: ColorItem) { - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, library?.id ?: -1) - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, colorItem.id) - } - - private fun savePrefsForLegacy(library: ColorLibrary?, colorItem: ColorItem) { - when (library?.id) { - COLOR_LIBRARY_DEFAULT_COLORS_ID -> { - if (getColor(colorItem.colorRes) == getColor(R.color.theme_color_default)) { - Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, defaultColorPosition) - } else { - Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) - } - } - COLOR_LIBRARY_MATERIAL_COLORS_ID -> { - val index = colorItem.id - if (index !in ColorItems.MATERIAL_COLORS.indices) { - Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) - } else { - val fixedIndex = maxOf( - defaultColorPosition, - customColorPosition, - ) + 1 + index - Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, fixedIndex) - } - } - else -> { - Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) - } - } - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_color_library, menu) binding.toolbar.setMenuIconsColorByColorLuminance(this, currentColor) - val searchItem = menu.findItem(R.id.action_search_color) - val searchView = searchItem.actionView as? SearchView - searchView?.queryHint = "搜索颜色" - searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String?): Boolean { - filterColors(query) - return true - } + setUpSearchMenu( + menu, + onQueryTextSimpleListener = { query -> filterColorsFromColorItems(query, mLibrary.colors, mAdapter) }, + onMenuItemActionExpand = { menu.forEach { it.isVisible = it.isVisible.not() } }, + onMenuItemActionCollapse = { menu.forEach { it.isVisible = it.isVisible.not() } }, + ) - override fun onQueryTextChange(newText: String?): Boolean { - filterColors(newText) - return true - } - }) - return true - } - - private fun filterColors(@Suppress("unused") query: String?) { - // if (library == null) return - // val filteredColors = if (query.isNullOrBlank()) { - // library!!.colors - // } else { - // library!!.colors.filter { colorItem -> - // // 假设可以通过资源 id 获取对应的字符串显示,再做匹配 - // val name = getString(colorItem.nameRes) - // name.contains(query, ignoreCase = true) - // } - // } - // adapter.updateData(filteredColors) + return super.onCreateOptionsMenu(menu) } override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { - R.id.action_search_color -> { - ViewUtils.showToast(this, R.string.text_under_development_title) - true - } R.id.action_locate_current_theme_color -> { locateCurrentThemeColor() true @@ -323,7 +234,7 @@ class ColorLibraryActivity : ColorSelectBaseActivity() { itemView.setBackgroundColor(getColor(R.color.window_background)) } - mInitiallyIdScrollTo = targetIndex + mInitiallyItemIdScrollTo = targetIndex scrollToPositionOnceIfNeeded(recyclerView) } else -> { @@ -337,65 +248,4 @@ class ColorLibraryActivity : ColorSelectBaseActivity() { } } - inner class ColorItemAdapter( - private var items: List, - private val onItemClick: (ColorItem, View) -> Unit, - ) : RecyclerView.Adapter() { - - fun updateData(newItems: List) { - items = newItems - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColorViewHolder { - val view = LayoutInflater.from(parent.context) - .inflate(R.layout.mt_color_library_recycler_view_item, parent, false) - return ColorViewHolder(view) - } - - override fun onBindViewHolder(holder: ColorViewHolder, position: Int) { - val item = items[position] - - when (val tag = holder.itemView.tag) { - is ValueAnimator -> { - tag.cancel() - holder.itemView.tag = null - holder.itemView.setBackgroundColor(getColor(R.color.window_background)) - } - } - - holder.bind(item, position) - holder.itemView.setOnClickListener { onItemClick(item, holder.itemView) } - } - - override fun getItemCount() = items.size - - } - - inner class ColorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - - private val colorView: ImageView = itemView.findViewById(R.id.color) - private val nameView: TextView = itemView.findViewById(R.id.name) - private val descView: TextView = itemView.findViewById(R.id.description) - - fun bind(item: ColorItem, position: Int) { - val color = getColor(item.colorRes) - ThemeColorHelper.setBackgroundColor(colorView, color) - nameView.text = item.nameString ?: getString(item.nameRes) - descView.text = String.format("#%06X", 0xFFFFFF and color) - setChecked(color, mSelectedPosition == position) - } - - fun setChecked(@ColorInt color: Int, checked: Boolean) { - if (checked) { - colorView.setImageResource(R.drawable.mt_ic_check_white_36dp) - val tintRes = if (ViewUtils.isLuminanceLight(color)) R.color.day else R.color.night - colorView.imageTintList = ColorStateList.valueOf(getColor(tintRes)) - } else { - colorView.setImageDrawable(null) - } - } - - } - } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryAdapter.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryAdapter.kt new file mode 100644 index 00000000..8459fe79 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryAdapter.kt @@ -0,0 +1,34 @@ +package org.autojs.autojs.theme.app + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.autojs.autojs6.R + +@SuppressLint("NotifyDataSetChanged") +class ColorLibraryAdapter( + private var libraries: List, + private val onItemClick: (ColorLibrariesActivity.Companion.PresetColorLibrary) -> Unit, +) : RecyclerView.Adapter() { + + fun updateData(newLibraries: List) { + libraries = newLibraries + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ColorLibraryViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.mt_color_libraries_recycler_view_item, parent, false) + return ColorLibraryViewHolder(view) + } + + override fun onBindViewHolder(holder: ColorLibraryViewHolder, position: Int) { + val library = libraries[position] + holder.bind(library) + holder.itemView.setOnClickListener { onItemClick(library) } + } + + override fun getItemCount() = libraries.size + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryViewHolder.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryViewHolder.kt new file mode 100644 index 00000000..357e2454 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryViewHolder.kt @@ -0,0 +1,39 @@ +package org.autojs.autojs.theme.app + +import android.content.res.ColorStateList +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.util.ColorUtils +import org.autojs.autojs6.R + +class ColorLibraryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + private val context = itemView.context + private val resources = itemView.resources + + private val colorItemView: ImageView = itemView.findViewById(R.id.library_item) + private val libraryName: TextView = itemView.findViewById(R.id.name) + private val description: TextView = itemView.findViewById(R.id.description) + + fun bind(library: ColorLibrariesActivity.Companion.PresetColorLibrary) { + libraryName.text = context.getString(library.nameRes) + + val size = library.colors.size + description.text = resources.getQuantityString(R.plurals.text_items_total_sum, size, size) + + val adjustedContrastColor = ColorUtils.adjustColorForContrast(context.getColor(R.color.window_background), ThemeColorManager.colorPrimary, 2.3) + when { + library.isDefault -> colorItemView.setImageResource(R.drawable.ic_color_library_default) + library.isIntelligent -> colorItemView.setImageResource(R.drawable.ic_color_library_intelligent) + library.isCreated -> colorItemView.setImageResource(R.drawable.ic_color_library_created) + library.isImported -> colorItemView.setImageResource(R.drawable.ic_color_library_imported) + library.isCloned -> colorItemView.setImageResource(R.drawable.ic_color_library_cloned) + else -> colorItemView.setImageResource(R.drawable.ic_color_library_preset) + } + colorItemView.imageTintList = ColorStateList.valueOf(adjustedContrastColor) + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt index 19f38887..8aebe4f9 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt @@ -23,7 +23,7 @@ class ColorSelectActivity : ColorSelectBaseActivity() { override fun onItemClick(v: View?, position: Int) { mColorSettingRecyclerView.selectedThemeColor?.let { mSelectedPosition = position - setColorWithAnimation(it.colorPrimary) + updateAppBarColorContent(it.colorPrimary) } } } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt index 797366d7..11fe802f 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt @@ -2,26 +2,43 @@ package org.autojs.autojs.theme.app import android.content.Context import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import android.view.Menu +import android.view.MenuItem import android.view.View import android.view.ViewAnimationUtils +import androidx.annotation.StringRes +import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar +import androidx.lifecycle.lifecycleScope +import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.appbar.AppBarLayout +import com.jaredrummler.android.colorpicker.ColorPickerDialog import io.codetail.widget.RevealFrameLayout +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.autojs.autojs.annotation.ReservedForCompatibility import org.autojs.autojs.core.image.ColorItems import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.theme.ThemeChangeNotifier import org.autojs.autojs.theme.ThemeColorManager -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_CUSTOM_COLOR_ID -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.colorLibraries +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_PALETTE +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.PresetColorItem +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.PresetColorLibrary +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.presetColorLibraries import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.util.ColorUtils import org.autojs.autojs.util.ViewUtils +import org.autojs.autojs.util.ViewUtils.onceGlobalLayout +import org.autojs.autojs.util.ViewUtils.setColorsByColorLuminance import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByColorLuminance import org.autojs.autojs.util.ViewUtils.setNavigationIconColorByColorLuminance import org.autojs.autojs.util.ViewUtils.setTitlesTextColorByColorLuminance import org.autojs.autojs6.R +import java.util.* import kotlin.math.hypot import kotlin.properties.Delegates @@ -40,6 +57,12 @@ abstract class ColorSelectBaseActivity : BaseActivity() { private lateinit var mTitle: String + private var mSearchJob: Job? = null + private var mSearchView: SearchView? = null + + private val customColor: Int + get() = Pref.getInt(KEY_CUSTOM_COLOR, getColor(R.color.custom_color_default)) + protected var currentColor by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { @@ -61,27 +84,76 @@ abstract class ColorSelectBaseActivity : BaseActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) } + protected fun setUpSearchMenu(menu: Menu, onQueryTextSimpleListener: (text: String?) -> Unit, onMenuItemActionExpand: (item: MenuItem) -> Unit = {}, onMenuItemActionCollapse: (item: MenuItem) -> Unit = {}): SearchView? { + val menuItem = menu.findItem(R.id.action_search_color) ?: return null + menuItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { + override fun onMenuItemActionExpand(item: MenuItem) = true.also { + mToolbar.onceGlobalLayout { updateToolbarColors() } + onMenuItemActionExpand(item) + } + + override fun onMenuItemActionCollapse(item: MenuItem) = true.also { + onQueryTextSimpleListener(null) + onMenuItemActionCollapse(item) + } + }) + return setUpSearchMenu(menuItem.actionView, onQueryTextSimpleListener) + } + + private fun setUpSearchMenu(searchView: View?, onQueryTextSimpleListener: (text: String?) -> Unit): SearchView? { + return setUpSearchMenu(searchView, object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?) = true.also { onQueryTextSimpleListener(query) } + override fun onQueryTextChange(newText: String?) = true.also { onQueryTextSimpleListener(newText) } + }) + } + + protected fun setUpSearchMenu(menu: Menu, onQueryTextListener: SearchView.OnQueryTextListener? = null, onMenuItemActionExpand: (item: MenuItem) -> Unit = {}, onMenuItemActionCollapse: (item: MenuItem) -> Unit = {}): SearchView? { + val menuItem = menu.findItem(R.id.action_search_color) ?: return null + menuItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { + override fun onMenuItemActionExpand(item: MenuItem) = true.also { onMenuItemActionExpand(item) } + override fun onMenuItemActionCollapse(item: MenuItem) = true.also { onMenuItemActionCollapse(item) } + }) + return setUpSearchMenu(menuItem.actionView, onQueryTextListener) + } + + private fun setUpSearchMenu(searchView: View?, onQueryTextListener: SearchView.OnQueryTextListener? = null): SearchView? { + if (searchView !is SearchView) return null + return searchView.apply { + mSearchView = this + queryHint = context.getString(R.string.text_search_color) + setOnQueryTextListener(onQueryTextListener) + } + } + protected open fun getSubtitle(): String? = null override fun initThemeColors() { super.initThemeColors() - mToolbar.setTitlesTextColorByColorLuminance(this, currentColor) - mToolbar.setNavigationIconColorByColorLuminance(this, currentColor) + updateToolbarColors() + updateSearchViewColors() ViewUtils.setStatusBarAppearanceLightByColorLuminance(this, currentColor) } override fun onCreateOptionsMenu(menu: Menu): Boolean { - updateToolbarIconsColor() + updateToolbarColors() + updateSearchViewColors() return super.onCreateOptionsMenu(menu) } - private fun updateToolbarIconsColor() { + private fun updateToolbarColors() { mToolbar.setMenuIconsColorByColorLuminance(this, currentColor) + mToolbar.setNavigationIconColorByColorLuminance(this, currentColor) + mToolbar.setTitlesTextColorByColorLuminance(this, currentColor) } - protected fun setColorWithAnimation(colorTo: Int) { - setColor(colorTo) - ViewAnimationUtils.createCircularReveal( + private fun updateSearchViewColors() { + mSearchView?.setColorsByColorLuminance(this, currentColor) + } + + protected fun updateAppBarColorContent(colorTo: Int) { + setColors(colorTo) + updateSubtitle() + if (hasWindowFocus()) ViewAnimationUtils.createCircularReveal( /* view = */ mAppBarLayout, /* centerX = */ mAppBarLayout.left, /* centerY = */ mAppBarLayout.bottom, @@ -93,14 +165,15 @@ abstract class ColorSelectBaseActivity : BaseActivity() { } } - protected fun setColor(colorTo: Int) { + protected fun updateSubtitle() { + mToolbar.post { mToolbar.subtitle = getSubtitle() } + } + + private fun setColors(colorTo: Int) { mAppBarContainer.setBackgroundColor(currentColor) mAppBarLayout.setBackgroundColor(colorTo) currentColor = colorTo - initThemeColors() - updateToolbarIconsColor() - mToolbar.subtitle = getSubtitle() } protected fun setUpAppBar(appBar: AppBarLayout, appBarContainer: RevealFrameLayout) { @@ -110,42 +183,135 @@ abstract class ColorSelectBaseActivity : BaseActivity() { protected fun checkAndGetTargetInfoForThemeColorLocate(): TargetInfoForLocate? { val targetLibraryId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, -1) - if (targetLibraryId == COLOR_LIBRARY_CUSTOM_COLOR_ID) { - ViewUtils.showToast(this, "当前主题色为自定义颜色", true) - // 提示 - // 当前主题色为自定义颜色 - // - // HEX: #FF3300 - // RGB: 255, 0, 0 - // HSL: 0, 0, 0.14 - // - // 使用调色盘可查看或修改自定义主题颜色 - // 调色盘 关闭 + if (targetLibraryId == COLOR_LIBRARY_ID_PALETTE) { + MaterialDialog.Builder(this) + .title(R.string.text_prompt) + .content(R.string.content_current_theme_color_configured_by_palette, ColorUtils.toHex(currentColor, 6)) + .neutralText(R.string.dialog_button_open_color_palette) + .neutralColorRes(R.color.dialog_button_hint) + .onNeutral { _, _ -> showColorPicker() } + .negativeText(R.string.dialog_button_dismiss) + .negativeColorRes(R.color.dialog_button_default) + .show() return null } - val targetLibrary = colorLibraries.find { it.id == targetLibraryId } + val targetLibrary = presetColorLibraries.find { it.id == targetLibraryId } if (targetLibrary == null) { - ViewUtils.showToast(this, "主题色库定位失败", true) - // 定位失败 - // 无法定位主题色所在颜色库 - // - // Target lib ID: targetLibraryId - // Color libs IDs: [ colorLibraries.sorted().joinToString(", ") { "${it.id}" } ] - // 复制信息 关闭 + MaterialDialog.Builder(this) + .title(R.string.text_failed_to_locate) + .content( + getString(R.string.content_failed_to_locate_library_for_theme_color) + "\n" + + "\n" + + "Target library ID: 0x${targetLibraryId.toString(16)}" + "\n" + + "Color library IDs: [ ${presetColorLibraries.sortedBy { it.id }.joinToString(", ") { "0x${it.id.toString(16)}" }} ]" + ) + .negativeText(R.string.dialog_button_dismiss) + .negativeColorRes(R.color.dialog_button_default) + .show() return null } - val targetIndex = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, -1) - if (targetIndex !in targetLibrary.colors.indices) { - ViewUtils.showToast(this, "主题色条目定位失败", true) - // 定位失败 - // 无法确定主题色条目的索引值 - // - // Target index: targetLibraryId - // Color indicies: [ 0..90 ] (注意 90 为 size - 1) - // 复制信息 关闭 + val targetItemIndex = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, -1) + if (targetItemIndex !in targetLibrary.colors.indices) { + MaterialDialog.Builder(this) + .title(R.string.text_failed_to_locate) + .content( + getString(R.string.content_failed_to_determine_index_of_theme_color_item) + "\n" + + "\n" + + "Target item index: $targetItemIndex" + "\n" + + "Item indicies: [ 0..${targetLibrary.colors.size - 1} ]" + ) + .negativeText(R.string.dialog_button_dismiss) + .negativeColorRes(R.color.dialog_button_default) + .show() return null } - return TargetInfoForLocate(targetLibraryId, targetIndex) + return TargetInfoForLocate(targetLibraryId, targetItemIndex) + } + + protected fun showColorPicker() { + ColorPickerDialog.newBuilder() + .setAllowCustom(true) + .setAllowPresets(true) + .setDialogType(ColorPickerDialog.TYPE_CUSTOM) + .setShowAlphaSlider(false) + .setDialogTitle(R.string.dialog_title_color_palette) + .setColor(customColor) + .create() + .setColorPickerDialogListener { dialogId: Int, color: Int -> + savePrefsForLibraries() + savePrefsForLegacy(color) + + updateAppBarColorContent(color) + + ThemeColorManager.setThemeColor(color) + ThemeChangeNotifier.notifyThemeChanged() + } + .show(supportFragmentManager, "ColorPickerTagForColorLibraries") + } + + private fun savePrefsForLibraries() { + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_ID_PALETTE) + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, 0) + } + + private fun savePrefsForLegacy(color: Int) { + Pref.putInt(KEY_CUSTOM_COLOR, color or -0x1000000) + Pref.putInt(KEY_LEGACY_SELECTED_COLOR_INDEX, customColorPosition) + } + + protected fun filterColorsFromColorItems(query: String?, colorItems: List, colorItemAdapter: ColorItemAdapter) { + mSearchJob?.cancel() + mSearchJob = lifecycleScope.launch { + withContext(Dispatchers.Default) { + if (query.isNullOrBlank()) return@withContext colorItems + val normalizedQuery = normalizeForMatching(query) + colorItems.filter { colorItem -> + val colorHex = String.format("#%06X", 0xFFFFFF and getColor(colorItem.colorRes)) + if (query.startsWith("#")) { + if (isRegexSearch(query.drop(1))) { + val regex = compileRegexOrNull(extractPatternFromQuery(query.drop(1))) ?: return@filter false + return@filter regex.containsMatchIn(colorHex) + } + return@filter colorHex.contains(query, ignoreCase = true) + } + val localName = getString(colorItem.nameRes) + val enName = getLocalizedString(this@ColorSelectBaseActivity, colorItem.nameRes, Locale("en")) + if (isRegexSearch(query)) { + val regex = compileRegexOrNull(extractPatternFromQuery(query)) ?: return@filter false + return@filter regex.containsMatchIn(localName) || regex.containsMatchIn(enName) + } + return@filter normalizeForMatching(localName).contains(normalizedQuery, ignoreCase = true) + || normalizeForMatching(enName).contains(normalizedQuery, ignoreCase = true) + } + }.let { filteredResult -> colorItemAdapter.updateData(filteredResult) } + } + } + + private fun normalizeForMatching(input: String): String { + // 去掉所有非字母或数字字符 (例如空格/括号/斜线等). + // \p{L} 表示任何语言的字母字符, \p{N} 表示数字. + return input.replace("[^\\p{L}\\p{N}]+".toRegex(), "") + } + + private fun getLocalizedString(context: Context, @StringRes resId: Int, locale: Locale): String { + val config = Configuration(context.resources.configuration).apply { setLocale(locale) } + val localizedContext = context.createConfigurationContext(config) + return localizedContext.getString(resId) + } + + private fun isRegexSearch(query: String?): Boolean { + if (query.isNullOrBlank()) return false + return query.length > 2 && query.startsWith("/") && query.endsWith("/") + } + + private fun extractPatternFromQuery(query: String): String { + // 假设已检查过 isRegexSearch() == true + // 去掉最前和最后的斜杠 + return query.substring(1, query.length - 1) + } + + private fun compileRegexOrNull(pattern: String): Regex? { + return runCatching { Regex(pattern, RegexOption.IGNORE_CASE) }.getOrNull() } interface OnItemClickListener { @@ -233,13 +399,13 @@ abstract class ColorSelectBaseActivity : BaseActivity() { val libraryId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE) val libraryItemId = Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, SELECT_NONE) when (libraryId) { - COLOR_LIBRARY_CUSTOM_COLOR_ID -> { - identifier = context.getString(R.string.mt_custom) + COLOR_LIBRARY_ID_PALETTE -> { + identifier = context.getString(R.string.color_library_identifier_palette) } SELECT_NONE -> { val legacyIndex = Pref.getInt(KEY_LEGACY_SELECTED_COLOR_INDEX, SELECT_NONE) when (legacyIndex) { - customColorPosition -> identifier = context.getString(R.string.color_library_identifier_custom) + customColorPosition -> identifier = context.getString(R.string.color_library_identifier_palette) SELECT_NONE, defaultColorPosition -> identifier = context.getString(R.string.color_library_identifier_default_colors) else -> { val calculatedIndex = legacyIndex - maxOf(customColorPosition, defaultColorPosition) - 1 @@ -251,17 +417,43 @@ abstract class ColorSelectBaseActivity : BaseActivity() { } } } - else -> colorLibraries.find { it.id == libraryId }?.let { lib -> + else -> presetColorLibraries.find { it.id == libraryId }?.let { lib: PresetColorLibrary -> identifier = when { - lib.isUserDefined -> context.getString(R.string.color_library_identifier_custom) - else -> lib.identifierRes?.let { resId -> context.getString(resId) } + lib.isCreated -> { + // lib.identifierString?.let { idStr -> + // when { + // idStr.estimateVisualWidth <= 10 -> idStr + // else -> { + // var newStr = idStr + // while (newStr.estimateVisualWidth > 8) { + // newStr = newStr.dropLast(1) + // } + // "$newStr..." + // } + // } + // } ?: lib.titleString?.let { titleStr -> + // when { + // titleStr.estimateVisualWidth <= 10 -> titleStr + // else -> { + // var newStr = titleStr + // while (newStr.estimateVisualWidth > 8) { + // newStr = newStr.dropLast(1) + // } + // "$newStr..." + // } + // } + // } ?: context.getString(R.string.color_library_identifier_created) + context.getString(R.string.color_library_identifier_created) + } + else -> context.getString(lib.identifierRes) } if (libraryItemId != -1) { - lib.colors.find { it.id == libraryItemId }?.let { item -> - colorName = item.nameString - ?: item.nameRes.takeUnless { - it == R.string.text_unknown - }?.let { context.getString(it) } + lib.colors.find { it.itemId == libraryItemId }?.let { item -> + // colorName = item.nameString + // ?: item.nameRes.takeUnless { + // it == R.string.text_unknown + // }?.let { context.getString(it) } + colorName = context.getString(item.nameRes) } } } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt index 99200df8..12be131d 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt @@ -3,6 +3,7 @@ package org.autojs.autojs.theme.app import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList +import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater import android.view.View @@ -20,10 +21,10 @@ import org.autojs.autojs.theme.ThemeChangeNotifier import org.autojs.autojs.theme.ThemeColor import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.theme.ThemeColorManager -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_CUSTOM_COLOR_ID -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_DEFAULT_COLORS_ID -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_MATERIAL_COLORS_ID -import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.colorLibraries +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_PALETTE +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_DEFAULT +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_MATERIAL +import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.presetColorLibraries import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.KEY_LEGACY_SELECTED_COLOR_INDEX import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.KEY_SELECTED_COLOR_LIBRARY_ID import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.KEY_SELECTED_COLOR_LIBRARY_ITEM_ID @@ -99,22 +100,22 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { private fun savePrefsForLibraries() { when (mSelectedPosition) { 0 -> { - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_CUSTOM_COLOR_ID) + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_ID_PALETTE) Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, 0) } 1 -> { - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_DEFAULT_COLORS_ID) - colorLibraries.find { it.id == COLOR_LIBRARY_DEFAULT_COLORS_ID }!!.colors.find { colorItem -> + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_ID_DEFAULT) + presetColorLibraries.find { it.isDefault }!!.colors.find { colorItem -> context.getColor(colorItem.colorRes) == context.getColor(R.color.theme_color_default) - }?.let { Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, it.id) } + }?.let { Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, it.itemId) } } else -> { selectedThemeColor?.colorPrimary?.let { c -> - colorLibraries.find { it.id == COLOR_LIBRARY_MATERIAL_COLORS_ID }!!.colors.find { colorItem -> + presetColorLibraries.find { it.isMaterial }!!.colors.find { colorItem -> context.getColor(colorItem.colorRes) == c }?.let { - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_MATERIAL_COLORS_ID) - Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, it.id) + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_ID_MATERIAL) + Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, it.itemId) } } } @@ -143,8 +144,8 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { .setColor(customColor) .create() .setColorPickerDialogListener { dialogId: Int, color: Int -> - val c = color or -0x1000000 - Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, c) + val colorWithFullAlpha = color or Color.BLACK + Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, colorWithFullAlpha) setSelectedPosition(customColorPosition) mOnItemClickListener?.onItemClick(v, customColorPosition) } diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt index c5a49e13..c8a49f1d 100644 --- a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt @@ -50,7 +50,5 @@ open class ThemeColorToolbar : Toolbar, ThemeColorMutable { navigationIcon?.let { navigationIcon = it.applyColorFilterWith(tintColor) } collapseIcon?.let { collapseIcon = it.applyColorFilterWith(tintColor) } overflowIcon?.let { overflowIcon = it.applyColorFilterWith(tintColor) } - - popupTheme = if (ViewUtils.isLuminanceLight(currentThemeColor)) R.style.PopupMenuThemeLight else R.style.PopupMenuThemeDark } } diff --git a/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt b/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt index cfa0faf7..1707fdc2 100644 --- a/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt @@ -98,7 +98,7 @@ abstract class BaseActivity : AppCompatActivity() { } protected fun setUpStatusBarAppearanceLightByThemeColor() { - ViewUtils.setStatusBarAppearanceLight(this, ThemeColorManager.isLuminanceDark()) + ThemeColorManager.setStatusBarAppearanceLight(this) } } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt index d07c9322..41348622 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt @@ -12,7 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration import org.autojs.autojs.core.accessibility.NodeInfo -import org.autojs.autojs.extension.NumberExtensions.string +import org.autojs.autojs.extension.NumberExtensions.jsString import org.autojs.autojs.util.ClipboardUtils import org.autojs.autojs.util.ViewUtils import org.autojs.autojs6.R @@ -68,7 +68,7 @@ class NodeInfoView : RecyclerView { else -> { when (FIELDS[i].name) { "bounds" -> (value as? Rect)?.let { "[ ${it.left}, ${it.top}, ${it.right}, ${it.bottom} ]" } ?: value?.toString() ?: "" - "center" -> (value as? Point)?.let { "[ ${it.x.string}, ${it.y.string} ]" } ?: value?.toString() ?: "" + "center" -> (value as? Point)?.let { "[ ${it.x.jsString}, ${it.y.jsString} ]" } ?: value?.toString() ?: "" else -> value?.toString() ?: "" } } @@ -158,13 +158,13 @@ class NodeInfoView : RecyclerView { result = if (x == x.toLong().toDouble()) { result.replace("%X%", x.toLong().toString()) } else { - result.replace("%X%", "${floor(x).string}, ${ceil(x).string}") + result.replace("%X%", "${floor(x).jsString}, ${ceil(x).jsString}") } result = if (y == y.toLong().toDouble()) { result.replace("%Y%", y.toLong().toString()) } else { - result.replace("%Y%", "${floor(y).string}, ${ceil(y).string}") + result.replace("%Y%", "${floor(y).jsString}, ${ceil(y).jsString}") } return result diff --git a/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java b/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java index fe552001..155978db 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java @@ -33,7 +33,7 @@ public class FloatingActionMenu extends FrameLayout implements View.OnClickListe private static final int[] ICONS = { R.drawable.ic_floating_action_menu_dir, R.drawable.ic_floating_action_menu_file, - R.drawable.ic_import_thick, + R.drawable.ic_file_download_white_cropped, R.drawable.ic_project_white}; private static final int[] LABELS = { diff --git a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt index 04481835..9d596fd6 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.kt @@ -16,6 +16,7 @@ import android.view.MenuItem import android.view.View import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions import androidx.appcompat.app.ActionBarDrawerToggle +import androidx.appcompat.widget.SearchView import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager @@ -280,7 +281,7 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity { private fun setUpToolbarColors() { mToolbar.setMenuIconsColorByThemeColorLuminance(this) mToolbar.setNavigationIconColorByThemeColorLuminance(this) - mSearchViewItem?.initThemeColors() + mSearchViewItem?.setColorsByThemeColorLuminance() } private fun setUpTabLayoutColors() { @@ -416,7 +417,10 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity { return super.onMenuItemActionCollapse(item) } }.apply { - setQueryCallback { query: String? -> submitQuery(query) } + setQueryCallback(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?) = true.also { submitQuery(query) } + override fun onQueryTextChange(newText: String?) = true.also { submitQuery(newText) } + }) } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt index fc7b18fb..53fc93f1 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt @@ -173,7 +173,7 @@ class ExplorerFragment : ViewPagerFragment(0), OnFloatingActionButtonClickListen mExplorerView?.setFilter(null) return } - mExplorerView?.setFilter { item: ExplorerItem -> item.name.contains(event.query) } + mExplorerView?.setFilter { item: ExplorerItem -> item.name.contains(event.query, true) } } override fun onStop() { diff --git a/app/src/main/java/org/autojs/autojs/ui/widget/SearchViewItem.java b/app/src/main/java/org/autojs/autojs/ui/widget/SearchViewItem.java index b5d13c8e..cdce4548 100644 --- a/app/src/main/java/org/autojs/autojs/ui/widget/SearchViewItem.java +++ b/app/src/main/java/org/autojs/autojs/ui/widget/SearchViewItem.java @@ -4,12 +4,9 @@ import android.app.Activity; import android.app.SearchManager; import android.content.Context; import android.view.MenuItem; -import android.widget.EditText; -import android.widget.ImageView; import androidx.appcompat.widget.SearchView; import androidx.core.view.MenuItemCompat; -import org.autojs.autojs.theme.ThemeColorManager; -import org.autojs.autojs6.R; +import org.autojs.autojs.util.ViewUtils; /** * Created by Stardust on Oct 25, 2017. @@ -20,49 +17,33 @@ public class SearchViewItem implements MenuItemCompat.OnActionExpandListener, Se void summitQuery(String query); } - private QueryCallback mQueryCallback; + private SearchView.OnQueryTextListener mQueryCallback; private final MenuItem mSearchMenuItem; + private final SearchView mSearchView; private final Activity mActivity; - private EditText mTextview; - private ImageView mCloseButtonView; - private ImageView mSearchGoButtonView; public SearchViewItem(Activity activity, MenuItem searchMenuItem) { mActivity = activity; mSearchMenuItem = searchMenuItem; SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE); - SearchView searchView = (SearchView) searchMenuItem.getActionView(); - if (searchView == null) { + mSearchView = (SearchView) searchMenuItem.getActionView(); + if (mSearchView == null) { return; } - searchView.setSubmitButtonEnabled(true); - searchView.setSearchableInfo(searchManager.getSearchableInfo(activity.getComponentName())); - mTextview = searchView.findViewById(androidx.appcompat.R.id.search_src_text); - mCloseButtonView = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); - mSearchGoButtonView = searchView.findViewById(androidx.appcompat.R.id.search_go_btn); - initThemeColors(); + mSearchView.setSubmitButtonEnabled(false); + mSearchView.setSearchableInfo(searchManager.getSearchableInfo(activity.getComponentName())); + setColorsByThemeColorLuminance(); MenuItemCompat.setOnActionExpandListener(searchMenuItem, this); - searchView.setOnQueryTextListener(this); + mSearchView.setOnQueryTextListener(this); } - public void initThemeColors() { - boolean isThemeColorLuminanceLight = ThemeColorManager.isLuminanceLight(); - int fullColor = mActivity.getColor(isThemeColorLuminanceLight ? R.color.day_full : R.color.night_full); - int hintColor = mActivity.getColor(isThemeColorLuminanceLight ? R.color.day : R.color.night); - - if (mTextview != null) { - mTextview.setTextColor(fullColor); - mTextview.setHintTextColor(hintColor); - } - if (mCloseButtonView != null) { - mCloseButtonView.setColorFilter(fullColor); - } - if (mSearchGoButtonView != null) { - mSearchGoButtonView.setColorFilter(fullColor); + public void setColorsByThemeColorLuminance() { + if (mSearchView != null) { + ViewUtils.setSearchViewColorsByThemeColorLuminance(mActivity, mSearchView); } } - public void setQueryCallback(QueryCallback queryCallback) { + public void setQueryCallback(SearchView.OnQueryTextListener queryCallback) { mQueryCallback = queryCallback; } @@ -80,21 +61,23 @@ public class SearchViewItem implements MenuItemCompat.OnActionExpandListener, Se if (mQueryCallback == null) { return true; } - mQueryCallback.summitQuery(null); + mQueryCallback.onQueryTextSubmit(null); return true; } @Override public boolean onQueryTextSubmit(String query) { - if (mQueryCallback == null) { - return true; + if (mQueryCallback != null) { + mQueryCallback.onQueryTextSubmit(query); } - mQueryCallback.summitQuery(query); return true; } @Override public boolean onQueryTextChange(String newText) { + if (mQueryCallback != null) { + mQueryCallback.onQueryTextChange(newText); + } return false; } diff --git a/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt b/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt index adc61c80..37fdb596 100644 --- a/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt @@ -14,7 +14,6 @@ import androidx.core.graphics.ColorUtils import org.autojs.autojs.app.GlobalAppContext import org.autojs.autojs.core.image.ColorTable import org.autojs.autojs.theme.ThemeColor -import kotlin.math.pow import kotlin.math.roundToInt import kotlin.text.RegexOption.IGNORE_CASE @@ -57,7 +56,7 @@ object ColorUtils { } @JvmStatic - fun toInt(num: Long) = toInt(toHex(num)) + fun toInt(num: Number) = toInt(toHex(num)) @JvmStatic fun toInt(themeColor: ThemeColor) = toInt(toHex(themeColor)) @@ -72,17 +71,17 @@ object ColorUtils { @JvmStatic @JvmOverloads - fun toHex(num: Long, alpha: String = "auto"): String { + fun toHex(num: Number, alpha: String = "auto"): String { return toHex(toString(toJavaIntegerRange(num)), alpha) } @JvmStatic - fun toHex(num: Long, hasAlpha: Boolean): String { + fun toHex(num: Number, hasAlpha: Boolean): String { return toHex(toString(toJavaIntegerRange(num)), hasAlpha) } @JvmStatic - fun toHex(num: Long, resultLength: Int): String { + fun toHex(num: Number, resultLength: Int): String { return toHex(toString(toJavaIntegerRange(num)), resultLength) } @@ -163,7 +162,7 @@ object ColorUtils { } @JvmStatic - fun toFullHex(num: Long) = toHex(num, 8) + fun toFullHex(num: Number) = toHex(num, 8) @JvmStatic fun toFullHex(themeColor: ThemeColor) = toHex(themeColor, 8) @@ -189,14 +188,16 @@ object ColorUtils { else -> toInt(color) } - private fun toJavaIntegerRange(x: Long): Int { - val t = 2f.pow(32).toLong() - val min = (-2f).pow(31).toLong() - val max = 2f.pow(31 - 1).toLong() - var tmp = x - while (tmp < min) tmp += t - while (tmp > max) tmp -= t - return tmp.toInt() + private fun toJavaIntegerRange(x: Number): Int { + // @Commented by SuperMonster003 on Apr 1, 2025. + // # val t = 2f.pow(32).toLong() + // # val min = (-2f).pow(31).toLong() + // # val max = 2f.pow(31 - 1).toLong() + // # var tmp = x.toLong() + // # while (tmp < min) tmp += t + // # while (tmp > max) tmp -= t + // # return tmp.toInt() + return x.toLong().toInt() } fun toColorStateList(color: String) = ColorStateList.valueOf(toInt(color)) diff --git a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt index 6a64905a..e2e1a8d5 100644 --- a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt @@ -20,23 +20,26 @@ import android.os.Looper import android.util.DisplayMetrics import android.util.TypedValue import android.view.Gravity +import android.view.Menu import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.view.Window import android.view.WindowInsets import android.view.WindowManager +import android.widget.EditText import android.widget.FrameLayout +import android.widget.ImageView import android.widget.Toast import androidx.annotation.IdRes import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat -import androidx.core.view.forEach import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.snackbar.Snackbar import org.autojs.autojs.app.GlobalAppContext @@ -44,8 +47,6 @@ import org.autojs.autojs.core.pref.Pref import org.autojs.autojs.theme.ThemeColorManager import org.autojs.autojs.util.StringUtils.key import org.autojs.autojs6.R -import org.autojs.autojs6.R.color.day -import org.autojs.autojs6.R.color.night import kotlin.math.roundToInt /** @@ -186,12 +187,12 @@ object ViewUtils { @JvmStatic fun getDayOrNightColorByLuminance(context: Context, color: Int): Int { - return context.getColor(if (isLuminanceLight(color)) day else night) + return context.getColor(if (isLuminanceLight(color)) R.color.day else R.color.night) } @JvmStatic fun getDayOrNightColorResByLuminance(color: Int): Int { - return if (isLuminanceLight(color)) day else night + return if (isLuminanceLight(color)) R.color.day else R.color.night } @JvmStatic @@ -408,13 +409,19 @@ object ViewUtils { fun Toolbar.setMenuIconsColorByColorLuminance(context: Context, aimColor: Int) { val color = getDayOrNightColorByLuminance(context, aimColor) - this.menu.forEach { menu -> - menu.icon?.let { ic -> menu.icon = ic.applyColorFilterWith(color) } - } + this.menu.setItemsColor(color) this.collapseIcon?.let { this.collapseIcon = it.applyColorFilterWith(color) } this.overflowIcon?.let { this.overflowIcon = it.applyColorFilterWith(color) } } + fun Menu.setItemsColor(color: Int) { + for (i in 0 until size()) { + val menuItem = getItem(i) + menuItem.icon = menuItem.icon?.applyColorFilterWith(color) + menuItem.subMenu?.setItemsColor(color) + } + } + @JvmStatic fun setToolbarMenuIconsColorByColorLuminance(context: Context, toolbar: Toolbar, aimColor: Int) { toolbar.setMenuIconsColorByColorLuminance(context, aimColor) @@ -496,6 +503,41 @@ object ViewUtils { toolbar.setTitlesTextColorByColorLuminance(context, aimColor) } + fun SearchView.setColorsByColorLuminance(context: Context, aimColor: Int) { + val isAimColorLight = isLuminanceLight(aimColor) + val fullColor = context.getColor(if (isAimColorLight) R.color.day_full else R.color.night_full) + val hintColor = context.getColor(if (isAimColorLight) R.color.day_alpha_70 else R.color.night_alpha_70) + + findViewById(androidx.appcompat.R.id.search_src_text).apply { + setTextColor(fullColor) + setHintTextColor(hintColor) + setLinkTextColor(fullColor) + } + findViewById(androidx.appcompat.R.id.search_close_btn)?.apply { + setColorFilter(fullColor) + } + findViewById(androidx.appcompat.R.id.search_mag_icon)?.apply { + setColorFilter(fullColor) + } + findViewById(androidx.appcompat.R.id.search_go_btn)?.apply { + setColorFilter(fullColor) + } + } + + fun SearchView.setColorsByThemeColorLuminance(context: Context) { + this.setColorsByColorLuminance(context, ThemeColorManager.colorPrimary) + } + + @JvmStatic + fun setSearchViewColorsByColorLuminance(context: Context, searchView: SearchView, aimColor: Int) { + searchView.setColorsByColorLuminance(context, aimColor) + } + + @JvmStatic + fun setSearchViewColorsByThemeColorLuminance(context: Context, searchView: SearchView) { + setSearchViewColorsByColorLuminance(context, searchView, ThemeColorManager.colorPrimary) + } + @JvmStatic fun showToast(context: Context, stringRes: Int) = showToast(context, stringRes, false) diff --git a/app/src/main/res/drawable/ic_add_rounded_rectangle_outline_black.png b/app/src/main/res/drawable/ic_add_rounded_rectangle_outline_black.png new file mode 100644 index 0000000000000000000000000000000000000000..7162815ae3ed5e1969373c8af4e8490ca0b42117 GIT binary patch literal 13030 zcmd^mcU03`vuFw-NC~J21_&So1?do41Qe;EDMblI3?=juA@r7j3QAF9Km|ml%8?RL zP(UFZJ&M5wNK?^R5R@V+DuTeSu**;Y(g zMi>TziIMEATwyQ-8Tt_t1S1_mr=NpgYiM?!u`n3sHuM88RL97|U;;Ct?qoXI$&nZk z9jWCP80}BhN{pldXc)|Ndm_y*Ae>59^rr@gMwuynZ0}T33=K3>@-T4HaiUpLLqhG6 zW2kP)&h7!p;Q=OrO54p9O%sU#K_r##rxVQnSFRSrwJf5W0Ruj zeumIrUXvSKvPFwQ_sX**MLaSBkCHd>wx3a z`333}9T*yv^e;gHwC;Zb1v(SxNB8@0fdd1GLD4aheqh6)k$%BcZCX^YlHxyNBw9vC zM8^QafIIzFE}Wc*q^MZBUsM213#+2zR}<7t)c_spp*T3ec=D&`du-h;A;6r{EzWK7YMB+HIy3039neQ0ez@=>J#(ztARxPyy2a;<$f-#YP9w6Z~SR z7QsMT|E)S{1Ln1%d-!V~+W+SkSLgo2o&6ge7y{_yKPCu#`NxP+qk!d#0Vc{_kI)Z; zX_k?!EZh@Ir$-a6Q}?8;eENRY8I48tUXa<1JzPMSu(sCNzWcV|a?bfXKR@f+R9sdm zIvt`UDWdv`1@Sk<|8@p;_0@2TIDI?IB$zd`Dc zr<&fsxfna-l~RAAx7P(vV!1!6oPe?LqfF)b6P)IENo}mBF7L2ebU{3jYc~-WMZ`TP#5aR2R_XWz<)Gb{Ne>(he zfB4i;D0gf9=0ZY_yr8_o;>(PUi*fR_NBs@$cN?BDTe)J~ib%md`zk6bde_QeNz%ia zgX0dDbY-{r|LO1h6mzHM6vON)aFe++1%Z{)aM zY=QZ9uUFp9B237m8_u)q9T@wOA#nVOZ+)+G0D_2XB~< zXep{xycF|X5*spHHL3m{;mvt!h#Fp-xM9|nBFkM7Vjb@N%GG8lAh*}lEx9`MeJ!Lj zHOY~ut<~HYVJWX($B>fSvKelSlMDrT=dt|$wD$}4ZCt6k^fPOw#N|Y%4tgir^(AT| z9>NP0+N1LG`<;FR6bB*Di0JcmHBIiMzS|mz^fjpoQ*B!eof9g5@ewvGm58QEjH&G) zxu$(#C?ITItJlYl($J2-Hh#%t5)qBWAPv_%R3hDa=f&@21Tadnu2ixc8Y@L2y28T3 z`DyG>Zf%z*K6Lm2x&VnmYaPvJIsBH}jd+x~&{XcTt#*BiM3H$7>a%Pgqc^bM?2Vn- z>FMz`ofq|iRoRt*oi*V}zRu)pAl3Knhfb)OaFQ_u&k&E0DYa%jDQV?ycO4AX%*)qH z{4JqfhC4?j=G?eNfI2D8XHBZ0aZ%HB7KifnEGqm+n(BT=Y#2>>bk?f~^`1RblUW>4vK@YjE zqX{so{Ai2{srVv}DWa<4z|+(EYJ;Pxz_AMOzlEfi(dJL@VBvh)k&=KpAw1svo!kg>Q#w+*-#gZ+>U6;2b`{>?i=jj zYW7+bcLPqhPBo6O%}5Xl3*GFP=%-taZEHL^3*%MXGu(w<3p^>gcpTO#;JX%Ac}au3 z^ht`pg)0M%dmSEND8QogFn!iibqkmZxfFc^Vh*09t|MkFm6$?5-f)>R@O7N)F&kTm zAJfGe3nxa?k852Pdh*4B|59~vABn}jCp4SH^Y#3Lo4Mz1%_r?DyjrI?;#?l47bR79 zWO3u{s|g8UJ3s64EqgaL#a8ql`LV)X+q(%*`jGV1$C)Um`btE*0DHg6r< zeZOA$h3T19tD|~uq>!y z;cL@I&ToVGiF_-buH3E2)MI(6#*>b5!cp zX(K1TA-_Ff$i&!QrFPq9muiWZFgaMAtZcC25>E5ueAz06sIFv#s@is(<>j2ulJ`!q zA5qgoWJn)6?{RaP39v;Mss2mP#eKzoR@NIiLe@B{krFBVQ&3^)(C5IHrT z=i)a`HvM>~pLsx*4A^cb1>JU_ec2|pU zcN`J)KfP~fQWNK6?h9~NY;0}a_G$jm<`tLw-E0tik>^&yx@vk-ZA;3}g87fnP7Dog zUa%;zrLTlM_b5k-Qo4wz=R50MhVt2Qf(^RID?gQ3d5UIeetLPgqQS^%-pz+OvD`Zs zb9A=W5TWHiA0L*nab9i~%fAd*U=O(SN7*%#ho{YB6gV5k&|f>iT`EN+|B2`6jO(Pi zXdsr?C(6$r0N0AJ_6t*);iNk0A${jg=s+=h@!ng$9P(D?*Mr9pDOTAby;OFZFJ|+^ zFp~7)VmtFYtQ~#|9UR&p#YLA}iVD{VU1gMaf48-Oo#*W+y z?ecu8qma0k<~J?v42ig5Kc^Zo4v!7%oQ1U=|9snFICO$Vs5GoGz0g6WAD8kGnu2Lu z{80|MX@s-K3Fm{tXWeZ?b@>L8k;@*~!AEKQwZ)C;>oYGUyF-oLOQW(wVfizC% z8UpQ7aQy`SuV*Dqim7KO6w~HZsk5)2dTF1oZxsC^G>GS`w(V-w;u`z!WVgUvtHrSpE)hT}9LE=sBvlh}PGo zXkt27?&OM{{=ps{?vyXJWD(4>5&O$c=>rA{h!Vv2U2}(;z83o7x)zK_H9W)-ja`7? z89A{j%R}q*7-iNY!7&q}Z-fTFsMTa7Om8_P%S^*II8Ebg9a><{0zua3+NlE+!?E2{ zWz zcW~6|2lEGOLb33sU}6$I$55q|(odY$zw@FbJbwd> z){G|?%SK;qc^JJGEN2lkW-9CUec%zFJzyFERl22jK2I;!B{H5MaTa(Z*r!+BFu{+ z!(qCd*=#^net18sDuNfE0tt18r?{~K*@)OJkmouxAbo7oXv?JfzA~lz9pA#%(j-=2 z>-NIW5*}}sDh0cRW;-S%mih)Vo3*Ip-|k~-91qyDt`fE&SJvVDGcf{#M=-tO`!vbf zyWd^B(k3w<0`}0yUDTnu&~w(Dw!t2mEY)i0lDQD!-$GjHpZm*{BFjGtISZ0OZi4|% zxtP9+a8+Bl=C$L2fD5^hbk^H*Kc4@qVi%y1CPg!b9?YYN24nHCX>MlG}h1WeeX3(h9X{#LuIp+bXx)j3mDn?^zHV zS+F0n;k>YW7=xmTf?c|Pe2D14;>vCHyI1B`+~|=4lc(N3ANgj%le?PYOJZ&I$MMQP z4OC>!@!k0Sn}GAFG3gNc*m20Uqf0(y32Lc;9n$r$aA2emfTA-jL9j0^H} zp=a~#rzCzgm^>{oC5bq>))+9LD%5Eu} zzIP;?@qmefxIe46;W{gIaid}a_Ds^RY=O!)F;S63zwXuIe+hxa1m3oyDaU>=*jZUvcWOgxCM{UR?|a1_&< zmB-Wp}Ntu?xokwG{!&FGEI2`W$g|!rLw$KFCTOdJ}<_{^; z;~#KZFyN`FOk4D=HhIK`Q*bNaT7@)SBA%*Ew6c_{Q&fk0TW5!KL!&MQxtPa~Tex`> z5;u81oOs0{n?NJvxJ~wPyjZb{zdwPyBjAP!L@Vtk zsk(^CM!lu0ilh%M5#KA>{Rcfo2H*9H*Qs4P|^ysHx4-j%kg>OF~lF7v)mKt??RqwXHI=n(!$FT9vX<^QN% z>hJ_iEU@i6(nMtNDd6(7EN%y@k_vvEXF7gQ=VlH>$5tTiSXV{Q*l_el7n!A~Nh~A+ z6Cwjo>Y=&O8G;&Q&F&`jplXslvk)(KuKivtyCj_B#R;M_4zwwdCBSh2jN+yn0l$Ms zF^}EvWEN75hT2#0B0Ph`e z2IlB78+9o|{@5za{alQWv**l`0}z|1S42_gRaWJz!ZBZJSC~an=9o|sKJ+p0-vjOG z40*=_04oA0lIjJfL~m?7EfyhIhpZ!h`>24JIWOm)qDGUU872*~?6UAZ@jHKGWwnJ$ z^K~d0l;*LY9nE(d#*vLEb750hDNGJk+W+!2>#9GtMo1;DCyI*&LBca~daGB_0Mk-c z*|WyQhKpCrLpivzn;DI6yn&ew`xAEAdu|gXSG=CI@4F6CBG$w3>kK`AgTCw`1^6<3 z%B*Gb)}%vU447)39^k&`9@e}ubcfwrx8$9uP4fCPQ>E6a5xrdUxsu{tjl2tAY@RP; z9WDhlynRLG9Pan`xG|z#66#OkHBW*;*}*Ew((VU{VAx&cBr51Q0S}Tf3y}w18wT?+ z2-DopZ_Dvt3jts!&gzW3oMZ|TgfN?GpFvQeg0shZHx<1;*B#qXTX_%~dM_au`=DQg zC-1|0A`Ox|OLH?5u%1t4;1;&^0M_=mAcH_0Qt*IT5AN89%_2pW=}D152fB~DxbB1& z=-KVUXgM6tW36kVkUnISxQ4x(?)atrG*_(^|9MBLR>AQ6=oi71X1&?x;0bBF3y>-R zA0>pc1kqUix)-Rxj_NuVivwX0?a#`sUx(Y_`kl@XcnI#PC%LgjsJvju87NoDpjg3$)Ox70p z_GZATg>hZJDexuGToiy=zCx+(34&$AR>VPVL@M<316Vw+eOc~4*5KnQD-(*YVp1A$U6+{A z@cxP{yW-_nFcRnj2yBAocoxb|Hp_q%P5E7c-!XVofhl_TxK2A%;s>IC2)*k50Jfe?W?KXpQ-%CF1SupM^E zI{WyOKL!pI@4iRou=9fpNw-2DO~72&OKDK`w-6bX65il^ia8Xu5+{H~__8M*R=Y-| zs3~bLc#k&yeCn|kKwb%hzNB8at_AmcHF2y~k_|`;f1>;bZ`FrzrBADG0Bc(}LtnrP z_Y1KD1bHCzH>8OfG+ATwd-4hc#FAhSOWfApO_iI0WZvmQt_900&QwR6c<>1@9$4V) z>~OvGv)F?On4ufeY=EOvKaZN71d?+DLtp(U1meNU4ljXJJXj(Ecp%EoCj+RoIKpfR zfYOFU-pH7&0G2Q}oGEUVeLNW)SYwU;^4R_GJ% zf2Hz<=B&F+D%V`5)QUJ)<^{IyDqugWV8?vzpHS?x^5i_(umz@#p2@=~)o!^4PeE?a z!6*$-x?E3{!XvCljBH)yx4^yK3jSmfyE3a9Jb${)dNaH;uh@BY$TE@4G{!dYc@IFd z=Ow}r{$h=fRH=2J+dg4A!3g10BjemB(r!R{X>-Q3x5Lc_vtAT!$~HNDs}p9ey;^l%b|;iHZ}*ci#j0oZ&fAu7nTYU4h1Mzn9?vSs z`B$i_YXiW7^5?cm<1R6HDm zoN1hIV-cbN-@Ok7eMP54Q#T}@&mOw2U@Qn~K5J-E&2-k2EHxm5(EBC3Sg6Jm;vd`Q2(Y?BLC9 zdUO;DDD>(;#L3jiQilSHGv;r_fHs1_M|L%yx~b6Z$QiBR2kum_XFkrU`Uc`}eRE7zXbp6rw%I2U=VTRZTT5t5cqc{R+mSU^W$&dHs%* zn-I@t4>TzCfMMoXfUAE{|U93Bt9NGpM`nLQZ% z6}g?42C?RI5YSBlpO{ryGhzT;BEdaHAUJIRjx*Q!?NX@E_mjGRgW3vkHL9grl<>OlvT}yG-B+x0Veb$H(={b9ud+ zWV-2%8AtD<)SnUSKwSzja5D|aiXF4G;jI?A6U5VxC+{sKIj~|%1a4@7WWu-&dScHz z+2!c&=EqB|Y_rRF(oxQ~)`xe`qJae{_c$XmXv+T+@Q2$7BtW>@G@6y}@Tb0zbdL`Q z_7GT+$M99%sJx(`pW2@lY>PfEB(k@CP~|1UlH{7+h$;garwjTONXLVyOKI7wES~iZgT-Q#7PhyE4x1|4H%h@}kw!M?6L_&hV$8{IgNre`oPm=o7A+mD z_qTkD&Vg7vWZi55INZt$pR_)Ye%y5wqvJASK3jEfUg6av#vb4zu!zwH{Ik8Al8;Bu zzCA|2Kv@z72GGhf9KK>igi<>g)F8+TJVxR(G9}tvIPz#<+Iq7(1vUdagpV7PXSAC+=L3` z+(b0E)0;ptOcyy1GS>1qaD9qEn(Ynq5Fp5bQ@h&nB!iy@I_g9#aVf+WtL%$a>fs!z zZDPY$&f@o&2}Ri09tJrfzcNeDlxBPSarsiw8xfu>dfxlr_X$b8J-gXQY@QCRs%!E& zmEcx{u@-TM(>~cQuaYLd*_+~OYf!u~`ISqw@x*sLmmOmyOOnN}M|*Z|0w|se4VrOR ztg zEyw1)v*q%-9uomK){~?~*#10_2Hy^B$hC%J6u4t`#M4&KB|?45@t8sP;PE;Yl7oS) z@p`f{(GE2P(-x32{9*YE&-tI|pMmro`@P6?0bp{iSWk+@)I|Pl-`xN+x49Kl*b8#^ z7HTYM*OsV>%y6a|!y6L*LKu!O+NLXlq+zK6Ppq9*D4>oYs!ZO!Y?;25Xl4Bf>0Fii ziUd+No2l&=8rbTp*{()f9$2v+Au0A2VeRt~VS^i_U8Oo+;s8na0Y`pdTihd}_%Kuc z5$^t=$6=~~2ruLDciZfX5#f9f?rMGh56@G24wv`P3Z9xfqQ&EUi~P2dcOUl3ki(TX zjl0>5=2-Ue6)SD zsM;r9o>)15zv_(m4cTJ@Cn_~wtobRcqe8S(c6dCa-udB7#f{MFK9GD?KMOLcsq-u;U;`u;SxOLU}PmPO$D!c$L1X}Nh$t>v9O zJ~Wiv6_G|I*9b{3;zpmoN(&uCr3=bgU<-=yf1QSd=7$qer_>ppRsMkfFra@wWu<5) za-xMGjf}1;MX8X&9!YUCdT%b(7rjg6JsHm|)-DD+S_DVe3CngZ>zHiQRLl6Zomt_@ zdU6=cKEwKgEr|JQJXYq_>{CS`5{o~4s5rJ;>a|!;9E#&mxXT$7LE7OSYgd*!9!w(l zn73Bt%qTc%*9e`{ITFKuShkd$1t-`i9UWWZI)N6ATJ=HXa)BO8-%;PXQ{Wpy>f4*Y z`k`KzMGp?FOvDFKH}J>^yW<#a#nChM2bm^C;)Th~2D8<=1~RW)oi^v`u{)MHWq@V3 zEAq#@83|U|LL9xZn)-0Ycm9F~Da?N>bz7-AGsAD5w}IPE+x)h+d|VYBA~tw3Eo(k$ zs(X^iGs?ZUeo0ZK_Et44dv}X+&TtgfKwe|Kez-c{NR|?-W^0^! zCg#R*{F=R}7nmE;!-~cZS92L>nYN2dHme;h(~=sX(z+NR_AI%s>IZUH>8Y{H+gOJO z4zp`H35f8+o3WzbVbA*d(l$YD1J`e6qBusgZlznjBi7QkQjO=)>?LP>ZBI2^8;wDH zySv!spUX&No_v~o>sLWqM2h{_ONHn~r}fuQHvM($0Q>zDkXgak7L(X!br=B*Ea=W1 ztR2W|UU=}k;@wGcLM)>boj_5(`y+EbXesLavtAxQrjH!Pfp(*0{>bG6f=}15Uyp<_ z?N)2#ofLQ-q7)M${psC3Q$(o^*3cYzUC#CzUaXA7jR3Cj2DVeRM}a8&b|X`||IhMo zH4f0a0yQ#h5;6XIy|UA&c&S=quNmt)f)_ zYmqt`R^m1&TaU$-BWJ3nPG=ZU)pKO;q~AR9+5KqlxQc;+7+IFAFr4%G_DdUX5LYf$ zDYbm2s&s$Kp5HAE!zk6 z!t|uByAMNyVT8E*`b`_FGRoVobv#X*Xa`zuJP+RdfuTz8myUK| zwSfZl<*>w7UU%j|d-QIMO%c8}_XS!Ghf`7)8NB^dcGd%Wj{lgll>T&GXd$yDXa3B!V{=VD>Kz{tRG7tRfazcn_BaHZE3|94f1s2X}w2FMv3Vc z@U>|b++d~=?3iFMR=A-n?4>z-i`cof&`T*f1Al?|sX^?vT9xs*Hc$*V`6Hv|fJSY< zmVmFV=aVuoKwQ!?vT8|ny8hOnMU90K6|G-h2&U43+A4}TIy8#t;taVS}HCl>?2uP(bxpFHVHmD#KnL#e>Sv4aJYiKv>~DL&Dd6DF!k&X z*Mo6t)xTu#M`Xi?tbVm`2@O)(*%e{uQDPkm^xH1{0@+QzeF_ zXDva?QLNOgCr|0ye`v(3ZV><~F61ck5On#?900k^SKO*DPuJf~jbFnwd4re?_^46W5KYai96Wq3{3Qtr+R1=52l>)Af2wPQEh9Ppew;kCUq28uyRo z>-(%WrfHIU_twb0|kEe=Q zS+;8UIVo4EVx%eJC;WQwR2%4RZCBeh_W;)}A8zzVnEjAP6AD~x8Tv_(L}cOP^8f7% bF)Jdy=QvjaQnrgie~Ch}cD8ERNy+?Q@KH(+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_color_library_cloned.png b/app/src/main/res/drawable/ic_color_library_cloned.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e399a8f7fb0d3b9ae3b7c2efd5c89ea2b34f09 GIT binary patch literal 33303 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˺VxtZc@y&5= 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_color_library_created.png b/app/src/main/res/drawable/ic_color_library_created.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb9966a60563916160b938100926390b7a056aa GIT binary patch literal 6385 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 Utk`33{-*?Qq0fTSKZbAmPbrVeiU0rr literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_color_library_custom.png b/app/src/main/res/drawable/ic_color_library_custom.png deleted file mode 100644 index 0103cd56228e528e75a7f6ce335c916533c06855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6806 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_color_library_intelligent.png b/app/src/main/res/drawable/ic_color_library_intelligent.png new file mode 100644 index 0000000000000000000000000000000000000000..082a05e54d8e02ed64badba6b47fe94603eb33a1 GIT binary patch literal 11956 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 QkDe<>8=4!GoprhLPi?BjLjV8( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_color_palette_vector.xml b/app/src/main/res/drawable/ic_color_palette_vector.xml index a073bc4c..dc1ed752 100644 --- a/app/src/main/res/drawable/ic_color_palette_vector.xml +++ b/app/src/main/res/drawable/ic_color_palette_vector.xml @@ -15,12 +15,12 @@ diff --git a/app/src/main/res/drawable/ic_customize.png b/app/src/main/res/drawable/ic_customize.png new file mode 100644 index 0000000000000000000000000000000000000000..82ac7a9d92117a26b54f987697d59214bc92a8cf GIT binary patch literal 4116 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_file_download_black.png b/app/src/main/res/drawable/ic_file_download_black.png new file mode 100644 index 0000000000000000000000000000000000000000..4547fae5d794d9a8af52b1acfa73f186729bbdf9 GIT binary patch literal 7515 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 B-p2p{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_file_download_white.png b/app/src/main/res/drawable/ic_file_download_white.png new file mode 100644 index 0000000000000000000000000000000000000000..1e51685e0b68caf668ca6e2744dcfcd9786ec7b1 GIT binary patch literal 8898 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 KrDO~1@P7avpTvp) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_file_download_white_cropped.png b/app/src/main/res/drawable/ic_file_download_white_cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef38eeeb5e97cb75cbd856a79d51f5e9c83b1dd GIT binary patch literal 7184 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_filter.png b/app/src/main/res/drawable/ic_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..803fff0c490da390c324c4cc9ccf6365d29fe212 GIT binary patch literal 24190 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 OgmCc4fiiQSEB^p`n~m21 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_import_from_top.png b/app/src/main/res/drawable/ic_import_from_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7e59a4edda398f65d50fafd46227b50f45e4a301 GIT binary patch literal 6428 zcmeHLX;f3$mOcq#Qkk@>9hk(4XHyZB5>SRXf-|TPCV?P@C__jw6Nbc6q3kE%2q>d3 zIFJw$nF0wz6a^_%M7@AQAczQDkU_j8CL!sYs_yr*e|4|bKVH_#y2;slfBQT8?0e4M z=d#B!H@zimmH+_s4j$Nd0st)f6AN^-(8sr=cQW*$OF7^h3xIyB`ip6ge)tPIxH@jX zPu$7qGjWN*F`*zaF>%W|azt!MFeP+LbWB*mw9^^@R+S&zx7#zR@QWzrbyQ-&(43@0 zw_(K=Vv!M-P2Uq$zH^Z2shxk7{<~0zO^mP(XB~56`$g3T=1;`!{Lz~IW26zAxXZ*^ zv;W-I@OPyL*m&`-T}m7n@t9M}%ut|QLVcNPX=_n9Cg@3j zB}?y#4oJYDME{pR+@NDwWYAaM$#nBJ_YFv17;56lT46lIz97Q_yYV;hZD=X8fN2XA zNsfoTQrdTMijN0uD-8l-oZ0cT#Q0c=^Xv?VT-nT`O0!e6LH5LMNJ5;Md7`ayo?OK5 z7Q?1wZ9v)AON@?=y`U;a>fk#?QF?$9_<%W>=dCj+guq63(e9DN1@HX7xKS%_nqrWyr4St~w zP$Li_o4gggmi(MPK2%-IgYa7P4(G;~&7Zxw>&_vj@0RZ8}e<}Sd1pg1RVEkjZp0Fv&2a&>$p!Fw(CrpkM9HUkRRfXm0RkEi=WQ?#l=`5lVb!K*`I#9IyC;iL7=9Q&4=iIz} z;t28^Y$53Xf&R#aEi0;Xyy)_}YJmDT76vPvE@C$GskDAkP|HwE*HYnbxg)+c*}HZ8 z9&}I8$HlJz36pQ&&@bc?5izafSlu!bofFj%LhIF-kimbLMh@BO0zqtO=gf;rNxv!7 zJ4KR%1o-c3Y|%}PaAEVOWBmvS`}Yji<> z;{MK==i`fs{>W-{uXD&ZF6#?2U~~SplW|w3c8#Jad3M~@ zArcGv7p(mUuhv-?`z-Q$(ss~a@*AnioilCC(s`(5l?W%iBrB_%FH~)UWw{zEzj_?k zG|&EXMhoNJ7d&T82Ahi&+AYp6ND`+GLNs!K1qx6jyPP|8DJ_mK%k4f2OnMppL)9ul zua&=>4j0Sy&EusmFeK1%BF5#+VL83y%jEmjlagob5y|A83fzm&1GiP%8OA$)dyCI` z{iKaO3|{VZ4vW)hryNDz;)8a)2o_XqoK1T*?wTEZl$PgXgrP^FS@kQUz~O#`zt#mq zO8u5|JLX#w;?}o+n}gi4$iKC&2VA{~#nU$|!#0XNiX7)@AI4p`TwSU0=vOoVvwhuq zg~E8KYXi>Y`eDE3zA=7xR-rJ&)m}Jk1o|>+hiX%!kQ=6LJe^n5Z*skgx=cmSb)CcG zG)&CYzMqe4*@?@2b$tY}VM=#Yrj>-ZF}6fqW`3<)ob)5F5&ROj-lTscp5@?fE_$Ak z6uxvtZ6wpg+bj)7rXT$AHS_$&YdyySWL>So}wkH691di{J2)#r_FecwnIYYj>ONZ zE8SU<9nm>t`k$fTtQHCXEiJG!B$S9i&}PWZ>3pP7}5Hu&Z>zxWIev*nT32Jm!p-DwH);2uFN5mw2N;U z+Wev6SNuX+z%YJ)J}(<}z5#IYgrKH`xD}3TaZ`g6FrjWrzE|=ARwL)5lOBBqJG$9F zTHh7!J6E3+w|+%^{YFaK<8jx7PeEtCoBQ1TJ2NN(O;Qg+_re}wwS*+k_Ujsam`)UwSFciQWwkp zQJwz=b{v>1&NC zB)`vN@XqBSAAefZ(EfBCmbICmN=#cjJ6Yfp7d@Xa9DXj+J+XLLaZL3qAk zE3UC-sR70oM~{t`8jDn0I%l=-{~V!Hf7MvSz!{vnIc#8aYxQ2?C8u>s&oSbEOG?}SgjlvmsO@+Wkfa)v4SR$EJ!asT zmx^pa?GIh81eP`-I!VFiYp^{gU>OZ;`Q4B^_^0YR6ioFxz=D*85qlzODX+WK?)rX1 z$+twWE{j+S9x!PF?WU=!Wi&ee&UTzrn1Re8+}W|!oQ|)rl09oP|CZ>>8M24y@IVpHVJrv(L?kcXwfu18eqz$blUMql)qXpe)8I9-; z#D+SUsq4dCyA6TE4|{-sB#pJf0sYH{LOYatN@SY^_wY;Jm;yuGrQ=cXQ>!^?|3y%H z8I30KfR2adW^~}$MG$WhD%CIn7Q0Lzpj0*1;T|&3WuVYeNi(XdpKn+?%|<1YN)b;d{%M0QYPl#73hysvPV>9f7S9U(>)p*WR>u+<8;yDCft;_=<0Bn zcC4c0-38_hdvNHpzRgVZ_x<(M%>KveE3gX;^7GlTE!nCSf;wtSzhhq`n|~(EzqNS< zwyj5RwQ}Iu9PPwkWxnH|W&ZXty_>0jvmhN&<35?AoqoVtSu59gy|haiX^2hmxBo?2 zO;MEemFF6qes_M{?K;jk$z4ePBUV{BA|*78*(vGY*ytJA^W=~)VKSred+f?~)n(^L z{HD1U5XQ8OPWJaTu)_3j4pR;kji{bhk_Cw=X1qZ^X9~;z#T_5rzDUtkTiWzT6l~_4 zA~U^#hj z`D#kla!PRg-dBq69_p!=QNuUmvG0D1#hi=GA(akHwp6DL&-kai{t-2v7pVOUD z!g~JwRQ>a}=qViIn9p6`cPQPbz9!6v8d$RXS)Fw?1`f-nb*18%mnHHMX^UnAA2<83 zr+a1szQ!mZahf=ze#6#TSCcbIQQI}hn>w;oqAutI!? z;5MeVUjich)-|I2NW~L5vn%SAAteO4i3a-TY?VLvKA?1<%pX^mnm|`9gtKGyCMq83 zCisD-^%4S+?hTDGfIiF*J&-e<3ljUsqI4*2Ax>7!5; zR{)r-%29j$aXBEREo@dBoxp;Mw=NgeMkpvk4MM)bKWd~eSTQHJDS~TJYo3JIRZ;9M zYPe967={#u(LSdn&d$^EMu4>V$}?yv##PyaR~8Z+deg)S}qr_UJ1pzfmxFVS@3 z$X?_YXmZMxF$i5QRi&0v)8f;Rudr8t^omvcQ3n!cHIjvIRfRA!y$qb>EiDhI{)i*q z0_4*Hi2c3`xnHe$%m1GteC^NZZw(vdkOp z`Nec63R-Q>Dp4792P+Iu2uH--dcfrBcGHv5#vzyjKBoh1rw(*VV&T$8k>u?9dxM5dB(NR{+(UCmr zu@jt%%0X!$#)qTr)oZVmre3E$X_G85|M&)W&QfvRPefO`1iy9EB3*KMB>U24p67mo z_i6deD@Ei8VfIE(6nfp{9hEc$Djxp`@pw*~x66`J-^gyioL=*4%xaD5d^A&8DsxK? zHnhpKVsa`6KS)Pr?!%pS{7eTF#T>Z1Q=B|BJNK}YHN{LgD!ELbzExQ!dkCkY;V_IyHF~{+ z=Sgtk>w^2pN8(OJgvbiiIuT?AXnv7)Cf2m%J4xCr)7S;g zquC^kQz9tM@Gp5F{C$S%ebo;dXbDVUqJ7KLgKSvv_pXsI(8?=hEPb}xke{_>DR#`SGxW_RS=>Y9fmf!St$5okiSdY%o zEMr!S9p4D(Kgoi^;z^R*Xu0}OCe0oD*#Mce#PntPGuR59aj46&I)9_}7 zF@^*+*Jz}TD(+T-cU4i=oMJTyapDq`mqkA9ufGF$qKj}sxL(bKsUUWCjuPeZEt0XT zgBp}*Wj&Rst-xTpzs|6W-=6Qv-fIB7I4mVG{!H9@FxAx0vaT3(;9rY!d{+QwCho%$ zW>}mw&l%L)BobAn)Csgl3C;x`$cJ1nx@9&QM{oM}5^7m3dRqD72lUNspi+A?v9A15RcbukN@# z^Kmu4mtKh$$G|`SaHk+R(1m}k8%Gy7-KY8@-mYjYh>ed%^=K{I`Pb5HgLL z_QW8+rgL%Y<h&xs8m5&DXi!vv{)?peWTZp)D3HV1 zxt4qvp6uDCv}V=AQ&@*$cXl&N_5$@YyE_ny=}{RojD44eRkzRI$?e3_nq==EHvtb$ zL~_l{+-ha}X-)AjE_Y>N&{$XycIpj_NrPgxohesgSNRpp)x%aS>$Ax@02D|pp~K9T zH3KEjbag;Md?+#nFJ)PJuFQ$jCLv@_dUNQkY9G@4=!=OyhLqycNF^fg;LFM7hQi~b zH`~6cB9N2#=jjGum;!Yp1-+-F+=^7;}bL{*{xeukUGtb~OwXJ*2SGO!W2H z-W--ooop!-6zRJIIP9A_`+dp65PR@cQ}gH+C9fuRzqR8AFjaDxWgzem82GyUADymt znv`WcBJD%WqOu4d{W&G<75sm2r7w0;5^BHS#n>IcH;djMgM<5z?W^2F`t3gfnTIIv literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_import_from_top_thick.png b/app/src/main/res/drawable/ic_import_from_top_thick.png new file mode 100644 index 0000000000000000000000000000000000000000..5a55510e7a1285686bac0a46ddbf08bd5b4f5220 GIT binary patch literal 5751 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/mt_color_libraries_recycler_view_item.xml b/app/src/main/res/layout/mt_color_libraries_recycler_view_item.xml index 221321d3..d8d7aac9 100644 --- a/app/src/main/res/layout/mt_color_libraries_recycler_view_item.xml +++ b/app/src/main/res/layout/mt_color_libraries_recycler_view_item.xml @@ -17,7 +17,7 @@ android:layout_width="36dp" android:layout_height="36dp" android:layout_marginTop="1dp" - android:src="@drawable/ic_color_library_custom" /> + android:src="@drawable/ic_color_library_created" /> + app:showAsAction="always" /> + android:imeOptions="actionSearch" + android:inputType="text" + app:actionViewClass="androidx.appcompat.widget.SearchView" + app:showAsAction="always|collapseActionView" /> + android:id="@+id/action_add_color_library" + android:title="@string/text_add_color_library"> + +

+ + + + + + + + + + - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_color_library.xml b/app/src/main/res/menu/menu_color_library.xml index 845f9504..d8f9d2b0 100644 --- a/app/src/main/res/menu/menu_color_library.xml +++ b/app/src/main/res/menu/menu_color_library.xml @@ -7,7 +7,10 @@ android:id="@+id/action_search_color" android:title="@string/text_search_color" android:icon="@drawable/ic_search_black_48dp" - app:showAsAction="ifRoom" /> + android:imeOptions="actionSearch" + android:inputType="text" + app:actionViewClass="androidx.appcompat.widget.SearchView" + app:showAsAction="always|collapseActionView" /> Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 4a72a5e9..07054c71 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -919,5 +919,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 84ee50e6..da4b1e14 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -922,5 +922,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 78d8d1f2..c7f3b700 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -922,5 +922,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 113b92f2..08d70d1a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -922,5 +922,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 330c23f4..b6c0371d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -923,5 +923,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index af1a3b6d..fc34d61c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -922,5 +922,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 8c4c2459..b7d83f44 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -921,5 +921,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 601a9f71..1dd646e5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -921,5 +921,20 @@ Default Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index e33e322f..bdfc2311 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -921,5 +921,20 @@ 默认 自定义 调色盘 + 添加颜色库 + 导入颜色库 + 新建智能颜色库 + 克隆颜色库 + 智能颜色库 + 智能颜色 + 智能 + 调色盘 + 自建 + 搜索全部颜色 + 打开调色盘 + 当前主题色 %1$s 由调色盘配置 + 定位失败 + 无法定位主题色所在颜色库 + 无法确定主题色条目的索引值 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0ae4ac32..84ec43ed 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,8 +2,16 @@ #DE212121 + #B3212121 + #9A212121 + #4D212121 + #33212121 @color/md_gray_900 #DEFBFBFB + #B3FBFBFB + #9AFBFBFB + #4DFBFBFB + #33FBFBFB #FBFBFB #DE252525 #252525 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 441b5dd7..6db2b01e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1163,5 +1163,20 @@ WEB Custom Color palette + Add a color library + Import a color library + New intelligent color library + Clone a color library + Intelligent color library + Intelligent colors + Intell. + Palette + Created + Search all colors + Palette + Current theme color %1$s is configured by the color palette + Failed to locate + Failed to locate the color library for the theme color + Failed to determine the index of the theme color item diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3fcf0227..84e1dae6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -121,7 +121,8 @@