mirror of
https://github.com/fumiama/copymanga.git
synced 2026-06-12 03:20:23 +08:00
v2.0.beta22
新增 1. 浏览漫画的加载提示 2. 设置->网络->总是使用流量观看 3. 加入书架(但是还不能删除) 修复 1. 进入排行时快速切换tab闪退 2. 详情页点击章节非第一组时错位到第一组(fix #33) 3. 快速多次点击某些按钮后闪退
This commit is contained in:
@@ -8,8 +8,8 @@ android {
|
||||
applicationId 'top.fumiama.copymanga'
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 33
|
||||
versionCode 33
|
||||
versionName '2.0.beta21'
|
||||
versionCode 34
|
||||
versionName '2.0.beta22'
|
||||
resConfigs 'zh', 'zh-rCN'
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -40,6 +40,8 @@ import com.yalantis.ucrop.UCrop
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import kotlinx.android.synthetic.main.app_bar_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.copymanga.tools.api.UITools
|
||||
import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler
|
||||
@@ -361,5 +363,16 @@ class MainActivity : AppCompatActivity() {
|
||||
var mainWeakReference: WeakReference<MainActivity>? = null
|
||||
var ime: InputMethodManager? = null
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,12 +9,13 @@ import top.fumiama.copymanga.ui.vm.ViewMangaActivity
|
||||
|
||||
object Reader {
|
||||
fun viewMangaAt(name: String, pos: Int, from_first_page: Boolean = false) {
|
||||
Log.d("MyR", "viewMangaAt name $name, pos $pos")
|
||||
mainWeakReference?.get()?.apply {
|
||||
getPreferences(Context.MODE_PRIVATE)?.edit {
|
||||
putInt(name, pos)
|
||||
apply()
|
||||
Log.d("MyR", "记录 $name 阅读到第 ${pos+1} 话")
|
||||
}?: Log.d("MyR", "无法获得main pref")
|
||||
}?: Log.d("MyR", "无法获得 main pref")
|
||||
ViewMangaActivity.dlhandler = null
|
||||
ViewMangaActivity.position = pos
|
||||
ViewMangaActivity.comicName = name
|
||||
|
||||
44
app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt
Normal file
44
app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -36,27 +36,31 @@ class CardList(
|
||||
exitCardList = false
|
||||
}
|
||||
|
||||
private fun manageRow(){
|
||||
private fun manageRow() {
|
||||
if(!exitCardList && count++ % cardPerRow == 0) inflateRow()
|
||||
Log.d("MyCL", "index: $index, cardPR: $cardPerRow")
|
||||
}
|
||||
|
||||
private fun inflateRow(){
|
||||
that?.layoutInflater?.inflate(R.layout.line_horizonal_empty, that.mydll, false)?.let {
|
||||
if(exitCardList) return
|
||||
it.layoutParams.height = cardHeight + 16
|
||||
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?){
|
||||
val relativeIndex = index++ % 20
|
||||
val relativeIndex = index % 20
|
||||
if(rows[relativeIndex] == null) rows[relativeIndex] = v
|
||||
else {
|
||||
val victim = rows[relativeIndex]
|
||||
mainWeakReference?.get()?.runOnUiThread {
|
||||
if(!exitCardList) that?.apply {
|
||||
if(exitCardList) return@runOnUiThread
|
||||
that?.apply {
|
||||
mydll?.removeView(victim)
|
||||
mys?.scrollY = that.mys?.scrollY?.minus(cardHeight + 16)?:0
|
||||
}
|
||||
@@ -67,8 +71,9 @@ class CardList(
|
||||
|
||||
@ExperimentalStdlibApi
|
||||
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) that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let {
|
||||
if(exitCardList) return
|
||||
manageRow()
|
||||
that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let {
|
||||
val card = it.cic
|
||||
card.name = name
|
||||
card.append = append
|
||||
@@ -79,7 +84,8 @@ class CardList(
|
||||
card.pageNumber = pn
|
||||
card.isFinish = isFinish
|
||||
mainWeakReference?.get()?.runOnUiThread{
|
||||
if(!exitCardList) addCard(it)
|
||||
if(exitCardList) return@runOnUiThread
|
||||
addCard(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -87,21 +93,22 @@ class CardList(
|
||||
@ExperimentalStdlibApi
|
||||
fun addCard(cardFrame: View) {
|
||||
val card = cardFrame.cic
|
||||
if (card.index < 0) return
|
||||
val name = card.name + (card.append?:"")
|
||||
val head = card.headImageUrl
|
||||
val file = File(that?.context?.getExternalFilesDir(""), card.name)
|
||||
if(!exitCardList) cardFrame.let {
|
||||
if(exitCardList) return
|
||||
cardFrame.let {
|
||||
it.tic.text = name
|
||||
if(!file.exists()){
|
||||
if(head != null) {
|
||||
that?.context?.let { context ->
|
||||
if(!exitCardList)
|
||||
Glide.with(context).load(
|
||||
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
|
||||
).into(it.imic)
|
||||
Glide.with(context).load(
|
||||
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
|
||||
).into(it.imic)
|
||||
}
|
||||
} else {
|
||||
if(!exitCardList) it.imic.setImageResource(R.drawable.img_defmask)
|
||||
it.imic.setImageResource(R.drawable.img_defmask)
|
||||
}
|
||||
} else {
|
||||
val img = File(file, "head.jpg")
|
||||
@@ -110,8 +117,8 @@ class CardList(
|
||||
if(card.isFinish) it.sgnic.visibility = View.VISIBLE
|
||||
initClickListeners?.prepareListeners(card, card.name, card.path, card.chapterUUID, card.pageNumber)
|
||||
rows[card.index % 20]?.ltbtn?.addView(it)
|
||||
it.layoutParams.height = cardHeight
|
||||
it.layoutParams.width = cardWidth
|
||||
it.layoutParams?.height = cardHeight
|
||||
it.layoutParams?.width = cardWidth
|
||||
}
|
||||
}
|
||||
interface InitClickListeners{
|
||||
|
||||
@@ -14,6 +14,7 @@ import top.fumiama.copymanga.json.ShelfStructure
|
||||
import top.fumiama.copymanga.json.TypeBookListStructure
|
||||
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
|
||||
import top.fumiama.copymanga.template.http.AutoDownloadThread
|
||||
import top.fumiama.copymanga.tools.api.Navigate
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
@ExperimentalStdlibApi
|
||||
@@ -101,7 +102,7 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
|
||||
v.setOnClickListener {
|
||||
val bundle = Bundle()
|
||||
bundle.putString("path", path)
|
||||
findNavController().navigate(navId, bundle)
|
||||
Navigate.safeNavigateTo(findNavController(), navId, bundle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
17
app/src/main/java/top/fumiama/copymanga/tools/api/Font.kt
Normal file
17
app/src/main/java/top/fumiama/copymanga/tools/api/Font.kt
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package top.fumiama.copymanga.tools.http
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import androidx.preference.PreferenceManager
|
||||
import okhttp3.RequestBody
|
||||
import top.fumiama.copymanga.MainActivity
|
||||
import top.fumiama.dmzj.copymanga.R
|
||||
import java.net.HttpURLConnection
|
||||
@@ -129,4 +130,28 @@ object DownloadTools {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,14 @@ package top.fumiama.copymanga.ui.book
|
||||
import android.content.Context.MODE_PRIVATE
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import kotlinx.android.synthetic.main.line_booktandb.*
|
||||
import top.fumiama.copymanga.MainActivity
|
||||
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
|
||||
import top.fumiama.copymanga.manga.Reader
|
||||
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
|
||||
import top.fumiama.copymanga.tools.api.Navigate
|
||||
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
|
||||
import top.fumiama.dmzj.copymanga.R
|
||||
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(){
|
||||
val bundle = Bundle()
|
||||
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("groupNames", bookHandler!!.keys)
|
||||
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 {
|
||||
|
||||
@@ -34,6 +34,7 @@ import top.fumiama.copymanga.template.http.AutoDownloadHandler
|
||||
import top.fumiama.copymanga.template.http.AutoDownloadThread
|
||||
import top.fumiama.copymanga.tools.api.CMApi
|
||||
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.Companion.json
|
||||
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
|
||||
complete = true
|
||||
that?.setStartRead()
|
||||
that?.setAddToShelf()
|
||||
Log.d("MyBH", "Set complete: true")
|
||||
}
|
||||
|
||||
@@ -224,6 +226,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
|
||||
}
|
||||
|
||||
private fun setThemes(){
|
||||
if (exit) return
|
||||
that?.apply {
|
||||
book?.results?.comic?.apply {
|
||||
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
|
||||
ViewMangaActivity.fileArray = arrayOf()
|
||||
ViewMangaActivity.urlArray = arrayOf()
|
||||
var i = 0
|
||||
vols?.forEachIndexed { iv, v ->
|
||||
if(exit) return@runOnUiThread
|
||||
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))
|
||||
var line: View? = null
|
||||
val last = v.results.list.size - 1
|
||||
v.results.list.onEachIndexed { i, it ->
|
||||
v.results.list.forEach {
|
||||
ViewMangaActivity.urlArray += CMApi.getChapterInfoApiUrl(
|
||||
comic.path_word,
|
||||
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?.lcc?.apply {
|
||||
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)
|
||||
} else {
|
||||
line = layoutInflater.inflate(R.layout.line_2chapters, that!!.fbl, false)
|
||||
line?.l2cl?.apply {
|
||||
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 {
|
||||
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)
|
||||
line = null
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
||||
endSetLayouts()
|
||||
@@ -292,7 +300,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
|
||||
val bundle = Bundle()
|
||||
bundle.putString("name", name)
|
||||
bundle.putString("path", path)
|
||||
that?.apply { findNavController().navigate(nav, bundle) }
|
||||
that?.apply { Navigate.safeNavigateTo(findNavController(), nav, bundle) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import kotlinx.android.synthetic.main.app_bar_main.*
|
||||
import kotlinx.android.synthetic.main.fragment_download.*
|
||||
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
|
||||
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.vm.ViewMangaActivity
|
||||
import top.fumiama.dmzj.copymanga.R
|
||||
@@ -96,7 +97,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
|
||||
ComicDlFragment.json = jsonFile.readText()
|
||||
Log.d("MyDF", "root view: $rootView")
|
||||
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){
|
||||
@@ -105,7 +106,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
|
||||
Log.d("MyDF", "Call self to $title")
|
||||
Log.d("MyDF", "root view: $rootView")
|
||||
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 {
|
||||
|
||||
@@ -9,6 +9,7 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
|
||||
import top.fumiama.copymanga.MainActivity
|
||||
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
|
||||
import top.fumiama.copymanga.template.ui.CardList
|
||||
import top.fumiama.copymanga.tools.api.Navigate
|
||||
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
|
||||
import top.fumiama.dmzj.copymanga.R
|
||||
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?) {
|
||||
v.setOnClickListener {
|
||||
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
|
||||
}
|
||||
callDownloadFragment(name)
|
||||
@@ -79,12 +80,13 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
|
||||
ComicDlFragment.json = File(File(extDir, name), "info.json").readText()
|
||||
Log.d("MyNDF", "root view: $rootView")
|
||||
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() {
|
||||
MainActivity.mainWeakReference?.get()?.runOnUiThread {
|
||||
if(cardList?.exitCardList == false) mypl.visibility = View.GONE
|
||||
if(cardList?.exitCardList != false) return@runOnUiThread
|
||||
mypl.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ import top.fumiama.copymanga.json.BookListStructure
|
||||
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
|
||||
import top.fumiama.copymanga.template.http.AutoDownloadThread
|
||||
import top.fumiama.copymanga.tools.api.CMApi
|
||||
import top.fumiama.copymanga.tools.api.Navigate
|
||||
import top.fumiama.dmzj.copymanga.R
|
||||
import java.lang.Thread.sleep
|
||||
import java.lang.ref.WeakReference
|
||||
@@ -159,7 +160,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
|
||||
holder.itemView.vpc.setOnClickListener {
|
||||
val bundle = Bundle()
|
||||
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 {
|
||||
val bundle = Bundle()
|
||||
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
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import top.fumiama.copymanga.json.ComicStructure
|
||||
import top.fumiama.copymanga.json.IndexStructure
|
||||
import top.fumiama.copymanga.template.http.AutoDownloadHandler
|
||||
import top.fumiama.copymanga.tools.api.CMApi
|
||||
import top.fumiama.copymanga.tools.api.Navigate
|
||||
import top.fumiama.copymanga.tools.api.UITools
|
||||
import java.lang.Thread.sleep
|
||||
import java.lang.ref.WeakReference
|
||||
@@ -143,7 +144,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
||||
comics += rec.comic
|
||||
}
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
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 {
|
||||
val bundle = Bundle()
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ class PagesManager(w: WeakReference<ViewMangaActivity>) {
|
||||
fun toNextPage(){
|
||||
toPage(v?.r2l!=true)
|
||||
}
|
||||
private fun judgePrevious() = v?.pageNum?:0 > 1
|
||||
private fun judgeNext() = v?.pageNum?:0 < v?.realCount?:0
|
||||
private fun judgePrevious() = (v?.pageNum ?: 0) > 1
|
||||
private fun judgeNext() = (v?.pageNum ?: 0) < (v?.realCount ?: 0)
|
||||
@ExperimentalStdlibApi
|
||||
fun toPage(goNext:Boolean){
|
||||
if (v?.clicked == false) {
|
||||
|
||||
@@ -88,8 +88,8 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
|
||||
}.start()
|
||||
9 -> loadScrollMode(msg.arg1)
|
||||
10 -> loadScrollMode()
|
||||
11 -> loadImgsIntoLine(msg.arg1)
|
||||
12 -> loadImgsIntoLine()
|
||||
11 -> loadImagesIntoLine(msg.arg1)
|
||||
12 -> loadImagesIntoLine()
|
||||
13 -> {
|
||||
dl?.hide()
|
||||
wv.get()?.restorePN()
|
||||
@@ -100,7 +100,17 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
|
||||
Log.d("MyVMH", "Load page from $item")
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -163,8 +173,8 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
|
||||
wv.get()?.initManga()
|
||||
wv.get()?.vprog?.visibility = View.GONE
|
||||
}
|
||||
private fun loadImgsIntoLine(item: Int = (wv.get()?.currentItem?:0), maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20)) /*= Thread*/{
|
||||
Log.d("MyVMH", "Fun: loadImgsIntoLine($item, $maxCount)")
|
||||
private fun loadImagesIntoLine(item: Int = (wv.get()?.currentItem?:0), maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20)) /*= Thread*/{
|
||||
Log.d("MyVMH", "Fun: loadImagesIntoLine($item, $maxCount)")
|
||||
wv.get()?.realCount?.let { count ->
|
||||
if(count > 0){
|
||||
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()
|
||||
}
|
||||
|
||||
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() {
|
||||
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.8F, 0.3F).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()
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,13 @@ import android.animation.ObjectAnimator
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.graphics.Bitmap
|
||||
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.os.Bundle
|
||||
import android.os.Handler
|
||||
@@ -13,6 +18,7 @@ import android.util.Log
|
||||
import android.view.*
|
||||
import android.widget.SeekBar
|
||||
import android.widget.Toast
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.edit
|
||||
import androidx.preference.PreferenceManager
|
||||
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.http.AutoDownloadThread
|
||||
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.thread.TimeThread
|
||||
import top.fumiama.copymanga.views.ScaleImageView
|
||||
@@ -85,6 +92,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
||||
private var volTurnPage = false
|
||||
private var am: AudioManager? = null
|
||||
private var pm: PagesManager? = null
|
||||
private var fullyHideInfo = false
|
||||
val realCount get() = if(cut) indexMap.size else count
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
@@ -108,6 +116,8 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
||||
tt.start()
|
||||
volTurnPage = settingsPref?.getBoolean("settings_cat_vm_sw_vol_turn", false)?:false
|
||||
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")
|
||||
try {
|
||||
@@ -148,7 +158,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
||||
}
|
||||
|
||||
private fun alertCellar() {
|
||||
toolsBox.buildInfo("注意", "要使用使用流量观看吗?", "确定", "不再提醒", "取消", {handler.startLoad()}, { noCellarAlert = true; handler.startLoad()}, {finish()})
|
||||
toolsBox.buildInfo(
|
||||
"注意", "要使用使用流量观看吗?", "确定", "本次阅读不再提醒", "取消",
|
||||
{ handler.startLoad() }, { noCellarAlert = true; handler.startLoad() }, { finish() }
|
||||
)
|
||||
}
|
||||
|
||||
fun restorePN(){
|
||||
@@ -354,11 +367,26 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
||||
}.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){
|
||||
Log.d("MyVM", "Load img: $position")
|
||||
val index2load = if(cut) Math.abs(indexMap[position]) -1 else position
|
||||
val useCut = cut && isCut[index2load]
|
||||
val isLeft = cut && indexMap[position] > 0
|
||||
loadImg(imgView, getLoadingBitmap(position), isLast, useCut, isLeft)
|
||||
if (zipFile?.exists() == true) getImgBitmap(index2load)?.let {
|
||||
loadImg(imgView, it, isLast, useCut, isLeft)
|
||||
}
|
||||
@@ -428,6 +456,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
||||
infoDrawerDelta = position.toFloat()
|
||||
infcard.translationY = infoDrawerDelta
|
||||
Log.d("MyVM", "Set info drawer delta to $infoDrawerDelta")
|
||||
handler.sendEmptyMessage(if (fullyHideInfo) 16 else 1)
|
||||
}
|
||||
|
||||
@ExperimentalStdlibApi
|
||||
@@ -538,7 +567,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
||||
})
|
||||
isearch.setImageResource(R.drawable.ic_author)
|
||||
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
|
||||
Glide.with(this@ViewMangaActivity)
|
||||
.asBitmap()
|
||||
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)
|
||||
).into(object : SimpleTarget<Bitmap>() {
|
||||
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders))
|
||||
.placeholder(BitmapDrawable(resources, getLoadingBitmap(pos)))
|
||||
.into(object : SimpleTarget<Bitmap>() {
|
||||
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
|
||||
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
|
||||
isearch.visibility = View.GONE
|
||||
}, 300)
|
||||
handler.sendEmptyMessage(1)
|
||||
handler.sendEmptyMessage(if (fullyHideInfo) 16 else 1)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
BIN
app/src/main/res/font/nisi.ttf
Executable file
BIN
app/src/main/res/font/nisi.ttf
Executable file
Binary file not shown.
@@ -60,6 +60,7 @@
|
||||
<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&offset=%2$d&platform=3</string>
|
||||
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&offset=%2$d&free_type=1&ordering=%3$s&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&url=%2$s</string>
|
||||
<string name="imgProxyApiPrefix">https://hi77-overseas.mangafuna.xyz/</string>
|
||||
@@ -108,6 +109,8 @@
|
||||
<string name="caption">标签</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_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化(也可能不变), 请酌情选择使用</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_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_sm_vol_turn">使用音量上下键前后翻页</string>
|
||||
<string name="settings_cat_vm_sb_vertical_max">竖向翻页一次加载页数</string>
|
||||
|
||||
@@ -4,6 +4,12 @@
|
||||
<PreferenceCategory
|
||||
app:iconSpaceReserved="false"
|
||||
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
|
||||
app:iconSpaceReserved="false"
|
||||
app:key="settings_cat_net_sw_use_foreign"
|
||||
@@ -49,6 +55,12 @@
|
||||
<PreferenceCategory
|
||||
app:iconSpaceReserved="false"
|
||||
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
|
||||
app:iconSpaceReserved="false"
|
||||
app:key="settings_cat_vm_sw_vol_turn"
|
||||
|
||||
Reference in New Issue
Block a user