Migration bug fix

This commit is contained in:
tom5079
2020-09-03 15:49:04 +09:00
parent 29665be34d
commit 705925a050
6 changed files with 34 additions and 22 deletions

View File

@@ -99,7 +99,7 @@ dependencies {
implementation ("xyz.quaver:libpupil:1.3") { implementation ("xyz.quaver:libpupil:1.3") {
exclude group: 'org.jetbrains.kotlinx', module: 'kotlinx-serialization-core-jvm' 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' testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test:rules:1.3.0' androidTestImplementation 'androidx.test:rules:1.3.0'

View File

@@ -21,7 +21,6 @@
#-renamesourcefileattribute SourceFile #-renamesourcefileattribute SourceFile
-dontobfuscate -dontobfuscate
-dontoptimize
-keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule { -keep class * extends com.bumptech.glide.module.AppGlideModule {

View File

@@ -162,7 +162,7 @@ class Pupil : Application() {
lockscreenVisibility = Notification.VISIBILITY_SECRET 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) description = getString(R.string.channel_update_description)
enableLights(false) enableLights(false)
enableVibration(false) enableVibration(false)

View File

@@ -240,7 +240,7 @@ class DownloadService : Service() {
} }
} }
fun cancel() { fun cancel(startId: Int? = null) {
client.dispatcher().queuedCalls().filter { client.dispatcher().queuedCalls().filter {
it.request().tag() is Tag it.request().tag() is Tag
}.forEach { }.forEach {
@@ -255,6 +255,8 @@ class DownloadService : Service() {
progress.clear() progress.clear()
notification.clear() notification.clear()
notificationManager.cancelAll() notificationManager.cancelAll()
startId?.let { stopSelf(it) }
} }
fun cancel(galleryID: Int, startId: Int? = null) { fun cancel(galleryID: Int, startId: Int? = null) {
@@ -370,10 +372,10 @@ class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
when (intent?.getStringExtra(KEY_COMMAND)) { when (intent?.getStringExtra(KEY_COMMAND)) {
COMMAND_DOWNLOAD -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) 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_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) } COMMAND_DELETE -> intent.getIntExtra(KEY_ID, -1).let { if (it > 0) delete(it, startId = startId) }
} }
return START_NOT_STICKY return START_NOT_STICKY

View File

@@ -39,6 +39,7 @@ import xyz.quaver.pupil.R
import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.Preferences
import xyz.quaver.pupil.util.byteToString import xyz.quaver.pupil.util.byteToString
import xyz.quaver.pupil.util.downloader.DownloadManager import xyz.quaver.pupil.util.downloader.DownloadManager
import xyz.quaver.pupil.util.migrate
import xyz.quaver.pupil.util.normalizeID import xyz.quaver.pupil.util.normalizeID
import java.io.File import java.io.File
@@ -119,7 +120,11 @@ class DownloadLocationDialogFragment : DialogFragment() {
builder builder
.setTitle(R.string.settings_download_folder) .setTitle(R.string.settings_download_folder)
.setView(build()) .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() return builder.create()
} }

View File

@@ -18,6 +18,7 @@
package xyz.quaver.pupil.util package xyz.quaver.pupil.util
import android.annotation.SuppressLint
import android.app.DownloadManager import android.app.DownloadManager
import android.app.PendingIntent import android.app.PendingIntent
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
@@ -25,6 +26,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.util.Base64 import android.util.Base64
import android.util.Log
import android.webkit.URLUtil import android.webkit.URLUtil
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
@@ -44,8 +46,8 @@ import ru.noties.markwon.Markwon
import xyz.quaver.hitomi.GalleryBlock import xyz.quaver.hitomi.GalleryBlock
import xyz.quaver.hitomi.Reader import xyz.quaver.hitomi.Reader
import xyz.quaver.io.FileX import xyz.quaver.io.FileX
import xyz.quaver.io.util.FilenameFilterX
import xyz.quaver.io.util.getChild import xyz.quaver.io.util.getChild
import xyz.quaver.io.util.*
import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.BuildConfig
import xyz.quaver.pupil.R import xyz.quaver.pupil.R
import xyz.quaver.pupil.client import xyz.quaver.pupil.client
@@ -226,6 +228,7 @@ private val receiver = object: BroadcastReceiver() {
} }
} }
} }
@SuppressLint("RestrictedApi")
fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() {
val notificationManager = NotificationManagerCompat.from(this) val notificationManager = NotificationManagerCompat.from(this)
val action = NotificationCompat.Action.Builder(0, getText(android.R.string.cancel), 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?.cancel()
job = CoroutineScope(Dispatchers.IO).launch { 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 -> folders.forEachIndexed { index, folder ->
notification notification
.setContentText(getString(R.string.import_old_galleries_notification_text, index, folders.size)) .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 { kotlin.runCatching {
val folder = (folder as? FileX) ?: return@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? = val galleryBlock: GalleryBlock? =
metadata["galleryBlock"]?.let { Json.decodeFromJsonElement(it) } metadata["galleryBlock"]?.let { Json.decodeFromJsonElement<GalleryBlock>(it) }
val reader: Reader? = val reader: Reader? =
metadata["reader"]?.let { Json.decodeFromJsonElement(it) } metadata["reader"]?.let { Json.decodeFromJsonElement<Reader>(it) }
val galleryID = galleryBlock?.id ?: reader?.galleryInfo?.id ?: folder.name.toIntOrNull() ?: return@runCatching val galleryID = galleryBlock?.id ?: reader?.galleryInfo?.id ?: folder.name.toIntOrNull() ?: return@runCatching
if (downloadFolderMap.containsKey(galleryID)) return@runCatching
metadata["thumbnail"]?.jsonPrimitive?.contentOrNull.let { thumbnail -> metadata["thumbnail"]?.jsonPrimitive?.contentOrNull.let { thumbnail ->
val file = folder.getChild(".thumbnail").also { val file = folder.getChild(".thumbnail").also {
if (!it.exists()) if (!it.exists())
@@ -275,20 +279,21 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() {
downloadFolderMap[galleryID] = folder.name downloadFolderMap[galleryID] = folder.name
val cache = Cache.getInstance(this@migrate, galleryID) val cache = Cache.getInstance(this@migrate, galleryID)
cache.metadata.galleryBlock = galleryBlock
cache.metadata.reader = reader
val list: MutableList<String?> = val list: MutableList<String?> =
MutableList(cache.getReader()!!.galleryInfo.files.size) { null } MutableList(cache.getReader()!!.galleryInfo.files.size) { null }
folder.listFiles(object: FilenameFilterX() { folder.listFiles { dir ->
override fun accept(dir: File?, name: String?): Boolean = dir?.nameWithoutExtension?.toIntOrNull() != null
dir?.nameWithoutExtension?.toIntOrNull() != null }?.forEach {
})?.forEach {
list[it.nameWithoutExtension.toInt()] = it.name 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)) .setContentText(getText(R.string.import_old_galleries_notification_done))
.setProgress(0, 0, false) .setProgress(0, 0, false)
.setOngoing(false) .setOngoing(false)
.mActions.clear()
notificationManager.notify(R.id.notification_id_import, notification.build()) notificationManager.notify(R.id.notification_id_import, notification.build())
} }
} }