From 6f8697791d6c23fff34becf37addd266b44b3446 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Thu, 6 Jun 2019 00:45:33 +0900 Subject: [PATCH] Added export feature --- app/src/main/AndroidManifest.xml | 2 +- .../java/xyz/quaver/pupil/MainActivity.kt | 82 +++++++++++++++++-- .../java/xyz/quaver/pupil/ReaderActivity.kt | 14 ++++ .../quaver/pupil/util/GalleryDownloader.kt | 69 ++++++++++++++++ app/src/main/res/drawable/ic_export.xml | 8 ++ app/src/main/res/layout/activity_reader.xml | 8 ++ .../main/res/layout/dialog_galleryblock.xml | 2 +- app/src/main/res/values-ja/strings.xml | 7 +- app/src/main/res/values-ko/strings.xml | 9 +- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/xml/filepaths.xml | 4 - app/src/main/res/xml/root_preferences.xml | 5 ++ 12 files changed, 198 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/drawable/ic_export.xml delete mode 100644 app/src/main/res/xml/filepaths.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c0514b8f..e8cbecd4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ package="xyz.quaver.pupil"> - + { - AlertDialog.Builder(this@MainActivity).apply { - title = getString(R.string.help_dialog_title) - setMessage(R.string.help_dialog_message) - - setPositiveButton(android.R.string.ok) { _, _ -> } - }.show() + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.help)))) } R.id.main_drawer_github -> { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github)))) @@ -398,6 +399,73 @@ class MainActivity : AppCompatActivity() { dialog.dismiss() } + with(view.main_dialog_export) { + val images = File(ContextCompat.getDataDir(this@MainActivity), "images/${galleryBlock.id}/images").let { + when { + it.exists() -> it + else -> File(cacheDir, "imageCache/${galleryBlock.id}/images") + } + } + isEnabled = images.exists() + + setOnClickListener { + CoroutineScope(Dispatchers.Default).launch { + val preference = PreferenceManager.getDefaultSharedPreferences(context) + val zip = preference.getBoolean("export_zip", false) + + if (zip) { + var target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id} ${galleryBlock.title}.zip") + + try { + target.createNewFile() + } catch (e: IOException) { + target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id}.zip") + + try { + target.createNewFile() + } catch (e: IOException) { + Snackbar.make(main_layout, getString(R.string.main_export_error), Snackbar.LENGTH_LONG).show() + return@launch + } + } + + FileOutputStream(target).use { targetStream -> + ZipOutputStream(targetStream).use {zipStream -> + images.listFiles().forEach { + zipStream.putNextEntry(ZipEntry(it.name)) + + FileInputStream(it).use { fileStream -> + fileStream.copyTo(zipStream) + } + } + } + } + } else { + var target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id} ${galleryBlock.title}") + + try { + target.canonicalPath + } catch (e: IOException) { + target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id}") + + try { + target.canonicalPath + } catch (e: IOException) { + Snackbar.make(main_layout, getString(R.string.main_export_error), Snackbar.LENGTH_LONG).show() + return@launch + } + } + + images.copyRecursively(target, true) + } + + Snackbar.make(main_layout, getString(R.string.main_export_complete), Snackbar.LENGTH_LONG).show() + } + + dialog.dismiss() + } + } + dialog.show() true diff --git a/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt index c92e65b0..a4bcd5d0 100644 --- a/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt @@ -2,6 +2,7 @@ package xyz.quaver.pupil import android.graphics.drawable.Drawable import android.os.Bundle +import android.os.Environment import android.view.* import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -26,6 +27,11 @@ import xyz.quaver.hitomi.GalleryBlock import xyz.quaver.pupil.adapters.ReaderAdapter import xyz.quaver.pupil.util.GalleryDownloader import xyz.quaver.pupil.util.ItemClickSupport +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream class ReaderActivity : AppCompatActivity() { @@ -274,6 +280,14 @@ class ReaderActivity : AppCompatActivity() { if (!downloader.download) downloader.clearNotification() } + + reader_fab_export.setOnClickListener { + downloader.export( { + Snackbar.make(reader_layout, getString(R.string.main_export_complete), Snackbar.LENGTH_LONG).show() + }, { + Snackbar.make(reader_layout, getString(R.string.main_export_error), Snackbar.LENGTH_LONG).show() + }) + } } private fun fullscreen(isFullscreen: Boolean) { diff --git a/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt b/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt index cebeaa4d..5cfabe95 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt @@ -4,6 +4,7 @@ import android.app.PendingIntent import android.content.Context import android.content.ContextWrapper import android.content.Intent +import android.os.Environment import android.util.SparseArray import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -20,9 +21,12 @@ import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R import xyz.quaver.pupil.ReaderActivity import java.io.File +import java.io.FileInputStream import java.io.FileOutputStream import java.net.URL import java.util.* +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream import javax.net.ssl.HttpsURLConnection import kotlin.collections.ArrayList import kotlin.concurrent.schedule @@ -284,4 +288,69 @@ class GalleryDownloader( notificationManager = NotificationManagerCompat.from(this) } + fun export(onSuccess: (() -> Unit)? = null, onError: (() -> Unit)? = null) { + val images = File(ContextCompat.getDataDir(this), "images/${galleryBlock.id}/images").let { + when { + it.exists() -> it + else -> File(cacheDir, "imageCache/${galleryBlock.id}/images") + } + } + + if (!images.exists()) + return + + CoroutineScope(Dispatchers.Default).launch { + val preference = PreferenceManager.getDefaultSharedPreferences(this@GalleryDownloader) + val zip = preference.getBoolean("export_zip", false) + + if (zip) { + var target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id} ${galleryBlock.title}.zip") + + try { + target.createNewFile() + } catch (e: IOException) { + target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id}.zip") + + try { + target.createNewFile() + } catch (e: IOException) { + onError?.invoke() + return@launch + } + } + + FileOutputStream(target).use { targetStream -> + ZipOutputStream(targetStream).use { zipStream -> + images.listFiles().forEach { + zipStream.putNextEntry(ZipEntry(it.name)) + + FileInputStream(it).use { fileStream -> + fileStream.copyTo(zipStream) + } + } + } + } + } else { + var target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id} ${galleryBlock.title}") + + try { + target.canonicalPath + } catch (e: IOException) { + target = File(Environment.getExternalStorageDirectory(), "Pupil/${galleryBlock.id}") + + try { + target.canonicalPath + } catch (e: IOException) { + onError?.invoke() + return@launch + } + } + + images.copyRecursively(target, true) + } + + onSuccess?.invoke() + } + } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_export.xml b/app/src/main/res/drawable/ic_export.xml new file mode 100644 index 00000000..32d0ca69 --- /dev/null +++ b/app/src/main/res/drawable/ic_export.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index 9e49df68..e9827e8d 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -51,6 +51,14 @@ app:fab_label="@string/reader_fab_download" app:fab_size="mini"/> + +