|
|
@ -14,6 +14,11 @@ import androidx.compose.foundation.layout.size
|
|
|
|
import androidx.compose.foundation.lazy.items
|
|
|
|
import androidx.compose.foundation.lazy.items
|
|
|
|
import androidx.compose.material.icons.Icons
|
|
|
|
import androidx.compose.material.icons.Icons
|
|
|
|
import androidx.compose.material.icons.outlined.Close
|
|
|
|
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.AlertDialog
|
|
|
|
import androidx.compose.material3.Button
|
|
|
|
import androidx.compose.material3.Button
|
|
|
|
import androidx.compose.material3.CircularProgressIndicator
|
|
|
|
import androidx.compose.material3.CircularProgressIndicator
|
|
|
@ -62,6 +67,7 @@ fun ExtensionScreen(
|
|
|
|
searchQuery: String?,
|
|
|
|
searchQuery: String?,
|
|
|
|
onLongClickItem: (Extension) -> Unit,
|
|
|
|
onLongClickItem: (Extension) -> Unit,
|
|
|
|
onClickItemCancel: (Extension) -> Unit,
|
|
|
|
onClickItemCancel: (Extension) -> Unit,
|
|
|
|
|
|
|
|
onClickItemWebView: (Extension.Available) -> Unit,
|
|
|
|
onInstallExtension: (Extension.Available) -> Unit,
|
|
|
|
onInstallExtension: (Extension.Available) -> Unit,
|
|
|
|
onUninstallExtension: (Extension) -> Unit,
|
|
|
|
onUninstallExtension: (Extension) -> Unit,
|
|
|
|
onUpdateExtension: (Extension.Installed) -> Unit,
|
|
|
|
onUpdateExtension: (Extension.Installed) -> Unit,
|
|
|
@ -94,6 +100,7 @@ fun ExtensionScreen(
|
|
|
|
contentPadding = contentPadding,
|
|
|
|
contentPadding = contentPadding,
|
|
|
|
onLongClickItem = onLongClickItem,
|
|
|
|
onLongClickItem = onLongClickItem,
|
|
|
|
onClickItemCancel = onClickItemCancel,
|
|
|
|
onClickItemCancel = onClickItemCancel,
|
|
|
|
|
|
|
|
onClickItemWebView = onClickItemWebView,
|
|
|
|
onInstallExtension = onInstallExtension,
|
|
|
|
onInstallExtension = onInstallExtension,
|
|
|
|
onUninstallExtension = onUninstallExtension,
|
|
|
|
onUninstallExtension = onUninstallExtension,
|
|
|
|
onUpdateExtension = onUpdateExtension,
|
|
|
|
onUpdateExtension = onUpdateExtension,
|
|
|
@ -111,6 +118,7 @@ private fun ExtensionContent(
|
|
|
|
state: ExtensionsScreenModel.State,
|
|
|
|
state: ExtensionsScreenModel.State,
|
|
|
|
contentPadding: PaddingValues,
|
|
|
|
contentPadding: PaddingValues,
|
|
|
|
onLongClickItem: (Extension) -> Unit,
|
|
|
|
onLongClickItem: (Extension) -> Unit,
|
|
|
|
|
|
|
|
onClickItemWebView: (Extension.Available) -> Unit,
|
|
|
|
onClickItemCancel: (Extension) -> Unit,
|
|
|
|
onClickItemCancel: (Extension) -> Unit,
|
|
|
|
onInstallExtension: (Extension.Available) -> Unit,
|
|
|
|
onInstallExtension: (Extension.Available) -> Unit,
|
|
|
|
onUninstallExtension: (Extension) -> Unit,
|
|
|
|
onUninstallExtension: (Extension) -> Unit,
|
|
|
@ -177,6 +185,7 @@ private fun ExtensionContent(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
onLongClickItem = onLongClickItem,
|
|
|
|
onLongClickItem = onLongClickItem,
|
|
|
|
|
|
|
|
onClickItemWebView = onClickItemWebView,
|
|
|
|
onClickItemCancel = onClickItemCancel,
|
|
|
|
onClickItemCancel = onClickItemCancel,
|
|
|
|
onClickItemAction = {
|
|
|
|
onClickItemAction = {
|
|
|
|
when (it) {
|
|
|
|
when (it) {
|
|
|
@ -217,6 +226,7 @@ private fun ExtensionItem(
|
|
|
|
item: ExtensionUiModel.Item,
|
|
|
|
item: ExtensionUiModel.Item,
|
|
|
|
onClickItem: (Extension) -> Unit,
|
|
|
|
onClickItem: (Extension) -> Unit,
|
|
|
|
onLongClickItem: (Extension) -> Unit,
|
|
|
|
onLongClickItem: (Extension) -> Unit,
|
|
|
|
|
|
|
|
onClickItemWebView: (Extension.Available) -> Unit,
|
|
|
|
onClickItemCancel: (Extension) -> Unit,
|
|
|
|
onClickItemCancel: (Extension) -> Unit,
|
|
|
|
onClickItemAction: (Extension) -> Unit,
|
|
|
|
onClickItemAction: (Extension) -> Unit,
|
|
|
|
modifier: Modifier = Modifier,
|
|
|
|
modifier: Modifier = Modifier,
|
|
|
@ -260,6 +270,7 @@ private fun ExtensionItem(
|
|
|
|
ExtensionItemActions(
|
|
|
|
ExtensionItemActions(
|
|
|
|
extension = extension,
|
|
|
|
extension = extension,
|
|
|
|
installStep = installStep,
|
|
|
|
installStep = installStep,
|
|
|
|
|
|
|
|
onClickItemWebView = onClickItemWebView,
|
|
|
|
onClickItemCancel = onClickItemCancel,
|
|
|
|
onClickItemCancel = onClickItemCancel,
|
|
|
|
onClickItemAction = onClickItemAction,
|
|
|
|
onClickItemAction = onClickItemAction,
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -343,42 +354,80 @@ private fun ExtensionItemActions(
|
|
|
|
extension: Extension,
|
|
|
|
extension: Extension,
|
|
|
|
installStep: InstallStep,
|
|
|
|
installStep: InstallStep,
|
|
|
|
modifier: Modifier = Modifier,
|
|
|
|
modifier: Modifier = Modifier,
|
|
|
|
|
|
|
|
onClickItemWebView: (Extension.Available) -> Unit = {},
|
|
|
|
onClickItemCancel: (Extension) -> Unit = {},
|
|
|
|
onClickItemCancel: (Extension) -> Unit = {},
|
|
|
|
onClickItemAction: (Extension) -> Unit = {},
|
|
|
|
onClickItemAction: (Extension) -> Unit = {},
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
val isIdle = installStep.isCompleted()
|
|
|
|
val isIdle = installStep.isCompleted()
|
|
|
|
Row(modifier = modifier) {
|
|
|
|
|
|
|
|
if (isIdle) {
|
|
|
|
Row(
|
|
|
|
TextButton(
|
|
|
|
modifier = modifier,
|
|
|
|
onClick = { onClickItemAction(extension) },
|
|
|
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
Text(
|
|
|
|
when {
|
|
|
|
text = when (installStep) {
|
|
|
|
!isIdle -> {
|
|
|
|
InstallStep.Installed -> stringResource(MR.strings.ext_installed)
|
|
|
|
IconButton(onClick = { onClickItemCancel(extension) }) {
|
|
|
|
InstallStep.Error -> stringResource(MR.strings.action_retry)
|
|
|
|
Icon(
|
|
|
|
InstallStep.Idle -> {
|
|
|
|
imageVector = Icons.Outlined.Close,
|
|
|
|
when (extension) {
|
|
|
|
contentDescription = stringResource(MR.strings.action_cancel),
|
|
|
|
is Extension.Installed -> {
|
|
|
|
)
|
|
|
|
if (extension.hasUpdate) {
|
|
|
|
}
|
|
|
|
stringResource(MR.strings.ext_update)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
installStep == InstallStep.Error -> {
|
|
|
|
stringResource(MR.strings.action_settings)
|
|
|
|
IconButton(onClick = { onClickItemAction(extension) }) {
|
|
|
|
}
|
|
|
|
Icon(
|
|
|
|
}
|
|
|
|
imageVector = Icons.Outlined.Refresh,
|
|
|
|
is Extension.Untrusted -> stringResource(MR.strings.ext_trust)
|
|
|
|
contentDescription = stringResource(MR.strings.action_retry),
|
|
|
|
is Extension.Available -> stringResource(MR.strings.ext_install)
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
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")
|
|
|
|
|
|
|
|
},
|
|
|
|
IconButton(onClick = { onClickItemAction(extension) }) {
|
|
|
|
)
|
|
|
|
Icon(
|
|
|
|
}
|
|
|
|
imageVector = Icons.Outlined.Settings,
|
|
|
|
} else {
|
|
|
|
contentDescription = stringResource(MR.strings.action_settings),
|
|
|
|
IconButton(onClick = { onClickItemCancel(extension) }) {
|
|
|
|
)
|
|
|
|
Icon(
|
|
|
|
}
|
|
|
|
imageVector = Icons.Outlined.Close,
|
|
|
|
}
|
|
|
|
contentDescription = stringResource(MR.strings.action_cancel),
|
|
|
|
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),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|