diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 0c0c338..16b6f5f 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,7 +3,20 @@ - + + + + + + + + + + + + + + diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1f59d0c..26c147f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 34 - versionCode 60 - versionName '2.3.2' + versionCode 61 + versionName '2.3.3' resourceConfigurations += ['zh', 'zh-rCN'] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -71,10 +71,11 @@ android { } dependencies { + //noinspection GradleDependency implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.11.0' + implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7' implementation 'androidx.navigation:navigation-ui-ktx:2.7.7' @@ -86,11 +87,12 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.16.0' //noinspection KaptUsageInsteadOfKsp kapt 'com.github.bumptech.glide:compiler:4.16.0' - implementation 'com.google.code.gson:gson:2.10.1' + implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.github.vovaksenov99:OverscrollableScrollView:1.0' implementation 'com.liaoinstan.springview:library:1.7.0' implementation 'com.github.zawadz88.materialpopupmenu:material-popup-menu:4.0.1' implementation 'com.lapism:search:2.4.1@aar' + //noinspection GradleDependency implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0' implementation 'com.airbnb.android:lottie:6.4.0' implementation 'net.java.dev.jna:jna:5.14.0@aar' diff --git a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt index 7ea4248..65c662c 100644 --- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt @@ -55,6 +55,7 @@ import top.fumiama.copymanga.tools.ui.UITools import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler import top.fumiama.copymanga.ui.cardflow.rank.RankFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment +import top.fumiama.copymanga.ui.download.DownloadFragment import top.fumiama.copymanga.ui.download.NewDownloadFragment import top.fumiama.copymanga.update.Update import top.fumiama.copymanga.user.Member @@ -197,6 +198,17 @@ class MainActivity : AppCompatActivity() { RankFragment.wr?.get()?.showSexInfo(toolsBox) true } + R.id.action_del -> { + if (DownloadFragment.wd != null) { + val dl = AlertDialog.Builder(this) + dl.setMessage(R.string.delele_all_empty_manga) + dl.setPositiveButton(android.R.string.ok) { _, _ -> + DownloadFragment.wd?.get()?.removeAllEmpty() + } + dl.show() + } + true + } else -> super.onOptionsItemSelected(item) } } @@ -261,36 +273,49 @@ class MainActivity : AppCompatActivity() { menuMain?.findItem(R.id.action_info)?.isVisible = true menuMain?.findItem(R.id.action_download)?.isVisible = false menuMain?.findItem(R.id.action_sort)?.isVisible = false + menuMain?.findItem(R.id.action_del)?.isVisible = false } R.id.nav_book -> { Log.d("MyMA", "enter book") menuMain?.findItem(R.id.action_info)?.isVisible = false menuMain?.findItem(R.id.action_download)?.isVisible = true menuMain?.findItem(R.id.action_sort)?.isVisible = false + menuMain?.findItem(R.id.action_del)?.isVisible = false } R.id.nav_group -> { Log.d("MyMA", "enter group") menuMain?.findItem(R.id.action_info)?.isVisible = false menuMain?.findItem(R.id.action_download)?.isVisible = false menuMain?.findItem(R.id.action_sort)?.isVisible = true + menuMain?.findItem(R.id.action_del)?.isVisible = false } R.id.nav_new_download -> { Log.d("MyMA", "enter new_download") menuMain?.findItem(R.id.action_info)?.isVisible = false menuMain?.findItem(R.id.action_download)?.isVisible = false menuMain?.findItem(R.id.action_sort)?.isVisible = true + menuMain?.findItem(R.id.action_del)?.isVisible = false } R.id.nav_rank -> { Log.d("MyMA", "enter rank") menuMain?.findItem(R.id.action_info)?.isVisible = false menuMain?.findItem(R.id.action_download)?.isVisible = false menuMain?.findItem(R.id.action_sort)?.isVisible = true + menuMain?.findItem(R.id.action_del)?.isVisible = false + } + R.id.nav_download -> { + Log.d("MyMA", "enter old download") + menuMain?.findItem(R.id.action_info)?.isVisible = false + menuMain?.findItem(R.id.action_download)?.isVisible = false + menuMain?.findItem(R.id.action_sort)?.isVisible = false + menuMain?.findItem(R.id.action_del)?.isVisible = true } else -> { Log.d("MyMA", "enter others") menuMain?.findItem(R.id.action_info)?.isVisible = false menuMain?.findItem(R.id.action_download)?.isVisible = false menuMain?.findItem(R.id.action_sort)?.isVisible = false + menuMain?.findItem(R.id.action_del)?.isVisible = false } } } diff --git a/app/src/main/java/top/fumiama/copymanga/manga/MangaDlTools.kt b/app/src/main/java/top/fumiama/copymanga/manga/MangaDlTools.kt index 60db74b..a6ad384 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/MangaDlTools.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/MangaDlTools.kt @@ -91,4 +91,44 @@ class MangaDlTools { fun handleMessage(index: Int, isSuccess: Boolean, message: String) fun handleMessage(index: Int, downloaded: Int, total: Int, isSuccess: Boolean, message: String) } + + companion object { + fun getNonEmptyMangaList(sortedBookList: List?, setProgress: ((Int) -> Unit)? = null): List? { + val cache = hashMapOf() + val size = sortedBookList?.size?:0 + if(size <= 0) return null + return sortedBookList?.filter { + setProgress?.let { it(100*cache.size/size) } + it.absolutePath.let { path -> + if (cache.containsKey(path)) cache[path]!! + else { + val b = (it.listFiles { f -> + return@listFiles f.isDirectory && f.listFiles()?.isNotEmpty() ?: false + }?.size ?: 0) > 0 + cache[path] = b + b + } + } + } + } + + fun getEmptyMangaList(sortedBookList: List?, setProgress: ((Int) -> Unit)? = null): List? { + val cache = hashMapOf() + val size = sortedBookList?.size?:0 + if(size <= 0) return null + return sortedBookList?.filter { + setProgress?.let { it(100*cache.size/size) } + it.absolutePath.let { path -> + if (cache.containsKey(path)) cache[path]!! + else { + val b = (it.listFiles { f -> + return@listFiles f.isDirectory && f.listFiles()?.isNotEmpty() ?: false + }?.size ?: 0) <= 0 + cache[path] = b + b + } + } + } + } + } } 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 b907a7a..3d35477 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 @@ -13,27 +13,44 @@ import kotlinx.android.synthetic.main.fragment_download.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import top.fumiama.copymanga.MainActivity +import top.fumiama.copymanga.manga.MangaDlTools import top.fumiama.copymanga.manga.Reader import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.tools.file.FileUtils import top.fumiama.copymanga.tools.ui.Navigate import top.fumiama.dmzj.copymanga.R import java.io.File +import java.lang.ref.WeakReference import java.util.regex.Pattern class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + wd = WeakReference(this) + } + + override fun onDestroy() { + super.onDestroy() + wd = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if(isFirstInflate) { arguments?.getString("title")?.let { activity?.toolbar?.title = it } - lifecycleScope.launch { - scanFile(arguments?.getString("file")?.let { File(it) }?:context?.getExternalFilesDir("")?:run { - findNavController().popBackStack() - return@launch - }) - } + initScan() + } + } + + private fun initScan() { + lifecycleScope.launch { + scanFile(arguments?.getString("file")?.let { File(it) }?:context?.getExternalFilesDir("")?:run { + findNavController().popBackStack() + return@launch + }) } } @@ -128,4 +145,21 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { //Log.d("MyDLL2", newString.toString().toFloat().toString()) return if(newString.isEmpty()) 0f else newString.toString().toFloat() } + + fun removeAllEmpty() { + MainActivity.mainWeakReference?.get()?.getExternalFilesDir("")?.listFiles()?.toList().let { + var removed = false + MangaDlTools.getEmptyMangaList(it)?.forEach { f -> + if (f.exists()) { + FileUtils.recursiveRemove(f) + removed = true + } + } + if (removed) initScan() + } + } + + companion object { + var wd: WeakReference? = null + } } \ No newline at end of file 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 276d319..fd76764 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 @@ -13,6 +13,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference +import top.fumiama.copymanga.manga.MangaDlTools import top.fumiama.copymanga.manga.Reader import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate import top.fumiama.copymanga.template.ui.CardList @@ -72,28 +73,12 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl sortedBookList = extDir?.listFiles()?.toList() var size = sortedBookList?.size?:0 if (size > 0) { - if (isReverse) { - Log.d("MyNDF", "reversed...") - sortedBookList = sortedBookList?.asReversed() - } - setProgress(40) if (!showAll) { - val cache = hashMapOf() - sortedBookList = sortedBookList?.filter { - setProgress(40+20*cache.size/size) - it.absolutePath.let { path -> - if (cache.containsKey(path)) cache[path]!! - else { - val b = (it.listFiles { f -> - return@listFiles f.isDirectory && f.listFiles()?.isNotEmpty() ?: false - }?.size ?: 0) > 0 - cache[path] = b - b - } - } + sortedBookList = MangaDlTools.getNonEmptyMangaList(sortedBookList) { + setProgress(40+20*it/100) } } - setProgress(60) + setProgress(40) size = sortedBookList?.size?:0 val cache = hashMapOf() sortedBookList = sortedBookList?.sortedBy { @@ -107,6 +92,11 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl } } } + setProgress(60) + if (isReverse) { + Log.d("MyNDF", "reversed...") + sortedBookList = sortedBookList?.asReversed() + } setProgress(80) } isContentChanged = false diff --git a/app/src/main/res/drawable-anydpi/ic_hot.xml b/app/src/main/res/drawable-anydpi/ic_hot.xml index a46da1b..07f4d9d 100644 --- a/app/src/main/res/drawable-anydpi/ic_hot.xml +++ b/app/src/main/res/drawable-anydpi/ic_hot.xml @@ -1,10 +1,12 @@ + android:pathData="M791 191a32 32 0 0 1 45 0 457 457 0 0 1 135 324 457 457 0 0 1-135 324 32 32 0 1 1-45-45 393 393 0 0 0 116-279 393 393 0 0 0-116-279 32 32 0 0 1 0-45m-603 0a32 32 0 0 1 45 45 393 393 0 0 0-116 279 393 393 0 0 0 116 279 32 32 0 0 1-45 45A457 457 0 0 1 53 515a457 457 0 0 1 135-324m143 95a32 32 0 0 1 0 45 255 255 0 0 0-75 181 255 255 0 0 0 75 181 32 32 0 1 1-45 46 319 319 0 0 1-94-227 319 319 0 0 1 94-226 32 32 0 0 1 45 0m407 0a319 319 0 0 1 94 226 319 319 0 0 1-94 226 32 32 0 0 1-45-45 255 255 0 0 0 75-181 255 255 0 0 0-75-181 32 32 0 1 1 45-45zm-171 98c70 0 116 57 116 131q-1 86-140 181a53 53 0 0 1-62 0q-139-95-140-181c0-74 46-131 116-131q31 0 55 18a87 87 0 0 1 55-18zm0 64c-9 0-15 3-28 15l-6 5a32 32 0 0 1-42 0l-6-5c-13-12-19-15-28-15-31 0-52 26-52 67q-1 46 107 124 108-78 107-124c0-41-21-67-52-67" + tools:ignore="VectorPath" /> \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_menu_del.xml b/app/src/main/res/drawable-anydpi/ic_menu_del.xml new file mode 100644 index 0000000..da2cd30 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_menu_del.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index 4311e0b..13d84df 100644 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -1,6 +1,5 @@ - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cbaeee0..ed4c0af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ 关于 下载 整理 + 删除 主页 分类 @@ -33,6 +34,7 @@ 选取图片失败 裁剪图片失败 下载更新失败 + 删除所有空漫画? 登录 注销