Migration bug fix
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
1
app/proguard-rules.pro
vendored
1
app/proguard-rules.pro
vendored
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user