Added Migration
This commit is contained in:
@@ -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" />
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user