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 0000000..734a70e Binary files /dev/null and b/app/src/main/res/drawable-nodpi/img_defmask.webp differ diff --git a/app/src/main/res/layout/fragment_newdownload.xml b/app/src/main/res/layout/fragment_newdownload.xml new file mode 100644 index 0000000..fcfa627 --- /dev/null +++ b/app/src/main/res/layout/fragment_newdownload.xml @@ -0,0 +1,10 @@ + + + + + \ 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 @@ 用户名为空 密码为空 连接失败 + + 前往旧版下载