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 @@
选取图片失败
裁剪图片失败
下载更新失败
+ 删除所有空漫画?
登录
注销