Add share/save manga cover when expanded from J2k, not tested

This commit is contained in:
Jobobby04 2020-10-15 11:26:39 -04:00
parent 0b6f7c5e23
commit a4273bb9a2
4 changed files with 101 additions and 5 deletions

View File

@ -5,6 +5,7 @@ import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet import android.animation.AnimatorSet
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.app.Activity import android.app.Activity
import android.content.ClipData
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.graphics.Point 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.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.chapter.NoChaptersException import eu.kanade.tachiyomi.util.chapter.NoChaptersException
import eu.kanade.tachiyomi.util.hasCustomCover 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.getResourceColor
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.getCoordinates import eu.kanade.tachiyomi.util.view.getCoordinates
@ -205,6 +207,8 @@ class MangaController :
private var editMergedSettingsDialog: EditMergedSettingsDialog? = null private var editMergedSettingsDialog: EditMergedSettingsDialog? = null
private var currentAnimator: Animator? = null private var currentAnimator: Animator? = null
private var isExpanded: Boolean = false
// EXH <-- // EXH <--
init { init {
@ -430,6 +434,8 @@ class MangaController :
if (preferences.recommendsInOverflow().get()) menu.findItem(R.id.action_recommend).isVisible = true 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_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_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 <-- // SY <--
} }
@ -463,14 +469,35 @@ class MangaController :
presenter.dedupe = !presenter.dedupe presenter.dedupe = !presenter.dedupe
presenter.toggleDedupe() presenter.toggleDedupe()
} }
R.id.action_migrate -> {
migrateManga()
}
// SY <-- // SY <--
R.id.action_edit_categories -> onCategoriesClick() R.id.action_edit_categories -> onCategoriesClick()
// SY --> R.id.action_edit_cover -> handleChangeCover() // SY <-- // 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) return super.onOptionsItemSelected(item)
} }
@ -742,7 +769,7 @@ class MangaController :
// SY --> // SY -->
fun onThumbnailClick(thumbView: ImageView) { fun onThumbnailClick(thumbView: ImageView) {
if (!presenter.manga.initialized) return if (!presenter.manga.initialized || presenter.manga.thumbnail_url == null) return
currentAnimator?.cancel() currentAnimator?.cancel()
val startBoundsInt = Rect() val startBoundsInt = Rect()
@ -777,6 +804,7 @@ class MangaController :
binding.expandedImage.pivotX = 0f binding.expandedImage.pivotX = 0f
binding.expandedImage.pivotY = 0f binding.expandedImage.pivotY = 0f
isExpanded = true
currentAnimator = AnimatorSet().apply { currentAnimator = AnimatorSet().apply {
play( play(
@ -809,6 +837,7 @@ class MangaController :
binding.expandedImage.clicks() binding.expandedImage.clicks()
.onEach { .onEach {
isExpanded = false
currentAnimator?.cancel() currentAnimator?.cancel()
currentAnimator = AnimatorSet().apply { currentAnimator = AnimatorSet().apply {

View File

@ -3,9 +3,11 @@ package eu.kanade.tachiyomi.ui.manga
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import com.elvishew.xlog.XLog import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.BehaviorRelay
import com.jakewharton.rxrelay.PublishRelay import com.jakewharton.rxrelay.PublishRelay
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Category 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.prepUpdateCover
import eu.kanade.tachiyomi.util.removeCovers import eu.kanade.tachiyomi.util.removeCovers
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters 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.util.updateCoverLastModified
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
import exh.MERGED_SOURCE_ID import exh.MERGED_SOURCE_ID
@ -59,6 +63,7 @@ import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.File
import java.util.Date import java.util.Date
class MangaPresenter( class MangaPresenter(
@ -490,6 +495,50 @@ class MangaPresenter(
fun toggleDedupe() { fun toggleDedupe() {
// I cant find any way to call the chapter list subscription to get the chapters again // 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 <-- // SY <--
/** /**

View File

@ -83,4 +83,18 @@
android:title="@string/toggle_dedupe" android:title="@string/toggle_dedupe"
android:visible="false" android:visible="false"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/action_save"
android:icon="@drawable/ic_save_black_24dp"
android:title="@string/action_save"
android:visible="false"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_share_cover"
android:icon="@drawable/ic_share_24dp"
android:title="@string/share_cover"
android:visible="false"
app:showAsAction="ifRoom" />
</menu> </menu>

View File

@ -255,6 +255,10 @@
<string name="az_recommends">See Recommendations</string> <string name="az_recommends">See Recommendations</string>
<string name="merge">Merge</string> <string name="merge">Merge</string>
<string name="merge_with_another_source">Merge With Another</string> <string name="merge_with_another_source">Merge With Another</string>
<string name="cover_saved">Cover saved</string>
<string name="share_cover">Cover saved</string>
<string name="error_saving_cover">Error saving cover</string>
<string name="error_sharing_cover">Error sharing cover</string>
<!-- Manga info fragment --> <!-- Manga info fragment -->
<string name="hiatus">Hiatus</string> <string name="hiatus">Hiatus</string>