mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Add ability to open available extension websites in WebView
Closes #8628
This commit is contained in:
		@@ -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),
 | 
			
		||||
                            )
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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) },
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user