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"/>
+
+