From 5d9db7a657535d48848aaf720bca002f8e25551d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?=
<41315874+fumiama@users.noreply.github.com>
Date: Wed, 25 Oct 2023 00:46:06 +0900
Subject: [PATCH] =?UTF-8?q?v2.0.beta22=20=E6=96=B0=E5=A2=9E=201.=20?=
=?UTF-8?q?=E6=B5=8F=E8=A7=88=E6=BC=AB=E7=94=BB=E7=9A=84=E5=8A=A0=E8=BD=BD?=
=?UTF-8?q?=E6=8F=90=E7=A4=BA=202.=20=E8=AE=BE=E7=BD=AE->=E7=BD=91?=
=?UTF-8?q?=E7=BB=9C->=E6=80=BB=E6=98=AF=E4=BD=BF=E7=94=A8=E6=B5=81?=
=?UTF-8?q?=E9=87=8F=E8=A7=82=E7=9C=8B=203.=20=E5=8A=A0=E5=85=A5=E4=B9=A6?=
=?UTF-8?q?=E6=9E=B6(=E4=BD=86=E6=98=AF=E8=BF=98=E4=B8=8D=E8=83=BD?=
=?UTF-8?q?=E5=88=A0=E9=99=A4)=20=E4=BF=AE=E5=A4=8D=201.=20=E8=BF=9B?=
=?UTF-8?q?=E5=85=A5=E6=8E=92=E8=A1=8C=E6=97=B6=E5=BF=AB=E9=80=9F=E5=88=87?=
=?UTF-8?q?=E6=8D=A2tab=E9=97=AA=E9=80=80=202.=20=E8=AF=A6=E6=83=85?=
=?UTF-8?q?=E9=A1=B5=E7=82=B9=E5=87=BB=E7=AB=A0=E8=8A=82=E9=9D=9E=E7=AC=AC?=
=?UTF-8?q?=E4=B8=80=E7=BB=84=E6=97=B6=E9=94=99=E4=BD=8D=E5=88=B0=E7=AC=AC?=
=?UTF-8?q?=E4=B8=80=E7=BB=84(fix=20#33)=203.=20=E5=BF=AB=E9=80=9F?=
=?UTF-8?q?=E5=A4=9A=E6=AC=A1=E7=82=B9=E5=87=BB=E6=9F=90=E4=BA=9B=E6=8C=89?=
=?UTF-8?q?=E9=92=AE=E5=90=8E=E9=97=AA=E9=80=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/dictionaries/fumiama.xml | 1 +
app/build.gradle | 4 +-
.../top/fumiama/copymanga/MainActivity.kt | 13 +++++
.../top/fumiama/copymanga/manga/Reader.kt | 3 +-
.../java/top/fumiama/copymanga/manga/Shelf.kt | 44 +++++++++++++++++
.../fumiama/copymanga/template/ui/CardList.kt | 39 ++++++++-------
.../copymanga/template/ui/InfoCardLoader.kt | 3 +-
.../top/fumiama/copymanga/tools/api/Font.kt | 17 +++++++
.../fumiama/copymanga/tools/api/Navigate.kt | 12 +++++
.../copymanga/tools/http/DownloadTools.kt | 25 ++++++++++
.../fumiama/copymanga/ui/book/BookFragment.kt | 21 +++++++-
.../fumiama/copymanga/ui/book/BookHandler.kt | 18 +++++--
.../copymanga/ui/download/DownloadFragment.kt | 5 +-
.../ui/download/NewDownloadFragment.kt | 8 ++--
.../fumiama/copymanga/ui/home/HomeFragment.kt | 5 +-
.../fumiama/copymanga/ui/home/HomeHandler.kt | 17 +++++--
.../fumiama/copymanga/ui/vm/PagesManager.kt | 4 +-
.../top/fumiama/copymanga/ui/vm/VMHandler.kt | 30 ++++++++++--
.../copymanga/ui/vm/ViewMangaActivity.kt | 45 +++++++++++++++---
app/src/main/res/font/nisi.ttf | Bin 0 -> 24436 bytes
app/src/main/res/values/strings.xml | 5 ++
app/src/main/res/xml/pref_setting.xml | 12 +++++
22 files changed, 281 insertions(+), 50 deletions(-)
create mode 100644 app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt
create mode 100644 app/src/main/java/top/fumiama/copymanga/tools/api/Font.kt
create mode 100644 app/src/main/java/top/fumiama/copymanga/tools/api/Navigate.kt
create mode 100755 app/src/main/res/font/nisi.ttf
diff --git a/.idea/dictionaries/fumiama.xml b/.idea/dictionaries/fumiama.xml
index e4278ec..58e02df 100644
--- a/.idea/dictionaries/fumiama.xml
+++ b/.idea/dictionaries/fumiama.xml
@@ -2,6 +2,7 @@
lowpan
+ nisi
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 06b561d..16efb5f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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"
diff --git a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt
index 2b8884e..49ece94 100644
--- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt
@@ -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? = 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
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt b/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt
index 5e49d4d..c49f504 100644
--- a/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt
+++ b/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt
@@ -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
diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt
new file mode 100644
index 0000000..f74e91a
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt
@@ -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
+ }
+}
diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt
index 25f17f5..ec128f1 100644
--- a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt
+++ b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt
@@ -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{
diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt
index 7d4ad8d..57e2f9b 100644
--- a/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt
+++ b/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt
@@ -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)
}
}
}
diff --git a/app/src/main/java/top/fumiama/copymanga/tools/api/Font.kt b/app/src/main/java/top/fumiama/copymanga/tools/api/Font.kt
new file mode 100644
index 0000000..968c2ae
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/tools/api/Font.kt
@@ -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
+ }
+}
diff --git a/app/src/main/java/top/fumiama/copymanga/tools/api/Navigate.kt b/app/src/main/java/top/fumiama/copymanga/tools/api/Navigate.kt
new file mode 100644
index 0000000..d6103f9
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/tools/api/Navigate.kt
@@ -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)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt
index 24dafc8..bea5f72 100644
--- a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt
+++ b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt
@@ -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
+ }
+ }
}
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt
index 773ca63..b0ae84e 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt
@@ -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 {
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt
index 2257a58..3cdd195 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt
@@ -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, 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, 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, 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, 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, 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, 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) }
}
}
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt
index 55235f4..0257a8b 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt
@@ -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 {
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt
index 464c2ff..4801f26 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt
@@ -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
}
}
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt
index de0a868..3763483 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt
@@ -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
}
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt
index 222ca49..a1fe939 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt
@@ -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) : 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) : 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) : 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) : 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)
+ }
}
}
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/PagesManager.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/PagesManager.kt
index 6e142c9..081d31b 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/vm/PagesManager.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/PagesManager.kt
@@ -19,8 +19,8 @@ class PagesManager(w: WeakReference) {
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) {
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt
index f6f7377..514ea24 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt
@@ -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()
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt
index 7b26cbb..cd3274f 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt
@@ -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() {
+ .load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders))
+ .placeholder(BitmapDrawable(resources, getLoadingBitmap(pos)))
+ .into(object : SimpleTarget() {
override fun onResourceReady(resource: Bitmap, transition: Transition?) {
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 {
diff --git a/app/src/main/res/font/nisi.ttf b/app/src/main/res/font/nisi.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..91f156205b3c3eabf9979c6268e88ae16c0fbe2b
GIT binary patch
literal 24436
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://%1$s/api/v3/member/info?platform=3
https://%1$s/api/v3/member/browse/comics?limit=21&offset=%2$d&platform=3
https://%1$s/api/v3/member/collect/comics?limit=21&offset=%2$d&free_type=1&ordering=%3$s&platform=3
+ https://%1$s/api/v3/member/collect/comic
https://copymanga.azurewebsites.net/api/img?code=%1$s&url=%2$s
https://hi77-overseas.mangafuna.xyz/
@@ -108,6 +109,8 @@
标签
网络
+ 总是使用流量观看
+ 打开后不再在开始阅读时提示
使用海外线路
不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化(也可能不变), 请酌情选择使用
请求API网址
@@ -120,6 +123,8 @@
为避免滥用,代理密钥需加群(559748702)获得,且随时可能会刷新
漫画浏览
+ 隐藏底部时间栏
+ 打开后不再在底部显示时间和网络状态
音量键翻页
使用音量上下键前后翻页
竖向翻页一次加载页数
diff --git a/app/src/main/res/xml/pref_setting.xml b/app/src/main/res/xml/pref_setting.xml
index afc26e7..bd14b6a 100644
--- a/app/src/main/res/xml/pref_setting.xml
+++ b/app/src/main/res/xml/pref_setting.xml
@@ -4,6 +4,12 @@
+
+