diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json
index 3064bd87..19f7b68b 100644
--- a/.changelog/lang_zh-Hans.json
+++ b/.changelog/lang_zh-Hans.json
@@ -17,6 +17,7 @@
"精简打包应用模板 APK 文件大小",
"打包页面支持 Pinyin 库选项",
"打包应用主活动页面优化状态栏背景及文字颜色",
+ "控件的文字及图标根据主题色亮度值自动切换合适的颜色",
"脚本项目配置文件 project.json 支持更多打包选项 _[`issue #305`](http://issues.autojs6.com/305)_ _[`issue #306`](http://issues.autojs6.com/306)_",
"脚本项目配置文件 project.json 支持选项名称宽松匹配及别名兼容",
"APK 文件类型信息对话框增加文件大小与签名方案信息",
diff --git a/app/src/main/java/org/autojs/autojs/App.kt b/app/src/main/java/org/autojs/autojs/App.kt
index ed052a8f..68830ff4 100644
--- a/app/src/main/java/org/autojs/autojs/App.kt
+++ b/app/src/main/java/org/autojs/autojs/App.kt
@@ -92,7 +92,7 @@ class App : MultiDexApplication() {
val crashHandler = CrashHandler(ErrorReportActivity::class.java)
val strategy = CrashReport.UserStrategy(applicationContext)
- strategy.crashHandleCallback = crashHandler
+ strategy.setCrashHandleCallback(crashHandler)
CrashReport.initCrashReport(applicationContext, BUGLY_APP_ID, false, strategy)
@@ -115,7 +115,6 @@ class App : MultiDexApplication() {
else -> ViewUtils.MODE.DAY
}
}
-
else -> ViewUtils.MODE.NULL
}
)
@@ -221,7 +220,7 @@ class App : MultiDexApplication() {
}
override fun onConfigurationChanged(newConfig: Configuration) {
- ViewUtils.onConfigurationChanged(newConfig)
+ ViewUtils.onConfigurationChangedForNightMode(newConfig)
EventBus.getDefault().post(newConfig)
FloatyWindowManger.getCircularMenu()?.savePosition(newConfig)
super.onConfigurationChanged(newConfig)
diff --git a/app/src/main/java/org/autojs/autojs/core/image/Colors.kt b/app/src/main/java/org/autojs/autojs/core/image/Colors.kt
index 4bce9dda..a616b605 100644
--- a/app/src/main/java/org/autojs/autojs/core/image/Colors.kt
+++ b/app/src/main/java/org/autojs/autojs/core/image/Colors.kt
@@ -1,72 +1,56 @@
-package org.autojs.autojs.core.image;
+package org.autojs.autojs.core.image
-import android.graphics.Color;
-
-import androidx.annotation.ColorInt;
-
-import org.autojs.autojs.util.ColorUtils;
+import androidx.annotation.ColorInt
+import org.autojs.autojs.annotation.ScriptInterface
+import org.autojs.autojs.util.ColorUtils
/**
* Created by Stardust on Dec 31, 2017.
+ * Transformed by SuperMonster003 on Mar 8, 2025.
*/
-public class Colors {
+@Suppress("FunctionName")
+class Colors {
- public int rgb(int red, int green, int blue) {
- return Color.rgb(red, green, blue);
- }
+ @ScriptInterface
+ fun rgb(red: Int, green: Int, blue: Int) = ColorUtils.rgb(red, green, blue)
- public int argb(int alpha, int red, int green, int blue) {
- return Color.argb(alpha, red, green, blue);
- }
+ @ScriptInterface
+ fun argb(alpha: Int, red: Int, green: Int, blue: Int) = ColorUtils.argb(alpha, red, green, blue)
/**
- * @see W3C Recommendation
+ * @see ColorUtils.luminance
*/
- public double luminance(@ColorInt int color) {
- // return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
- // ? Color.luminance(Color.pack(color))
- // : Color.luminance(color);
- return androidx.core.graphics.ColorUtils.calculateLuminance(color);
- }
+ @ScriptInterface
+ fun luminance(@ColorInt color: Int) = ColorUtils.luminance(color)
- public int parseColor(String colorString) {
- return Color.parseColor(colorString);
- }
+ @ScriptInterface
+ fun parseColor(colorString: String?) = ColorUtils.parseColor(colorString)
- public String toString(int color) {
- return ColorUtils.toString(color);
- }
+ @ScriptInterface
+ fun toString(color: Int) = ColorUtils.toString(color)
- public void RGBToHSV(int red, int green, int blue, float[] hsv) {
- Color.RGBToHSV(red, green, blue, hsv);
- }
+ @ScriptInterface
+ fun RGBToHSV(red: Int, green: Int, blue: Int, hsv: FloatArray?) = ColorUtils.RGBToHSV(red, green, blue, hsv)
- public void colorToHSV(int color, float[] hsv) {
- Color.colorToHSV(color, hsv);
- }
+ @ScriptInterface
+ fun colorToHSV(color: Int, hsv: FloatArray?) = ColorUtils.colorToHSV(color, hsv)
- public int HSVToColor(float[] hsv) {
- return Color.HSVToColor(hsv);
- }
+ @ScriptInterface
+ fun HSVToColor(hsv: FloatArray?) = ColorUtils.HSVToColor(hsv)
- public int HSVToColor(int alpha, float[] hsv) {
- return Color.HSVToColor(alpha, hsv);
- }
+ @ScriptInterface
+ fun HSVToColor(alpha: Int, hsv: FloatArray?) = ColorUtils.HSVToColor(alpha, hsv)
- public boolean equals(int c1, int c2) {
- return (c1 & 0xffffff) == (c2 & 0xffffff);
- }
+ @ScriptInterface
+ fun equals(c1: Int, c2: Int) = ColorUtils.equals(c1, c2)
- public boolean equals(int c1, String c2) {
- return equals(c1, parseColor(c2));
- }
+ @ScriptInterface
+ fun equals(c1: Int, c2: String?) = ColorUtils.equals(c1, c2)
- public boolean equals(String c1, int c2) {
- return equals(parseColor(c1), c2);
- }
+ @ScriptInterface
+ fun equals(c1: String?, c2: Int) = ColorUtils.equals(c1, c2)
- public boolean equals(String c1, String c2) {
- return equals(parseColor(c1), parseColor(c2));
- }
+ @ScriptInterface
+ fun equals(c1: String?, c2: String?) = ColorUtils.equals(c1, c2)
}
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 f7a3bc67..29d5d4e3 100644
--- a/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt
+++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt
@@ -9,6 +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.autojs6.R
/**
@@ -36,6 +37,10 @@ class ThemeColor {
@ScriptInterface
fun getColorPrimaryDark() = colorPrimaryDark
+ fun isLuminanceLight() = ColorUtils.isLuminanceLight(colorPrimary)
+
+ fun isLuminanceDark() = ColorUtils.isLuminanceDark(colorPrimary)
+
constructor()
constructor(color: Int) : this(color, color, 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 57fe0c27..5093f01f 100644
--- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt
+++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt
@@ -6,8 +6,7 @@ import android.view.View
import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs6.R
import java.lang.ref.WeakReference
-import java.util.LinkedList
-import java.util.Vector
+import java.util.*
/**
* Created by Stardust on May 10, 2016.
@@ -28,6 +27,12 @@ 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)
diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColorNotifier.kt b/app/src/main/java/org/autojs/autojs/theme/ThemeColorNotifier.kt
new file mode 100644
index 00000000..054286de
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorNotifier.kt
@@ -0,0 +1,16 @@
+package org.autojs.autojs.theme
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+
+object ThemeChangeNotifier {
+
+ private val _themeChanged = MutableLiveData()
+
+ val themeChanged: LiveData get() = _themeChanged
+
+ fun notifyThemeChanged() {
+ _themeChanged.postValue(Unit)
+ }
+
+}
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 b1694a07..15cb8f0a 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
@@ -1,37 +1,23 @@
package org.autojs.autojs.theme.app
-import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
-import android.content.res.ColorStateList
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffColorFilter
import android.os.Bundle
-import android.util.AttributeSet
-import android.view.LayoutInflater
import android.view.View
-import android.view.View.OnClickListener
import android.view.ViewAnimationUtils
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.annotation.ColorInt
-import androidx.appcompat.widget.Toolbar
-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.google.android.material.appbar.AppBarLayout
-import com.jaredrummler.android.colorpicker.ColorPickerDialog
-import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
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.ui.BaseActivity
import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs.util.StringUtils.key
-import org.autojs.autojs.util.ViewUtils.appendSystemUiVisibility
+import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.R
+import org.autojs.autojs6.databinding.MtActivityColorSelectBinding
import kotlin.math.hypot
/**
@@ -41,6 +27,10 @@ import kotlin.math.hypot
*/
class ColorSelectActivity : BaseActivity() {
+ override val handleStatusBarThemeColorAutomatically = false
+
+ private var binding: MtActivityColorSelectBinding? = null
+
private lateinit var mAppBarLayout: AppBarLayout
private lateinit var mTitle: String
private lateinit var mColorSettingRecyclerView: ColorSettingRecyclerView
@@ -55,28 +45,33 @@ class ColorSelectActivity : BaseActivity() {
}
}
- @Suppress("DEPRECATION")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleIntent()
- setUpUI()
- appendSystemUiVisibility(this, View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
+ binding = MtActivityColorSelectBinding.inflate(layoutInflater).also {
+ setUpUI(it)
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ binding = null
}
private fun handleIntent() {
mTitle = intent.getStringExtra("title") ?: getString(R.string.mt_color_picker_title)
}
- private fun setUpUI() {
- setContentView(R.layout.mt_activity_color_select)
+ private fun setUpUI(binding: MtActivityColorSelectBinding) {
+ setContentView(binding.root)
mCurrentColor = ThemeColorManager.colorPrimary
- mAppBarLayout = findViewById(R.id.appBar).apply { setBackgroundColor(mCurrentColor) }
- setUpToolbar()
- setUpColorSettingRecyclerView()
+ mAppBarLayout = binding.appBar.apply { setBackgroundColor(mCurrentColor) }
+ setUpToolbar(binding)
+ setUpColorSettingRecyclerView(binding)
}
- private fun setUpToolbar() {
- findViewById(R.id.toolbar).also { toolbar ->
+ private fun setUpToolbar(binding: MtActivityColorSelectBinding) {
+ binding.toolbar.also { toolbar ->
toolbar.title = mTitle
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
@@ -84,26 +79,53 @@ class ColorSelectActivity : BaseActivity() {
}
}
- private fun setUpColorSettingRecyclerView() {
- mColorSettingRecyclerView = findViewById(R.id.color_setting_recycler_view)
- .apply {
- setCustomColor()
- setSelectedColor(mCurrentColor)
- setOnItemClickListener(mOnItemClickListener)
- }
+ private fun setUpColorSettingRecyclerView(binding: MtActivityColorSelectBinding) {
+ mColorSettingRecyclerView = binding.colorSettingRecyclerView.apply {
+ setCustomColor()
+ setSelectedColor(mCurrentColor)
+ setOnItemClickListener(mOnItemClickListener)
+ }
}
override fun finish() {
mColorSettingRecyclerView.selectedThemeColor?.let {
ThemeColorManager.setThemeColor(it.colorPrimary)
Pref.putString(key(R.string.key_theme_color), getColorString(this))
+ ThemeChangeNotifier.notifyThemeChanged()
}
super.finish()
}
+ override fun initThemeColors() {
+ super.initThemeColors()
+ setUpToolbarColors()
+ setUpStatusBarIconLight()
+ }
+
+ private fun setUpToolbarColors() {
+ val toolbar = binding!!.toolbar
+ val aimColor = when {
+ ColorUtils.isLuminanceLight(mCurrentColor) -> getColor(R.color.day)
+ else -> getColor(R.color.night)
+ }
+ toolbar.setTitleTextColor(aimColor)
+ toolbar.setSubtitleTextColor(aimColor)
+ toolbar.navigationIcon?.let { navigationIcon ->
+ navigationIcon.colorFilter = PorterDuffColorFilter(aimColor, PorterDuff.Mode.SRC_IN)
+ }
+ }
+
+ private fun setUpStatusBarIconLight() {
+ ViewUtils.setStatusBarIconLight(this, ColorUtils.isLuminanceDark(mCurrentColor))
+ }
+
private fun setColorWithAnimation(view: View, colorTo: Int) {
- findViewById(R.id.appBarContainer).setBackgroundColor(mCurrentColor)
+ binding!!.appBarContainer.setBackgroundColor(mCurrentColor)
view.setBackgroundColor(colorTo)
+ mCurrentColor = colorTo
+
+ initThemeColors()
+
ViewAnimationUtils.createCircularReveal(
/* view = */ view,
/* centerX = */ view.left,
@@ -111,13 +133,12 @@ class ColorSelectActivity : BaseActivity() {
/* startRadius = */ 0f,
/* endRadius = */ hypot(view.width.toDouble(), view.height.toDouble()).toFloat()
).apply {
- duration = 500
+ duration = 500L
start()
}
- mCurrentColor = colorTo
}
- private class ColorItem(var name: String, var themeColor: ThemeColor) {
+ class ColorItem(var name: String, var themeColor: ThemeColor) {
constructor(name: String, color: Int) : this(name, ThemeColor(color))
}
@@ -152,7 +173,7 @@ class ColorSelectActivity : BaseActivity() {
return "${colorItem.name} [${ColorUtils.toString(colorItem.themeColor.colorPrimary).uppercase()}]"
}
- private fun getColorItems(context: Context): List = ArrayList>()
+ internal fun getColorItems(context: Context): List = ArrayList>()
.apply {
add(customColorPosition, Pair(Pref.getInt(KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800)), R.string.mt_custom))
add(defaultColorPosition, Pair(context.getColor(R.color.theme_color_default), R.string.theme_color_default))
@@ -160,147 +181,6 @@ class ColorSelectActivity : BaseActivity() {
}
.map { (colorInt, nameRes) -> ColorItem(context.getString(nameRes), colorInt) }
- class ColorSettingRecyclerView : ThemeColorRecyclerView {
-
- private var mOnItemClickListener: OnItemClickListener? = null
-
- private var mSelectedPosition = SELECT_NONE
-
- val selectedThemeColor: ThemeColor?
- get() = getColorItems(context)[mSelectedPosition].themeColor.takeUnless { mSelectedPosition < 0 }
-
- private val customColor: Int
- get() = Pref.getInt(KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800))
-
- private val mActualOnItemClickListener = OnClickListener { v ->
- getChildViewHolder(v)?.let { holder ->
- val pos = holder.bindingAdapterPosition
- if (pos == customColorPosition) {
- showColorPicker(v)
- } else {
- setSelectedPosition(pos)
- mOnItemClickListener?.onItemClick(v, pos)
- }
- }
- }
-
- constructor(context: Context) : super(context)
-
- constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
-
- constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle)
-
- init {
- adapter = Adapter()
- layoutManager = LinearLayoutManager(context)
- addItemDecoration(DividerItemDecoration(context, VERTICAL))
- }
-
- @SuppressLint("NotifyDataSetChanged")
- fun setSelectedPosition(currentPosition: Int) {
- if (mSelectedPosition != SELECT_NONE) {
- adapter!!.notifyItemChanged(mSelectedPosition)
- mSelectedPosition = currentPosition
- adapter!!.notifyItemChanged(currentPosition)
- } else {
- mSelectedPosition = currentPosition
- adapter!!.notifyDataSetChanged()
- }
- Pref.putInt(KEY_SELECTED_COLOR_INDEX, mSelectedPosition)
- }
-
- fun setSelectedColor(colorPrimary: Int) {
- for ((i, colorItem) in getColorItems(context).withIndex()) {
- if (colorItem.themeColor.colorPrimary == colorPrimary) {
- return Unit.also { setSelectedPosition(i) }
- }
- }
- mSelectedPosition = SELECT_NONE
- }
-
- private fun setCustomColor(color: Int) {
- getColorItems(context)[customColorPosition].themeColor.colorPrimary = color
- }
-
- fun setCustomColor() {
- setCustomColor(customColor)
- }
-
- 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(KEY_CUSTOM_COLOR, c)
- setCustomColor(c)
- setSelectedPosition(customColorPosition)
- mOnItemClickListener?.onItemClick(v, customColorPosition)
- }
-
- override fun onDialogDismissed(dialogId: Int) {}
- })
- }
- .show((context as FragmentActivity).supportFragmentManager, "Tag")
- }
-
- fun setOnItemClickListener(onItemClickListener: 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 item = getColorItems(context)[position]
- holder.apply {
- setColor(item.themeColor.colorPrimary)
- name.text = item.name
- name.setTextColor(context.getColor(R.color.color_selector_item_text))
- setChecked(mSelectedPosition == position)
- }
- }
-
- override fun getItemCount() = getColorItems(context).size
-
- }
-
- private inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-
- var color: ImageView
- var name: TextView
-
- init {
- itemView.setOnClickListener(mActualOnItemClickListener)
- color = itemView.findViewById(R.id.color)
- name = itemView.findViewById(R.id.name)
- }
-
- fun setChecked(checked: Boolean) {
- if (checked) {
- color.setImageResource(R.drawable.mt_ic_check_white_36dp)
- color.imageTintList = ColorStateList.valueOf(context.getColor(R.color.night_day))
- } else {
- color.setImageDrawable(null)
- }
- }
-
- fun setColor(c: Int) = ThemeColorHelper.setBackgroundColor(color, c)
-
- }
-
- }
-
}
}
\ 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
new file mode 100644
index 00000000..7cb627b2
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt
@@ -0,0 +1,170 @@
+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.View.OnClickListener
+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.util.ColorUtils
+import org.autojs.autojs6.R
+
+class ColorSettingRecyclerView : 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: ColorSelectActivity.OnItemClickListener? = null
+
+ private var mSelectedPosition = ColorSelectActivity.SELECT_NONE
+
+ val selectedThemeColor: ThemeColor?
+ get() = ColorSelectActivity.getColorItems(context)[mSelectedPosition].themeColor.takeUnless { mSelectedPosition < 0 }
+
+ private val customColor: Int
+ get() = Pref.getInt(ColorSelectActivity.KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800))
+
+ private val mActualOnItemClickListener = OnClickListener { v ->
+ getChildViewHolder(v)?.let { holder ->
+ val pos = holder.bindingAdapterPosition
+ if (pos == ColorSelectActivity.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 != ColorSelectActivity.SELECT_NONE) {
+ adapter!!.notifyItemChanged(mSelectedPosition)
+ mSelectedPosition = currentPosition
+ adapter!!.notifyItemChanged(currentPosition)
+ } else {
+ mSelectedPosition = currentPosition
+ adapter!!.notifyDataSetChanged()
+ }
+ Pref.putInt(ColorSelectActivity.KEY_SELECTED_COLOR_INDEX, mSelectedPosition)
+ }
+
+ fun setSelectedColor(colorPrimary: Int) {
+ for ((i, colorItem) in ColorSelectActivity.getColorItems(context).withIndex()) {
+ if (colorItem.themeColor.colorPrimary == colorPrimary) {
+ setSelectedPosition(i)
+ return
+ }
+ }
+ mSelectedPosition = ColorSelectActivity.SELECT_NONE
+ }
+
+ private fun setCustomColor(color: Int) {
+ ColorSelectActivity.getColorItems(context)[ColorSelectActivity.customColorPosition].themeColor.colorPrimary = color
+ }
+
+ fun setCustomColor() {
+ setCustomColor(customColor)
+ }
+
+ 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(ColorSelectActivity.KEY_CUSTOM_COLOR, c)
+ setCustomColor(c)
+ setSelectedPosition(ColorSelectActivity.customColorPosition)
+ mOnItemClickListener?.onItemClick(v, ColorSelectActivity.customColorPosition)
+ }
+
+ override fun onDialogDismissed(dialogId: Int) {}
+ })
+ }
+ .show((context as FragmentActivity).supportFragmentManager, "Tag")
+ }
+
+ fun setOnItemClickListener(onItemClickListener: ColorSelectActivity.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 item = ColorSelectActivity.getColorItems(context)[position]
+ holder.apply {
+ setColor(item.themeColor.colorPrimary)
+ nameView.text = item.name
+ nameView.setTextColor(context.getColor(R.color.color_selector_item_text))
+ setChecked(mSelectedPosition == position)
+ }
+ }
+
+ override fun getItemCount() = ColorSelectActivity.getColorItems(context).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 3f7ad54b..c1cee264 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
@@ -9,6 +9,8 @@ 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.autojs6.R;
/**
* Created by Stardust on Aug 16, 2016.
@@ -35,7 +37,13 @@ public class ThemeColorFloatingActionButton extends FloatingActionButton impleme
@Override
public void setThemeColor(ThemeColor color) {
- setBackgroundTintList(ColorStateList.valueOf(color.colorAccent));
+ int colorAccent = color.colorAccent;
+ setBackgroundTintList(ColorStateList.valueOf(colorAccent));
+ var tintColorRes = ColorUtils.isLuminanceLight(colorAccent)
+ ? R.color.fab_tint_dark
+ : R.color.fab_tint_light;
+ var tintColor = getResources().getColor(tintColorRes, null);
+ setImageTintList(ColorStateList.valueOf(tintColor));
}
}
diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.java b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.java
index b35a0daf..cc76c2c6 100644
--- a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.java
+++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.java
@@ -1,11 +1,13 @@
package org.autojs.autojs.theme.widget;
import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
-
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
-
import org.autojs.autojs.theme.ThemeColor;
import org.autojs.autojs.theme.ThemeColorManager;
import org.autojs.autojs.theme.ThemeColorMutable;
@@ -40,7 +42,43 @@ public class ThemeColorToolbar extends Toolbar implements ThemeColorMutable {
@Override
public void setThemeColor(ThemeColor color) {
- setBackgroundColor(color.colorPrimary);
+ getViewTreeObserver().addOnGlobalLayoutListener(() -> applyThemeColor(color));
+ }
+
+ private void applyThemeColor(ThemeColor color) {
+ int colorPrimary = color.colorPrimary;
+ setBackgroundColor(colorPrimary);
+
+ int aimColor;
+ int popupTheme;
+ if (ThemeColorManager.isThemeColorLuminanceLight()) {
+ aimColor = getResources().getColor(R.color.day, null);
+ popupTheme = R.style.PopupMenuThemeLight;
+ } else {
+ aimColor = getResources().getColor(R.color.night, null);
+ popupTheme = R.style.PopupMenuThemeDark;
+ }
+
+ setTitleTextColor(aimColor);
+ setSubtitleTextColor(aimColor);
+
+ Drawable navigationIcon = getNavigationIcon();
+ if (navigationIcon != null) {
+ navigationIcon.setColorFilter(new PorterDuffColorFilter(aimColor, PorterDuff.Mode.SRC_IN));
+ setNavigationIcon(navigationIcon);
+ }
+ Drawable collapseIcon = getCollapseIcon();
+ if (collapseIcon != null) {
+ collapseIcon.setColorFilter(new PorterDuffColorFilter(aimColor, PorterDuff.Mode.SRC_IN));
+ setCollapseIcon(collapseIcon);
+ }
+ Drawable overflowIcon = getOverflowIcon();
+ if (overflowIcon != null) {
+ overflowIcon.setColorFilter(new PorterDuffColorFilter(aimColor, PorterDuff.Mode.SRC_IN));
+ setOverflowIcon(overflowIcon);
+ }
+
+ setPopupTheme(popupTheme);
}
}
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 4f0b112f..defa19a3 100644
--- a/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/BaseActivity.kt
@@ -5,11 +5,15 @@ package org.autojs.autojs.ui
import android.content.Context
import android.os.Build
import android.os.Bundle
+import android.view.View
import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+import android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import org.autojs.autojs.core.accessibility.AccessibilityTool
import org.autojs.autojs.core.pref.Language
+import org.autojs.autojs.theme.ThemeChangeNotifier
import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.LocaleUtils
import org.autojs.autojs.util.ViewUtils
@@ -21,27 +25,22 @@ import org.autojs.autojs6.BuildConfig
*/
abstract class BaseActivity : AppCompatActivity() {
+ open val handleStatusBarThemeColorAutomatically = true
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- if (ViewUtils.isAutoNightModeEnabled) {
- val isNightModeYes = ViewUtils.isNightModeYes(this)
- if (ViewUtils.isNightModeEnabled != isNightModeYes) {
- ViewUtils.isNightModeEnabled = isNightModeYes
- val mode = when (isNightModeYes) {
- true -> ViewUtils.MODE.NIGHT
- else -> ViewUtils.MODE.DAY
- }
- ViewUtils.setDefaultNightMode(mode)
- }
- }
+ @Suppress("DEPRECATION")
+ ViewUtils.appendSystemUiVisibility(this, SYSTEM_UI_FLAG_LAYOUT_STABLE or SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
- if (!BuildConfig.isInrt) {
- ViewUtils.makeBarsAdaptToNightMode(this)
- }
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
setApplicationLocale(this)
+ ThemeChangeNotifier.themeChanged.observe(this) {
+ initThemeColors()
+ }
+
// @Dubious by SuperMonster003 on Oct 28, 2024.
// ! Is it property to start a11y service automatically here?
// ! zh-CN: 无障碍服务自启动放在这里是否合适?
@@ -62,11 +61,11 @@ abstract class BaseActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
- if (!BuildConfig.isInrt) {
- if (window.decorView.systemUiVisibility and SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN == 0) {
- ThemeColorManager.addActivityStatusBar(this)
- }
+ initThemeColors()
+ if (handleStatusBarThemeColorAutomatically && !BuildConfig.isInrt) {
+ ThemeColorManager.addActivityStatusBar(this)
}
+ setUpStatusBarIconLightByThemeColor()
}
override fun onResume() {
@@ -74,8 +73,20 @@ abstract class BaseActivity : AppCompatActivity() {
LocaleUtils.syncPrefWithCurrentStateIfNeeded(this)
}
+ open fun initThemeColors() {
+ /* Empty body. */
+ }
+
fun setToolbarAsBack(titleRes: Int) = ViewUtils.setToolbarAsBack(this, titleRes)
fun setToolbarAsBack(title: String?) = ViewUtils.setToolbarAsBack(this, title)
+ protected fun setUpStatusBarIconLightByNightMode() {
+ ViewUtils.setStatusBarIconLight(this, ViewUtils.isNightModeEnabled)
+ }
+
+ protected fun setUpStatusBarIconLightByThemeColor() {
+ ViewUtils.setStatusBarIconLight(this, ThemeColorManager.isThemeColorLuminanceDark())
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt
index 46edba30..50d74ed8 100644
--- a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt
+++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt
@@ -717,7 +717,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef
mFirstChar.setIcon(ExplorerViewHelper.getIcon(item))
when (item.type) {
FileUtils.TYPE.JAVASCRIPT, FileUtils.TYPE.AUTO -> mFirstChar
- .setIconTextColorNightDay()
+ .setIconTextByThemeColorLuminance()
.setStrokeThemeColor()
.setFillThemeColor()
else -> mFirstChar
diff --git a/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java b/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java
index 843b065c..af0d3844 100644
--- a/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java
+++ b/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java
@@ -46,7 +46,7 @@ class ExplorerItemViewHolder extends BindableViewHolder