refactor: move PatchCard to its own file

This commit is contained in:
Ushie 2022-11-12 19:06:45 +03:00
parent 2dfef99d8c
commit 284e9a76c0
No known key found for this signature in database
GPG Key ID: 0EF73F1CA38B2D5F
2 changed files with 129 additions and 116 deletions

View File

@ -0,0 +1,127 @@
package app.revanced.manager.ui.component
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import app.revanced.manager.R
import app.revanced.manager.ui.theme.Typography
import app.revanced.manager.ui.viewmodel.PatchClass
import app.revanced.patcher.extensions.PatchExtensions.description
import app.revanced.patcher.extensions.PatchExtensions.options
import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.extensions.PatchExtensions.version
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PatchCard(patchClass: PatchClass, isSelected: Boolean, onSelected: () -> Unit) {
val patch = patchClass.patch
val name = patch.patchName
var showDialog by remember { mutableStateOf(false) }
ElevatedCard(
modifier = Modifier
.padding(16.dp, 4.dp),
enabled = !patchClass.unsupported,
onClick = onSelected
) {
Column(modifier = Modifier.padding(12.dp, 0.dp, 12.dp, 12.dp)) {
Row {
Column(
Modifier
.align(Alignment.CenterVertically)
) {
Text(
text = name.replace("-", " ").split(" ")
.joinToString(" ") { it.replaceFirstChar(Char::uppercase) },
style = MaterialTheme.typography.titleMedium
)
}
Spacer(Modifier.width(4.dp))
Row(
Modifier
.align(Alignment.CenterVertically)
) {
Text(
text = patch.version ?: "unknown",
style = Typography.bodySmall
)
}
Spacer(Modifier.weight(1f, true))
Column(modifier = Modifier.padding(0.dp, 6.dp)) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(4.dp)
) {
if (patchClass.patch.options != null) {
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
IconButton(onClick = { }, modifier = Modifier.size(24.dp)) {
Icon(
Icons.Outlined.Settings,
contentDescription = "Patch Options"
)
}
}
}
Spacer(Modifier.width(8.dp))
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
Checkbox(
enabled = !patchClass.unsupported,
checked = isSelected,
onCheckedChange = { onSelected() }
)
}
}
}
}
var isExpanded by remember { mutableStateOf(false) }
patch.description?.let { desc ->
Text(
text = desc,
modifier = Modifier
.padding(0.dp, 8.dp, 22.dp, 8.dp)
.clickable { isExpanded = !isExpanded },
maxLines = if (isExpanded) Int.MAX_VALUE else 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodyMedium
)
}
if (patchClass.unsupported) {
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
Column {
Row {
if (showDialog) {
PatchCompatibilityDialog(
onClose = { showDialog = false },
patchClass = patchClass,
)
}
InputChip(
selected = false,
onClick = { showDialog = true },
leadingIcon = {
Icon(
Icons.Default.Warning,
tint = MaterialTheme.colorScheme.primary,
contentDescription = stringResource(id = R.string.unsupported_version)
)
},
label = { Text(stringResource(id = R.string.unsupported_version)) }
)
}
}
}
}
}
}
}

View File

@ -1,33 +1,25 @@
package app.revanced.manager.ui.screen.subscreens package app.revanced.manager.ui.screen.subscreens
import android.annotation.SuppressLint import android.annotation.SuppressLint
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.* import androidx.compose.material.icons.filled.*
import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import app.revanced.manager.R import app.revanced.manager.R
import app.revanced.manager.patcher.PatcherUtils import app.revanced.manager.patcher.PatcherUtils
import app.revanced.manager.ui.Resource import app.revanced.manager.ui.Resource
import app.revanced.manager.ui.component.LoadingIndicator import app.revanced.manager.ui.component.LoadingIndicator
import app.revanced.manager.ui.component.PatchCompatibilityDialog import app.revanced.manager.ui.component.PatchCard
import app.revanced.manager.ui.navigation.AppDestination import app.revanced.manager.ui.navigation.AppDestination
import app.revanced.manager.ui.theme.Typography
import app.revanced.manager.ui.viewmodel.PatchClass
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel
import app.revanced.patcher.extensions.PatchExtensions.description
import app.revanced.patcher.extensions.PatchExtensions.options
import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.extensions.PatchExtensions.version
import com.xinto.taxi.BackstackNavigator import com.xinto.taxi.BackstackNavigator
import org.koin.androidx.compose.get import org.koin.androidx.compose.get
import org.koin.androidx.compose.getViewModel import org.koin.androidx.compose.getViewModel
@ -149,110 +141,4 @@ fun PatchesSelectorSubscreen(
} }
} }
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PatchCard(patchClass: PatchClass, isSelected: Boolean, onSelected: () -> Unit) {
val patch = patchClass.patch
val name = patch.patchName
var showDialog by remember { mutableStateOf(false) }
ElevatedCard(
modifier = Modifier
.padding(16.dp, 4.dp),
enabled = !patchClass.unsupported,
onClick = onSelected
) {
Column(modifier = Modifier.padding(12.dp, 0.dp, 12.dp, 12.dp)) {
Row {
Column(
Modifier
.align(Alignment.CenterVertically)
) {
Text(
text = name.replace("-", " ").split(" ")
.joinToString(" ") { it.replaceFirstChar(Char::uppercase) },
style = MaterialTheme.typography.titleMedium
)
}
Spacer(Modifier.width(4.dp))
Row(
Modifier
.align(Alignment.CenterVertically)
) {
Text(
text = patch.version ?: "unknown",
style = Typography.bodySmall
)
}
Spacer(Modifier.weight(1f, true))
Column(modifier = Modifier.padding(0.dp, 6.dp)) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(4.dp)
) {
if (patchClass.patch.options != null) {
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
IconButton(onClick = { }, modifier = Modifier.size(24.dp)) {
Icon(
Icons.Outlined.Settings,
contentDescription = "Patch Options"
)
}
}
}
Spacer(Modifier.width(8.dp))
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
Checkbox(
enabled = !patchClass.unsupported,
checked = isSelected,
onCheckedChange = { onSelected() }
)
}
}
}
}
var isExpanded by remember { mutableStateOf(false) }
patch.description?.let { desc ->
Text(
text = desc,
modifier = Modifier
.padding(0.dp, 8.dp, 22.dp, 8.dp)
.clickable { isExpanded = !isExpanded },
maxLines = if (isExpanded) Int.MAX_VALUE else 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodyMedium
)
}
if (patchClass.unsupported) {
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
Column {
Row {
if (showDialog) {
PatchCompatibilityDialog(
onClose = { showDialog = false },
patchClass = patchClass,
)
}
InputChip(
selected = false,
onClick = { showDialog = true },
leadingIcon = {
Icon(
Icons.Default.Warning,
tint = MaterialTheme.colorScheme.primary,
contentDescription = stringResource(id = R.string.unsupported_version)
)
},
label = { Text(stringResource(id = R.string.unsupported_version)) }
)
}
}
}
}
}
}
}