Added Migration

This commit is contained in:
tom5079
2020-09-03 10:54:07 +09:00
parent 1edf986acf
commit 29665be34d
4 changed files with 107 additions and 3 deletions

View File

@@ -40,7 +40,7 @@
android:exported="false"/> android:exported="false"/>
<receiver <receiver
android:name=".reciever.UpdateBroadcastReciever" android:name=".receiver.UpdateBroadcastReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />

View File

@@ -16,7 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package xyz.quaver.pupil.reciever package xyz.quaver.pupil.receiver
import android.app.DownloadManager import android.app.DownloadManager
import android.app.PendingIntent import android.app.PendingIntent
@@ -32,7 +32,7 @@ import xyz.quaver.pupil.R
import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.Preferences
import java.io.File import java.io.File
class UpdateBroadcastReciever : BroadcastReceiver() { class UpdateBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
context ?: return context ?: return

View File

@@ -19,13 +19,20 @@
package xyz.quaver.pupil.util package xyz.quaver.pupil.util
import android.app.DownloadManager import android.app.DownloadManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent
import android.net.Uri import android.net.Uri
import android.util.Base64
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.NotificationManagerCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
@@ -34,9 +41,16 @@ import okhttp3.Callback
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import ru.noties.markwon.Markwon 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.BuildConfig
import xyz.quaver.pupil.R import xyz.quaver.pupil.R
import xyz.quaver.pupil.client 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.File
import java.io.IOException import java.io.IOException
import java.net.URL 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<String?> =
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())
}
} }

View File

@@ -10,9 +10,11 @@
<item name="request_write_permission_and_saf" type="id" /> <item name="request_write_permission_and_saf" type="id" />
<item name="notification_id_update" type="id" /> <item name="notification_id_update" type="id" />
<item name="notification_id_import" type="id" />
<item name="downloader_notification_id" type="id" /> <item name="downloader_notification_id" type="id" />
<item name="downloader_notification_request" type="id" /> <item name="downloader_notification_request" type="id" />
<item name="notification_download_cancel_action" type="id" /> <item name="notification_download_cancel_action" type="id" />
<item name="notification_import_cancel_action" type="id" />
</resources> </resources>