diff --git a/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt index 538dd01e1..1fa3bac21 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.Photo import androidx.compose.material.icons.outlined.Save import androidx.compose.material.icons.outlined.Share @@ -31,9 +32,9 @@ fun ReaderPageActionsDialog( onDismissRequest: () -> Unit, // SY --> onSetAsCover: (useExtraPage: Boolean) -> Unit, - onShare: (useExtraPage: Boolean) -> Unit, + onShare: (copy: Boolean, useExtraPage: Boolean) -> Unit, onSave: (useExtraPage: Boolean) -> Unit, - onShareCombined: () -> Unit, + onShareCombined: (copy: Boolean) -> Unit, onSaveCombined: () -> Unit, hasExtraPage: Boolean, // SY <-- @@ -62,6 +63,25 @@ fun ReaderPageActionsDialog( icon = Icons.Outlined.Photo, onClick = { showSetCoverDialog = true }, ) + ActionButton( + modifier = Modifier.weight(1f), + title = stringResource( + // SY --> + if (hasExtraPage) { + SYMR.strings.action_copy_first_page + } else { + MR.strings.action_copy_to_clipboard + }, + // SY <-- + ), + icon = Icons.Outlined.ContentCopy, + onClick = { + // SY --> + onShare(true, false) + // SY <-- + onDismissRequest() + }, + ) ActionButton( modifier = Modifier.weight(1f), title = stringResource( @@ -76,7 +96,7 @@ fun ReaderPageActionsDialog( icon = Icons.Outlined.Share, onClick = { // SY --> - onShare(false) + onShare(false, false) // SY <-- onDismissRequest() }, @@ -114,12 +134,21 @@ fun ReaderPageActionsDialog( showSetCoverDialog = true }, ) + ActionButton( + modifier = Modifier.weight(1f), + title = stringResource(SYMR.strings.action_copy_second_page), + icon = Icons.Outlined.ContentCopy, + onClick = { + onShare(true, true) + onDismissRequest() + }, + ) ActionButton( modifier = Modifier.weight(1f), title = stringResource(SYMR.strings.action_share_second_page), icon = Icons.Outlined.Share, onClick = { - onShare(true) + onShare(false, true) onDismissRequest() }, ) @@ -136,12 +165,21 @@ fun ReaderPageActionsDialog( Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { + ActionButton( + modifier = Modifier.weight(1f), + title = stringResource(SYMR.strings.action_copy_combined_page), + icon = Icons.Outlined.ContentCopy, + onClick = { + onShareCombined(true) + onDismissRequest() + }, + ) ActionButton( modifier = Modifier.weight(1f), title = stringResource(SYMR.strings.action_share_combined_page), icon = Icons.Outlined.Share, onClick = { - onShareCombined() + onShareCombined(false) onDismissRequest() }, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 9833475a3..eb27fcfb1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -3,6 +3,8 @@ package eu.kanade.tachiyomi.ui.reader import android.annotation.SuppressLint import android.app.Activity import android.app.assist.AssistContent +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.res.Configuration @@ -35,6 +37,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.unit.dp +import androidx.core.content.getSystemService import androidx.core.graphics.ColorUtils import androidx.core.net.toUri import androidx.core.transition.doOnEnd @@ -269,6 +272,9 @@ class ReaderActivity : BaseActivity() { is ReaderViewModel.Event.ShareImage -> { onShareImageResult(event.uri, event.page /* SY --> */, event.secondPage /* SY <-- */) } + is ReaderViewModel.Event.CopyImage -> { + onCopyImageResult(event.uri) + } is ReaderViewModel.Event.SetCoverResult -> { onSetAsCoverResult(event.result) } @@ -1100,6 +1106,12 @@ class ReaderActivity : BaseActivity() { startActivity(Intent.createChooser(intent, stringResource(MR.strings.action_share))) } + private fun onCopyImageResult(uri: Uri) { + val clipboardManager = applicationContext.getSystemService() ?: return + val clipData = ClipData.newUri(applicationContext.contentResolver, "", uri) + clipboardManager.setPrimaryClip(clipData) + } + /** * Called from the presenter when a page is saved or fails. It shows a message or logs the * event depending on the [result]. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index e799afe58..8015fffa9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -1156,7 +1156,7 @@ class ReaderViewModel @JvmOverloads constructor( * get a path to the file and it has to be decompressed somewhere first. Only the last shared * image will be kept so it won't be taking lots of internal disk space. */ - fun shareImage(useExtraPage: Boolean) { + fun shareImage(copyToClipboard: Boolean, useExtraPage: Boolean) { // SY --> val page = if (useExtraPage) { (state.value.dialog as? Dialog.PageActions)?.extraPage @@ -1182,7 +1182,7 @@ class ReaderViewModel @JvmOverloads constructor( location = Location.Cache, ), ) - eventChannel.send(Event.ShareImage(uri, page)) + eventChannel.send(if (copyToClipboard) Event.CopyImage(uri) else Event.ShareImage(uri, page)) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) @@ -1190,7 +1190,7 @@ class ReaderViewModel @JvmOverloads constructor( } // SY --> - fun shareImages() { + fun shareImages(copyToClipboard: Boolean) { val (firstPage, secondPage) = (state.value.dialog as? Dialog.PageActions ?: return) val viewer = state.value.viewer as? PagerViewer ?: return val isLTR = (viewer !is R2LPagerViewer) xor (viewer.config.invertDoublePages) @@ -1214,7 +1214,7 @@ class ReaderViewModel @JvmOverloads constructor( location = Location.Cache, manga = manga, ) - eventChannel.send(Event.ShareImage(uri, firstPage, secondPage)) + eventChannel.send(if (copyToClipboard) Event.CopyImage(uri) else Event.ShareImage(uri, firstPage, secondPage)) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) @@ -1382,5 +1382,6 @@ class ReaderViewModel @JvmOverloads constructor( val page: ReaderPage/* SY --> */, val secondPage: ReaderPage? = null, /* SY <-- */ ) : Event + data class CopyImage(val uri: Uri) : Event } } diff --git a/i18n-sy/src/commonMain/moko-resources/base/strings.xml b/i18n-sy/src/commonMain/moko-resources/base/strings.xml index d59691a2b..82ec61648 100644 --- a/i18n-sy/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-sy/src/commonMain/moko-resources/base/strings.xml @@ -348,6 +348,9 @@ Share second page Save combined page Share combined page + Copy first page + Copy second page + Copy combined page %1$s: %2$s, pages %3$s