From ae25018574da5f70ed261ea0de29316641440bc3 Mon Sep 17 00:00:00 2001 From: GG Bond Date: Mon, 4 Mar 2024 11:57:08 +0800 Subject: [PATCH] ReaderScreen saveToImage --- .../hippo/ehviewer/ui/reader/PageActions.kt | 21 +++++++++++++++++++ .../hippo/ehviewer/ui/reader/ReaderScreen.kt | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PageActions.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PageActions.kt index 5ea39c292..cecf6f1f1 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PageActions.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PageActions.kt @@ -9,6 +9,7 @@ import android.net.Uri import android.os.Environment import android.provider.MediaStore import android.webkit.MimeTypeMap +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.material3.SnackbarHostState import androidx.core.content.FileProvider import com.hippo.ehviewer.BuildConfig.APPLICATION_ID @@ -18,14 +19,17 @@ import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.gallery.PageLoader2 import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.FileUtils +import com.hippo.ehviewer.util.awaitActivityResult import com.hippo.ehviewer.util.isAtLeastQ import com.hippo.ehviewer.util.isAtLeastT import com.hippo.ehviewer.util.requestPermission import com.hippo.unifile.asUniFile +import com.hippo.unifile.displayPath import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.util.system.logcat import java.io.File import kotlinx.datetime.Clock +import moe.tarsin.coroutines.runSuspendCatching import splitties.systemservices.clipboardManager context(PageLoader2) @@ -125,3 +129,20 @@ suspend fun save(page: ReaderPage) { showSnackbar(getString(R.string.permission_denied)) } } + +context(SnackbarHostState, Context, PageLoader2) +suspend fun saveTo(page: ReaderPage) { + val filename = getImageFilename(page.index) + val extension = FileUtils.getExtensionFromFilename(filename) + val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) ?: "image/jpeg" + page.runSuspendCatching { + val uri = awaitActivityResult(ActivityResultContracts.CreateDocument(mimeType), filename) + if (uri != null) { + save(index, uri.asUniFile()) + showSnackbar(getString(R.string.image_saved, uri.displayPath)) + } + }.onFailure { + it.logcat(it) + showSnackbar(getString(R.string.error_cant_find_activity)) + } +} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt index fbdb77128..6389e2ffb 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt @@ -117,7 +117,7 @@ fun ReaderScreen(info: BaseGalleryInfo, page: Int = -1, navigator: DestinationsN share = { launchIO { with(pageLoader) { shareImage(page, info) } } }, copy = { launchIO { with(pageLoader) { copy(page) } } }, save = { launchIO { with(pageLoader) { save(page) } } }, - saveTo = {}, + saveTo = { launchIO { with(pageLoader) { saveTo(page) } } }, dismiss = { launch { state.hide().also { dispose() } } }, ) Spacer(modifier = Modifier.navigationBarsPadding())