From 29665be34dc1331b7e9d31db207d8ffd1d75c4e0 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Thu, 3 Sep 2020 10:54:07 +0900 Subject: [PATCH] Added Migration --- app/src/main/AndroidManifest.xml | 2 +- .../UpdateBroadcastReceiver.kt} | 4 +- .../main/java/xyz/quaver/pupil/util/update.kt | 102 ++++++++++++++++++ app/src/main/res/values/ids.xml | 2 + 4 files changed, 107 insertions(+), 3 deletions(-) rename app/src/main/java/xyz/quaver/pupil/{reciever/UpdateBroadcastReciever.kt => receiver/UpdateBroadcastReceiver.kt} (97%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c620557..47df453c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,7 +40,7 @@ android:exported="false"/> diff --git a/app/src/main/java/xyz/quaver/pupil/reciever/UpdateBroadcastReciever.kt b/app/src/main/java/xyz/quaver/pupil/receiver/UpdateBroadcastReceiver.kt similarity index 97% rename from app/src/main/java/xyz/quaver/pupil/reciever/UpdateBroadcastReciever.kt rename to app/src/main/java/xyz/quaver/pupil/receiver/UpdateBroadcastReceiver.kt index 705de974..1058b94c 100644 --- a/app/src/main/java/xyz/quaver/pupil/reciever/UpdateBroadcastReciever.kt +++ b/app/src/main/java/xyz/quaver/pupil/receiver/UpdateBroadcastReceiver.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package xyz.quaver.pupil.reciever +package xyz.quaver.pupil.receiver import android.app.DownloadManager import android.app.PendingIntent @@ -32,7 +32,7 @@ import xyz.quaver.pupil.R import xyz.quaver.pupil.util.Preferences import java.io.File -class UpdateBroadcastReciever : BroadcastReceiver() { +class UpdateBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { context ?: return 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 23b0b95f..ccce5c39 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -19,13 +19,20 @@ package xyz.quaver.pupil.util import android.app.DownloadManager +import android.app.PendingIntent +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent import android.net.Uri +import android.util.Base64 import android.webkit.URLUtil import androidx.appcompat.app.AlertDialog +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat import androidx.preference.PreferenceManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.* @@ -34,9 +41,16 @@ import okhttp3.Callback import okhttp3.Request import okhttp3.Response 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.pupil.BuildConfig import xyz.quaver.pupil.R import xyz.quaver.pupil.client +import xyz.quaver.pupil.services.DownloadService +import xyz.quaver.pupil.util.downloader.Cache import java.io.File import java.io.IOException import java.net.URL @@ -196,4 +210,92 @@ fun restore(favorites: GalleryList, url: String, onFailure: ((Exception) -> Unit } } }) +} + +private var job: Job? = null +private val receiver = object: BroadcastReceiver() { + val ACTION_CANCEL = "ACTION_IMPORT_CANCEL" + override fun onReceive(context: Context?, intent: Intent?) { + context ?: return + + when (intent?.action) { + ACTION_CANCEL -> { + job?.cancel() + NotificationManagerCompat.from(context).cancel(R.id.notification_id_import) + } + } + } +} +fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { + val notificationManager = NotificationManagerCompat.from(this) + val action = NotificationCompat.Action.Builder(0, getText(android.R.string.cancel), + PendingIntent.getBroadcast(this, R.id.notification_import_cancel_action.normalizeID(), Intent(receiver.ACTION_CANCEL), PendingIntent.FLAG_UPDATE_CURRENT) + ).build() + val notification = NotificationCompat.Builder(this, "import") + .setContentTitle(getText(R.string.import_old_galleries_notification)) + .setProgress(0, 0, true) + .addAction(action) + .setSmallIcon(R.drawable.ic_notification) + .setOngoing(true) + + DownloadService.cancel(this) + + job?.cancel() + job = CoroutineScope(Dispatchers.IO).launch { + val folders = downloadFolder.listFiles() ?: return@launch + folders.forEachIndexed { index, folder -> + notification + .setContentText(getString(R.string.import_old_galleries_notification_text, index, folders.size)) + .setProgress(index, folders.size, false) + notificationManager.notify(R.id.notification_id_import, notification.build()) + + kotlin.runCatching { + val folder = (folder as? FileX) ?: return@runCatching + + val metadata = Json.parseToJsonElement(folder.getChild(".metadata").readText()).jsonObject + + val galleryBlock: GalleryBlock? = + metadata["galleryBlock"]?.let { Json.decodeFromJsonElement(it) } + val reader: Reader? = + 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()) + it.createNewFile() + } + + file.writeBytes(Base64.decode(thumbnail, Base64.DEFAULT)) + } + + 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 { + list[it.nameWithoutExtension.toInt()] = it.name + } + + cache.metadata.imageList = list + } + } + + notification + .setContentText(getText(R.string.import_old_galleries_notification_done)) + .setProgress(0, 0, false) + .setOngoing(false) + notificationManager.notify(R.id.notification_id_import, notification.build()) + } } \ No newline at end of file diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 3ccc0e9e..820c1b4d 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -10,9 +10,11 @@ + + \ No newline at end of file