This commit is contained in:
HapeLee
2025-06-08 02:08:15 +08:00
parent 55ac1f6070
commit 8325a17864
13 changed files with 384 additions and 157 deletions
@@ -26,9 +26,9 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface {
private suspend fun getLatestRelease(): List<AppReleaseInfo> {
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)
@@ -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<CharSequence> = context.resources.getTextArray(R.array.themes_item)
private var entryValues: Array<CharSequence> = 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<ThemeViewHolder>() {
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<Int> {
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)
}
}
@@ -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()
}
@@ -0,0 +1,3 @@
package io.legato.kazusa.lib.theme
@@ -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<ListPreference>(PreferKey.themePref)?.let {
findPreference<ThemeCardPreference>(PreferKey.themePref)?.let {
it.setOnPreferenceChangeListener { _, _ ->
val intent = requireActivity().intent
requireActivity().finish()
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/white" />
<corners android:radius="8dp" />
</shape>
+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:orientation="vertical"
android:gravity="center_horizontal">
<!-- 四色预览框 -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardView"
android:layout_width="112dp"
android:layout_height="200dp"
android:layout_marginBottom="8dp"
app:cardCornerRadius="20dp"
app:cardBackgroundColor="#000000"
android:checkable="true"
app:strokeWidth="4dp"
android:clickable="true"
android:focusable="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 一号:左上角 -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv_title"
android:layout_width="64dp"
android:layout_height="16dp"
android:layout_margin="12dp"
app:strokeWidth="0dp"
app:cardCornerRadius="8dp"
app:cardBackgroundColor="#FF0000"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv_book"
android:layout_width="56dp"
android:layout_height="80dp"
android:layout_marginTop="8dp"
app:strokeWidth="0dp"
app:cardCornerRadius="8dp"
app:cardBackgroundColor="#FFFF00"
app:layout_constraintTop_toBottomOf="@id/cv_title"
app:layout_constraintStart_toStartOf="@id/cv_title" />
<!-- 三号:在二号内部的右上角 -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv_pin"
android:layout_width="20dp"
android:layout_height="12dp"
android:layout_margin="4dp"
app:strokeWidth="0dp"
app:cardCornerRadius="4dp"
app:cardBackgroundColor="#0000FF"
app:layout_constraintTop_toTopOf="@id/cv_book"
app:layout_constraintEnd_toEndOf="@id/cv_book" />
<!-- 四号:最下方 -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv_bottom"
android:layout_width="match_parent"
android:layout_height="32dp"
android:layout_margin="4dp"
app:strokeWidth="0dp"
app:cardCornerRadius="0dp"
app:cardBackgroundColor="#FFFF00"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" >
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/left_circle"
android:layout_width="20dp"
android:layout_height="20dp"
app:cardCornerRadius="24dp"
app:cardBackgroundColor="#000000"
app:strokeWidth="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="8dp"/>
<com.google.android.material.card.MaterialCardView
android:id="@+id/right_rect"
android:layout_width="62dp"
android:layout_height="16dp"
app:cardCornerRadius="8dp"
app:cardBackgroundColor="#000000"
app:strokeWidth="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginEnd="8dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<!-- 主题名称 -->
<TextView
android:id="@+id/themeLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主题名"
android:textSize="14sp" />
</LinearLayout>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingVertical="8dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:orientation="vertical" />
</LinearLayout>
@@ -12,6 +12,8 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_system"
style="@style/Widget.Material3.Button.OutlinedButton"
app:checkedIcon="@drawable/ic_check"
android:checkable="true"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@@ -20,6 +22,8 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_light"
style="@style/Widget.Material3.Button.OutlinedButton"
app:checkedIcon="@drawable/ic_check"
android:checkable="true"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@@ -28,6 +32,8 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_dark"
style="@style/Widget.Material3.Button.OutlinedButton"
app:checkedIcon="@drawable/ic_check"
android:checkable="true"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
+7 -7
View File
@@ -67,12 +67,12 @@
<string name="book_local">添加本地</string>
<string name="book_source">书源</string>
<string name="book_source_manage">书源管理</string>
<string name="book_source_manage_desc">新建、导入、编辑或管理书源</string>
<string name="book_source_manage_desc">新建 • 导入 • 编辑或管理书源</string>
<string name="setting">设置</string>
<string name="theme_setting">主题设置</string>
<string name="theme_setting_s">与界面/颜色相关的一些设置</string>
<string name="other_setting">其它设置</string>
<string name="other_setting_s">与功能相关的一些设置</string>
<string name="theme_setting">外观</string>
<string name="theme_setting_s">主题 • 深色模式 • 界面设置</string>
<string name="other_setting">高级</string>
<string name="other_setting_s">语言 • 其他设置</string>
<string name="about">关于</string>
<string name="donate">捐赠</string>
<string name="exit">退出</string>
@@ -111,7 +111,7 @@
<string name="ps_auto_download">更新书籍时自动下载最新章节</string>
<string name="backup_restore">备份与恢复</string>
<string name="web_dav_set">WebDav 设置</string>
<string name="web_dav_set_import_old">WebDav 设置/导入旧版本数据</string>
<string name="web_dav_set_import_old">WebDav 设置导入旧版本数据</string>
<string name="backup">备份</string>
<string name="restore">恢复</string>
<string name="backup_permission">备份请给予存储权限</string>
@@ -590,7 +590,7 @@
<string name="add_replace_rule">新建替换</string>
<string name="group">分组</string>
<string name="group_s">分组:%s</string>
<string name="toc_s">目录%s</string>
<string name="toc_s">已读%s</string>
<string name="enable_explore">启用发现</string>
<string name="disable_explore">禁用发现</string>
<string name="enable_selection">启用所选</string>
+2 -1
View File
@@ -235,4 +235,5 @@
<enum name="right_bottom_fill" value="7" />
</attr>
</declare-styleable>
</resources>
</resources>
+57 -114
View File
@@ -2,59 +2,68 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<io.legato.kazusa.lib.prefs.ThemeModePreference
android:defaultValue="0"
android:entries="@array/theme_mode"
android:entryValues="@array/theme_mode_v"
android:key="themeMode"
android:title="@string/theme_mode"
android:summary="切换浅色/深色/跟随系统" />
<io.legato.kazusa.lib.prefs.NameListPreference
android:key="app_theme"
android:title="应用主题"
android:summary="喵喵喵"
android:entries="@array/themes_item"
android:entryValues="@array/themes_value"
android:defaultValue="0" />
<io.legato.kazusa.lib.prefs.IconListPreference
android:defaultValue="ic_launcher"
android:entries="@array/icon_names"
android:entryValues="@array/icons"
android:key="launcherIcon"
android:summary="@string/change_icon_summary"
android:title="@string/change_icon"
<io.legato.kazusa.lib.prefs.PreferenceCategory
android:key="themeCategory"
android:title="@string/theme"
app:allowDividerAbove="true"
app:allowDividerBelow="false"
app:iconSpaceReserved="false"
app:icons="@array/icons" />
app:layout="@layout/view_preference_category">
<io.legato.kazusa.lib.prefs.Preference
android:key="welcomeStyle"
android:title="@string/welcome_style"
android:summary="@string/welcome_style_summary" />
<io.legato.kazusa.lib.prefs.ThemeModePreference
android:defaultValue="0"
android:entries="@array/theme_mode"
android:entryValues="@array/theme_mode_v"
android:key="themeMode"
android:title="@string/theme_mode"
android:summary="切换浅色/深色/跟随系统" />
<io.legato.kazusa.lib.prefs.Preference
android:key="fontScale"
android:summary="@string/font_scale_summary"
android:title="@string/font_scale"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ThemeCardPreference
android:key="app_theme"
android:title="应用主题"
android:summary="喵喵喵"
android:entries="@array/themes_item"
android:entryValues="@array/themes_value"
android:defaultValue="0" />
<io.legato.kazusa.lib.prefs.Preference
android:key="coverConfig"
android:title="@string/cover_config"
android:summary="@string/cover_config_summary"
app:allowDividerAbove="false"
app:allowDividerBelow="false"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.IconListPreference
android:defaultValue="ic_launcher"
android:entries="@array/icon_names"
android:entryValues="@array/icons"
android:key="launcherIcon"
android:summary="@string/change_icon_summary"
android:title="@string/change_icon"
app:iconSpaceReserved="false"
app:icons="@array/icons" />
<io.legato.kazusa.lib.prefs.Preference
android:key="themeList"
android:summary="@string/theme_list_summary"
android:title="@string/theme_list"
app:allowDividerAbove="false"
app:allowDividerBelow="false"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:key="welcomeStyle"
android:title="@string/welcome_style"
android:summary="@string/welcome_style_summary" />
<io.legato.kazusa.lib.prefs.Preference
android:key="fontScale"
android:summary="@string/font_scale_summary"
android:title="@string/font_scale"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:key="coverConfig"
android:title="@string/cover_config"
android:summary="@string/cover_config_summary"
app:allowDividerAbove="false"
app:allowDividerBelow="false"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:key="themeList"
android:summary="@string/theme_list_summary"
android:title="@string/theme_list"
app:allowDividerAbove="false"
app:allowDividerBelow="false"
app:iconSpaceReserved="false" />
</io.legato.kazusa.lib.prefs.PreferenceCategory>
<io.legato.kazusa.lib.prefs.PreferenceCategory
android:key="dayThemeCategory"
@@ -64,40 +73,6 @@
app:iconSpaceReserved="false"
app:layout="@layout/view_preference_category">
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_brown_500"
android:key="colorPrimary"
android:summary="@string/day_color_primary"
android:title="@string/primary"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_red_600"
android:key="colorAccent"
android:summary="@string/day_color_accent"
android:title="@string/accent"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_grey_100"
android:key="colorBackground"
android:summary="@string/day_background_color"
android:title="@string/background_color"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_grey_200"
android:key="colorBottomBackground"
android:summary="@string/day_navbar_color"
android:title="@string/navbar_color"
app:allowDividerAbove="false"
app:allowDividerBelow="false"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:key="backgroundImage"
android:title="@string/background_image" />
@@ -120,38 +95,6 @@
app:iconSpaceReserved="false"
app:layout="@layout/view_preference_category">
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_blue_grey_600"
android:key="colorPrimaryNight"
android:summary="@string/night_primary"
android:title="@string/primary"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_deep_orange_800"
android:key="colorAccentNight"
android:summary="@string/night_accent"
android:title="@string/accent"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_grey_900"
android:key="colorBackgroundNight"
android:summary="@string/night_background_color"
android:title="@string/background_color"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.ColorPreference
android:defaultValue="@color/md_grey_850"
android:key="colorBottomBackgroundNight"
android:summary="@string/night_navbar_color"
android:title="@string/navbar_color"
app:cpv_dialogType="preset"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:key="backgroundImageNight"
android:title="@string/background_image" />
+32 -22
View File
@@ -11,27 +11,6 @@
android:title="@string/book_source_manage"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_cfg_txt"
android:key="txtTocRuleManage"
android:summary="@string/config_txt_toc_rule"
android:title="@string/txt_toc_rule"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_cfg_replace"
android:key="replaceManage"
android:summary="@string/replace_purify_desc"
android:title="@string/replace_purify"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_translate"
android:key="dictRuleManage"
android:summary="@string/config_dict_rule"
android:title="@string/dict_rule"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.SwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_cfg_web"
@@ -45,7 +24,8 @@
android:title="@string/setting"
app:allowDividerAbove="true"
app:allowDividerBelow="false"
app:iconSpaceReserved="false">
app:iconSpaceReserved="false"
app:layout="@layout/view_preference_category">
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_cfg_backup"
@@ -71,6 +51,36 @@
</io.legato.kazusa.lib.prefs.PreferenceCategory>
<io.legato.kazusa.lib.prefs.PreferenceCategory
android:title="规则"
app:allowDividerAbove="true"
app:allowDividerBelow="false"
app:iconSpaceReserved="false"
app:layout="@layout/view_preference_category">
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_cfg_txt"
android:key="txtTocRuleManage"
android:summary="@string/config_txt_toc_rule"
android:title="@string/txt_toc_rule"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_cfg_replace"
android:key="replaceManage"
android:summary="@string/replace_purify_desc"
android:title="@string/replace_purify"
app:iconSpaceReserved="false" />
<io.legato.kazusa.lib.prefs.Preference
android:icon="@drawable/ic_translate"
android:key="dictRuleManage"
android:summary="@string/config_dict_rule"
android:title="@string/dict_rule"
app:iconSpaceReserved="false" />
</io.legato.kazusa.lib.prefs.PreferenceCategory>
<io.legato.kazusa.lib.prefs.PreferenceCategory
android:key="aboutCategory"
android:title="@string/other"