From c4ae6228809c861e0a0539714787f65e7ca5467a 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: Tue, 5 Sep 2023 22:01:56 +0800 Subject: [PATCH] =?UTF-8?q?v2.0.beta20=20=E6=96=B0=E5=A2=9E=201.=20?= =?UTF-8?q?=E5=8D=A1=E7=89=87=E5=BC=8F=E6=BC=AB=E7=94=BB=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=A1=B5=20=E4=BF=AE=E5=A4=8D=201.=20=E6=B7=B1=E8=89=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E7=8A=B6=E6=80=81=E6=A0=8F=E4=B8=8D?= =?UTF-8?q?=E5=8F=98=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../top/fumiama/copymanga/MainActivity.kt | 2 +- .../fumiama/copymanga/template/ui/CardList.kt | 16 +-- .../copymanga/template/ui/InfoCardLoader.kt | 8 +- .../copymanga/template/ui/StatusCardFlow.kt | 7 -- .../fumiama/copymanga/ui/book/BookHandler.kt | 19 +++- .../ui/cardflow/history/HistoryFragment.kt | 7 -- .../ui/cardflow/newest/NewestFragment.kt | 7 -- .../ui/cardflow/rank/RankFragment.kt | 7 -- .../ui/cardflow/recommend/RecFragment.kt | 7 -- .../ui/cardflow/sort/SortFragment.kt | 7 -- .../ui/cardflow/topic/TopicFragment.kt | 7 -- .../copymanga/ui/download/DownloadFragment.kt | 59 +--------- .../ui/download/NewDownloadFragment.kt | 101 ++++++++++++++++++ .../main/res/drawable-nodpi/img_defmask.webp | Bin 0 -> 14012 bytes .../main/res/layout/fragment_newdownload.xml | 10 ++ .../main/res/menu/activity_main_drawer.xml | 2 +- .../main/res/navigation/mobile_navigation.xml | 21 ++++ app/src/main/res/values-night/colors.xml | 15 +++ app/src/main/res/values/strings.xml | 3 + 20 files changed, 192 insertions(+), 117 deletions(-) create mode 100644 app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt create mode 100644 app/src/main/res/drawable-nodpi/img_defmask.webp create mode 100644 app/src/main/res/layout/fragment_newdownload.xml create mode 100644 app/src/main/res/values-night/colors.xml diff --git a/app/build.gradle b/app/build.gradle index c2b3090..bd976a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 33 - versionCode 31 - versionName '2.0.beta19' + versionCode 32 + versionName '2.0.beta20' 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 744c3a3..da9dfad 100644 --- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt @@ -74,7 +74,7 @@ class MainActivity : AppCompatActivity() { R.id.nav_rank, R.id.nav_sub, R.id.nav_history, - R.id.nav_download, + R.id.nav_new_download, R.id.nav_settings ), drawer_layout ) 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 c570497..25f17f5 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 @@ -93,13 +93,17 @@ class CardList( if(!exitCardList) cardFrame.let { it.tic.text = name if(!file.exists()){ - that?.context?.let { context -> - if(!exitCardList && head != null) - Glide.with(context).load( - GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders) - ).into(it.imic) + if(head != null) { + that?.context?.let { context -> + if(!exitCardList) + 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) } - }else { + } else { val img = File(file, "head.jpg") if(img.exists()) it.imic.setImageURI(Uri.fromFile(img)) } 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 8b87823..831c739 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 @@ -6,6 +6,8 @@ import android.view.View import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.google.gson.Gson +import kotlinx.android.synthetic.main.line_lazybooklines.* +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.json.BookListStructure import top.fumiama.copymanga.json.HistoryBookListStructure import top.fumiama.copymanga.json.TypeBookListStructure @@ -98,7 +100,11 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT open fun setListeners(){} - open fun onLoadFinish(){} + open fun onLoadFinish(){ + MainActivity.mainWeakReference?.get()?.runOnUiThread { + if(ad?.exit == false) mypl.visibility = View.GONE + } + } override fun onDestroy() { super.onDestroy() diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt index e37194d..64a506b 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt @@ -27,13 +27,6 @@ open class StatusCardFlow(private val api: Int, nav: Int) : InfoCardLoader(R.lay setHot(line_finish_pop) } - override fun onLoadFinish() { - super.onLoadFinish() - mainWeakReference?.get()?.runOnUiThread { - mypl.visibility = View.GONE - } - } - open fun setUpdate(that: View) { that.apply { apt.setText(R.string.menu_update_time) 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 6a7f563..2257a58 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 @@ -1,5 +1,6 @@ package top.fumiama.copymanga.ui.book +import android.graphics.Bitmap import android.os.Bundle import android.os.Looper import android.os.Message @@ -8,6 +9,7 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast +import androidx.core.graphics.drawable.toBitmap import androidx.navigation.fragment.findNavController import com.bumptech.glide.Glide import com.bumptech.glide.load.model.GlideUrl @@ -21,6 +23,7 @@ import kotlinx.android.synthetic.main.line_bookinfo.* import kotlinx.android.synthetic.main.line_bookinfo_text.* import kotlinx.android.synthetic.main.line_caption.view.* import kotlinx.android.synthetic.main.line_chapter.view.* +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.json.BookInfoStructure import top.fumiama.copymanga.json.ChapterStructure @@ -51,7 +54,7 @@ class BookHandler(private val th: WeakReference, private val path: return re } var book: BookInfoStructure? = null - var complete = false + private var complete = false var ads = emptyArray() var gpws = arrayOf() var keys = arrayOf() @@ -363,6 +366,20 @@ class BookHandler(private val th: WeakReference, private val path: json = Gson().toJson(volumes) File(mangaFolder, "info.json").writeText(json!!) File(mangaFolder, "grps.json").writeText(Gson().toJson(keys)) + that?.apply { + File(mangaFolder, "head.jpg").let { head -> + val fo = head.outputStream() + try { + imic.drawable.toBitmap().compress(Bitmap.CompressFormat.JPEG, 90, fo) + } catch (e: Exception) { + e.printStackTrace() + mainWeakReference?.get()?.apply { + Toast.makeText(this, R.string.download_cover_error, Toast.LENGTH_SHORT).show() + } + } + fo.close() + } + } } } vols = volumes diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt index f881601..9fc6d7c 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt @@ -11,11 +11,4 @@ import top.fumiama.dmzj.copymanga.R class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) { override fun getApiUrl() = getString(R.string.historyApiUrl).format(CMApi.myHostApiUrl, page * 21) - - override fun onLoadFinish() { - super.onLoadFinish() - MainActivity.mainWeakReference?.get()?.runOnUiThread { - if(ad?.exit == false) mypl.visibility = View.GONE - } - } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt index 6618f12..f87a4e4 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt @@ -11,11 +11,4 @@ import top.fumiama.dmzj.copymanga.R class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) { override fun getApiUrl() = getString(R.string.newestApiUrl).format(CMApi.myHostApiUrl, page * 21) - - override fun onLoadFinish() { - super.onLoadFinish() - mainWeakReference?.get()?.runOnUiThread { - if(ad?.exit == false) mypl.visibility = View.GONE - } - } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt index abec779..0753487 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt @@ -36,13 +36,6 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank }) } - override fun onLoadFinish() { - super.onLoadFinish() - mainWeakReference?.get()?.runOnUiThread { - if(ad?.exit == false) mypl.visibility = View.GONE - } - } - private fun setSortValue(value: Int) { sortValue = value Thread{ diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/recommend/RecFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/recommend/RecFragment.kt index c468215..6e11498 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/recommend/RecFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/recommend/RecFragment.kt @@ -11,11 +11,4 @@ import top.fumiama.dmzj.copymanga.R class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) { override fun getApiUrl() = getString(R.string.recommendApiUrl).format(CMApi.myHostApiUrl, page * 21) - - override fun onLoadFinish() { - super.onLoadFinish() - mainWeakReference?.get()?.runOnUiThread { - if(ad?.exit == false) mypl.visibility = View.GONE - } - } } \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt index 3e18492..9aaa411 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt @@ -46,13 +46,6 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort }.start() } - override fun onLoadFinish() { - super.onLoadFinish() - mainWeakReference?.get()?.runOnUiThread { - if(ad?.exit == false) mypl.visibility = View.GONE - } - } - private fun setUpdate(){ if(ad?.exit == true) return line_sort_time.apt.setText(R.string.menu_update_time) diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt index 7d371fe..7a0c68c 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt @@ -40,11 +40,4 @@ class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_to } }.start() } - - override fun onLoadFinish() { - super.onLoadFinish() - mainWeakReference?.get()?.runOnUiThread { - if(ad?.exit == false) mypl.visibility = View.GONE - } - } } \ No newline at end of file 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 27386f9..55235f4 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 @@ -17,10 +17,8 @@ import top.fumiama.copymanga.ui.vm.ViewMangaActivity import top.fumiama.dmzj.copymanga.R import java.io.File import java.util.regex.Pattern -import java.util.zip.ZipInputStream class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { - private var nullZipDirStr = emptyArray() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if(isFirstInflate) { @@ -69,7 +67,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { AlertDialog.Builder(context) .setIcon(R.drawable.ic_launcher_foreground).setMessage("删除?") .setTitle("提示").setPositiveButton(android.R.string.ok) { _, _ -> - if (chosenFile.exists()) rmrf(chosenFile) + if (chosenFile.exists()) recursiveRemove(chosenFile) scanFile(cd) }.setNegativeButton(android.R.string.cancel) { _, _ -> } .show() @@ -81,10 +79,10 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { } - fun rmrf(f: File) { + private fun recursiveRemove(f: File) { if (f.isDirectory) f.listFiles()?.let { for (i in it) - if (i.isDirectory) rmrf(i) + if (i.isDirectory) recursiveRemove(i) else i.delete() } f.delete() @@ -110,57 +108,6 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { findNavController().navigate(R.id.action_nav_download_self, bundle) } - private fun findNullWebpZipFileInDir(f: File){ - if (f.isDirectory) f.listFiles()?.let { - for (i in it) - if (i.isDirectory) findNullWebpZipFileInDir(i) - else if(!checkZip(i)) nullZipDirStr += i.path.substringAfterLast(context?.getExternalFilesDir("").toString()) - } - } - - private fun checkZip(f: File): Boolean{ - return try { - val exist = f.exists() - if (!exist) true - else { - var re = true - val zip = ZipInputStream(f.inputStream().buffered()) - var entry = zip.nextEntry - while (entry != null) { - if (!entry.isDirectory){ - if(zip.read() == -1 && entry.size == 0L){ - re = false - break - } - } - entry = zip.nextEntry - } - zip.closeEntry() - zip.close() - re - } - } catch (e: Exception) { - Toast.makeText(context, "读取${f.name}错误!", Toast.LENGTH_SHORT).show() - true - } - } - - private fun showErrorZip(msg: CharSequence) = AlertDialog.Builder(context) - .setIcon(R.drawable.ic_launcher_foreground) - .setTitle("找到以下错误文件,是否删除?") - .setMessage(msg) - .setPositiveButton(android.R.string.ok){_, _ -> deleteErrorZip()} - .setNegativeButton(android.R.string.cancel){_, _ ->} - .show() - - private fun deleteErrorZip(){ - val exf = context?.getExternalFilesDir("") - for(i in nullZipDirStr){ - val f = File(exf, i) - if(f.exists()) f.delete() - } - } - private fun getFloat(oldString: String): Float { val newString = StringBuffer() var matcher = Pattern.compile("\\d+.+\\d+").matcher(oldString) 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 new file mode 100644 index 0000000..cea3846 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt @@ -0,0 +1,101 @@ +package top.fumiama.copymanga.ui.download + +import android.os.Bundle +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +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.ui.comicdl.ComicDlFragment +import top.fumiama.dmzj.copymanga.R +import java.io.File +import java.lang.ref.WeakReference + +@OptIn(ExperimentalStdlibApi::class) +class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownload) { + private var sortedBookList: List? = null + private val oldDlCardName = MainActivity.mainWeakReference?.get()?.getString(R.string.old_download_card_name)!! + private val extDir = MainActivity.mainWeakReference?.get()?.getExternalFilesDir("") + init { + pageHandler = object : PageHandler { + override fun addPage() { + if(!isEnd) { + if(sortedBookList == null) { + Log.d("MyNDF", "Sorting books...") + sortedBookList = extDir?.listFiles()?.sorted() + } + Log.d("MyNDF", "Start drawing cards") + cardList.addCard(oldDlCardName, path = oldDlCardName) + sortedBookList?.let { + for(i in it.listIterator(page)) { + if(cardList.exitCardList) return + page++ // page is actually count + val chosenJson = File(i, "info.bin") + val newJson = File(i, "info.json") + val bookSize = (sizeOf(i)/1048576).toInt() + when{ + chosenJson.exists() -> continue // unsupported old folder + newJson.exists() -> { + if(cardList.exitCardList) return + cardList.addCard(i.name, " ${bookSize}MB") + } + } + } + if(page >= it.size) { + isEnd = true + } + } + } + onLoadFinish() + } + + override fun initCardList(weakReference: WeakReference) { + cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow) + cardList.initClickListeners = object : CardList.InitClickListeners { + 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) + return@setOnClickListener + } + callDownloadFragment(name) + } + } + } + } + + override fun setListeners() {} + } + } + + private fun callDownloadFragment(name: String){ + val bundle = Bundle() + Log.d("MyNDF", "Call dl and is new.") + bundle.putBoolean("loadJson", true) + bundle.putString("name", name) + 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) + } + + private fun onLoadFinish() { + MainActivity.mainWeakReference?.get()?.runOnUiThread { + if(!cardList.exitCardList) mypl.visibility = View.GONE + } + } + + companion object { + fun sizeOf(f: File):Long{ + var size = 0L + if (f.isDirectory) f.listFiles()?.apply { + for (i in this) + size += if (i.isDirectory) sizeOf(i) else i.length() + } + return size + } + } +} diff --git a/app/src/main/res/drawable-nodpi/img_defmask.webp b/app/src/main/res/drawable-nodpi/img_defmask.webp new file mode 100644 index 0000000000000000000000000000000000000000..734a70e0460a8bdf614dc5ba270d7c8a780df271 GIT binary patch literal 14012 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 + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index aefd57a..13f1d4f 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -35,7 +35,7 @@ android:id="@+id/menugroup_dl" android:checkableBehavior="single"> diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index a627d47..e690922 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -110,6 +110,27 @@ app:popExitAnim="@anim/slide_in_right_exit"/> + + + + + + + #2ca9e1 + #000000 + #00a3af + #c1e4e9 + #f2faff + #00beff + #81caf8 + #c7eaff + #BFEA88 + #ffffff + #F6837A + #E1E1E1 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 957d95f..8bc034a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,6 +34,7 @@ N/A 获取图书信息失败 网络错误 + 保存封面出错 https://%1$s/api/v3/h5/homeIndex?platform=3 https://%1$s @@ -124,4 +125,6 @@ 用户名为空 密码为空 连接失败 + + 前往旧版下载