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 0000000..91f1562
Binary files /dev/null and b/app/src/main/res/font/nisi.ttf differ
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 351c306..b944664 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -60,6 +60,7 @@
https://%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 @@
+
+