diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt index 2e4c6fc0b3..3b63e86fde 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt @@ -14,6 +14,11 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.GetApp +import androidx.compose.material.icons.outlined.Public +import androidx.compose.material.icons.outlined.Refresh +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material.icons.outlined.VerifiedUser import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator @@ -62,6 +67,7 @@ fun ExtensionScreen( searchQuery: String?, onLongClickItem: (Extension) -> Unit, onClickItemCancel: (Extension) -> Unit, + onClickItemWebView: (Extension.Available) -> Unit, onInstallExtension: (Extension.Available) -> Unit, onUninstallExtension: (Extension) -> Unit, onUpdateExtension: (Extension.Installed) -> Unit, @@ -94,6 +100,7 @@ fun ExtensionScreen( contentPadding = contentPadding, onLongClickItem = onLongClickItem, onClickItemCancel = onClickItemCancel, + onClickItemWebView = onClickItemWebView, onInstallExtension = onInstallExtension, onUninstallExtension = onUninstallExtension, onUpdateExtension = onUpdateExtension, @@ -111,6 +118,7 @@ private fun ExtensionContent( state: ExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (Extension) -> Unit, + onClickItemWebView: (Extension.Available) -> Unit, onClickItemCancel: (Extension) -> Unit, onInstallExtension: (Extension.Available) -> Unit, onUninstallExtension: (Extension) -> Unit, @@ -177,6 +185,7 @@ private fun ExtensionContent( } }, onLongClickItem = onLongClickItem, + onClickItemWebView = onClickItemWebView, onClickItemCancel = onClickItemCancel, onClickItemAction = { when (it) { @@ -217,6 +226,7 @@ private fun ExtensionItem( item: ExtensionUiModel.Item, onClickItem: (Extension) -> Unit, onLongClickItem: (Extension) -> Unit, + onClickItemWebView: (Extension.Available) -> Unit, onClickItemCancel: (Extension) -> Unit, onClickItemAction: (Extension) -> Unit, modifier: Modifier = Modifier, @@ -260,6 +270,7 @@ private fun ExtensionItem( ExtensionItemActions( extension = extension, installStep = installStep, + onClickItemWebView = onClickItemWebView, onClickItemCancel = onClickItemCancel, onClickItemAction = onClickItemAction, ) @@ -343,42 +354,80 @@ private fun ExtensionItemActions( extension: Extension, installStep: InstallStep, modifier: Modifier = Modifier, + onClickItemWebView: (Extension.Available) -> Unit = {}, onClickItemCancel: (Extension) -> Unit = {}, onClickItemAction: (Extension) -> Unit = {}, ) { val isIdle = installStep.isCompleted() - Row(modifier = modifier) { - if (isIdle) { - TextButton( - onClick = { onClickItemAction(extension) }, - ) { - Text( - text = when (installStep) { - InstallStep.Installed -> stringResource(MR.strings.ext_installed) - InstallStep.Error -> stringResource(MR.strings.action_retry) - InstallStep.Idle -> { - when (extension) { - is Extension.Installed -> { - if (extension.hasUpdate) { - stringResource(MR.strings.ext_update) - } else { - stringResource(MR.strings.action_settings) - } - } - is Extension.Untrusted -> stringResource(MR.strings.ext_trust) - is Extension.Available -> stringResource(MR.strings.ext_install) + + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + when { + !isIdle -> { + IconButton(onClick = { onClickItemCancel(extension) }) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = stringResource(MR.strings.action_cancel), + ) + } + } + installStep == InstallStep.Error -> { + IconButton(onClick = { onClickItemAction(extension) }) { + Icon( + imageVector = Icons.Outlined.Refresh, + contentDescription = stringResource(MR.strings.action_retry), + ) + } + } + installStep == InstallStep.Idle -> { + when (extension) { + is Extension.Installed -> { + if (extension.hasUpdate) { + IconButton(onClick = { onClickItemAction(extension) }) { + Icon( + imageVector = Icons.Outlined.GetApp, + contentDescription = stringResource(MR.strings.ext_update), + ) } } - else -> error("Must not show install process text") - }, - ) - } - } else { - IconButton(onClick = { onClickItemCancel(extension) }) { - Icon( - imageVector = Icons.Outlined.Close, - contentDescription = stringResource(MR.strings.action_cancel), - ) + + IconButton(onClick = { onClickItemAction(extension) }) { + Icon( + imageVector = Icons.Outlined.Settings, + contentDescription = stringResource(MR.strings.action_settings), + ) + } + } + is Extension.Untrusted -> { + IconButton(onClick = { onClickItemAction(extension) }) { + Icon( + imageVector = Icons.Outlined.VerifiedUser, + contentDescription = stringResource(MR.strings.ext_trust), + ) + } + } + is Extension.Available -> { + if (extension.sources.isNotEmpty()) { + IconButton( + onClick = { onClickItemWebView(extension) }, + ) { + Icon( + imageVector = Icons.Outlined.Public, + contentDescription = stringResource(MR.strings.action_open_in_web_view), + ) + } + } + + IconButton(onClick = { onClickItemAction(extension) }) { + Icon( + imageVector = Icons.Outlined.GetApp, + contentDescription = stringResource(MR.strings.ext_install), + ) + } + } + } } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsTab.kt index cb72b5f66e..9a73307a78 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsTab.kt @@ -12,6 +12,7 @@ import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.ui.browse.extension.details.ExtensionDetailsScreen +import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @@ -47,6 +48,17 @@ fun extensionsTab( }, onClickItemCancel = extensionsScreenModel::cancelInstallUpdateExtension, onClickUpdateAll = extensionsScreenModel::updateAllExtensions, + onClickItemWebView = { extension -> + extension.sources.getOrNull(0)?.let { + navigator.push( + WebViewScreen( + url = it.baseUrl, + initialTitle = it.name, + sourceId = it.id, + ), + ) + } + }, onInstallExtension = extensionsScreenModel::installExtension, onOpenExtension = { navigator.push(ExtensionDetailsScreen(it.pkgName)) }, onTrustExtension = { extensionsScreenModel.trustSignature(it.signatureHash) },