1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-05 07:20:23 +08:00
新增
1. 深色阅读背景开关(fix #41)
修复
1. 主页未加载完全时无法刷新
2. 前进后退后丢失详情页失灵
3. 点一本书后迅速返回概率闪退
优化
1. 详情页头部显示
2. 取消详情页下拉放大
3. 大屏下详情页caption缩进
This commit is contained in:
源文雨
2024-03-08 02:20:58 +09:00
parent d34f296248
commit 229d5b2088
16 changed files with 169 additions and 107 deletions

View File

@@ -8,8 +8,8 @@ android {
applicationId 'top.fumiama.copymanga'
minSdkVersion 23
targetSdkVersion 34
versionCode 44
versionName '2.1.1'
versionCode 45
versionName '2.1.2'
resConfigs 'zh', 'zh-rCN'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -57,7 +57,6 @@ import java.lang.Thread.sleep
import java.lang.ref.WeakReference
class MainActivity : AppCompatActivity() {
var isDrawerClosed = true
private var menuMain: Menu? = null
private var navController: NavController? = null
@@ -366,6 +365,7 @@ class MainActivity : AppCompatActivity() {
companion object{
var mainWeakReference: WeakReference<MainActivity>? = null
var isDrawerClosed = true
var ime: InputMethodManager? = null
const val MSG_CROP_IMAGE = 1
var shelf: Shelf? = null

View File

@@ -3,10 +3,11 @@ package top.fumiama.copymanga.template.general
import android.app.Activity
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import top.fumiama.copymanga.tools.ui.UITools
open class ActivityTemplate:Activity() {
open class ActivityTemplate:AppCompatActivity() {
lateinit var toolsBox: UITools
val pb = BoolPref()
private val allFullScreen

View File

@@ -8,6 +8,7 @@ import android.view.View
import android.widget.Toast
import androidx.navigation.fragment.findNavController
import com.google.gson.Gson
import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.fragment_book.*
import kotlinx.android.synthetic.main.line_bookinfo_text.*
import kotlinx.android.synthetic.main.line_booktandb.*
@@ -25,6 +26,7 @@ import java.lang.ref.WeakReference
class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
var isOnPause = false
private var mBookHandler: BookHandler? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -57,24 +59,26 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
}
}
}
bookHandler = BookHandler(WeakReference(this), path)
mBookHandler = BookHandler(WeakReference(this), path)
Log.d("MyBF", "read path: $path")
bookHandler = mBookHandler
Thread {
sleep(600)
bookHandler?.startLoad()
mBookHandler?.startLoad()
}.start()
} else {
bookHandler = mBookHandler
}
}
override fun onResume() {
super.onResume()
isOnPause = false
/*mainWeakReference?.get()?.apply {
toolbar.title = bookHandler?.book?.results?.comic?.name
bookHandler = mBookHandler
mainWeakReference?.get()?.apply {
toolbar.title = mBookHandler?.book?.results?.comic?.name
}
setStartRead()
fbibinfo?.layoutParams?.height = ((fbibinfo?.width?:0) * 4.0 / 9.0 + 0.5).toInt()
*/
}
override fun onPause() {
@@ -84,25 +88,25 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
override fun onDestroy() {
super.onDestroy()
bookHandler?.destroy()
bookHandler?.ads?.forEach {
mBookHandler?.destroy()
mBookHandler?.ads?.forEach {
it.exit = true
}
bookHandler = null
}
fun setStartRead() {
if(bookHandler?.chapterNames?.isNotEmpty() == true) mainWeakReference?.get()?.apply {
bookHandler?.book?.results?.comic?.let { comic ->
if(mBookHandler?.chapterNames?.isNotEmpty() == true) mainWeakReference?.get()?.apply {
mBookHandler?.book?.results?.comic?.let { comic ->
getPreferences(MODE_PRIVATE).getInt(comic.name, -1).let { p ->
this@BookFragment.lbbstart.apply {
var i = 0
if(p >= 0) {
text = bookHandler!!.chapterNames[p]
text = mBookHandler!!.chapterNames[p]
i = p
}
setOnClickListener {
bookHandler?.urlArray?.let {
mBookHandler?.urlArray?.let {
Reader.viewMangaAt(comic.name, i, it)
}
}
@@ -114,22 +118,22 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
@SuppressLint("SetTextI18n")
fun setAddToShelf() {
if(bookHandler?.chapterNames?.isNotEmpty() == true) {
val b = MainActivity.shelf?.query(bookHandler?.path!!)
bookHandler?.collect = b?.results?.collect?:-2
Log.d("MyBF", "get collect of ${bookHandler?.path} = ${bookHandler?.collect}")
if(mBookHandler?.chapterNames?.isNotEmpty() == true) {
val b = MainActivity.shelf?.query(mBookHandler?.path!!)
mBookHandler?.collect = b?.results?.collect?:-2
Log.d("MyBF", "get collect of ${mBookHandler?.path} = ${mBookHandler?.collect}")
b?.results?.browse?.chapter_name?.let { name ->
btsub.text = "${btsub.text} ${getString(R.string.text_format_cloud_read_to).format(name)}"
}
bookHandler?.collect?.let { collect ->
mBookHandler?.collect?.let { collect ->
if (collect > 0) {
this@BookFragment.lbbsub.setText(R.string.button_sub_subscribed)
}
}
bookHandler?.book?.results?.comic?.let { comic ->
mBookHandler?.book?.results?.comic?.let { comic ->
this@BookFragment.lbbsub.setOnClickListener {
if (this@BookFragment.lbbsub.text != getString(R.string.button_sub)) {
bookHandler?.collect?.let { collect ->
mBookHandler?.collect?.let { collect ->
if (collect < 0) return@setOnClickListener
Thread{
val re = MainActivity.shelf?.del(collect)
@@ -160,13 +164,13 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
fun navigate2dl(){
val bundle = Bundle()
bundle.putString("path", arguments?.getString("path")?:"null")
bundle.putString("name", bookHandler!!.book?.results?.comic?.name)
if(bookHandler!!.vols != null) {
bundle.putString("name", mBookHandler!!.book?.results?.comic?.name)
if(mBookHandler!!.vols != null) {
bundle.putBoolean("loadJson", true)
}
bundle.putStringArray("group", bookHandler!!.gpws)
bundle.putStringArray("groupNames", bookHandler!!.keys)
bundle.putIntArray("count", bookHandler!!.cnts)
bundle.putStringArray("group", mBookHandler!!.gpws)
bundle.putStringArray("groupNames", mBookHandler!!.keys)
bundle.putIntArray("count", mBookHandler!!.cnts)
findNavController().let {
Navigate.safeNavigateTo(it, R.id.action_nav_book_to_nav_group, bundle)
}

View File

@@ -6,7 +6,6 @@ import android.os.Looper
import android.os.Message
import android.util.Log
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.core.graphics.drawable.toBitmap
@@ -74,7 +73,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, val path: String)
1 -> setCover()
2 -> setTexts()
3 -> setAuthorsAndTags()
4 -> setOverScale()
//4 -> setOverScale()
6 -> if(complete) that?.navigate2dl()
7 -> setVolumes()
8 -> that?.apply { fbl?.addView(msg.obj as View) }
@@ -118,22 +117,24 @@ class BookHandler(private val th: WeakReference<BookFragment>, val path: String)
private fun endSetLayouts() {
if (exit) return
that?.fbloading?.visibility = View.GONE
that?.fbloading?.apply {
pauseAnimation()
visibility = View.GONE
}
complete = true
that?.setStartRead()
that?.setAddToShelf()
Log.d("MyBH", "Set complete: true")
}
private fun setOverScale(){
that?.fbov?.setScaleView(that!!.lbibg)
}
/*private fun setOverScale() {
if (exit) return
that?.fbov?.setScaleView(that!!.fbapp)
}*/
private fun setCover() {
if (exit) return
that?.apply {
that?.layoutInflater?.inflate(R.layout.line_bookinfo, that?.fbl, false)?.let {
fbl.addView(it)
setInfoHeight(it)
}
book?.results?.comic?.cover?.let { cover ->
val load = Glide.with(this).load(
GlideUrl(CMApi.proxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)
@@ -144,7 +145,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, val path: String)
?.let { it3 -> load.apply(it3).into(lbibg) }
}
imf?.visibility = View.GONE
fbl?.addView(divider)
//fbl?.addView(divider)
}
}
@@ -155,6 +156,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, val path: String)
}
private fun setTexts(){
if (exit) return
//that?.tic?.text = book?.name
that?.tic?.visibility = View.GONE
mainWeakReference?.get()?.toolbar?.title = book?.results?.comic?.name
@@ -175,15 +177,6 @@ class BookHandler(private val th: WeakReference<BookFragment>, val path: String)
that?.fbl?.addView(divider)
}
private fun setInfoHeight(v: View){
v.viewTreeObserver.addOnGlobalLayoutListener {
Log.d("MyMy", "Width: ${v.width}")
val newH = (v.width * 4.0 / 9.0 + 0.5).toInt()
v.layoutParams.height = newH
v.invalidate()
}
}
private fun setTheme(caption: String, themeStructure: Array<ThemeStructure>, nav: Int) {
that?.apply {
val t = layoutInflater.inflate(R.layout.line_caption, fbl, false)
@@ -225,6 +218,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, val path: String)
}
private fun setAuthorsAndTags() {
if (exit) return
that?.apply {
book?.results?.comic?.apply {
author?.let {

View File

@@ -156,7 +156,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
Thread{
homeHandler.obtainMessage(-1, true).sendToTarget()
while(mainWeakReference?.get()?.isDrawerClosed != true) sleep(233)
while(!MainActivity.isDrawerClosed) sleep(233)
//homeHandler.sendEmptyMessage(6) //removeAllViews
homeHandler.fhib = null
sleep(600)
@@ -164,6 +164,12 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
}.start()
}
}
override fun onResume() {
super.onResume()
swiperefresh?.isRefreshing = false
}
override fun onDestroy() {
super.onDestroy()
homeHandler.destroy()

View File

@@ -14,6 +14,7 @@ import androidx.cardview.widget.CardView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.animation.doOnEnd
import androidx.navigation.fragment.findNavController
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.bumptech.glide.Glide
import com.bumptech.glide.load.model.GlideUrl
import com.to.aboomy.pager2banner.Banner
@@ -58,6 +59,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
-1 -> homeF?.swiperefresh?.isRefreshing = msg.obj as Boolean
//0 -> setLayouts()
1 -> inflateCardLines()
2 -> homeF?.swiperefresh?.let { setSwipe(it) }
3 -> setBanner(fhib as Banner)
5 -> setBannerInfo(msg.obj as Banner)
6 -> {
@@ -107,6 +109,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
if(exit) return
try {
Thread {
sendEmptyMessage(2) //setSwipe
sendEmptyMessage(7) //inflateBanner
sendEmptyMessage(1) //inflateCardLines
}.start()
@@ -255,8 +258,11 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
).adapter = homeF?.ViewData(v)?.RecyclerViewAdapter()
}
v.invalidate()
homeF?.fhov?.swipeRefreshLayout = homeF?.swiperefresh
homeF?.swiperefresh?.setOnRefreshListener {
}
private fun setSwipe(sw: SwipeRefreshLayout) {
homeF?.fhov?.swipeRefreshLayout = sw
sw.setOnRefreshListener {
Log.d("MyHFH", "Refresh items.")
//index = null
//Thread{this@HomeHandler.obtainMessage(-1, true).sendToTarget()}.start() //startLoad
@@ -271,7 +277,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
}
}
private fun allocateLine(title: String, iconResId: Int, comics: Array<ComicStructure>, finish: Boolean = false, isTopic: Boolean = false, onClick: (() -> Unit)? = null): Int{
private fun allocateLine(title: String, iconResId: Int, comics: Array<ComicStructure>, finish: Boolean = false, isTopic: Boolean = false, onClick: (() -> Unit)? = null): Int{
val p = indexLines.size
val c = comics.size / 3
homeF?.layoutInflater?.inflate(

View File

@@ -17,6 +17,7 @@ import android.util.TypedValue
import android.view.*
import android.widget.SeekBar
import android.widget.Toast
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.animation.doOnEnd
import androidx.core.content.ContextCompat
import androidx.core.content.edit
@@ -127,10 +128,19 @@ class ViewMangaActivity : TitleActivityTemplate() {
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
val settingsPref = MainActivity.mainWeakReference?.get()?.let { PreferenceManager.getDefaultSharedPreferences(it) }
settingsPref?.getBoolean("settings_cat_vm_sw_always_dark_bg", false)?.let {
if (it) {
Log.d("MyVM", "force dark")
delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES
} else {
delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
}
}
postponeEnterTransition()
setContentView(R.layout.activity_viewmanga)
super.onCreate(null)
val settingsPref = MainActivity.mainWeakReference?.get()?.let { PreferenceManager.getDefaultSharedPreferences(it) }
va = WeakReference(this)
//dlZip2View = intent.getStringExtra("callFrom") == "Dl" || p["dlZip2View"] == "true"
//zipFirst = intent.getStringExtra("callFrom") == "zipFirst"

View File

@@ -1,28 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<top.fumiama.copymanga.views.OverScrollView
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/fbapp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurface">
<include
android:id="@+id/fbai"
layout="@layout/line_bookinfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/nav_header_vertical_spacing"
app:layout_constraintBottom_toTopOf="@id/fbov"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_scrollFlags="scroll|enterAlways" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/fbov"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/fbiinf">
<LinearLayout
android:id="@+id/fbl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</top.fumiama.copymanga.views.OverScrollView>
android:orientation="vertical" />
</androidx.core.widget.NestedScrollView>
<ProgressBar
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/fbloading"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.5"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/lottie_loading" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -11,14 +11,14 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:isScrollContainer="true"
android:layout_marginTop="@dimen/search_layout_padding">
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/search_layout_padding"
android:isScrollContainer="true">
<top.fumiama.copymanga.views.ScrollRefreshView
android:id="@+id/fhov"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -28,7 +28,7 @@
<LinearLayout
android:id="@+id/fhl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>

View File

@@ -1,41 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height">
android:layout_height="wrap_content"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="@dimen/book_card_radius"
app:cardElevation="@dimen/book_card_elevation"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<ImageView
android:id="@+id/lbibg"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.4"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:scaleType="centerCrop" />
<include
android:id="@+id/lbc"
layout="@layout/card_book"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/lbitb"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.499" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/book_bg_card_padding">
<include
android:id="@+id/lbitb"
layout="@layout/line_booktandb"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/lbibg"
app:layout_constraintHorizontal_weight="2"
app:layout_constraintStart_toEndOf="@+id/lbc"
app:layout_constraintTop_toTopOf="parent" />
<include
android:id="@+id/lbc"
layout="@layout/card_book"
android:layout_width="@dimen/book_card_width"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/lbitb"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.499" />
</androidx.constraintlayout.widget.ConstraintLayout>
<include
android:id="@+id/lbitb"
layout="@layout/line_booktandb"
android:layout_width="0dp"
android:layout_height="@dimen/nav_header_height"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_weight="2"
app:layout_constraintStart_toEndOf="@+id/lbc"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/lbbsub"

View File

@@ -9,9 +9,8 @@
android:id="@+id/tcptn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/caption_text_padding"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.06"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -12,6 +12,10 @@
<dimen name="book_card_radius">16dp</dimen>
<dimen name="book_card_elevation">4dp</dimen>
<dimen name="book_bg_card_padding">8dp</dimen>
<dimen name="book_card_width">128dp</dimen>
<dimen name="caption_text_padding">16dp</dimen>
<dimen name="search_layout_padding">64dp</dimen>
</resources>

View File

@@ -145,6 +145,8 @@
<string name="settings_cat_net_et_summary_img_proxy">为避免滥用代理密钥需加群559748702获得且随时可能会刷新</string>
<string name="settings_cat_vm">漫画浏览</string>
<string name="settings_cat_vm_sw_always_dark_bg">深色阅读背景</string>
<string name="settings_cat_vm_sm_always_dark_bg">打开后阅览漫画的背景色永远为黑色</string>
<string name="settings_cat_vm_sw_hide_info">隐藏底部时间栏</string>
<string name="settings_cat_vm_sm_hide_info">打开后不再在底部显示时间和网络状态</string>
<string name="settings_cat_vm_sw_vol_turn">音量键翻页</string>

View File

@@ -65,6 +65,12 @@
<PreferenceCategory
app:iconSpaceReserved="false"
app:title="@string/settings_cat_vm">
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_vm_sw_always_dark_bg"
app:selectable="true"
app:summary="@string/settings_cat_vm_sm_always_dark_bg"
app:title="@string/settings_cat_vm_sw_always_dark_bg" />
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_vm_sw_hide_info"