From c517856e896cd612f080cc81fb05976faba5719d Mon Sep 17 00:00:00 2001 From: Vladimir Dostoyevskiy <99822064+VDostoyevskiy@users.noreply.github.com> Date: Sat, 9 Dec 2023 14:39:46 +0800 Subject: [PATCH] Convert ReaderPageSheet to Compose (#481) * Convert ReaderPageSheet to Compose * Cleanup unused --------- Co-authored-by: GG Bond --- .../tachiyomi/ui/reader/ReaderActivity.kt | 20 ++- .../tachiyomi/ui/reader/ReaderPageSheet.kt | 114 ++++++++---------- .../main/kotlin/moe/tarsin/kt/Functions.kt | 6 + app/src/main/res/drawable/ic_file_copy_24.xml | 9 -- app/src/main/res/drawable/ic_save_24dp.xml | 9 -- app/src/main/res/drawable/ic_share_24dp.xml | 9 -- .../main/res/drawable/v_refresh_dark_x24.xml | 28 ----- app/src/main/res/layout/reader_page_sheet.xml | 98 --------------- app/src/main/res/values/pathdata.xml | 1 - 9 files changed, 77 insertions(+), 217 deletions(-) create mode 100644 app/src/main/kotlin/moe/tarsin/kt/Functions.kt delete mode 100644 app/src/main/res/drawable/ic_file_copy_24.xml delete mode 100644 app/src/main/res/drawable/ic_save_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_share_24dp.xml delete mode 100644 app/src/main/res/drawable/v_refresh_dark_x24.xml delete mode 100644 app/src/main/res/layout/reader_page_sheet.xml diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 75b9859c0..32258dc13 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -46,10 +46,13 @@ import androidx.annotation.RequiresApi import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheetFix +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.BlendMode import androidx.core.content.FileProvider @@ -109,6 +112,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.sample +import kotlinx.coroutines.launch import splitties.init.appCtx import splitties.systemservices.clipboardManager @@ -735,7 +739,21 @@ class ReaderActivity : EhActivity() { * actions to perform is shown. */ fun onPageLongTap(page: ReaderPage) { - ReaderPageSheet(this, page).show() + lifecycleScope.launch { + dialogState.dialog { + val coroutineScope = rememberCoroutineScope() + fun dismiss() = it.cancel() + val sheetState = rememberModalBottomSheetState() + ModalBottomSheetFix( + onDismissRequest = { dismiss() }, + sheetState = sheetState, + ) { + ReaderPageSheet(page) { + coroutineScope.launch { sheetState.hide() } + } + } + } + } } /** diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt index 7fa24ddb8..939a9bff7 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt @@ -1,73 +1,63 @@ package eu.kanade.tachiyomi.ui.reader -import android.view.LayoutInflater -import android.view.View -import com.hippo.ehviewer.databinding.ReaderPageSheetBinding +import androidx.annotation.StringRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.FileCopy +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Save +import androidx.compose.material.icons.filled.Share +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hippo.ehviewer.R +import com.hippo.ehviewer.util.findActivity import eu.kanade.tachiyomi.ui.reader.model.ReaderPage -import eu.kanade.tachiyomi.widget.sheet.BaseBottomSheetDialog +import moe.tarsin.kt.andThen -/** - * Sheet to show when a page is long clicked. - */ -class ReaderPageSheet( - private val activity: ReaderActivity, - private val page: ReaderPage, -) : BaseBottomSheetDialog(activity) { +@Composable +fun ReaderPageSheet(page: ReaderPage, dismiss: () -> Unit) { + val activity = LocalContext.current.run { remember { findActivity() } } + val modifier = Modifier.fillMaxWidth().height(56.dp).padding(horizontal = 16.dp) - private lateinit var binding: ReaderPageSheetBinding - - override fun createView(inflater: LayoutInflater): View { - binding = ReaderPageSheetBinding.inflate(activity.layoutInflater, null, false) - - binding.share.setOnClickListener { share() } - binding.copy.setOnClickListener { copy() } - binding.save.setOnClickListener { save() } - binding.saveTo.setOnClickListener { saveTo() } - binding.refresh.setOnClickListener { refresh() } - binding.refreshOrgImg.setOnClickListener { refreshOrgImg() } - - return binding.root + @Composable + fun Item(icon: ImageVector, @StringRes text: Int, onClick: () -> Unit) = Row( + modifier = modifier.clickable(onClick = onClick andThen dismiss), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon(imageVector = icon, contentDescription = null) + Spacer(modifier = Modifier.size(32.dp)) + Text(text = stringResource(id = text)) } - - /** - * Shares the image of this page with external apps. - */ - private fun share() { - activity.shareImage(page.index) - dismiss() - } - - /** - * Copy the image of this page with external apps. - */ - private fun copy() { - activity.copyImage(page.index) - dismiss() - } - - /** - * Saves the image of this page on external storage. - */ - private fun save() { - activity.saveImage(page.index) - dismiss() - } - - /** - * Saves the image of this page to a custom location on external storage. - */ - private fun saveTo() { - activity.saveImageTo(page.index) - dismiss() - } - - private fun refresh() { + Item(icon = Icons.Default.Refresh, text = R.string.refresh) { activity.mGalleryProvider?.retryPage(page.index) - dismiss() } - - private fun refreshOrgImg() { + Item(icon = Icons.Default.Refresh, text = R.string.refresh_original) { activity.mGalleryProvider?.retryPage(page.index, true) - dismiss() + } + Item(icon = Icons.Default.Share, text = R.string.action_share) { + activity.shareImage(page.index) + } + Item(icon = Icons.Default.FileCopy, text = R.string.action_copy) { + activity.copyImage(page.index) + } + Item(icon = Icons.Default.Save, text = R.string.action_save) { + activity.saveImage(page.index) + } + Item(icon = Icons.Default.Save, text = R.string.action_save_to) { + activity.saveImageTo(page.index) } } diff --git a/app/src/main/kotlin/moe/tarsin/kt/Functions.kt b/app/src/main/kotlin/moe/tarsin/kt/Functions.kt new file mode 100644 index 000000000..952e8b9d8 --- /dev/null +++ b/app/src/main/kotlin/moe/tarsin/kt/Functions.kt @@ -0,0 +1,6 @@ +package moe.tarsin.kt + +inline infix fun (() -> Unit).andThen(crossinline block: () -> Unit): () -> Unit = { + invoke() + block() +} diff --git a/app/src/main/res/drawable/ic_file_copy_24.xml b/app/src/main/res/drawable/ic_file_copy_24.xml deleted file mode 100644 index 5b7a962b9..000000000 --- a/app/src/main/res/drawable/ic_file_copy_24.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_save_24dp.xml b/app/src/main/res/drawable/ic_save_24dp.xml deleted file mode 100644 index 4435923ad..000000000 --- a/app/src/main/res/drawable/ic_save_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_share_24dp.xml b/app/src/main/res/drawable/ic_share_24dp.xml deleted file mode 100644 index 394e3effe..000000000 --- a/app/src/main/res/drawable/ic_share_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/v_refresh_dark_x24.xml b/app/src/main/res/drawable/v_refresh_dark_x24.xml deleted file mode 100644 index 48d9d93d3..000000000 --- a/app/src/main/res/drawable/v_refresh_dark_x24.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/layout/reader_page_sheet.xml b/app/src/main/res/layout/reader_page_sheet.xml deleted file mode 100644 index d35d6ba3d..000000000 --- a/app/src/main/res/layout/reader_page_sheet.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/pathdata.xml b/app/src/main/res/values/pathdata.xml index 9e4e4cec4..ddc603ec1 100644 --- a/app/src/main/res/values/pathdata.xml +++ b/app/src/main/res/values/pathdata.xml @@ -17,7 +17,6 @@ M14,19.14H18V5.14H14M6,19.14H10V5.14H6V19.14Z - M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M6,20H15L18,20V12L14,16L12,14L6,20M8,9A2,2 0 0,0 6,11A2,2 0 0,0 8,13A2,2 0 0,0 10,11A2,2 0 0,0 8,9Z