diff --git a/app/src/main/java/io/legato/kazusa/help/update/AppUpdateGitHub.kt b/app/src/main/java/io/legato/kazusa/help/update/AppUpdateGitHub.kt index 82a82b303..9a71f9272 100644 --- a/app/src/main/java/io/legato/kazusa/help/update/AppUpdateGitHub.kt +++ b/app/src/main/java/io/legato/kazusa/help/update/AppUpdateGitHub.kt @@ -26,9 +26,9 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface { private suspend fun getLatestRelease(): List { val lastReleaseUrl = if (checkVariant.isBeta()) { - "https://api.github.com/repos/gedoor/legado/releases/tags/beta" + "https://api.github.com/repos/HapeLee/legado/releases/tags/beta" } else { - "https://api.github.com/repos/gedoor/legado/releases/latest" + "https://api.github.com/repos/HapeLee/legado/releases/latest" } val res = okHttpClient.newCallResponse { url(lastReleaseUrl) diff --git a/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeCardPreference.kt b/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeCardPreference.kt new file mode 100644 index 000000000..8c199a430 --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeCardPreference.kt @@ -0,0 +1,131 @@ +package io.legato.kazusa.lib.prefs + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.util.AttributeSet +import android.view.ContextThemeWrapper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.preference.PreferenceViewHolder +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.card.MaterialCardView +import io.legato.kazusa.R +import androidx.core.graphics.toColorInt + +@SuppressLint("ResourceType") +class ThemeCardPreference( + context: Context, + attrs: AttributeSet +) : Preference(context, attrs) { + + private var entries: Array = context.resources.getTextArray(R.array.themes_item) + private var entryValues: Array = context.resources.getTextArray(R.array.themes_value) + private var currentValue: String? = null + + init { + layoutResource = R.layout.preference_theme_card + widgetLayoutResource = R.layout.item_theme_card + } + + override fun onSetInitialValue(defaultValue: Any?) { + currentValue = getPersistedString(defaultValue as? String ?: entryValues.getOrNull(0)?.toString()) + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + + //val titleView = holder.findViewById(R.id.title) as TextView + val recyclerView = holder.findViewById(R.id.recyclerView) as RecyclerView + + //titleView.text = title + recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + recyclerView.adapter = ThemeAdapter() + } + + private inner class ThemeAdapter : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThemeViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_theme_card, parent, false) + return ThemeViewHolder(view) + } + + @SuppressLint("NotifyDataSetChanged") + override fun onBindViewHolder(holder: ThemeViewHolder, position: Int) { + val label = entries.getOrNull(position)?.toString() ?: return + val value = entryValues.getOrNull(position)?.toString() ?: return + + holder.label.text = label + holder.card.isChecked = (value == currentValue) + + val colors = getThemeColors(value) + holder.colorTop.setCardBackgroundColor(colors[0]) + holder.colorBook.setCardBackgroundColor(colors[1]) + holder.colorPin.setCardBackgroundColor(colors[2]) + holder.colorBottom.setCardBackgroundColor(colors[3]) + holder.colorBottomLeft.setCardBackgroundColor(colors[4]) + holder.colorBottomRight.setCardBackgroundColor(colors[5]) + holder.background.setCardBackgroundColor(colors[6]) + val isSelected = (value == currentValue) + holder.background.strokeColor = if (isSelected) colors[4] else colors[7] + holder.card.checkedIconTint = ColorStateList.valueOf(colors[2]) + + + holder.card.setOnClickListener { + if (value != currentValue) { + currentValue = value + persistString(value) + callChangeListener(value) + notifyDataSetChanged() + } + } + } + + + override fun getItemCount(): Int = entries.size + } + + private val themeResIdMap = mapOf( + "0" to R.style.Base_AppTheme, + "1" to R.style.Theme_Base_GR, + "2" to R.style.Theme_Base_WH + ) + + private fun getThemeColors(value: String): List { + val themeResId = themeResIdMap[value] ?: return listOf(Color.GRAY, Color.GRAY, Color.GRAY, Color.GRAY) + + val themedContext = ContextThemeWrapper(context, themeResId) + val attrs = intArrayOf( + com.google.android.material.R.attr.colorOnSurface, + com.google.android.material.R.attr.colorSecondaryContainer, + com.google.android.material.R.attr.colorSecondaryVariant, + com.google.android.material.R.attr.colorSurfaceContainer, + com.google.android.material.R.attr.colorPrimary, + com.google.android.material.R.attr.colorOnSurfaceVariant, + com.google.android.material.R.attr.colorSurface, + com.google.android.material.R.attr.colorPrimaryFixed, + ) + + val ta = themedContext.obtainStyledAttributes(attrs) + return List(attrs.size) { ta.getColor(it, Color.GRAY) }.also { ta.recycle() } + } + + + + class ThemeViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val card: MaterialCardView = view.findViewById(R.id.cardView) + val label: TextView = view.findViewById(R.id.themeLabel) + val colorTop: MaterialCardView = view.findViewById(R.id.cv_title) + val colorBook: MaterialCardView = view.findViewById(R.id.cv_book) + val colorPin: MaterialCardView = view.findViewById(R.id.cv_pin) + val colorBottom: MaterialCardView = view.findViewById(R.id.cv_bottom) + val colorBottomRight: MaterialCardView = view.findViewById(R.id.right_rect) + val colorBottomLeft : MaterialCardView = view.findViewById(R.id.left_circle) + val background : MaterialCardView = view.findViewById(R.id.cardView) + } +} + + diff --git a/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt b/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt index 16ed2e6a3..f8cd36bc0 100644 --- a/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt +++ b/app/src/main/java/io/legato/kazusa/lib/prefs/ThemeModePreference.kt @@ -8,20 +8,15 @@ import android.view.ViewGroup import androidx.preference.PreferenceViewHolder import com.google.android.material.button.MaterialButtonToggleGroup import io.legato.kazusa.R -import androidx.core.content.withStyledAttributes class ThemeModePreference(context: Context, attrs: AttributeSet) : Preference(context, attrs) { private var currentValue: String? = null - private var isBottomBackground: Boolean = false init { layoutResource = R.layout.view_pref widgetLayoutResource = R.layout.view_theme_mode - context.withStyledAttributes(attrs, R.styleable.Preference) { - isBottomBackground = getBoolean(R.styleable.Preference_isBottomBackground, false) - } } override fun onBindViewHolder(holder: PreferenceViewHolder) { @@ -65,14 +60,9 @@ class ThemeModePreference(context: Context, attrs: AttributeSet) : Preference(co } override fun onSetInitialValue(defaultValue: Any?) { - super.onSetInitialValue(defaultValue) currentValue = getPersistedString(defaultValue as? String ?: "0") } - fun getDefaultValue(): Any { - return "0" - } - override fun shouldDisableDependents(): Boolean { return currentValue == null || super.shouldDisableDependents() } diff --git a/app/src/main/java/io/legato/kazusa/lib/theme/ThemeModel.kt b/app/src/main/java/io/legato/kazusa/lib/theme/ThemeModel.kt new file mode 100644 index 000000000..fe0561bc7 --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/lib/theme/ThemeModel.kt @@ -0,0 +1,3 @@ +package io.legato.kazusa.lib.theme + + diff --git a/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt index ba6a84275..b0ef18c76 100644 --- a/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt @@ -23,6 +23,7 @@ import io.legato.kazusa.lib.dialogs.alert import io.legato.kazusa.lib.dialogs.selector import io.legato.kazusa.lib.prefs.ColorPreference import io.legato.kazusa.lib.prefs.NameListPreference +import io.legato.kazusa.lib.prefs.ThemeCardPreference import io.legato.kazusa.lib.prefs.ThemeModePreference //import io.legado.app.lib.theme.primaryColor import io.legato.kazusa.ui.widget.number.NumberPickerDialog @@ -104,7 +105,7 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), true } } - findPreference(PreferKey.themePref)?.let { + findPreference(PreferKey.themePref)?.let { it.setOnPreferenceChangeListener { _, _ -> val intent = requireActivity().intent requireActivity().finish() diff --git a/app/src/main/res/drawable/rounded_rect.xml b/app/src/main/res/drawable/rounded_rect.xml new file mode 100644 index 000000000..f4eed487d --- /dev/null +++ b/app/src/main/res/drawable/rounded_rect.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/layout/item_theme_card.xml b/app/src/main/res/layout/item_theme_card.xml new file mode 100644 index 000000000..844f59fe8 --- /dev/null +++ b/app/src/main/res/layout/item_theme_card.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/preference_theme_card.xml b/app/src/main/res/layout/preference_theme_card.xml new file mode 100644 index 000000000..155cd7a82 --- /dev/null +++ b/app/src/main/res/layout/preference_theme_card.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/layout/view_theme_mode.xml b/app/src/main/res/layout/view_theme_mode.xml index bd5c38b4a..5953b6d00 100644 --- a/app/src/main/res/layout/view_theme_mode.xml +++ b/app/src/main/res/layout/view_theme_mode.xml @@ -12,6 +12,8 @@ 添加本地 书源 书源管理 - 新建、导入、编辑或管理书源 + 新建 • 导入 • 编辑或管理书源 设置 - 主题设置 - 与界面/颜色相关的一些设置 - 其它设置 - 与功能相关的一些设置 + 外观 + 主题 • 深色模式 • 界面设置 + 高级 + 语言 • 其他设置 关于 捐赠 退出 @@ -111,7 +111,7 @@ 更新书籍时自动下载最新章节 备份与恢复 WebDav 设置 - WebDav 设置/导入旧版本数据 + WebDav 设置 • 导入旧版本数据 备份 恢复 备份请给予存储权限 @@ -590,7 +590,7 @@ 新建替换 分组 分组:%s - 目录:%s + 已读:%s 启用发现 禁用发现 启用所选 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index fab969f10..e738f9ea6 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -235,4 +235,5 @@ - \ No newline at end of file + + diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index 6e95d8c3d..357dde63d 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -2,59 +2,68 @@ - - - - - - + app:layout="@layout/view_preference_category"> - + - + - + - + + + + + + + + + - - - - - - - - @@ -120,38 +95,6 @@ app:iconSpaceReserved="false" app:layout="@layout/view_preference_category"> - - - - - - - - diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml index a8f48a1bd..706d1293c 100644 --- a/app/src/main/res/xml/pref_main.xml +++ b/app/src/main/res/xml/pref_main.xml @@ -11,27 +11,6 @@ android:title="@string/book_source_manage" app:iconSpaceReserved="false" /> - - - - - - + app:iconSpaceReserved="false" + app:layout="@layout/view_preference_category"> + + + + + + + + + +