diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
index b2f308ed1..95f4acc76 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
@@ -5,6 +5,7 @@ import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.app.Activity
+import android.content.ClipData
import android.content.Intent
import android.graphics.Color
import android.graphics.Point
@@ -85,6 +86,7 @@ import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.chapter.NoChaptersException
import eu.kanade.tachiyomi.util.hasCustomCover
+import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.getCoordinates
@@ -205,6 +207,8 @@ class MangaController :
private var editMergedSettingsDialog: EditMergedSettingsDialog? = null
private var currentAnimator: Animator? = null
+
+ private var isExpanded: Boolean = false
// EXH <--
init {
@@ -430,6 +434,8 @@ class MangaController :
if (preferences.recommendsInOverflow().get()) menu.findItem(R.id.action_recommend).isVisible = true
menu.findItem(R.id.action_merged).isVisible = presenter.manga.source == MERGED_SOURCE_ID
menu.findItem(R.id.action_toggle_dedupe).isVisible = false // presenter.manga.source == MERGED_SOURCE_ID
+ menu.findItem(R.id.action_share_cover).isVisible = isExpanded
+ menu.findItem(R.id.action_save).isVisible = isExpanded
// SY <--
}
@@ -463,14 +469,35 @@ class MangaController :
presenter.dedupe = !presenter.dedupe
presenter.toggleDedupe()
}
- R.id.action_migrate -> {
- migrateManga()
- }
// SY <--
R.id.action_edit_categories -> onCategoriesClick()
// SY --> R.id.action_edit_cover -> handleChangeCover() // SY <--
- // SY --> R.id.action_migrate -> migrateManga() // SY <--
+ R.id.action_migrate -> migrateManga()
+ // SY -->
+ R.id.action_save -> {
+ if (presenter.saveCover()) {
+ activity?.toast(R.string.cover_saved)
+ } else {
+ activity?.toast(R.string.error_saving_cover)
+ }
+ }
+ R.id.action_share_cover -> {
+ val cover = presenter.shareCover(activity!!)
+ if (cover != null) {
+ val stream = cover.getUriCompat(activity!!)
+ val intent = Intent(Intent.ACTION_SEND).apply {
+ putExtra(Intent.EXTRA_STREAM, stream)
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION
+ clipData = ClipData.newRawUri(null, stream)
+ type = "image/*"
+ }
+ startActivity(Intent.createChooser(intent, activity?.getString(R.string.action_share)))
+ } else {
+ activity?.toast(R.string.error_sharing_cover)
+ }
+ }
+ // SY <--
}
return super.onOptionsItemSelected(item)
}
@@ -742,7 +769,7 @@ class MangaController :
// SY -->
fun onThumbnailClick(thumbView: ImageView) {
- if (!presenter.manga.initialized) return
+ if (!presenter.manga.initialized || presenter.manga.thumbnail_url == null) return
currentAnimator?.cancel()
val startBoundsInt = Rect()
@@ -777,6 +804,7 @@ class MangaController :
binding.expandedImage.pivotX = 0f
binding.expandedImage.pivotY = 0f
+ isExpanded = true
currentAnimator = AnimatorSet().apply {
play(
@@ -809,6 +837,7 @@ class MangaController :
binding.expandedImage.clicks()
.onEach {
+ isExpanded = false
currentAnimator?.cancel()
currentAnimator = AnimatorSet().apply {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
index 06fe4a5d8..1785248a7 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
@@ -3,9 +3,11 @@ package eu.kanade.tachiyomi.ui.manga
import android.content.Context
import android.net.Uri
import android.os.Bundle
+import android.os.Environment
import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.BehaviorRelay
import com.jakewharton.rxrelay.PublishRelay
+import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Category
@@ -33,6 +35,8 @@ import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.prepUpdateCover
import eu.kanade.tachiyomi.util.removeCovers
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
+import eu.kanade.tachiyomi.util.storage.DiskUtil
+import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.updateCoverLastModified
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
import exh.MERGED_SOURCE_ID
@@ -59,6 +63,7 @@ import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
+import java.io.File
import java.util.Date
class MangaPresenter(
@@ -490,6 +495,50 @@ class MangaPresenter(
fun toggleDedupe() {
// I cant find any way to call the chapter list subscription to get the chapters again
}
+
+ fun shareCover(context: Context): File? {
+ return try {
+ val destDir = File(context.cacheDir, "shared_image")
+ val file = saveCover(destDir)
+ file
+ } catch (e: Exception) {
+ null
+ }
+ }
+
+ fun saveCover(): Boolean {
+ return try {
+ val directory = File(
+ Environment.getExternalStorageDirectory().absolutePath +
+ File.separator + Environment.DIRECTORY_PICTURES +
+ File.separator + R.string.app_name
+ )
+ saveCover(directory)
+ true
+ } catch (e: Exception) {
+ false
+ }
+ }
+
+ private fun saveCover(directory: File): File {
+ val cover = coverCache.getCoverFile(manga)!!
+ val type = ImageUtil.findImageType(cover.inputStream())
+ ?: throw Exception("Not an image")
+
+ directory.mkdirs()
+
+ // Build destination file.
+ val filename = DiskUtil.buildValidFilename("${manga.title}.${type.extension}")
+
+ val destFile = File(directory, filename)
+ cover.inputStream().use { input ->
+ destFile.outputStream().use { output ->
+ input.copyTo(output)
+ }
+ }
+ return destFile
+ }
+
// SY <--
/**
diff --git a/app/src/main/res/menu/manga.xml b/app/src/main/res/menu/manga.xml
index 34dbc1c24..55509a07c 100644
--- a/app/src/main/res/menu/manga.xml
+++ b/app/src/main/res/menu/manga.xml
@@ -83,4 +83,18 @@
android:title="@string/toggle_dedupe"
android:visible="false"
app:showAsAction="never" />
+
+
+
+
diff --git a/app/src/main/res/values/strings_sy.xml b/app/src/main/res/values/strings_sy.xml
index 2bc4b638a..c0c3b84ab 100644
--- a/app/src/main/res/values/strings_sy.xml
+++ b/app/src/main/res/values/strings_sy.xml
@@ -255,6 +255,10 @@
See Recommendations
Merge
Merge With Another
+ Cover saved
+ Cover saved
+ Error saving cover
+ Error sharing cover
Hiatus