From 7b19a4fb837c791009859068ed4739e2a56b2f56 Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 12 Oct 2022 01:42:53 +0300 Subject: [PATCH] feat: source selector screen skeleton --- .../java/app/revanced/manager/MainActivity.kt | 7 +- .../manager/ui/component/SourceItem.kt | 82 +++++++++++++++++++ .../manager/ui/navigation/AppDestination.kt | 3 + .../manager/ui/screen/MainDashboardScreen.kt | 1 + .../manager/ui/screen/PatcherScreen.kt | 58 ++++++++----- .../subscreens/SourceSelectorSubscreen.kt | 79 ++++++++++++++++++ app/src/main/res/drawable/uwu.xml | 9 ++ app/src/main/res/values/strings.xml | 2 + 8 files changed, 215 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/component/SourceItem.kt create mode 100644 app/src/main/java/app/revanced/manager/ui/screen/subscreens/SourceSelectorSubscreen.kt create mode 100644 app/src/main/res/drawable/uwu.xml diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index 8406e2a..bf11f42 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -21,11 +21,7 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import app.revanced.manager.preferences.PreferencesManager import app.revanced.manager.ui.navigation.AppDestination import app.revanced.manager.ui.screen.MainDashboardScreen -import app.revanced.manager.ui.screen.subscreens.PatchingSubscreen -import app.revanced.manager.ui.screen.subscreens.AppSelectorSubscreen -import app.revanced.manager.ui.screen.subscreens.ContributorsSubscreen -import app.revanced.manager.ui.screen.subscreens.LicensesSubscreen -import app.revanced.manager.ui.screen.subscreens.PatchesSelectorSubscreen +import app.revanced.manager.ui.screen.subscreens.* import app.revanced.manager.ui.theme.ReVancedManagerTheme import app.revanced.manager.ui.theme.Theme import com.xinto.taxi.Taxi @@ -61,6 +57,7 @@ class MainActivity : ComponentActivity() { is AppDestination.AppSelector -> AppSelectorSubscreen(navigator = navigator) is AppDestination.PatchSelector -> PatchesSelectorSubscreen(navigator = navigator) is AppDestination.Contributors -> ContributorsSubscreen(navigator = navigator) + is AppDestination.SourceSelector -> SourceSelectorSubscreen(navigator = navigator) is AppDestination.Licenses -> LicensesSubscreen(navigator = navigator) is AppDestination.Patcher -> PatchingSubscreen(navigator = navigator) } diff --git a/app/src/main/java/app/revanced/manager/ui/component/SourceItem.kt b/app/src/main/java/app/revanced/manager/ui/component/SourceItem.kt new file mode 100644 index 0000000..a740ecd --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/component/SourceItem.kt @@ -0,0 +1,82 @@ +package app.revanced.manager.ui.component + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import app.revanced.manager.R +import coil.compose.AsyncImage + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun SourceItem() { + Row( + modifier = Modifier + .padding(top = 8.dp) + .clickable { } + ) { + AsyncImage( + model = "https://github.com/ushie.png", + contentDescription = stringResource(id = R.string.contributor_image), + modifier = Modifier + .padding(4.dp, 4.dp, 10.dp, 4.dp) + .size(50.dp) + .clip(RoundedCornerShape(20)) + ) + Column { + Row(Modifier.padding(vertical = 5.dp)) { + Text( + text = "Ushie", + style = MaterialTheme.typography.bodyLarge + ) + Spacer(Modifier.width(4.dp)) + Text( + modifier = Modifier.align(Alignment.CenterVertically), + text = "2.52.5", + style = MaterialTheme.typography.bodySmall + ) + } + Row { + Icon( + modifier = Modifier.size(18.dp), + painter = painterResource(R.drawable.ic_github), + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.width(4.dp)) + Text( + text = "Ushie/revanced-patches", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + Spacer(Modifier.weight(1f)) + Box( + Modifier + .align(Alignment.CenterVertically) + ) { + IconButton(onClick = { /*TODO*/ }) { + Icon( + imageVector = Icons.Default.Settings, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/navigation/AppDestination.kt b/app/src/main/java/app/revanced/manager/ui/navigation/AppDestination.kt index 6b62e5f..34263f4 100644 --- a/app/src/main/java/app/revanced/manager/ui/navigation/AppDestination.kt +++ b/app/src/main/java/app/revanced/manager/ui/navigation/AppDestination.kt @@ -25,6 +25,9 @@ sealed interface AppDestination : Destination { @Parcelize object Patcher : AppDestination + @Parcelize + object SourceSelector : AppDestination + @Parcelize object Licenses : AppDestination diff --git a/app/src/main/java/app/revanced/manager/ui/screen/MainDashboardScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/MainDashboardScreen.kt index 2aff646..dc33550 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/MainDashboardScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/MainDashboardScreen.kt @@ -71,6 +71,7 @@ fun MainDashboardScreen(navigator: BackstackNavigator) { onClickAppSelector = { navigator.push(AppDestination.AppSelector) }, onClickPatchSelector = { navigator.push(AppDestination.PatchSelector) }, onClickPatch = { navigator.push(AppDestination.Patcher) }, + onClickSourceSelector = { navigator.push(AppDestination.SourceSelector) } ) DashboardDestination.SETTINGS -> SettingsScreen( onClickContributors = { navigator.push(AppDestination.Contributors) }, diff --git a/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt index ecb372e..3ffe038 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt @@ -27,6 +27,7 @@ fun PatcherScreen( onClickAppSelector: () -> Unit, onClickPatchSelector: () -> Unit, onClickPatch: () -> Unit, + onClickSourceSelector: () -> Unit, viewModel: PatcherScreenViewModel = getViewModel() ) { val selectedAmount = selectedPatches.size @@ -35,20 +36,21 @@ fun PatcherScreen( val patchesLoaded = patches.value is Resource.Success var showDialog by remember { mutableStateOf(false) } - Scaffold(floatingActionButton = { - FloatingActionButton( - enabled = hasAppSelected && viewModel.anyPatchSelected(), - onClick = { - if (viewModel.checkSplitApk()) { - showDialog = true - } else { - onClickPatch(); viewModel.loadPatches0() - } - }, // TODO: replace this with something better - icon = { Icon(Icons.Default.Build, contentDescription = "Patch") }, - text = { Text(text = "Patch") } - ) - }) { paddingValues -> + Scaffold( + floatingActionButton = { + FloatingActionButton( + enabled = hasAppSelected && viewModel.anyPatchSelected(), + onClick = { + if (viewModel.checkSplitApk()) { + showDialog = true + } else { + onClickPatch(); viewModel.loadPatches0() + } + }, // TODO: replace this with something better + icon = { Icon(Icons.Default.Build, contentDescription = "Patch") }, + text = { Text(text = "Patch") } + ) + }) { paddingValues -> Column( modifier = Modifier .fillMaxSize() @@ -57,9 +59,22 @@ fun PatcherScreen( ) { if (showDialog) SplitAPKDialog(onDismiss = { showDialog = false }, onConfirm = onClickPatch) - Card( + ElevatedCard( modifier = Modifier - .padding(4.dp) + .padding(vertical = 4.dp) + .fillMaxWidth(), + onClick = onClickSourceSelector + ) { + Column(modifier = Modifier.padding(16.dp)) { + Text( + text = stringResource(id = R.string.select_sources), + style = MaterialTheme.typography.titleMedium + ) + } + } + ElevatedCard( + modifier = Modifier + .padding(vertical = 4.dp) .fillMaxWidth(), enabled = patchesLoaded, onClick = onClickAppSelector @@ -73,19 +88,20 @@ fun PatcherScreen( text = if (patchesLoaded) { if (selectedAppPackage.isPresent) { selectedAppPackage.get().packageName + } else { + stringResource(R.string.card_application_not_selected) } - else {stringResource(R.string.card_application_not_selected)} } else { stringResource(R.string.card_application_not_loaded) }, style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(0.dp, 8.dp) + modifier = Modifier.padding(vertical = 8.dp) ) } } - Card( + ElevatedCard( modifier = Modifier - .padding(4.dp) + .padding(vertical = 4.dp) .fillMaxWidth(), enabled = hasAppSelected, onClick = onClickPatchSelector @@ -104,7 +120,7 @@ fun PatcherScreen( stringResource(R.string.card_patches_body_patches) }, style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(0.dp, 8.dp) + modifier = Modifier.padding(vertical = 8.dp) ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screen/subscreens/SourceSelectorSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/subscreens/SourceSelectorSubscreen.kt new file mode 100644 index 0000000..0b05c49 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screen/subscreens/SourceSelectorSubscreen.kt @@ -0,0 +1,79 @@ +package app.revanced.manager.ui.screen.subscreens + +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Alignment.Companion.CenterVertically +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import app.revanced.manager.R +import app.revanced.manager.ui.component.SourceItem +import app.revanced.manager.ui.navigation.AppDestination +import app.revanced.manager.ui.theme.Typography +import coil.compose.AsyncImage +import com.xinto.taxi.BackstackNavigator + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) +@Composable +fun SourceSelectorSubscreen( + navigator: BackstackNavigator +) { + val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( + state = rememberTopAppBarState(), + canScroll = { true } + ) + Scaffold( + modifier = Modifier + .nestedScroll(scrollBehavior.nestedScrollConnection), + topBar = { + LargeTopAppBar( + title = { Text(text = stringResource(R.string.select_sources)) }, + navigationIcon = { + IconButton(onClick = navigator::pop) { + Icon(imageVector = Icons.Default.ArrowBack, contentDescription = null) + } + }, + scrollBehavior = scrollBehavior + ) + }, + floatingActionButton = { + FloatingActionButton(onClick = { /* TODO */ }) { + Icon(imageVector = Icons.Default.Add, contentDescription = null) + } + } + ) { paddingValues -> + Column( + modifier = Modifier + .padding(paddingValues) + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()) + ) { + ListItem( + modifier = Modifier + .clickable { /* TODO */ }, + headlineText = { Text(stringResource(R.string.select_bundle_from_storage)) }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.uwu), + contentDescription = null + ) + } + ) + Divider() + SourceItem() + SourceItem() + SourceItem() + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/uwu.xml b/app/src/main/res/drawable/uwu.xml new file mode 100644 index 0000000..38355d2 --- /dev/null +++ b/app/src/main/res/drawable/uwu.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c0d6763..4cf7757 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,4 +79,6 @@ Warning You have selected a resource patch and a split APK installation was detected so patching errors can occur.\nAre you sure you want to proceed with patching a split base APK? Open source licenses + Select sources + Select a bundle from storage \ No newline at end of file