diff --git a/app/build.gradle b/app/build.gradle index 76cba508..4844741d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -99,7 +99,7 @@ dependencies { implementation ("xyz.quaver:libpupil:1.3") { exclude group: 'org.jetbrains.kotlinx', module: 'kotlinx-serialization-core-jvm' } - implementation "xyz.quaver:documentfilex:0.2.13" + implementation "xyz.quaver:documentfilex:0.2.14-alpha2" testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test:rules:1.3.0' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 435a6fc1..a4e83a1d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -21,7 +21,6 @@ #-renamesourcefileattribute SourceFile -dontobfuscate --dontoptimize -keep public class * implements com.bumptech.glide.module.GlideModule -keep class * extends com.bumptech.glide.module.AppGlideModule { diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index 7c53b38d..f1389ee9 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -162,7 +162,7 @@ class Pupil : Application() { lockscreenVisibility = Notification.VISIBILITY_SECRET }) - manager.createNotificationChannel(NotificationChannel("import", getString(R.string.channel_update), NotificationManager.IMPORTANCE_HIGH).apply { + manager.createNotificationChannel(NotificationChannel("import", getString(R.string.channel_update), NotificationManager.IMPORTANCE_LOW).apply { description = getString(R.string.channel_update_description) enableLights(false) enableVibration(false) diff --git a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt index af2f498e..28346b76 100644 --- a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt +++ b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt @@ -240,7 +240,7 @@ class DownloadService : Service() { } } - fun cancel() { + fun cancel(startId: Int? = null) { client.dispatcher().queuedCalls().filter { it.request().tag() is Tag }.forEach { @@ -255,6 +255,8 @@ class DownloadService : Service() { progress.clear() notification.clear() notificationManager.cancelAll() + + startId?.let { stopSelf(it) } } fun cancel(galleryID: Int, startId: Int? = null) { @@ -370,10 +372,10 @@ class DownloadService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.getStringExtra(KEY_COMMAND)) { COMMAND_DOWNLOAD -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) - download(it, intent.getBooleanExtra(KEY_PRIORITY, false), startId) + download(it, intent.getBooleanExtra(KEY_PRIORITY, false), startId = startId) } - COMMAND_CANCEL -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) cancel(it, startId) else cancel() } - COMMAND_DELETE -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) delete(it, startId) } + COMMAND_CANCEL -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) cancel(it, startId = startId) else cancel(startId = startId) } + COMMAND_DELETE -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) delete(it, startId = startId) } } return START_NOT_STICKY diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt index 1aeabffb..b6286b76 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt @@ -39,6 +39,7 @@ import xyz.quaver.pupil.R import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.byteToString import xyz.quaver.pupil.util.downloader.DownloadManager +import xyz.quaver.pupil.util.migrate import xyz.quaver.pupil.util.normalizeID import java.io.File @@ -119,7 +120,11 @@ class DownloadLocationDialogFragment : DialogFragment() { builder .setTitle(R.string.settings_download_folder) .setView(build()) - .setPositiveButton(requireContext().getText(android.R.string.ok)) { _, _ -> } + .setPositiveButton(requireContext().getText(android.R.string.ok)) { _, _ -> + DownloadManager.getInstance(requireContext()).migrate() + } + + isCancelable = false return builder.create() } diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index ccce5c39..10e8653f 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -18,6 +18,7 @@ package xyz.quaver.pupil.util +import android.annotation.SuppressLint import android.app.DownloadManager import android.app.PendingIntent import android.content.BroadcastReceiver @@ -25,6 +26,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.util.Base64 +import android.util.Log import android.webkit.URLUtil import androidx.appcompat.app.AlertDialog import androidx.core.app.NotificationCompat @@ -44,8 +46,8 @@ import ru.noties.markwon.Markwon import xyz.quaver.hitomi.GalleryBlock import xyz.quaver.hitomi.Reader import xyz.quaver.io.FileX -import xyz.quaver.io.util.FilenameFilterX import xyz.quaver.io.util.getChild +import xyz.quaver.io.util.* import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.R import xyz.quaver.pupil.client @@ -226,6 +228,7 @@ private val receiver = object: BroadcastReceiver() { } } } +@SuppressLint("RestrictedApi") fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { val notificationManager = NotificationManagerCompat.from(this) val action = NotificationCompat.Action.Builder(0, getText(android.R.string.cancel), @@ -242,7 +245,10 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { job?.cancel() job = CoroutineScope(Dispatchers.IO).launch { - val folders = downloadFolder.listFiles() ?: return@launch + val folders = downloadFolder.listFiles { folder -> + (folder as? FileX)?.isDirectory == true && !downloadFolderMap.values.contains(folder.name) + } + if (folders.isNullOrEmpty()) return@launch folders.forEachIndexed { index, folder -> notification .setContentText(getString(R.string.import_old_galleries_notification_text, index, folders.size)) @@ -252,17 +258,15 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { kotlin.runCatching { val folder = (folder as? FileX) ?: return@runCatching - val metadata = Json.parseToJsonElement(folder.getChild(".metadata").readText()).jsonObject + val metadata = folder.getChild(".metadata").readText()?.let { Json.parseToJsonElement(it).jsonObject } ?: return@runCatching val galleryBlock: GalleryBlock? = - metadata["galleryBlock"]?.let { Json.decodeFromJsonElement(it) } + metadata["galleryBlock"]?.let { Json.decodeFromJsonElement(it) } val reader: Reader? = - metadata["reader"]?.let { Json.decodeFromJsonElement(it) } + metadata["reader"]?.let { Json.decodeFromJsonElement(it) } val galleryID = galleryBlock?.id ?: reader?.galleryInfo?.id ?: folder.name.toIntOrNull() ?: return@runCatching - if (downloadFolderMap.containsKey(galleryID)) return@runCatching - metadata["thumbnail"]?.jsonPrimitive?.contentOrNull.let { thumbnail -> val file = folder.getChild(".thumbnail").also { if (!it.exists()) @@ -275,20 +279,21 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { downloadFolderMap[galleryID] = folder.name val cache = Cache.getInstance(this@migrate, galleryID) - cache.metadata.galleryBlock = galleryBlock - cache.metadata.reader = reader val list: MutableList = MutableList(cache.getReader()!!.galleryInfo.files.size) { null } - folder.listFiles(object: FilenameFilterX() { - override fun accept(dir: File?, name: String?): Boolean = - dir?.nameWithoutExtension?.toIntOrNull() != null - })?.forEach { + folder.listFiles { dir -> + dir?.nameWithoutExtension?.toIntOrNull() != null + }?.forEach { list[it.nameWithoutExtension.toInt()] = it.name } - cache.metadata.imageList = list + cache.setMetadata { + it.galleryBlock = galleryBlock + it.reader = reader + it.imageList = list + } } } @@ -296,6 +301,7 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { .setContentText(getText(R.string.import_old_galleries_notification_done)) .setProgress(0, 0, false) .setOngoing(false) + .mActions.clear() notificationManager.notify(R.id.notification_id_import, notification.build()) } } \ No newline at end of file