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