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