diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 79f85100..be026f14 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -574,11 +574,15 @@
+
+
- val isLightColor = ColorUtils.isLuminanceDark(backgroundColor)
+ val isLightColor = ViewUtils.isLuminanceDark(backgroundColor)
ViewUtils.setStatusBarBackgroundColor(this, backgroundColor)
ViewUtils.setStatusBarAppearanceLight(this, isLightColor)
ViewUtils.setNavigationBarBackgroundColor(this, backgroundColor)
diff --git a/app/src/main/java/org/autojs/autojs/inrt/LogActivity.kt b/app/src/main/java/org/autojs/autojs/inrt/LogActivity.kt
index 04101173..1f7c4a8c 100644
--- a/app/src/main/java/org/autojs/autojs/inrt/LogActivity.kt
+++ b/app/src/main/java/org/autojs/autojs/inrt/LogActivity.kt
@@ -14,6 +14,8 @@ import org.autojs.autojs6.databinding.ActivityMainInrtBinding
class LogActivity : BaseActivity() {
+ override val handleStatusBarThemeColorAutomatically = false
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupView()
diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ui/UI.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ui/UI.kt
index 20d8380e..f9162d8c 100644
--- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ui/UI.kt
+++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ui/UI.kt
@@ -22,6 +22,10 @@ import org.autojs.autojs.extension.AnyExtensions.isJsNullish
import org.autojs.autojs.extension.AnyExtensions.jsBrief
import org.autojs.autojs.extension.AnyExtensions.jsSanitize
import org.autojs.autojs.extension.AnyExtensions.jsUnwrapped
+import org.autojs.autojs.extension.FlexibleArray.Companion.component1
+import org.autojs.autojs.extension.FlexibleArray.Companion.component2
+import org.autojs.autojs.extension.FlexibleArray.Companion.component3
+import org.autojs.autojs.extension.FlexibleArray.Companion.component4
import org.autojs.autojs.extension.ScriptableExtensions.defineProp
import org.autojs.autojs.extension.ScriptableExtensions.prop
import org.autojs.autojs.rhino.ProxyObject.Companion.PROXY_GETTER_KEY
@@ -34,7 +38,6 @@ import org.autojs.autojs.runtime.api.augment.colors.Colors
import org.autojs.autojs.runtime.api.augment.jsox.Numberx
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
import org.autojs.autojs.util.RhinoUtils.NOT_CONSTRUCTABLE
import org.autojs.autojs.util.RhinoUtils.UNDEFINED
@@ -540,7 +543,7 @@ class UI(private val scriptRuntime: ScriptRuntime) : AugmentableProxy(scriptRunt
fun statusBarAppearanceLightBy(scriptRuntime: ScriptRuntime, args: Array): Undefined = ensureArgumentsOnlyOne(args) { refColor ->
ensureActivity(scriptRuntime) { activity ->
runRhinoRuntime(scriptRuntime, newBaseFunction("action", {
- Colors.toIntRhino(refColor).also { ViewUtils.setStatusBarAppearanceLight(activity, ColorUtils.isLuminanceDark(it)) }
+ Colors.toIntRhino(refColor).also { ViewUtils.setStatusBarAppearanceLight(activity, ViewUtils.isLuminanceDark(it)) }
}, NOT_CONSTRUCTABLE))
}
UNDEFINED
@@ -595,7 +598,7 @@ class UI(private val scriptRuntime: ScriptRuntime) : AugmentableProxy(scriptRunt
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
ScriptRuntime.requiresApi(Build.VERSION_CODES.O)
} else {
- ViewUtils.setNavigationBarAppearanceLight(activity, ColorUtils.isLuminanceDark(it))
+ ViewUtils.setNavigationBarAppearanceLight(activity, ViewUtils.isLuminanceDark(it))
}
}
}, NOT_CONSTRUCTABLE))
diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt b/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt
index 92e91b96..4e3d3111 100644
--- a/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt
+++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt
@@ -9,7 +9,7 @@ import org.autojs.autojs.core.pref.Pref.getInt
import org.autojs.autojs.core.pref.Pref.putInt
import org.autojs.autojs.extension.ArrayExtensions.toHashCode
import org.autojs.autojs.theme.ThemeColorManager.defaultThemeColor
-import org.autojs.autojs.util.ColorUtils
+import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.R
/**
@@ -31,9 +31,11 @@ class ThemeColor(@JvmField var colorPrimary: Int, @JvmField var colorPrimaryDark
@ScriptInterface
fun getColorPrimaryDark() = colorPrimaryDark
- fun isLuminanceLight() = ColorUtils.isLuminanceLight(colorPrimary)
+ @JvmOverloads
+ fun isLuminanceLight(backgroundColorMatters: Boolean = true) = ThemeColorManager.isLuminanceLight(backgroundColorMatters)
- fun isLuminanceDark() = ColorUtils.isLuminanceDark(colorPrimary)
+ @JvmOverloads
+ fun isLuminanceDark(backgroundColorMatters: Boolean = true) = !isLuminanceLight(backgroundColorMatters)
fun colorPrimary(colorPrimary: Int) = also { this.colorPrimary = colorPrimary }
diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java b/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java
index c56c926b..def2a5a6 100644
--- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java
+++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java
@@ -14,10 +14,8 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.Switch;
-
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.graphics.drawable.DrawableCompat;
-
import org.autojs.autojs.theme.internal.ScrollingViewEdgeGlowColorHelper;
import org.autojs.autojs.util.ColorUtils;
import org.autojs.autojs.util.ViewUtils;
@@ -90,8 +88,8 @@ public class ThemeColorHelper {
}
private static void setThumbDrawableTintList(Drawable drawable, int color) {
- int unselectedColor = ColorUtils.isLuminanceLight(color)
- ? Color.parseColor("#616161") // R.color.md_grey_700
+ int unselectedColor = ViewUtils.isLuminanceLight(color)
+ ? Color.parseColor("#616161") // R.color.md_gray_700
: Color.DKGRAY;
int[] thumbColors = new int[]{
color,
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 ab96dd4f..bf52dfb1 100644
--- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt
+++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt
@@ -29,12 +29,6 @@ object ThemeColorManager {
ThemeColor.fromPreferences()?.let { currentThemeColor = it } ?: setThemeColor(defaultThemeColor)
}
- @JvmStatic
- fun isThemeColorLuminanceLight() = currentThemeColor.isLuminanceLight()
-
- @JvmStatic
- fun isThemeColorLuminanceDark() = currentThemeColor.isLuminanceDark()
-
@JvmStatic
fun add(colorMutable: ThemeColorMutable) = ThemeColorMutableManager.add(colorMutable)
@@ -67,10 +61,6 @@ object ThemeColorManager {
ThemeColorWidgetReferenceManager.setColor(themeColor)
}
- /**
- * 设置主题色并为记录的状态栏和标题栏改变颜色
- * @param color 主题色RGB值
- */
fun setThemeColor(color: Int) = setThemeColor(ThemeColor(color))
private fun saveThemeColorIfNeeded() {
@@ -78,10 +68,31 @@ object ThemeColorManager {
}
@JvmStatic
- fun getDayOrNightColorByLuminance(context: Context): Int = ViewUtils.getDayOrNightColorByLuminance(context, colorPrimary)
+ @JvmOverloads
+ fun isLuminanceLight(backgroundColorMatters: Boolean = true): Boolean {
+ return ViewUtils.isLuminanceLight(colorPrimary, backgroundColorMatters)
+ }
@JvmStatic
- fun getDayOrNightColorResByLuminance(): Int = ViewUtils.getDayOrNightColorResByLuminance(colorPrimary)
+ @JvmOverloads
+ fun isLuminanceDark(backgroundColorMatters: Boolean = true): Boolean {
+ return ViewUtils.isLuminanceDark(colorPrimary, backgroundColorMatters)
+ }
+
+ @JvmStatic
+ fun getDayOrNightColorByLuminance(context: Context): Int {
+ return ViewUtils.getDayOrNightColorByLuminance(context, colorPrimary)
+ }
+
+ @JvmStatic
+ fun getDayOrNightColorResByLuminance(): Int {
+ return ViewUtils.getDayOrNightColorResByLuminance(colorPrimary)
+ }
+
+ @JvmStatic
+ fun setStatusBarBackgroundColor(activity: Activity) {
+ ViewUtils.setStatusBarBackgroundColor(activity, colorPrimary)
+ }
private object BackgroundColorManager {
@@ -105,7 +116,7 @@ object ThemeColorManager {
fun add(activity: Activity) {
activityRefs.add(WeakReference(activity))
- ViewUtils.setStatusBarBackgroundColor(activity, currentThemeColor.colorPrimary)
+ setStatusBarBackgroundColor(activity)
}
fun setColor(color: Int) {
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
new file mode 100644
index 00000000..9cb5e567
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibrariesActivity.kt
@@ -0,0 +1,322 @@
+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 android.widget.Toast
+import androidx.appcompat.widget.SearchView
+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 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
+import org.autojs.autojs6.databinding.MtActivityColorLibrariesBinding
+
+@SuppressLint("NotifyDataSetChanged")
+class ColorLibrariesActivity : ColorSelectBaseActivity() {
+
+ private lateinit var binding: MtActivityColorLibrariesBinding
+
+ private lateinit var mAdapter: ColorLibraryAdapter
+
+ private val customColor: Int
+ get() = Pref.getInt(KEY_CUSTOM_COLOR, getColor(R.color.custom_color_default))
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ ThemeChangeNotifier.themeChanged.observe(this) {
+ setColor(ThemeColorManager.colorPrimary)
+ mAdapter.notifyDataSetChanged()
+ }
+
+ MtActivityColorLibrariesBinding.inflate(layoutInflater).let {
+ binding = it
+ setContentView(it.root)
+ setUpToolbar(it.toolbar)
+ setUpAppBar(it.appBar, it.appBarContainer)
+ }
+
+ binding.colorLibrariesRecyclerView.let {
+ it.layoutManager = LinearLayoutManager(this)
+ it.adapter = ColorLibraryAdapter(colorLibraries) { library ->
+ val intent = Intent(this, ColorLibraryActivity::class.java)
+ intent.putExtra("LIBRARY_ID", library.id)
+ startActivity(intent)
+ }.also { mAdapter = it }
+ it.addItemDecoration(DividerItemDecoration(this, VERTICAL))
+ ViewUtils.excludePaddingClippableViewFromNavigationBar(it)
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.menu_color_libraries, 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 {
+ filterLibraries(query)
+ return true
+ }
+
+ override fun onQueryTextChange(newText: String?): Boolean {
+ filterLibraries(newText)
+ return true
+ }
+ })
+ return true
+ }
+
+ 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)
+ }
+ }
+ mAdapter.updateData(filteredLibraries)
+ }
+
+ // 定位功能可以通过工具栏中的 "action_locate_current_theme_color" 按钮实现,
+ // 按钮点击后找到包含当前主题色的颜色库在列表中的位置,
+ // 然后调用 RecyclerView 的 scrollToPosition() 方法跳转到该项
+
+ override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
+ R.id.action_color_palette -> {
+ showColorPicker()
+ true
+ }
+ R.id.action_search_color -> {
+ ViewUtils.showToast(this, R.string.text_under_development_title)
+ true
+ }
+ R.id.action_new_color_library -> {
+ ViewUtils.showToast(this, R.string.text_under_development_title)
+ true
+ }
+ R.id.action_locate_current_theme_color -> {
+ locateCurrentThemeColor()
+ true
+ }
+ R.id.action_toggle_color_select_layout -> {
+ isLegacyLayout = true
+ startActivity(this)
+ true
+ }
+ 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_SELECTED_COLOR_INDEX, customColorPosition)
+ }
+
+
+ private fun locateCurrentThemeColor() {
+ // 假设当前主题颜色保存在 ThemeColorManager 中,可以通过它查找对应颜色库
+ val currentColor = ThemeColorManager.colorPrimary
+ // 简单示例:遍历 colorLibraries,找到第一个包含该颜色的库
+ val targetIndex = colorLibraries.indexOfFirst { library ->
+ library.colors.any { colorItem ->
+ getColor(colorItem.colorRes) == currentColor
+ }
+ }
+ if (targetIndex >= 0) {
+ val recyclerView: RecyclerView = findViewById(R.id.color_libraries_recycler_view)
+ recyclerView.smoothScrollToPosition(targetIndex)
+ } else {
+ Toast.makeText(this, "未找到当前颜色所在的颜色库", Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ 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_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
+
+ val colorLibraries by lazy {
+ listOf(
+ ColorLibrary(
+ id = COLOR_LIBRARY_DEFAULT_COLORS_ID,
+ nameRes = R.string.color_library_default_colors,
+ titleRes = R.string.color_library_title_default_colors,
+ identifierRes = R.string.color_library_identifier_default_colors,
+ colors = listOf(
+ R.color.md_teal_800 to R.string.md_teal_800,
+ R.color.md_blue_gray_800 to R.string.md_blue_gray_800,
+ 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)
+ },
+ ),
+ ColorLibrary(
+ id = COLOR_LIBRARY_MATERIAL_COLORS_ID,
+ 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)
+ },
+ ),
+ ColorLibrary(
+ id = COLOR_LIBRARY_ANDROID_COLORS_ID,
+ 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)
+ },
+ ),
+ ColorLibrary(
+ id = COLOR_LIBRARY_CSS_COLORS_ID,
+ 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)
+ },
+ ),
+ ColorLibrary(
+ id = COLOR_LIBRARY_WEB_COLORS_ID,
+ 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)
+ },
+ ),
+ )
+ }
+
+ 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,
+ )
+
+ data class ColorLibrary(
+ 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,
+ )
+
+ }
+
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..4064c7df
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorLibraryActivity.kt
@@ -0,0 +1,257 @@
+package org.autojs.autojs.theme.app
+
+import android.annotation.SuppressLint
+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.annotation.ColorInt
+import androidx.appcompat.widget.SearchView
+import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.VERTICAL
+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.util.ViewUtils
+import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByColorLuminance
+import org.autojs.autojs6.R
+import org.autojs.autojs6.databinding.MtActivityColorLibraryBinding
+
+@SuppressLint("NotifyDataSetChanged")
+class ColorLibraryActivity : ColorSelectBaseActivity() {
+
+ private lateinit var binding: MtActivityColorLibraryBinding
+
+ private lateinit var mAdapter: ColorItemAdapter
+ private lateinit var mLibrary: ColorLibrary
+
+ private var mSelectedPosition = SELECT_NONE
+ private var mSelectedColor: Int? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val libraryId = intent.getIntExtra("LIBRARY_ID", -1)
+ val library = colorLibraries.find { it.id == libraryId }?.also { lib ->
+ mLibrary = lib
+ } ?: throw RuntimeException("Unknown library id: $libraryId")
+
+ 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)
+ }
+ }
+
+ 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()
+ }.also { mAdapter = it }
+ it.addItemDecoration(DividerItemDecoration(this, VERTICAL))
+ ViewUtils.excludePaddingClippableViewFromNavigationBar(it)
+ setUpSelectedPosition()
+ }
+ }
+
+ private fun setUpSelectedPosition() {
+ when (Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE)) {
+ SELECT_NONE -> when (val legacyIndex = Pref.getInt(KEY_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
+ }
+ }
+ 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
+ }
+ }
+ }
+ 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
+ }
+ }
+ }
+
+ 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_SELECTED_COLOR_INDEX, defaultColorPosition)
+ } else {
+ Pref.putInt(KEY_SELECTED_COLOR_INDEX, SELECT_NONE)
+ }
+ }
+ COLOR_LIBRARY_MATERIAL_COLORS_ID -> {
+ val index = colorItem.id
+ if (index !in ColorItems.MATERIAL_COLORS.indices) {
+ Pref.putInt(KEY_SELECTED_COLOR_INDEX, SELECT_NONE)
+ } else {
+ val fixedIndex = maxOf(
+ defaultColorPosition,
+ customColorPosition,
+ ) + 1 + index
+ Pref.putInt(KEY_SELECTED_COLOR_INDEX, fixedIndex)
+ }
+ }
+ else -> {
+ Pref.putInt(KEY_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
+ }
+
+ 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)
+ }
+
+ 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 -> {
+ // locateCurrentColorLibrary()
+ true
+ }
+ else -> super.onOptionsItemSelected(item)
+ }
+
+ 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]
+ 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/ColorSelectActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt
index 96f47b64..19f38887 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
@@ -4,10 +4,6 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
-import org.autojs.autojs.core.pref.Pref
-import org.autojs.autojs.theme.ThemeChangeNotifier
-import org.autojs.autojs.theme.ThemeColorManager
-import org.autojs.autojs.util.StringUtils.key
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.MtActivityColorSelectBinding
@@ -21,9 +17,12 @@ class ColorSelectActivity : ColorSelectBaseActivity() {
private lateinit var mColorSettingRecyclerView: ColorSettingRecyclerView
+ private var mSelectedPosition = SELECT_NONE
+
private val mOnItemClickListener = object : OnItemClickListener {
override fun onItemClick(v: View?, position: Int) {
mColorSettingRecyclerView.selectedThemeColor?.let {
+ mSelectedPosition = position
setColorWithAnimation(it.colorPrimary)
}
}
@@ -31,7 +30,7 @@ class ColorSelectActivity : ColorSelectBaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- MtActivityColorSelectBinding.inflate(layoutInflater).also {
+ MtActivityColorSelectBinding.inflate(layoutInflater).let {
binding = it
setContentView(it.root)
setUpToolbar(it.toolbar)
@@ -42,21 +41,12 @@ class ColorSelectActivity : ColorSelectBaseActivity() {
private fun setUpColorSettingRecyclerView(colorSettingRecyclerView: ColorSettingRecyclerView) {
mColorSettingRecyclerView = colorSettingRecyclerView.apply {
- setSelectedColor(currentColor)
+ setUpSelectedPosition(currentColor)
setOnItemClickListener(mOnItemClickListener)
ViewUtils.excludePaddingClippableViewFromNavigationBar(this)
}
}
- override fun finish() {
- mColorSettingRecyclerView.selectedThemeColor?.let {
- ThemeColorManager.setThemeColor(it.colorPrimary)
- Pref.putString(key(R.string.key_theme_color), getCurrentColorSummary(this))
- ThemeChangeNotifier.notifyThemeChanged()
- }
- super.finish()
- }
-
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_color_select, menu)
return super.onCreateOptionsMenu(menu)
@@ -64,26 +54,12 @@ class ColorSelectActivity : ColorSelectBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
- R.id.action_color_palette -> {
- ViewUtils.showToast(this, R.string.text_under_development_title)
- }
- R.id.action_search_color -> {
- ViewUtils.showToast(this, R.string.text_under_development_title)
- }
- R.id.action_new_color_library -> {
- ViewUtils.showToast(this, R.string.text_under_development_title)
- }
- R.id.action_locate_current_color -> {
- ViewUtils.showToast(this, R.string.text_under_development_title)
- }
R.id.action_toggle_color_select_layout -> {
- isLegacyLayout = true
+ isLegacyLayout = false
startActivity(this)
}
}
return true
}
- override fun getSubtitle() = getCurrentColorSummary(this)
-
}
\ No newline at end of file
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 0897b505..fe97f2d6 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
@@ -11,8 +11,9 @@ import com.google.android.material.appbar.AppBarLayout
import io.codetail.widget.RevealFrameLayout
import org.autojs.autojs.core.image.ColorItems
import org.autojs.autojs.core.pref.Pref
-import org.autojs.autojs.theme.ThemeColor
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.ui.BaseActivity
import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs.util.ViewUtils
@@ -59,10 +60,6 @@ abstract class ColorSelectBaseActivity : BaseActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
- protected fun finishWithoutSaving() {
- super.finish()
- }
-
protected open fun getSubtitle(): String? = null
override fun initThemeColors() {
@@ -82,36 +79,34 @@ abstract class ColorSelectBaseActivity : BaseActivity() {
}
protected fun setColorWithAnimation(colorTo: Int) {
- val view = mAppBarLayout
- mAppBarContainer.setBackgroundColor(currentColor)
- view.setBackgroundColor(colorTo)
- currentColor = colorTo
-
- initThemeColors()
- updateToolbarIconsColor()
- mToolbar.subtitle = getSubtitle()
-
+ setColor(colorTo)
ViewAnimationUtils.createCircularReveal(
- /* view = */ view,
- /* centerX = */ view.left,
- /* centerY = */ view.bottom,
+ /* view = */ mAppBarLayout,
+ /* centerX = */ mAppBarLayout.left,
+ /* centerY = */ mAppBarLayout.bottom,
/* startRadius = */ 0f,
- /* endRadius = */ hypot(view.width.toDouble(), view.height.toDouble()).toFloat(),
+ /* endRadius = */ hypot(mAppBarLayout.width.toDouble(), mAppBarLayout.height.toDouble()).toFloat(),
).apply {
duration = 500L
start()
}
}
+ protected fun setColor(colorTo: Int) {
+ mAppBarContainer.setBackgroundColor(currentColor)
+ mAppBarLayout.setBackgroundColor(colorTo)
+ currentColor = colorTo
+
+ initThemeColors()
+ updateToolbarIconsColor()
+ mToolbar.subtitle = getSubtitle()
+ }
+
protected fun setUpAppBar(appBar: AppBarLayout, appBarContainer: RevealFrameLayout) {
mAppBarLayout = appBar.apply { setBackgroundColor(currentColor) }
mAppBarContainer = appBarContainer
}
- class ColorItem(var name: String, var themeColor: ThemeColor) {
- constructor(name: String, color: Int) : this(name, ThemeColor(color))
- }
-
interface OnItemClickListener {
fun onItemClick(v: View?, position: Int)
}
@@ -122,11 +117,13 @@ abstract class ColorSelectBaseActivity : BaseActivity() {
val KEY_CUSTOM_COLOR = "${ColorSettingRecyclerView::class.java.name}.COLOR_SETTING_CUSTOM_COLOR"
val KEY_SELECTED_COLOR_INDEX = "${ColorSettingRecyclerView::class.java.name}.SELECTED_COLOR_INDEX"
+ val KEY_SELECTED_COLOR_LIBRARY_ID = "${ColorSettingRecyclerView::class.java.name}.SELECTED_COLOR_LIBRARY_ID"
+ val KEY_SELECTED_COLOR_LIBRARY_ITEM_ID = "${ColorSettingRecyclerView::class.java.name}.SELECTED_COLOR_LIBRARY_ITEM_ID"
val customColorPosition: Int
get() = /* return mColors.size() - 1; */ 0
- private val defaultColorPosition: Int
+ val defaultColorPosition: Int
get() = customColorPosition + 1
var isLegacyLayout: Boolean
@@ -135,7 +132,7 @@ abstract class ColorSelectBaseActivity : BaseActivity() {
val colorItems by lazy {
mutableListOf>().apply {
- add(customColorPosition, 0 to R.string.mt_custom)
+ add(customColorPosition, R.color.custom_color_default to R.string.mt_custom)
add(defaultColorPosition, R.color.theme_color_default to R.string.theme_color_default)
addAll(ColorItems.MATERIAL_COLORS)
}
@@ -144,8 +141,8 @@ abstract class ColorSelectBaseActivity : BaseActivity() {
@JvmStatic
fun startActivity(context: Context) {
val cls = when (isLegacyLayout) {
- true -> ColorSelectLegacyActivity::class.java
- else -> ColorSelectActivity::class.java
+ true -> ColorSelectActivity::class.java
+ else -> ColorLibrariesActivity::class.java
}
val titleRes = when (isLegacyLayout) {
true -> R.string.mt_color_picker_title
@@ -156,22 +153,80 @@ abstract class ColorSelectBaseActivity : BaseActivity() {
}
if (context is ColorSelectBaseActivity) {
intent.putExtra("currentColor", context.currentColor)
- context.finishWithoutSaving()
+ context.finish()
}
context.startActivity(intent)
}
@JvmStatic
- fun getCurrentColorSummary(context: Context): String {
- val index = Pref.getInt(KEY_SELECTED_COLOR_INDEX, defaultColorPosition)
- val colorItem = colorItems[index]
- val (colorRes, nameRes) = colorItem
- val name = context.getString(nameRes)
- val colorInt = when (index) {
- customColorPosition -> Pref.getInt(KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800))
- else -> context.getColor(colorRes)
+ fun getCurrentColorSummary(context: Context, isBrief: Boolean = false): String = when {
+ isLegacyLayout -> when (val index = Pref.getInt(KEY_SELECTED_COLOR_INDEX, defaultColorPosition)) {
+ SELECT_NONE -> {
+ val colorInt = ThemeColorManager.colorPrimary
+ ColorUtils.toString(colorInt).uppercase()
+ }
+ else -> {
+ val colorItem = colorItems[index]
+ val (colorRes, nameRes) = colorItem
+ val name = context.getString(nameRes)
+ val colorInt = when (index) {
+ customColorPosition -> Pref.getInt(KEY_CUSTOM_COLOR, context.getColor(R.color.custom_color_default))
+ else -> context.getColor(colorRes)
+ }
+ "$name [${ColorUtils.toString(colorInt).uppercase()}]"
+ }
+ }
+ else -> {
+ var identifier: String? = null
+ var colorName: String? = null
+ val colorInt = ThemeColorManager.colorPrimary
+ 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)
+ }
+ SELECT_NONE -> {
+ val legacyIndex = Pref.getInt(KEY_SELECTED_COLOR_INDEX, SELECT_NONE)
+ when (legacyIndex) {
+ customColorPosition -> identifier = context.getString(R.string.color_library_identifier_custom)
+ SELECT_NONE, defaultColorPosition -> identifier = context.getString(R.string.color_library_identifier_default_colors)
+ else -> {
+ val calculatedIndex = legacyIndex - maxOf(customColorPosition, defaultColorPosition) - 1
+ if (calculatedIndex in ColorItems.MATERIAL_COLORS.indices) {
+ val (_, nameRes) = ColorItems.MATERIAL_COLORS[calculatedIndex]
+ identifier = context.getString(R.string.color_library_identifier_material_design_colors)
+ colorName = context.getString(nameRes)
+ }
+ }
+ }
+ }
+ else -> colorLibraries.find { it.id == libraryId }?.let { lib ->
+ identifier = when {
+ lib.isUserDefined -> context.getString(R.string.color_library_identifier_custom)
+ else -> lib.identifierRes?.let { resId -> context.getString(resId) }
+ }
+ 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) }
+ }
+ }
+ }
+ }
+ val colorString = ColorUtils.toString(colorInt).uppercase()
+ when {
+ identifier != null && colorName != null -> when {
+ isBrief -> "$colorName [$colorString]"
+ else -> "$identifier | $colorName [$colorString]"
+ }
+ identifier != null -> "$identifier | $colorString"
+ colorName != null -> "$colorName [$colorString]"
+ else -> colorString
+ }
}
- return "$name [${ColorUtils.toString(colorInt).uppercase()}]"
}
}
diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt
deleted file mode 100644
index 69f0498e..00000000
--- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.autojs.autojs.theme.app
-
-import android.os.Bundle
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import org.autojs.autojs.core.pref.Pref
-import org.autojs.autojs.theme.ThemeChangeNotifier
-import org.autojs.autojs.theme.ThemeColorManager
-import org.autojs.autojs.util.StringUtils.key
-import org.autojs.autojs.util.ViewUtils
-import org.autojs.autojs6.R
-import org.autojs.autojs6.databinding.MtActivityColorSelectLegacyBinding
-
-/**
- * Created by SuperMonster003 on Mar 20, 2025.
- */
-class ColorSelectLegacyActivity : ColorSelectBaseActivity() {
-
- private lateinit var binding: MtActivityColorSelectLegacyBinding
-
- private lateinit var mColorSettingRecyclerView: ColorSettingRecyclerViewLegacy
-
- private val mOnItemClickListener = object : OnItemClickListener {
- override fun onItemClick(v: View?, position: Int) {
- mColorSettingRecyclerView.selectedThemeColor?.let {
- setColorWithAnimation(it.colorPrimary)
- }
- }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- MtActivityColorSelectLegacyBinding.inflate(layoutInflater).also {
- binding = it
- setContentView(it.root)
- setUpToolbar(it.toolbar)
- setUpColorSettingRecyclerView(it.colorSettingRecyclerView)
- setUpAppBar(it.appBar, it.appBarContainer)
- }
- }
-
- private fun setUpColorSettingRecyclerView(colorSettingRecyclerView: ColorSettingRecyclerViewLegacy) {
- mColorSettingRecyclerView = colorSettingRecyclerView.apply {
- setSelectedColor(currentColor)
- setOnItemClickListener(mOnItemClickListener)
- ViewUtils.excludePaddingClippableViewFromNavigationBar(this)
- }
- }
-
- override fun finish() {
- mColorSettingRecyclerView.selectedThemeColor?.let {
- ThemeColorManager.setThemeColor(it.colorPrimary)
- Pref.putString(key(R.string.key_theme_color), getCurrentColorSummary(this))
- ThemeChangeNotifier.notifyThemeChanged()
- }
- super.finish()
- }
-
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- menuInflater.inflate(R.menu.menu_color_select_legacy, menu)
- return super.onCreateOptionsMenu(menu)
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- when (item.itemId) {
- R.id.action_toggle_color_select_layout -> {
- isLegacyLayout = false
- startActivity(this)
- }
- }
- return true
- }
-
-}
\ No newline at end of file
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 65eac1fe..956f8208 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
@@ -9,16 +9,29 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
+import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.ThemeColorRecyclerView
import com.jaredrummler.android.colorpicker.ColorPickerDialog
import org.autojs.autojs.core.pref.Pref
+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.ColorSelectBaseActivity.Companion.KEY_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.colorItems
import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.customColorPosition
-import org.autojs.autojs.util.ColorUtils
+import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.defaultColorPosition
+import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.R
class ColorSettingRecyclerView : ThemeColorRecyclerView {
@@ -31,17 +44,17 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
private var mOnItemClickListener: ColorSelectBaseActivity.OnItemClickListener? = null
- private var mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE
+ private var mSelectedPosition = SELECT_NONE
val selectedThemeColor: ThemeColor?
get() = when {
mSelectedPosition < 0 -> null
mSelectedPosition == customColorPosition -> customColor
- else -> context.getColor(ColorSelectBaseActivity.colorItems[mSelectedPosition].first)
+ else -> context.getColor(colorItems[mSelectedPosition].first)
}?.let { ThemeColor(it) }
private val customColor: Int
- get() = Pref.getInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800))
+ get() = Pref.getInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, context.getColor(R.color.custom_color_default))
private val mActualOnItemClickListener = OnClickListener { v ->
getChildViewHolder(v)?.let { holder ->
@@ -63,7 +76,7 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
@SuppressLint("NotifyDataSetChanged")
fun setSelectedPosition(currentPosition: Int) {
- if (mSelectedPosition != ColorSelectBaseActivity.SELECT_NONE) {
+ if (mSelectedPosition != SELECT_NONE) {
adapter!!.notifyItemChanged(mSelectedPosition)
mSelectedPosition = currentPosition
adapter!!.notifyItemChanged(currentPosition)
@@ -71,21 +84,53 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
mSelectedPosition = currentPosition
adapter!!.notifyDataSetChanged()
}
- Pref.putInt(ColorSelectBaseActivity.KEY_SELECTED_COLOR_INDEX, mSelectedPosition)
+ savePrefsForLegacy()
+ savePrefsForLibraries()
+ selectedThemeColor?.let {
+ ThemeColorManager.setThemeColor(it.colorPrimary)
+ ThemeChangeNotifier.notifyThemeChanged()
+ }
}
- fun setSelectedColor(colorPrimary: Int) {
- for ((i, colorItem) in ColorSelectBaseActivity.colorItems.withIndex()) {
- val color = when (i) {
- customColorPosition -> customColor
- else -> context.getColor(colorItem.first)
+ private fun savePrefsForLegacy() {
+ Pref.putInt(KEY_SELECTED_COLOR_INDEX, mSelectedPosition)
+ }
+
+ private fun savePrefsForLibraries() {
+ when (mSelectedPosition) {
+ 0 -> {
+ Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ID, COLOR_LIBRARY_CUSTOM_COLOR_ID)
+ Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, 0)
}
- if (color == colorPrimary) {
- setSelectedPosition(i)
- return
+ 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 ->
+ context.getColor(colorItem.colorRes) == context.getColor(R.color.theme_color_default)
+ }?.let { Pref.putInt(KEY_SELECTED_COLOR_LIBRARY_ITEM_ID, it.id) }
+ }
+ else -> {
+ selectedThemeColor?.colorPrimary?.let { c ->
+ colorLibraries.find { it.id == COLOR_LIBRARY_MATERIAL_COLORS_ID }!!.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)
+ }
+ }
}
}
- mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE
+ }
+
+ fun setUpSelectedPosition(currentColor: Int) {
+ val selectedIndex = Pref.getInt(KEY_SELECTED_COLOR_INDEX, SELECT_NONE)
+ colorItems.getOrNull(selectedIndex)?.let {
+ setSelectedPosition(selectedIndex)
+ } ?: when (currentColor) {
+ context.getColor(R.color.theme_color_default) -> {
+ setSelectedPosition(defaultColorPosition)
+ }
+ else -> mSelectedPosition = SELECT_NONE
+ }
}
private fun showColorPicker(v: View) {
@@ -97,13 +142,13 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
.setDialogTitle(R.string.mt_color_picker_title)
.setColor(customColor)
.create()
- .setColorPickerDialogListener { _: Int, color: Int ->
- val customColor = color or -0x1000000
- Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, customColor)
+ .setColorPickerDialogListener { dialogId: Int, color: Int ->
+ val c = color or -0x1000000
+ Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, c)
setSelectedPosition(customColorPosition)
mOnItemClickListener?.onItemClick(v, customColorPosition)
}
- .show((context as ColorSelectBaseActivity).supportFragmentManager, "ColorPickerTag")
+ .show((context as FragmentActivity).supportFragmentManager, "ColorPickerTagForColorSelect")
}
fun setOnItemClickListener(onItemClickListener: ColorSelectBaseActivity.OnItemClickListener?) {
@@ -117,7 +162,7 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- val colorItem = ColorSelectBaseActivity.colorItems[position]
+ val colorItem = colorItems[position]
val (colorRes, nameRes) = colorItem
val color = when (position) {
customColorPosition -> customColor
@@ -131,7 +176,7 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
}
}
- override fun getItemCount() = ColorSelectBaseActivity.colorItems.size
+ override fun getItemCount() = colorItems.size
}
@@ -150,7 +195,7 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView {
if (checked) {
colorView.setImageResource(R.drawable.mt_ic_check_white_36dp)
val selectedThemeColorRes = selectedThemeColor?.colorPrimary?.let {
- if (ColorUtils.isLuminanceLight(it)) R.color.day else R.color.night
+ if (ViewUtils.isLuminanceLight(it)) R.color.day else R.color.night
} ?: R.color.night_day
colorView.imageTintList = ColorStateList.valueOf(context.getColor(selectedThemeColorRes))
} else {
diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt
deleted file mode 100644
index a3562b19..00000000
--- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt
+++ /dev/null
@@ -1,174 +0,0 @@
-package org.autojs.autojs.theme.app
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.content.res.ColorStateList
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.annotation.ColorInt
-import androidx.fragment.app.FragmentActivity
-import androidx.recyclerview.widget.DividerItemDecoration
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import androidx.recyclerview.widget.ThemeColorRecyclerView
-import com.jaredrummler.android.colorpicker.ColorPickerDialog
-import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
-import org.autojs.autojs.core.pref.Pref
-import org.autojs.autojs.theme.ThemeColor
-import org.autojs.autojs.theme.ThemeColorHelper
-import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.customColorPosition
-import org.autojs.autojs.util.ColorUtils
-import org.autojs.autojs6.R
-
-class ColorSettingRecyclerViewLegacy : ThemeColorRecyclerView {
-
- constructor(context: Context) : super(context)
-
- constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
-
- constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle)
-
- private var mOnItemClickListener: ColorSelectBaseActivity.OnItemClickListener? = null
-
- private var mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE
-
- val selectedThemeColor: ThemeColor?
- get() = when {
- mSelectedPosition < 0 -> null
- mSelectedPosition == customColorPosition -> customColor
- else -> context.getColor(ColorSelectBaseActivity.colorItems[mSelectedPosition].first)
- }?.let { ThemeColor(it) }
-
- private val customColor: Int
- get() = Pref.getInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800))
-
- private val mActualOnItemClickListener = OnClickListener { v ->
- getChildViewHolder(v)?.let { holder ->
- when (val pos = holder.bindingAdapterPosition) {
- customColorPosition -> showColorPicker(v)
- else -> {
- setSelectedPosition(pos)
- mOnItemClickListener?.onItemClick(v, pos)
- }
- }
- }
- }
-
- init {
- adapter = Adapter()
- layoutManager = LinearLayoutManager(context)
- addItemDecoration(DividerItemDecoration(context, VERTICAL))
- }
-
- @SuppressLint("NotifyDataSetChanged")
- fun setSelectedPosition(currentPosition: Int) {
- if (mSelectedPosition != ColorSelectBaseActivity.SELECT_NONE) {
- adapter!!.notifyItemChanged(mSelectedPosition)
- mSelectedPosition = currentPosition
- adapter!!.notifyItemChanged(currentPosition)
- } else {
- mSelectedPosition = currentPosition
- adapter!!.notifyDataSetChanged()
- }
- Pref.putInt(ColorSelectBaseActivity.KEY_SELECTED_COLOR_INDEX, mSelectedPosition)
- }
-
- fun setSelectedColor(colorPrimary: Int) {
- for ((i, colorItem) in ColorSelectBaseActivity.colorItems.withIndex()) {
- val color = when (i) {
- customColorPosition -> customColor
- else -> context.getColor(colorItem.first)
- }
- if (color == colorPrimary) {
- setSelectedPosition(i)
- return
- }
- }
- mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE
- }
-
- private fun showColorPicker(v: View) {
- ColorPickerDialog.newBuilder()
- .setAllowCustom(true)
- .setAllowPresets(false)
- .setDialogType(ColorPickerDialog.TYPE_CUSTOM)
- .setShowAlphaSlider(false)
- .setDialogTitle(R.string.mt_color_picker_title)
- .setColor(customColor)
- .create()
- .apply {
- setColorPickerDialogListener(object : ColorPickerDialogListener {
- override fun onColorSelected(dialogId: Int, @ColorInt color: Int) {
- val c = color or -0x1000000
- Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, c)
- setSelectedPosition(customColorPosition)
- mOnItemClickListener?.onItemClick(v, customColorPosition)
- }
-
- override fun onDialogDismissed(dialogId: Int) {}
- })
- }
- .show((context as FragmentActivity).supportFragmentManager, "Tag")
- }
-
- fun setOnItemClickListener(onItemClickListener: ColorSelectBaseActivity.OnItemClickListener?) {
- mOnItemClickListener = onItemClickListener
- }
-
- private inner class Adapter : RecyclerView.Adapter() {
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
- return ViewHolder(LayoutInflater.from(context).inflate(R.layout.mt_color_setting_recycler_view_item, parent, false))
- }
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- val colorItem = ColorSelectBaseActivity.colorItems[position]
- val (colorRes, nameRes) = colorItem
- val color = when (position) {
- customColorPosition -> customColor
- else -> context.getColor(colorRes)
- }
- holder.apply {
- setColor(color)
- nameView.text = context.getString(nameRes)
- nameView.setTextColor(context.getColor(R.color.color_selector_item_text))
- setChecked(mSelectedPosition == position)
- }
- }
-
- override fun getItemCount() = ColorSelectBaseActivity.colorItems.size
-
- }
-
- private inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-
- var colorView: ImageView
- var nameView: TextView
-
- init {
- itemView.setOnClickListener(mActualOnItemClickListener)
- colorView = itemView.findViewById(R.id.color)
- nameView = itemView.findViewById(R.id.name)
- }
-
- fun setChecked(checked: Boolean) {
- if (checked) {
- colorView.setImageResource(R.drawable.mt_ic_check_white_36dp)
- val selectedThemeColorRes = selectedThemeColor?.colorPrimary?.let {
- if (ColorUtils.isLuminanceLight(it)) R.color.day else R.color.night
- } ?: R.color.night_day
- colorView.imageTintList = ColorStateList.valueOf(context.getColor(selectedThemeColorRes))
- } else {
- colorView.setImageDrawable(null)
- }
- }
-
- fun setColor(c: Int) = ThemeColorHelper.setBackgroundColor(colorView, c)
-
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorFloatingActionButton.java b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorFloatingActionButton.java
index c76f4a97..c5d76646 100644
--- a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorFloatingActionButton.java
+++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorFloatingActionButton.java
@@ -3,13 +3,12 @@ package org.autojs.autojs.theme.widget;
import android.content.Context;
import android.content.res.ColorStateList;
import android.util.AttributeSet;
-
import com.google.android.material.floatingactionbutton.FloatingActionButton;
-
import org.autojs.autojs.theme.ThemeColor;
import org.autojs.autojs.theme.ThemeColorManager;
import org.autojs.autojs.theme.ThemeColorMutable;
import org.autojs.autojs.util.ColorUtils;
+import org.autojs.autojs.util.ViewUtils;
import org.autojs.autojs6.R;
/**
@@ -41,7 +40,7 @@ public class ThemeColorFloatingActionButton extends FloatingActionButton impleme
int colorAccent = color.colorAccent;
int colorForContrast = ColorUtils.adjustColorForContrast(getContext().getColor(R.color.window_background), colorAccent, 1.15);
setBackgroundTintList(ColorStateList.valueOf(colorForContrast));
- var tintColorRes = ColorUtils.isLuminanceLight(colorForContrast)
+ var tintColorRes = ViewUtils.isLuminanceLight(colorForContrast)
? R.color.fab_tint_dark
: R.color.fab_tint_light;
var tintColor = getResources().getColor(tintColorRes, null);
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 f3eae77d..c5a49e13 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
@@ -5,9 +5,8 @@ import android.util.AttributeSet
import androidx.appcompat.widget.Toolbar
import org.autojs.autojs.theme.ThemeColor
import org.autojs.autojs.theme.ThemeColorManager.add
-import org.autojs.autojs.theme.ThemeColorManager.getDayOrNightColorByLuminance
-import org.autojs.autojs.theme.ThemeColorManager.isThemeColorLuminanceLight
import org.autojs.autojs.theme.ThemeColorMutable
+import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs.util.ViewUtils.applyColorFilterWith
import org.autojs.autojs.util.ViewUtils.onceGlobalLayout
import org.autojs.autojs6.R
@@ -36,21 +35,22 @@ open class ThemeColorToolbar : Toolbar, ThemeColorMutable {
setTitleTextAppearance(context, R.style.TextAppearanceMainTitle)
}
- override fun setThemeColor(color: ThemeColor) {
- onceGlobalLayout { applyThemeColor(color) }
+ override fun setThemeColor(themeColor: ThemeColor) {
+ onceGlobalLayout { applyThemeColor(themeColor) }
}
- private fun applyThemeColor(color: ThemeColor) {
- val aimColor = getDayOrNightColorByLuminance(context)
+ private fun applyThemeColor(themeColor: ThemeColor) {
+ val currentThemeColor = themeColor.colorPrimary
+ val tintColor = ViewUtils.getDayOrNightColorByLuminance(context, currentThemeColor)
- setBackgroundColor(color.colorPrimary)
- setTitleTextColor(aimColor)
- setSubtitleTextColor(aimColor)
+ setBackgroundColor(currentThemeColor)
+ setTitleTextColor(tintColor)
+ setSubtitleTextColor(tintColor)
- navigationIcon?.let { navigationIcon = it.applyColorFilterWith(aimColor) }
- collapseIcon?.let { collapseIcon = it.applyColorFilterWith(aimColor) }
- overflowIcon?.let { overflowIcon = it.applyColorFilterWith(aimColor) }
+ navigationIcon?.let { navigationIcon = it.applyColorFilterWith(tintColor) }
+ collapseIcon?.let { collapseIcon = it.applyColorFilterWith(tintColor) }
+ overflowIcon?.let { overflowIcon = it.applyColorFilterWith(tintColor) }
- popupTheme = if (isThemeColorLuminanceLight()) R.style.PopupMenuThemeLight else R.style.PopupMenuThemeDark
+ 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 35a186ac..cfa0faf7 100644
--- a/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt
@@ -17,7 +17,6 @@ import org.autojs.autojs.theme.ThemeChangeNotifier
import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.LocaleUtils
import org.autojs.autojs.util.ViewUtils
-import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R
/**
@@ -48,6 +47,10 @@ abstract class BaseActivity : AppCompatActivity() {
ThemeChangeNotifier.themeChanged.observe(this) {
initThemeColors()
+ if (handleStatusBarThemeColorAutomatically) {
+ ThemeColorManager.setStatusBarBackgroundColor(this)
+ setUpStatusBarAppearanceLightByThemeColor()
+ }
}
// @Dubious by SuperMonster003 on Oct 28, 2024.
@@ -71,7 +74,7 @@ abstract class BaseActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
initThemeColors()
- if (handleStatusBarThemeColorAutomatically && !BuildConfig.isInrt) {
+ if (handleStatusBarThemeColorAutomatically) {
ThemeColorManager.addActivityStatusBar(this)
setUpStatusBarAppearanceLightByThemeColor()
}
@@ -95,7 +98,7 @@ abstract class BaseActivity : AppCompatActivity() {
}
protected fun setUpStatusBarAppearanceLightByThemeColor() {
- ViewUtils.setStatusBarAppearanceLight(this, ThemeColorManager.isThemeColorLuminanceDark())
+ ViewUtils.setStatusBarAppearanceLight(this, ThemeColorManager.isLuminanceDark())
}
}
\ No newline at end of file
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 aa994b97..04481835 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
@@ -5,9 +5,6 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
-import android.content.res.ColorStateList
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffColorFilter
import android.os.Bundle
import android.os.Handler
import android.os.Looper
@@ -65,6 +62,9 @@ import org.autojs.autojs.ui.widget.SearchViewItem
import org.autojs.autojs.util.StringUtils.key
import org.autojs.autojs.util.UpdateUtils
import org.autojs.autojs.util.ViewUtils
+import org.autojs.autojs.util.ViewUtils.onceGlobalLayout
+import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance
+import org.autojs.autojs.util.ViewUtils.setNavigationIconColorByThemeColorLuminance
import org.autojs.autojs.util.WorkingDirectoryUtils
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivityMainBinding
@@ -278,7 +278,8 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
}
private fun setUpToolbarColors() {
- ViewUtils.setToolbarMenuIconsColorByThemeColorLuminance(this, mToolbar)
+ mToolbar.setMenuIconsColorByThemeColorLuminance(this)
+ mToolbar.setNavigationIconColorByThemeColorLuminance(this)
mSearchViewItem?.initThemeColors()
}
@@ -287,7 +288,7 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
val tabSelectedColor: Int
val tabSelectedIndicatorColor: Int
when {
- ThemeColorManager.isThemeColorLuminanceLight() -> {
+ ThemeColorManager.isLuminanceLight() -> {
tabNormalColor = getColor(R.color.tab_text_dark)
tabSelectedColor = getColor(R.color.tab_selected_text_dark)
tabSelectedIndicatorColor = getColor(R.color.tab_indicator_dark)
@@ -399,11 +400,11 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
private fun setUpSearchMenuItem(searchMenuItem: MenuItem) {
mSearchViewItem = object : SearchViewItem(this, searchMenuItem) {
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
- setUpToolbarCollapseIconColor()
if (isCurrentPageDocs) {
mDocsSearchItemExpanded = true
mLogMenuItem.setIcon(R.drawable.ic_ali_up)
}
+ mToolbar.onceGlobalLayout { setUpToolbarColors() }
return super.onMenuItemActionExpand(item)
}
@@ -431,18 +432,6 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
}
}
- private fun setUpToolbarCollapseIconColor() {
- val collapseIcon = mToolbar.collapseIcon
- if (collapseIcon != null) {
- val isThemeColorLuminanceLight = ThemeColorManager.isThemeColorLuminanceLight()
- val fullColor = getColor(if (isThemeColorLuminanceLight) R.color.day_full else R.color.night_full)
- collapseIcon.setTintList(ColorStateList.valueOf(fullColor))
- collapseIcon.setTint(fullColor)
- collapseIcon.colorFilter = PorterDuffColorFilter(fullColor, PorterDuff.Mode.SRC_IN)
- mToolbar.collapseIcon = collapseIcon
- }
- }
-
private fun submitForwardQuery() {
val event = QueryEvent.FIND_FORWARD
EventBus.getDefault().post(event)
diff --git a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt
index 8dde8bac..1fad5621 100644
--- a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt
@@ -1,5 +1,6 @@
package org.autojs.autojs.ui.main.drawer
+import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
@@ -29,6 +30,7 @@ import org.autojs.autojs.pluginclient.JsonSocketServer
import org.autojs.autojs.service.AccessibilityService
import org.autojs.autojs.service.ForegroundService
import org.autojs.autojs.service.NotificationService
+import org.autojs.autojs.theme.ThemeChangeNotifier
import org.autojs.autojs.theme.app.ColorSelectBaseActivity
import org.autojs.autojs.ui.floating.CircularMenu
import org.autojs.autojs.ui.floating.FloatyWindowManger
@@ -102,6 +104,12 @@ open class DrawerFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ @SuppressLint("NotifyDataSetChanged")
+ ThemeChangeNotifier.themeChanged.observe(this) {
+ mThemeColorItem.subtitle = ColorSelectBaseActivity.getCurrentColorSummary(mContext)
+ mDrawerMenu.adapter?.notifyDataSetChanged()
+ }
+
mContext = requireContext()
mActivity = requireActivity() as MainActivity
diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/BaseDisplayContentActivity.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/BaseDisplayContentActivity.kt
index ef658922..901ff581 100644
--- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/BaseDisplayContentActivity.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/BaseDisplayContentActivity.kt
@@ -24,7 +24,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.autojs.autojs.ui.BaseActivity
-import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs.util.DisplayUtils
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.R
@@ -41,7 +40,7 @@ abstract class BaseDisplayContentActivity : BaseActivity() {
abstract var highlightGrammarName: String
abstract var highlightThemeLanguage: String
- open var themeColorDayNight = R.color.md_blue_grey_50 to R.color.md_blue_grey_900
+ open var themeColorDayNight = R.color.md_blue_gray_50 to R.color.md_blue_gray_900
private lateinit var internalTextView: TextView
private lateinit var internalFabView: FloatingActionButton
@@ -145,14 +144,14 @@ abstract class BaseDisplayContentActivity : BaseActivity() {
if (ViewUtils.isNightModeYes(this)) {
internalFabView.backgroundTintList = ColorStateList.valueOf(themeColorNight)
- internalFabView.imageTintList = ColorStateList.valueOf(if (ColorUtils.isLuminanceDark(themeColorNight)) getColor(R.color.night) else getColor(R.color.day))
+ internalFabView.imageTintList = ColorStateList.valueOf(if (ViewUtils.isLuminanceDark(themeColorNight)) getColor(R.color.night) else getColor(R.color.day))
ViewUtils.setStatusBarBackgroundColor(this, themeColorNight)
- ViewUtils.setStatusBarAppearanceLight(this, ColorUtils.isLuminanceDark(themeColorNight))
+ ViewUtils.setStatusBarAppearanceLight(this, ViewUtils.isLuminanceDark(themeColorNight))
} else {
internalFabView.backgroundTintList = ColorStateList.valueOf(themeColorDay)
- internalFabView.imageTintList = ColorStateList.valueOf(if (ColorUtils.isLuminanceDark(themeColorDay)) getColor(R.color.night) else getColor(R.color.day))
+ internalFabView.imageTintList = ColorStateList.valueOf(if (ViewUtils.isLuminanceDark(themeColorDay)) getColor(R.color.night) else getColor(R.color.day))
ViewUtils.setStatusBarBackgroundColor(this, themeColorDay)
- ViewUtils.setStatusBarAppearanceLight(this, ColorUtils.isLuminanceDark(themeColorDay))
+ ViewUtils.setStatusBarAppearanceLight(this, ViewUtils.isLuminanceDark(themeColorDay))
}
}
diff --git a/app/src/main/java/org/autojs/autojs/ui/widget/FirstCharView.kt b/app/src/main/java/org/autojs/autojs/ui/widget/FirstCharView.kt
index d55daa28..096cfae4 100644
--- a/app/src/main/java/org/autojs/autojs/ui/widget/FirstCharView.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/widget/FirstCharView.kt
@@ -11,7 +11,6 @@ import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.theme.ThemeColorManagerCompat
-import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs.util.FileUtils
import org.autojs.autojs6.R
import kotlin.math.roundToInt
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 bc48d307..eaf4d56f 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
@@ -43,7 +43,7 @@ public class SearchViewItem implements MenuItemCompat.OnActionExpandListener, Se
}
public void initThemeColors() {
- boolean isThemeColorLuminanceLight = ThemeColorManager.isThemeColorLuminanceLight();
+ 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);
diff --git a/app/src/main/java/org/autojs/autojs/ui/widget/ToolbarMenuItem.kt b/app/src/main/java/org/autojs/autojs/ui/widget/ToolbarMenuItem.kt
index b14b08a1..311cca88 100644
--- a/app/src/main/java/org/autojs/autojs/ui/widget/ToolbarMenuItem.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/widget/ToolbarMenuItem.kt
@@ -30,13 +30,13 @@ class ToolbarMenuItem : LinearLayout {
}
private val colorEnabled: Int
- get() = when (ThemeColorManager.isThemeColorLuminanceLight()) {
+ get() = when (ThemeColorManager.isLuminanceLight()) {
true -> ContextCompat.getColor(context, R.color.toolbar_menu_item_enabled_dark)
else -> ContextCompat.getColor(context, R.color.toolbar_menu_item_enabled_light)
}
private val colorDisabled: Int
- get() = when (ThemeColorManager.isThemeColorLuminanceLight()) {
+ get() = when (ThemeColorManager.isLuminanceLight()) {
true -> ContextCompat.getColor(context, R.color.toolbar_menu_item_disabled_dark)
else -> ContextCompat.getColor(context, R.color.toolbar_menu_item_disabled_light)
}
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 86f9b844..adc61c80 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 org.autojs.autojs6.R
import kotlin.math.pow
import kotlin.math.roundToInt
import kotlin.text.RegexOption.IGNORE_CASE
@@ -281,7 +280,7 @@ object ColorUtils {
*
*/
@JvmStatic
- fun isLuminanceLight(@ColorInt color: Int) = luminance(color) > 0.179
+ fun isLuminanceLight(@ColorInt color: Int) = luminance(color) >= 0.179
@JvmStatic
fun isLuminanceDark(@ColorInt color: Int) = !isLuminanceLight(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 c1a167db..6a64905a 100644
--- a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt
+++ b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt
@@ -44,6 +44,8 @@ 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
/**
@@ -170,6 +172,28 @@ object ViewUtils {
activity.window.addFlags(flags)
}
+ @JvmStatic
+ @JvmOverloads
+ fun isLuminanceLight(color: Int, backgroundColorMatters: Boolean = true) = when {
+ !backgroundColorMatters -> ColorUtils.isLuminanceLight(color)
+ !isNightModeEnabled -> ColorUtils.luminance(color) >= 0.224
+ else -> ColorUtils.luminance(color) >= 0.141
+ }
+
+ @JvmStatic
+ @JvmOverloads
+ fun isLuminanceDark(color: Int, backgroundColorMatters: Boolean = true) = !isLuminanceLight(color, backgroundColorMatters)
+
+ @JvmStatic
+ fun getDayOrNightColorByLuminance(context: Context, color: Int): Int {
+ return context.getColor(if (isLuminanceLight(color)) day else night)
+ }
+
+ @JvmStatic
+ fun getDayOrNightColorResByLuminance(color: Int): Int {
+ return if (isLuminanceLight(color)) day else night
+ }
+
@JvmStatic
fun isStatusBarAppearanceLight(activity: Activity): Boolean {
return !isStatusBarAppearanceDark(activity)
@@ -191,7 +215,7 @@ object ViewUtils {
}
fun setStatusBarAppearanceLightByColorLuminance(activity: Activity, aimColor: Int) {
- val shouldBeLight = ColorUtils.isLuminanceDark(aimColor)
+ val shouldBeLight = isLuminanceDark(aimColor)
setStatusBarAppearanceLight(activity, shouldBeLight)
}
@@ -472,14 +496,6 @@ object ViewUtils {
toolbar.setTitlesTextColorByColorLuminance(context, aimColor)
}
- @JvmStatic
- fun getDayOrNightColorByLuminance(context: Context, aimColor: Int): Int = context.getColor(getDayOrNightColorResByLuminance(aimColor))
-
- @JvmStatic
- fun getDayOrNightColorResByLuminance(aimColor: Int): Int {
- return if (ColorUtils.isLuminanceLight(aimColor)) R.color.day else R.color.night
- }
-
@JvmStatic
fun showToast(context: Context, stringRes: Int) = showToast(context, stringRes, false)
diff --git a/app/src/main/res/drawable/ic_color_library_custom.png b/app/src/main/res/drawable/ic_color_library_custom.png
new file mode 100644
index 00000000..0103cd56
Binary files /dev/null and b/app/src/main/res/drawable/ic_color_library_custom.png differ
diff --git a/app/src/main/res/drawable/ic_color_library_default.png b/app/src/main/res/drawable/ic_color_library_default.png
new file mode 100644
index 00000000..57cca66b
Binary files /dev/null and b/app/src/main/res/drawable/ic_color_library_default.png differ
diff --git a/app/src/main/res/drawable/ic_color_library_preset.png b/app/src/main/res/drawable/ic_color_library_preset.png
new file mode 100644
index 00000000..220decda
Binary files /dev/null and b/app/src/main/res/drawable/ic_color_library_preset.png differ
diff --git a/app/src/main/res/layout/activity_main_inrt.xml b/app/src/main/res/layout/activity_main_inrt.xml
index 8cd85a50..be2d1fcb 100644
--- a/app/src/main/res/layout/activity_main_inrt.xml
+++ b/app/src/main/res/layout/activity_main_inrt.xml
@@ -36,12 +36,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:excludeFromNavigationBar="true"
- app:color_verbose="#DFC0C0C0"
- app:color_debug="#CC000000"
- app:color_info="#FF43A047"
- app:color_warn="#FF1976D2"
- app:color_error="#FFC62828"
- app:color_assert="#FFE254FF" />
+ app:color_verbose="#BDBDBD"
+ app:color_debug="#111214"
+ app:color_info="#43A047"
+ app:color_warn="#1976D2"
+ app:color_error="#C62828"
+ app:color_assert="#E254FF" />
diff --git a/app/src/main/res/layout/activity_settings_inrt.xml b/app/src/main/res/layout/activity_settings_inrt.xml
index 396d7ecc..076d5a7d 100644
--- a/app/src/main/res/layout/activity_settings_inrt.xml
+++ b/app/src/main/res/layout/activity_settings_inrt.xml
@@ -20,7 +20,7 @@
app:titleTextColor="@color/day_full"
app:subtitleTextColor="@color/day_full"
android:theme="@style/ToolBarStyleInrt"
- android:background="@color/md_blue_grey_50"
+ android:background="@color/md_blue_gray_50"
app:contentInsetStartWithNavigation="0dp"
app:contentInsetEndWithActions="2dp"
app:titleTextAppearance="@style/TextAppearanceEditorTitle"
diff --git a/app/src/main/res/layout/mt_activity_color_select_legacy.xml b/app/src/main/res/layout/mt_activity_color_libraries.xml
similarity index 88%
rename from app/src/main/res/layout/mt_activity_color_select_legacy.xml
rename to app/src/main/res/layout/mt_activity_color_libraries.xml
index d50ec451..5ea09791 100644
--- a/app/src/main/res/layout/mt_activity_color_select_legacy.xml
+++ b/app/src/main/res/layout/mt_activity_color_libraries.xml
@@ -32,10 +32,10 @@
-
+ android:layout_height="match_parent"
+ android:scrollbars="vertical" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/mt_activity_color_library.xml b/app/src/main/res/layout/mt_activity_color_library.xml
new file mode 100644
index 00000000..ebb0b08d
--- /dev/null
+++ b/app/src/main/res/layout/mt_activity_color_library.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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
new file mode 100644
index 00000000..221321d3
--- /dev/null
+++ b/app/src/main/res/layout/mt_color_libraries_recycler_view_item.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/mt_color_library_recycler_view_item.xml b/app/src/main/res/layout/mt_color_library_recycler_view_item.xml
new file mode 100644
index 00000000..9784fbe7
--- /dev/null
+++ b/app/src/main/res/layout/mt_color_library_recycler_view_item.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/preference_custom.xml b/app/src/main/res/layout/preference_custom.xml
index db2002fd..8a3cc73b 100644
--- a/app/src/main/res/layout/preference_custom.xml
+++ b/app/src/main/res/layout/preference_custom.xml
@@ -3,9 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:minHeight="52dp"
android:baselineAligned="false"
android:gravity="center_vertical"
- android:minHeight="52dp"
android:orientation="horizontal"
android:paddingEnd="?android:attr/scrollbarSize">
@@ -21,10 +21,9 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
- android:layout_marginBottom="12dp"
- android:layout_marginEnd="6dp"
+ android:layout_marginVertical="12dp"
android:layout_marginStart="16dp"
- android:layout_marginTop="12dp"
+ android:layout_marginEnd="6dp"
android:layout_weight="1"
android:orientation="vertical">
@@ -36,7 +35,7 @@
android:fadingEdge="horizontal"
android:fontFamily="sans-serif"
android:maxLines="1"
- android:textColor="?android:textColorPrimary"
+ android:textColor="@color/day_night_full"
android:textSize="15sp"
tools:text="@string/text_sample_string" />
@@ -47,7 +46,7 @@
android:layout_marginTop="2dp"
android:fontFamily="sans-serif"
android:maxLines="4"
- android:textColor="?android:textColorSecondary"
+ android:textColor="@color/day_night_alpha_60"
android:textSize="12sp"
tools:text="@string/text_sample_string" />
diff --git a/app/src/main/res/menu/menu_color_libraries.xml b/app/src/main/res/menu/menu_color_libraries.xml
new file mode 100644
index 00000000..48c5b304
--- /dev/null
+++ b/app/src/main/res/menu/menu_color_libraries.xml
@@ -0,0 +1,36 @@
+
+
\ 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
new file mode 100644
index 00000000..845f9504
--- /dev/null
+++ b/app/src/main/res/menu/menu_color_library.xml
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_color_select.xml b/app/src/main/res/menu/menu_color_select.xml
index a57de813..ed8ba2ef 100644
--- a/app/src/main/res/menu/menu_color_select.xml
+++ b/app/src/main/res/menu/menu_color_select.xml
@@ -3,33 +3,9 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/menu_color_select_legacy.xml b/app/src/main/res/menu/menu_color_select_legacy.xml
deleted file mode 100644
index ed8ba2ef..00000000
--- a/app/src/main/res/menu/menu_color_select_legacy.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 373384ff..4dda7554 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -1,20 +1,21 @@
-