1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-23 11:00:24 +08:00

v2.0.beta22

新增
1. 浏览漫画的加载提示
2. 设置->网络->总是使用流量观看
3. 加入书架(但是还不能删除)
修复
1. 进入排行时快速切换tab闪退
2. 详情页点击章节非第一组时错位到第一组(fix #33)
3. 快速多次点击某些按钮后闪退
This commit is contained in:
源文雨
2023-10-25 00:46:06 +09:00
parent 95e82ab97c
commit 5d9db7a657
22 changed files with 281 additions and 50 deletions

View File

@@ -2,6 +2,7 @@
<dictionary name="fumiama"> <dictionary name="fumiama">
<words> <words>
<w>lowpan</w> <w>lowpan</w>
<w>nisi</w>
</words> </words>
</dictionary> </dictionary>
</component> </component>

View File

@@ -8,8 +8,8 @@ android {
applicationId 'top.fumiama.copymanga' applicationId 'top.fumiama.copymanga'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 33 targetSdkVersion 33
versionCode 33 versionCode 34
versionName '2.0.beta21' versionName '2.0.beta22'
resConfigs 'zh', 'zh-rCN' resConfigs 'zh', 'zh-rCN'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -40,6 +40,8 @@ import com.yalantis.ucrop.UCrop
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.nav_header_main.* import kotlinx.android.synthetic.main.nav_header_main.*
import top.fumiama.copymanga.manga.Shelf
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler
@@ -361,5 +363,16 @@ class MainActivity : AppCompatActivity() {
var mainWeakReference: WeakReference<MainActivity>? = null var mainWeakReference: WeakReference<MainActivity>? = null
var ime: InputMethodManager? = null var ime: InputMethodManager? = null
const val MSG_CROP_IMAGE = 1 const val MSG_CROP_IMAGE = 1
var shelf: Shelf? = null
get() {
if (field != null) return field
return mainWeakReference?.get()?.let {
field = Shelf(
it.getPreferences(Context.MODE_PRIVATE).getString("token", "")?:return@let null,
it.getString(R.string.shelfOperateApiUrl).format(CMApi.myHostApiUrl), it.getString(R.string.referer), it.getString(R.string.pc_ua)
)
field
}
}
} }
} }

View File

@@ -9,12 +9,13 @@ import top.fumiama.copymanga.ui.vm.ViewMangaActivity
object Reader { object Reader {
fun viewMangaAt(name: String, pos: Int, from_first_page: Boolean = false) { fun viewMangaAt(name: String, pos: Int, from_first_page: Boolean = false) {
Log.d("MyR", "viewMangaAt name $name, pos $pos")
mainWeakReference?.get()?.apply { mainWeakReference?.get()?.apply {
getPreferences(Context.MODE_PRIVATE)?.edit { getPreferences(Context.MODE_PRIVATE)?.edit {
putInt(name, pos) putInt(name, pos)
apply() apply()
Log.d("MyR", "记录 $name 阅读到第 ${pos+1}") Log.d("MyR", "记录 $name 阅读到第 ${pos+1}")
}?: Log.d("MyR", "无法获得main pref") }?: Log.d("MyR", "无法获得 main pref")
ViewMangaActivity.dlhandler = null ViewMangaActivity.dlhandler = null
ViewMangaActivity.position = pos ViewMangaActivity.position = pos
ViewMangaActivity.comicName = name ViewMangaActivity.comicName = name

View File

@@ -0,0 +1,44 @@
package top.fumiama.copymanga.manga
import android.content.SharedPreferences
import com.google.gson.Gson
import top.fumiama.copymanga.json.ReturnBase
import top.fumiama.copymanga.tools.http.DownloadTools
class Shelf(private val token: String, private val apiUrl: String, private val referer: String, private val ua: String) {
fun add(comicId: String): String {
if (comicId.isEmpty()) {
return "空漫画ID"
}
val body = buildString {
append("comic_id=")
append(comicId)
append("&is_collect=1&authorization=Token+")
append("")
append(token)
}
val re = DownloadTools.requestWithBody(
"$apiUrl?platform=3", "POST", body.encodeToByteArray(), referer, ua
)?.decodeToString() ?: return "空回应"
return Gson().fromJson(re, ReturnBase::class.java).message
}
fun del(vararg bookIds: Int): String {
if (bookIds.isEmpty()) {
return "空ID列表"
}
val body = buildString {
bookIds.forEach {
append("ids=")
append(it)
append("&")
}
append("authorization=Token+")
append(token)
}
val re = DownloadTools.requestWithBody(
"${apiUrl}s?platform=3", "DELETE", body.encodeToByteArray(), referer, ua
)?.decodeToString() ?: return "空回应"
return Gson().fromJson(re, ReturnBase::class.java).message
}
}

View File

@@ -36,27 +36,31 @@ class CardList(
exitCardList = false exitCardList = false
} }
private fun manageRow(){ private fun manageRow() {
if(!exitCardList && count++ % cardPerRow == 0) inflateRow() if(!exitCardList && count++ % cardPerRow == 0) inflateRow()
Log.d("MyCL", "index: $index, cardPR: $cardPerRow") Log.d("MyCL", "index: $index, cardPR: $cardPerRow")
} }
private fun inflateRow(){ private fun inflateRow(){
that?.layoutInflater?.inflate(R.layout.line_horizonal_empty, that.mydll, false)?.let { that?.layoutInflater?.inflate(R.layout.line_horizonal_empty, that.mydll, false)?.let {
if(exitCardList) return
it.layoutParams.height = cardHeight + 16 it.layoutParams.height = cardHeight + 16
mainWeakReference?.get()?.runOnUiThread { mainWeakReference?.get()?.runOnUiThread {
if(!exitCardList) that.mydll.addView(it) if(exitCardList) return@runOnUiThread
that.mydll.addView(it)
} }
if(!exitCardList) recycleOneRow(it) recycleOneRow(it)
index++
} }
} }
private fun recycleOneRow(v:View?){ private fun recycleOneRow(v:View?){
val relativeIndex = index++ % 20 val relativeIndex = index % 20
if(rows[relativeIndex] == null) rows[relativeIndex] = v if(rows[relativeIndex] == null) rows[relativeIndex] = v
else { else {
val victim = rows[relativeIndex] val victim = rows[relativeIndex]
mainWeakReference?.get()?.runOnUiThread { mainWeakReference?.get()?.runOnUiThread {
if(!exitCardList) that?.apply { if(exitCardList) return@runOnUiThread
that?.apply {
mydll?.removeView(victim) mydll?.removeView(victim)
mys?.scrollY = that.mys?.scrollY?.minus(cardHeight + 16)?:0 mys?.scrollY = that.mys?.scrollY?.minus(cardHeight + 16)?:0
} }
@@ -67,8 +71,9 @@ class CardList(
@ExperimentalStdlibApi @ExperimentalStdlibApi
fun addCard(name: String, append: String? = null, head: String? = null, path: String? = null, chapterUUID: String? = null, pn: Int? = null, isFinish: Boolean = false){ fun addCard(name: String, append: String? = null, head: String? = null, path: String? = null, chapterUUID: String? = null, pn: Int? = null, isFinish: Boolean = false){
if(!exitCardList) manageRow() if(exitCardList) return
if(!exitCardList) that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let { manageRow()
that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let {
val card = it.cic val card = it.cic
card.name = name card.name = name
card.append = append card.append = append
@@ -79,7 +84,8 @@ class CardList(
card.pageNumber = pn card.pageNumber = pn
card.isFinish = isFinish card.isFinish = isFinish
mainWeakReference?.get()?.runOnUiThread{ mainWeakReference?.get()?.runOnUiThread{
if(!exitCardList) addCard(it) if(exitCardList) return@runOnUiThread
addCard(it)
} }
} }
} }
@@ -87,21 +93,22 @@ class CardList(
@ExperimentalStdlibApi @ExperimentalStdlibApi
fun addCard(cardFrame: View) { fun addCard(cardFrame: View) {
val card = cardFrame.cic val card = cardFrame.cic
if (card.index < 0) return
val name = card.name + (card.append?:"") val name = card.name + (card.append?:"")
val head = card.headImageUrl val head = card.headImageUrl
val file = File(that?.context?.getExternalFilesDir(""), card.name) val file = File(that?.context?.getExternalFilesDir(""), card.name)
if(!exitCardList) cardFrame.let { if(exitCardList) return
cardFrame.let {
it.tic.text = name it.tic.text = name
if(!file.exists()){ if(!file.exists()){
if(head != null) { if(head != null) {
that?.context?.let { context -> that?.context?.let { context ->
if(!exitCardList) Glide.with(context).load(
Glide.with(context).load( GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders) ).into(it.imic)
).into(it.imic)
} }
} else { } else {
if(!exitCardList) it.imic.setImageResource(R.drawable.img_defmask) it.imic.setImageResource(R.drawable.img_defmask)
} }
} else { } else {
val img = File(file, "head.jpg") val img = File(file, "head.jpg")
@@ -110,8 +117,8 @@ class CardList(
if(card.isFinish) it.sgnic.visibility = View.VISIBLE if(card.isFinish) it.sgnic.visibility = View.VISIBLE
initClickListeners?.prepareListeners(card, card.name, card.path, card.chapterUUID, card.pageNumber) initClickListeners?.prepareListeners(card, card.name, card.path, card.chapterUUID, card.pageNumber)
rows[card.index % 20]?.ltbtn?.addView(it) rows[card.index % 20]?.ltbtn?.addView(it)
it.layoutParams.height = cardHeight it.layoutParams?.height = cardHeight
it.layoutParams.width = cardWidth it.layoutParams?.width = cardWidth
} }
} }
interface InitClickListeners{ interface InitClickListeners{

View File

@@ -14,6 +14,7 @@ import top.fumiama.copymanga.json.ShelfStructure
import top.fumiama.copymanga.json.TypeBookListStructure import top.fumiama.copymanga.json.TypeBookListStructure
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.Navigate
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ExperimentalStdlibApi @ExperimentalStdlibApi
@@ -101,7 +102,7 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
v.setOnClickListener { v.setOnClickListener {
val bundle = Bundle() val bundle = Bundle()
bundle.putString("path", path) bundle.putString("path", path)
findNavController().navigate(navId, bundle) Navigate.safeNavigateTo(findNavController(), navId, bundle)
} }
} }
} }

View File

@@ -0,0 +1,17 @@
package top.fumiama.copymanga.tools.api
import android.graphics.Typeface
import androidx.core.content.res.ResourcesCompat
import top.fumiama.copymanga.MainActivity
import top.fumiama.dmzj.copymanga.R
object Font {
var nisiTypeFace: Typeface? = null
get() {
if (field != null) return field
field = MainActivity.mainWeakReference?.get()?.let {
ResourcesCompat.getFont(it.applicationContext, R.font.nisi)
}
return field
}
}

View File

@@ -0,0 +1,12 @@
package top.fumiama.copymanga.tools.api
import android.os.Bundle
import androidx.navigation.NavController
object Navigate {
fun safeNavigateTo(navController: NavController, id: Int, bundle: Bundle? = null) {
navController.currentDestination?.getAction(id)?.let {
navController.navigate(id, bundle)
}
}
}

View File

@@ -3,6 +3,7 @@ package top.fumiama.copymanga.tools.http
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import okhttp3.RequestBody
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.net.HttpURLConnection import java.net.HttpURLConnection
@@ -129,4 +130,28 @@ object DownloadTools {
return@replace URLEncoder.encode(match.value, "UTF-8") return@replace URLEncoder.encode(match.value, "UTF-8")
} }
}*/ }*/
fun requestWithBody(url: String, method: String, body: ByteArray, refer: String? = null, ua: String? = null): ByteArray? {
Log.d("Mydl", "$method Http: $url")
var ret: ByteArray? = null
val task = FutureTask(Callable {
try {
getConnection(url, method, refer, ua)?.apply {
outputStream.write(body)
ret = inputStream.readBytes()
disconnect()
}
} catch (ex: Exception) {
ex.printStackTrace()
}
return@Callable ret
})
Thread(task).start()
return try {
task.get()
} catch (ex: Exception) {
ex.printStackTrace()
null
}
}
} }

View File

@@ -3,11 +3,14 @@ package top.fumiama.copymanga.ui.book
import android.content.Context.MODE_PRIVATE import android.content.Context.MODE_PRIVATE
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.line_booktandb.* import kotlinx.android.synthetic.main.line_booktandb.*
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.manga.Reader import top.fumiama.copymanga.manga.Reader
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep import java.lang.Thread.sleep
@@ -68,6 +71,20 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
} }
} }
fun setAddToShelf() {
if(bookHandler?.chapterNames?.isNotEmpty() == true)
bookHandler?.book?.results?.comic?.let { comic ->
this@BookFragment.lbbsub.setOnClickListener {
Thread{
val re = MainActivity.shelf?.add(comic.uuid)
mainWeakReference?.get()?.runOnUiThread {
Toast.makeText(context, re, Toast.LENGTH_SHORT).show()
}
}.start()
}
}
}
fun navigate2dl(){ fun navigate2dl(){
val bundle = Bundle() val bundle = Bundle()
bundle.putString("path", arguments?.getString("path")?:"null") bundle.putString("path", arguments?.getString("path")?:"null")
@@ -78,7 +95,9 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
bundle.putStringArray("group", bookHandler!!.gpws) bundle.putStringArray("group", bookHandler!!.gpws)
bundle.putStringArray("groupNames", bookHandler!!.keys) bundle.putStringArray("groupNames", bookHandler!!.keys)
bundle.putIntArray("count", bookHandler!!.cnts) bundle.putIntArray("count", bookHandler!!.cnts)
findNavController().navigate(R.id.action_nav_book_to_nav_group, bundle) findNavController().let {
Navigate.safeNavigateTo(it, R.id.action_nav_book_to_nav_group, bundle)
}
} }
companion object { companion object {

View File

@@ -34,6 +34,7 @@ import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.GlideBlurTransformation import top.fumiama.copymanga.tools.api.GlideBlurTransformation
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json
import top.fumiama.copymanga.ui.vm.ViewMangaActivity import top.fumiama.copymanga.ui.vm.ViewMangaActivity
@@ -113,6 +114,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
that?.fbloading?.visibility = View.GONE that?.fbloading?.visibility = View.GONE
complete = true complete = true
that?.setStartRead() that?.setStartRead()
that?.setAddToShelf()
Log.d("MyBH", "Set complete: true") Log.d("MyBH", "Set complete: true")
} }
@@ -224,6 +226,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
} }
private fun setThemes(){ private fun setThemes(){
if (exit) return
that?.apply { that?.apply {
book?.results?.comic?.apply { book?.results?.comic?.apply {
author?.let { setTheme(getString(R.string.author), it, R.id.action_nav_book_to_nav_author) } author?.let { setTheme(getString(R.string.author), it, R.id.action_nav_book_to_nav_author) }
@@ -240,6 +243,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
if(exit) return@runOnUiThread if(exit) return@runOnUiThread
ViewMangaActivity.fileArray = arrayOf() ViewMangaActivity.fileArray = arrayOf()
ViewMangaActivity.urlArray = arrayOf() ViewMangaActivity.urlArray = arrayOf()
var i = 0
vols?.forEachIndexed { iv, v -> vols?.forEachIndexed { iv, v ->
if(exit) return@runOnUiThread if(exit) return@runOnUiThread
fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false)) fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false))
@@ -249,7 +253,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false)) fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false))
var line: View? = null var line: View? = null
val last = v.results.list.size - 1 val last = v.results.list.size - 1
v.results.list.onEachIndexed { i, it -> v.results.list.forEach {
ViewMangaActivity.urlArray += CMApi.getChapterInfoApiUrl( ViewMangaActivity.urlArray += CMApi.getChapterInfoApiUrl(
comic.path_word, comic.path_word,
it.uuid it.uuid
@@ -261,22 +265,26 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
line = layoutInflater.inflate(R.layout.line_chapter, that!!.fbl, false) line = layoutInflater.inflate(R.layout.line_chapter, that!!.fbl, false)
line?.lcc?.apply { line?.lcc?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } val index = i
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, index) }
} }
fbl?.addView(line) fbl?.addView(line)
} else { } else {
line = layoutInflater.inflate(R.layout.line_2chapters, that!!.fbl, false) line = layoutInflater.inflate(R.layout.line_2chapters, that!!.fbl, false)
line?.l2cl?.apply { line?.l2cl?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } val index = i
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, index) }
} }
} }
} else line?.l2cr?.apply { } else line?.l2cr?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } val index = i
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, index) }
fbl?.addView(line) fbl?.addView(line)
line = null line = null
} }
i++
} }
} }
endSetLayouts() endSetLayouts()
@@ -292,7 +300,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
val bundle = Bundle() val bundle = Bundle()
bundle.putString("name", name) bundle.putString("name", name)
bundle.putString("path", path) bundle.putString("path", path)
that?.apply { findNavController().navigate(nav, bundle) } that?.apply { Navigate.safeNavigateTo(findNavController(), nav, bundle) }
} }
} }

View File

@@ -12,6 +12,7 @@ import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.fragment_download.* import kotlinx.android.synthetic.main.fragment_download.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.vm.ViewMangaActivity import top.fumiama.copymanga.ui.vm.ViewMangaActivity
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@@ -96,7 +97,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
ComicDlFragment.json = jsonFile.readText() ComicDlFragment.json = jsonFile.readText()
Log.d("MyDF", "root view: $rootView") Log.d("MyDF", "root view: $rootView")
Log.d("MyDF", "action_nav_download_to_nav_group") Log.d("MyDF", "action_nav_download_to_nav_group")
findNavController().navigate(R.id.action_nav_download_to_nav_group, bundle) Navigate.safeNavigateTo(findNavController(), R.id.action_nav_download_to_nav_group, bundle)
} }
private fun callSelf(title: String){ private fun callSelf(title: String){
@@ -105,7 +106,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
Log.d("MyDF", "Call self to $title") Log.d("MyDF", "Call self to $title")
Log.d("MyDF", "root view: $rootView") Log.d("MyDF", "root view: $rootView")
Log.d("MyDF", "action_nav_download_self") Log.d("MyDF", "action_nav_download_self")
findNavController().navigate(R.id.action_nav_download_self, bundle) Navigate.safeNavigateTo(findNavController(), R.id.action_nav_download_self, bundle)
} }
private fun getFloat(oldString: String): Float { private fun getFloat(oldString: String): Float {

View File

@@ -9,6 +9,7 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import top.fumiama.copymanga.template.ui.CardList import top.fumiama.copymanga.template.ui.CardList
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.io.File import java.io.File
@@ -58,7 +59,7 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) { override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) {
v.setOnClickListener { v.setOnClickListener {
if(name==oldDlCardName && path == oldDlCardName) { if(name==oldDlCardName && path == oldDlCardName) {
findNavController().navigate(R.id.action_nav_new_download_to_nav_download) Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_download)
return@setOnClickListener return@setOnClickListener
} }
callDownloadFragment(name) callDownloadFragment(name)
@@ -79,12 +80,13 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
ComicDlFragment.json = File(File(extDir, name), "info.json").readText() ComicDlFragment.json = File(File(extDir, name), "info.json").readText()
Log.d("MyNDF", "root view: $rootView") Log.d("MyNDF", "root view: $rootView")
Log.d("MyNDF", "action_nav_new_download_to_nav_group") Log.d("MyNDF", "action_nav_new_download_to_nav_group")
findNavController().navigate(R.id.action_nav_new_download_to_nav_group, bundle) Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_group, bundle)
} }
private fun onLoadFinish() { private fun onLoadFinish() {
MainActivity.mainWeakReference?.get()?.runOnUiThread { MainActivity.mainWeakReference?.get()?.runOnUiThread {
if(cardList?.exitCardList == false) mypl.visibility = View.GONE if(cardList?.exitCardList != false) return@runOnUiThread
mypl.visibility = View.GONE
} }
} }

View File

@@ -28,6 +28,7 @@ import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@@ -159,7 +160,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
holder.itemView.vpc.setOnClickListener { holder.itemView.vpc.setOnClickListener {
val bundle = Bundle() val bundle = Bundle()
homeHandler.index?.results?.banners?.get(position)?.comic?.path_word?.let { it1 -> bundle.putString("path", it1) } homeHandler.index?.results?.banners?.get(position)?.comic?.path_word?.let { it1 -> bundle.putString("path", it1) }
findNavController().navigate(R.id.action_nav_home_to_nav_book, bundle) Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_book, bundle)
} }
} }
@@ -198,7 +199,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
holder.itemView.lwc.setOnClickListener { holder.itemView.lwc.setOnClickListener {
val bundle = Bundle() val bundle = Bundle()
bundle.putString("path", path_word) bundle.putString("path", path_word)
findNavController().navigate(R.id.action_nav_home_to_nav_book, bundle) Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_book, bundle)
} }
holder.itemView.lwc.layoutParams.height = fhs.width / 4 holder.itemView.lwc.layoutParams.height = fhs.width / 4
} }

View File

@@ -28,6 +28,7 @@ import top.fumiama.copymanga.json.ComicStructure
import top.fumiama.copymanga.json.IndexStructure import top.fumiama.copymanga.json.IndexStructure
import top.fumiama.copymanga.template.http.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.tools.api.UITools
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@@ -143,7 +144,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
comics += rec.comic comics += rec.comic
} }
if(comics.size == 3) allocateLine(homeF?.getString(R.string.manga_rec)?:"", R.drawable.img_master_work, comics) { if(comics.size == 3) allocateLine(homeF?.getString(R.string.manga_rec)?:"", R.drawable.img_master_work, comics) {
homeF?.findNavController()?.navigate(R.id.action_nav_home_to_nav_recommend) homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_recommend)
}
} }
} }
} }
@@ -192,7 +195,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
comics += rec.comic comics += rec.comic
} }
if(comics.size == 9) allocateLine(homeF?.getString(R.string.new_list)?:"", R.drawable.img_latest_pub, comics) { if(comics.size == 9) allocateLine(homeF?.getString(R.string.new_list)?:"", R.drawable.img_latest_pub, comics) {
homeF?.findNavController()?.navigate(R.id.action_nav_home_to_nav_newest) homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_newest)
}
} }
} }
} }
@@ -205,7 +210,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
comics += rec comics += rec
} }
if(comics.size == 6) allocateLine(homeF?.getString(R.string.complete)?:"", R.drawable.img_novel_eye, comics, true) { if(comics.size == 6) allocateLine(homeF?.getString(R.string.complete)?:"", R.drawable.img_novel_eye, comics, true) {
homeF?.findNavController()?.navigate(R.id.action_nav_home_to_nav_finish) homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_finish)
}
} }
} }
} }
@@ -317,7 +324,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
cv.setOnClickListener { cv.setOnClickListener {
val bundle = Bundle() val bundle = Bundle()
bundle.putString("path", pw) bundle.putString("path", pw)
homeF?.findNavController()?.navigate(if(isTopic) R.id.action_nav_home_to_nav_topic else R.id.action_nav_home_to_nav_book, bundle) homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, if(isTopic) R.id.action_nav_home_to_nav_topic else R.id.action_nav_home_to_nav_book, bundle)
}
} }
} }

View File

@@ -19,8 +19,8 @@ class PagesManager(w: WeakReference<ViewMangaActivity>) {
fun toNextPage(){ fun toNextPage(){
toPage(v?.r2l!=true) toPage(v?.r2l!=true)
} }
private fun judgePrevious() = v?.pageNum?:0 > 1 private fun judgePrevious() = (v?.pageNum ?: 0) > 1
private fun judgeNext() = v?.pageNum?:0 < v?.realCount?:0 private fun judgeNext() = (v?.pageNum ?: 0) < (v?.realCount ?: 0)
@ExperimentalStdlibApi @ExperimentalStdlibApi
fun toPage(goNext:Boolean){ fun toPage(goNext:Boolean){
if (v?.clicked == false) { if (v?.clicked == false) {

View File

@@ -88,8 +88,8 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
}.start() }.start()
9 -> loadScrollMode(msg.arg1) 9 -> loadScrollMode(msg.arg1)
10 -> loadScrollMode() 10 -> loadScrollMode()
11 -> loadImgsIntoLine(msg.arg1) 11 -> loadImagesIntoLine(msg.arg1)
12 -> loadImgsIntoLine() 12 -> loadImagesIntoLine()
13 -> { 13 -> {
dl?.hide() dl?.hide()
wv.get()?.restorePN() wv.get()?.restorePN()
@@ -100,7 +100,17 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
Log.d("MyVMH", "Load page from $item") Log.d("MyVMH", "Load page from $item")
} }
15 -> dl?.hide() 15 -> dl?.hide()
//16 -> wv.get()?.prepareItems() 16 -> if (infcShowed) {
hideInfCardFull(); infcShowed = false
}
17 -> if (!infcShowed) {
showInfCardFull(); infcShowed = true
}
18 -> infcShowed = if (infcShowed) {
hideInfCardFull(); false
} else {
showInfCardFull(); true
}
22 -> wv.get()?.idtime?.text = SimpleDateFormat("HH:mm").format(Date()) + week + wv.get()?.toolsBox?.netinfo 22 -> wv.get()?.idtime?.text = SimpleDateFormat("HH:mm").format(Date()) + week + wv.get()?.toolsBox?.netinfo
} }
} }
@@ -163,8 +173,8 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
wv.get()?.initManga() wv.get()?.initManga()
wv.get()?.vprog?.visibility = View.GONE wv.get()?.vprog?.visibility = View.GONE
} }
private fun loadImgsIntoLine(item: Int = (wv.get()?.currentItem?:0), maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20)) /*= Thread*/{ private fun loadImagesIntoLine(item: Int = (wv.get()?.currentItem?:0), maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20)) /*= Thread*/{
Log.d("MyVMH", "Fun: loadImgsIntoLine($item, $maxCount)") Log.d("MyVMH", "Fun: loadImagesIntoLine($item, $maxCount)")
wv.get()?.realCount?.let { count -> wv.get()?.realCount?.let { count ->
if(count > 0){ if(count > 0){
val notFull = item + maxCount > count val notFull = item + maxCount > count
@@ -197,8 +207,18 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
ObjectAnimator.ofFloat(infcard, "translationY", delta, 0F).setDuration(233).start() ObjectAnimator.ofFloat(infcard, "translationY", delta, 0F).setDuration(233).start()
} }
private fun showInfCardFull() {
Log.d("MyVMH", "Read info drawer delta: $delta")
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.0F, 0.8F).setDuration(233).start()
ObjectAnimator.ofFloat(infcard, "translationY", delta, 0F).setDuration(233).start()
}
private fun hideInfCard() { private fun hideInfCard() {
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.8F, 0.3F).setDuration(233).start() ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.8F, 0.3F).setDuration(233).start()
ObjectAnimator.ofFloat(infcard, "translationY", 0F, delta).setDuration(233).start() ObjectAnimator.ofFloat(infcard, "translationY", 0F, delta).setDuration(233).start()
} }
private fun hideInfCardFull() {
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.8F, 0.0F).setDuration(233).start()
ObjectAnimator.ofFloat(infcard, "translationY", 0F, delta).setDuration(233).start()
}
} }

View File

@@ -4,8 +4,13 @@ import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Service import android.app.Service
import android.content.Context import android.content.Context
import android.content.res.Resources
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.media.AudioManager import android.media.AudioManager
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
@@ -13,6 +18,7 @@ import android.util.Log
import android.view.* import android.view.*
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@@ -36,6 +42,7 @@ import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.general.TitleActivityTemplate import top.fumiama.copymanga.template.general.TitleActivityTemplate
import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.Font
import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.thread.TimeThread import top.fumiama.copymanga.tools.thread.TimeThread
import top.fumiama.copymanga.views.ScaleImageView import top.fumiama.copymanga.views.ScaleImageView
@@ -85,6 +92,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
private var volTurnPage = false private var volTurnPage = false
private var am: AudioManager? = null private var am: AudioManager? = null
private var pm: PagesManager? = null private var pm: PagesManager? = null
private var fullyHideInfo = false
val realCount get() = if(cut) indexMap.size else count val realCount get() = if(cut) indexMap.size else count
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@@ -108,6 +116,8 @@ class ViewMangaActivity : TitleActivityTemplate() {
tt.start() tt.start()
volTurnPage = settingsPref?.getBoolean("settings_cat_vm_sw_vol_turn", false)?:false volTurnPage = settingsPref?.getBoolean("settings_cat_vm_sw_vol_turn", false)?:false
am = getSystemService(Service.AUDIO_SERVICE) as AudioManager am = getSystemService(Service.AUDIO_SERVICE) as AudioManager
if (!noCellarAlert) noCellarAlert = settingsPref?.getBoolean("settings_cat_net_sw_use_cellar", false) == true
fullyHideInfo = settingsPref?.getBoolean("settings_cat_vm_sw_hide_info", false) == true
Log.d("MyVM", "Now ZipFile is $zipFile") Log.d("MyVM", "Now ZipFile is $zipFile")
try { try {
@@ -148,7 +158,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
} }
private fun alertCellar() { private fun alertCellar() {
toolsBox.buildInfo("注意", "要使用使用流量观看吗?", "确定", "不再提醒", "取消", {handler.startLoad()}, { noCellarAlert = true; handler.startLoad()}, {finish()}) toolsBox.buildInfo(
"注意", "要使用使用流量观看吗?", "确定", "本次阅读不再提醒", "取消",
{ handler.startLoad() }, { noCellarAlert = true; handler.startLoad() }, { finish() }
)
} }
fun restorePN(){ fun restorePN(){
@@ -354,11 +367,26 @@ class ViewMangaActivity : TitleActivityTemplate() {
}.start() }.start()
} }
private fun getLoadingBitmap(position: Int): Bitmap {
val loading = Bitmap.createBitmap(1024, 256, Bitmap.Config.ARGB_8888)
val canvas = Canvas(loading)
val paint = Paint()
paint.color = ContextCompat.getColor(applicationContext, R.color.design_default_color_surface)
paint.textSize = 100.0f
paint.typeface = Font.nisiTypeFace!!
val text = "${position+1}"
val x = (canvas.width - paint.measureText(text)) / 2
val y = (canvas.height + paint.descent() - paint.ascent()) / 2
canvas.drawText(text, x, y, paint)
return loading
}
fun loadImgOn(imgView: ScaleImageView, position: Int, isLast: Int = 0){ fun loadImgOn(imgView: ScaleImageView, position: Int, isLast: Int = 0){
Log.d("MyVM", "Load img: $position") Log.d("MyVM", "Load img: $position")
val index2load = if(cut) Math.abs(indexMap[position]) -1 else position val index2load = if(cut) Math.abs(indexMap[position]) -1 else position
val useCut = cut && isCut[index2load] val useCut = cut && isCut[index2load]
val isLeft = cut && indexMap[position] > 0 val isLeft = cut && indexMap[position] > 0
loadImg(imgView, getLoadingBitmap(position), isLast, useCut, isLeft)
if (zipFile?.exists() == true) getImgBitmap(index2load)?.let { if (zipFile?.exists() == true) getImgBitmap(index2load)?.let {
loadImg(imgView, it, isLast, useCut, isLeft) loadImg(imgView, it, isLast, useCut, isLeft)
} }
@@ -428,6 +456,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
infoDrawerDelta = position.toFloat() infoDrawerDelta = position.toFloat()
infcard.translationY = infoDrawerDelta infcard.translationY = infoDrawerDelta
Log.d("MyVM", "Set info drawer delta to $infoDrawerDelta") Log.d("MyVM", "Set info drawer delta to $infoDrawerDelta")
handler.sendEmptyMessage(if (fullyHideInfo) 16 else 1)
} }
@ExperimentalStdlibApi @ExperimentalStdlibApi
@@ -538,7 +567,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
}) })
isearch.setImageResource(R.drawable.ic_author) isearch.setImageResource(R.drawable.ic_author)
isearch.setOnClickListener { isearch.setOnClickListener {
handler.sendEmptyMessage(3) handler.sendEmptyMessage(if (fullyHideInfo) 18 else 3) // trigger info card
} }
} }
@@ -641,12 +670,16 @@ class ViewMangaActivity : TitleActivityTemplate() {
val thisOneI = holder.itemView.onei val thisOneI = holder.itemView.onei
Glide.with(this@ViewMangaActivity) Glide.with(this@ViewMangaActivity)
.asBitmap() .asBitmap()
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders) .load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders))
).into(object : SimpleTarget<Bitmap>() { .placeholder(BitmapDrawable(resources, getLoadingBitmap(pos)))
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
thisOneI.setImageBitmap(cutBitmap(resource, isLeft)) thisOneI.setImageBitmap(cutBitmap(resource, isLeft))
} }) } })
} else Glide.with(this@ViewMangaActivity).load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)).into(holder.itemView.onei) } else Glide.with(this@ViewMangaActivity)
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders))
.placeholder(BitmapDrawable(resources, getLoadingBitmap(pos)))
.into(holder.itemView.onei)
} }
} }
@@ -680,7 +713,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
infseek.visibility = View.GONE infseek.visibility = View.GONE
isearch.visibility = View.GONE isearch.visibility = View.GONE
}, 300) }, 300)
handler.sendEmptyMessage(1) handler.sendEmptyMessage(if (fullyHideInfo) 16 else 1)
} }
companion object { companion object {

BIN
app/src/main/res/font/nisi.ttf Executable file

Binary file not shown.

View File

@@ -60,6 +60,7 @@
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string> <string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string>
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=3</string> <string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=3</string>
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=3</string> <string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=3</string>
<string name="shelfOperateApiUrl">https://%1$s/api/v3/member/collect/comic</string>
<string name="imgProxyApiUrl">https://copymanga.azurewebsites.net/api/img?code=%1$s&amp;url=%2$s</string> <string name="imgProxyApiUrl">https://copymanga.azurewebsites.net/api/img?code=%1$s&amp;url=%2$s</string>
<string name="imgProxyApiPrefix">https://hi77-overseas.mangafuna.xyz/</string> <string name="imgProxyApiPrefix">https://hi77-overseas.mangafuna.xyz/</string>
@@ -108,6 +109,8 @@
<string name="caption">标签</string> <string name="caption">标签</string>
<string name="settings_cat_net">网络</string> <string name="settings_cat_net">网络</string>
<string name="settings_cat_net_sw_use_cellar">总是使用流量观看</string>
<string name="settings_cat_net_sm_use_cellar">打开后不再在开始阅读时提示</string>
<string name="settings_cat_net_sw_use_foreign">使用海外线路</string> <string name="settings_cat_net_sw_use_foreign">使用海外线路</string>
<string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化也可能不变, 请酌情选择使用</string> <string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化也可能不变, 请酌情选择使用</string>
<string name="settings_cat_net_et_title_api_url">请求API网址</string> <string name="settings_cat_net_et_title_api_url">请求API网址</string>
@@ -120,6 +123,8 @@
<string name="settings_cat_net_et_summary_img_proxy">为避免滥用代理密钥需加群559748702获得且随时可能会刷新</string> <string name="settings_cat_net_et_summary_img_proxy">为避免滥用代理密钥需加群559748702获得且随时可能会刷新</string>
<string name="settings_cat_vm">漫画浏览</string> <string name="settings_cat_vm">漫画浏览</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> <string name="settings_cat_vm_sw_vol_turn">音量键翻页</string>
<string name="settings_cat_vm_sm_vol_turn">使用音量上下键前后翻页</string> <string name="settings_cat_vm_sm_vol_turn">使用音量上下键前后翻页</string>
<string name="settings_cat_vm_sb_vertical_max">竖向翻页一次加载页数</string> <string name="settings_cat_vm_sb_vertical_max">竖向翻页一次加载页数</string>

View File

@@ -4,6 +4,12 @@
<PreferenceCategory <PreferenceCategory
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:title="@string/settings_cat_net"> app:title="@string/settings_cat_net">
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_net_sw_use_cellar"
app:selectable="true"
app:summary="@string/settings_cat_net_sm_use_cellar"
app:title="@string/settings_cat_net_sw_use_cellar" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="settings_cat_net_sw_use_foreign" app:key="settings_cat_net_sw_use_foreign"
@@ -49,6 +55,12 @@
<PreferenceCategory <PreferenceCategory
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:title="@string/settings_cat_vm"> app:title="@string/settings_cat_vm">
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_vm_sw_hide_info"
app:selectable="true"
app:summary="@string/settings_cat_vm_sm_hide_info"
app:title="@string/settings_cat_vm_sw_hide_info" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="settings_cat_vm_sw_vol_turn" app:key="settings_cat_vm_sw_vol_turn"