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 @@ + +