|
@@ -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),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|