From accc6ad4c5ea80494f4d0bd1f97762a1205c00f3 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 18 Dec 2022 03:54:59 +0300 Subject: [PATCH] feat: app info screen --- .../java/app/revanced/manager/MainActivity.kt | 6 +- .../manager/ui/navigation/AppDestination.kt | 4 + .../manager/ui/screen/DashboardScreen.kt | 16 +- .../ui/screen/subscreens/AppInfoSubscreen.kt | 226 ++++++++++++++++++ .../ui/viewmodel/PatchingScreenViewModel.kt | 8 +- app/src/main/res/values/strings.xml | 2 + 6 files changed, 254 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/screen/subscreens/AppInfoSubscreen.kt diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index dacbb11..38fea74 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -21,6 +21,7 @@ import app.revanced.manager.ui.screen.SettingsScreen import app.revanced.manager.ui.screen.subscreens.* import app.revanced.manager.ui.theme.ReVancedManagerTheme import app.revanced.manager.ui.theme.Theme +import app.revanced.manager.ui.viewmodel.PatchedApp import dev.olshevski.navigation.reimagined.* import io.sentry.SentryOptions import io.sentry.android.core.SentryAndroid @@ -73,7 +74,9 @@ class MainActivity : ComponentActivity() { onNavChanged = { navController.replaceLast(it) } ) { when (destination) { - AppDestination.Dashboard -> DashboardScreen() + AppDestination.Dashboard -> DashboardScreen( + onClickAppInfo = { PatchedApp -> navController.navigate(AppDestination.AppInfo(PatchedApp)) } + ) AppDestination.Patcher -> PatcherScreen( onClickAppSelector = { navController.navigate(AppDestination.AppSelector) }, onClickPatchSelector = { navController.navigate(AppDestination.PatchSelector) }, @@ -86,6 +89,7 @@ class MainActivity : ComponentActivity() { ) } } + is AppDestination.AppInfo -> AppInfoSubscreen(onBackClick = { navController.back() }, patchedApp = destination.patchedApp) is AppDestination.AppSelector -> AppSelectorSubscreen(onBackClick = { navController.back() }) is AppDestination.PatchSelector -> PatchesSelectorSubscreen(onBackClick = { navController.back() }) is AppDestination.Contributors -> ContributorsSubscreen(onBackClick = { navController.back() }) 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 c0d45a7..ef577be 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 @@ -12,6 +12,7 @@ import androidx.compose.material.icons.outlined.Dashboard import androidx.compose.material.icons.outlined.Settings import androidx.compose.ui.graphics.vector.ImageVector import app.revanced.manager.R +import app.revanced.manager.ui.viewmodel.PatchedApp import dev.olshevski.navigation.reimagined.NavController import dev.olshevski.navigation.reimagined.pop import dev.olshevski.navigation.reimagined.replaceAll @@ -45,6 +46,9 @@ sealed interface AppDestination : Parcelable { @Parcelize object Patching : AppDestination + @Parcelize + class AppInfo(val patchedApp: PatchedApp) : AppDestination + @Parcelize object SourceSelector : AppDestination diff --git a/app/src/main/java/app/revanced/manager/ui/screen/DashboardScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/DashboardScreen.kt index 4147881..e864b8a 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/DashboardScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/DashboardScreen.kt @@ -16,14 +16,19 @@ import androidx.compose.ui.unit.dp import app.revanced.manager.R import app.revanced.manager.ui.component.AppIcon import app.revanced.manager.ui.component.ApplicationItem +import app.revanced.manager.ui.component.ApplicationItemDualTint import app.revanced.manager.ui.component.HeadlineWithCard import app.revanced.manager.ui.viewmodel.DashboardViewModel +import app.revanced.manager.ui.viewmodel.PatchedApp import app.revanced.manager.util.loadIcon import org.koin.androidx.compose.getViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable -fun DashboardScreen(viewModel: DashboardViewModel = getViewModel()) { +fun DashboardScreen( + viewModel: DashboardViewModel = getViewModel(), + onClickAppInfo: (PatchedApp) -> Unit +) { var showUpdates by remember { mutableStateOf(false) } val context = LocalContext.current val padHoriz = 16.dp @@ -87,7 +92,7 @@ fun DashboardScreen(viewModel: DashboardViewModel = getViewModel()) { verticalArrangement = Arrangement.spacedBy(12.dp) ) { viewModel.apps.forEach { - ApplicationItem( + ApplicationItemDualTint( appName = it.appName, appIcon = { AppIcon( @@ -96,9 +101,10 @@ fun DashboardScreen(viewModel: DashboardViewModel = getViewModel()) { size = 38 ) }, - releaseAgo = it.version - ) { - } + appVersion = it.appVersion, + onClick = { onClickAppInfo(it) }, + expandedContent = { Text("CANNNNNNNNNNNNNNNNNNNNNNNNNNNNNY") } + ) } } } diff --git a/app/src/main/java/app/revanced/manager/ui/screen/subscreens/AppInfoSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/subscreens/AppInfoSubscreen.kt new file mode 100644 index 0000000..d818617 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screen/subscreens/AppInfoSubscreen.kt @@ -0,0 +1,226 @@ +package app.revanced.manager.ui.screen.subscreens + +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Build +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.Launch +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import app.revanced.manager.R +import app.revanced.manager.ui.component.AppIcon +import app.revanced.manager.ui.component.AppMediumTopBar +import app.revanced.manager.ui.component.AppScaffold +import app.revanced.manager.ui.viewmodel.PatchedApp +import app.revanced.manager.util.loadIcon +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AppInfoSubscreen( + onBackClick: () -> Unit, + patchedApp: PatchedApp, +) { + val context = LocalContext.current + var showDialog by remember { mutableStateOf(false) } + + AppScaffold( + topBar = { scrollBehavior -> + AppMediumTopBar( + topBarTitle = stringResource(R.string.app_info), + scrollBehavior = scrollBehavior, + onBackClick = onBackClick + ) + } + ) { paddingValues -> + Column( + Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(paddingValues) + ) { + if (showDialog) { + AlertDialog( + title = { Text(text = "Applied patches") }, + onDismissRequest = { showDialog = false }, + confirmButton = { + TextButton(onClick = { showDialog = false }) { + Text(stringResource(R.string.dismiss)) + } + }, + text = { + LazyColumn { + items(count = patchedApp.appliedPatches.count()) { + Text(text = "\u2022 ${patchedApp.appliedPatches[it]}") + } + } + } + ) + } + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + AppIcon( + drawable = context.loadIcon(patchedApp.pkgName), + contentDescription = null, + size = 64 + ) + Text( + text = patchedApp.appName, + fontSize = 23.sp + ) + Text(patchedApp.appVersion) + Box( + modifier = Modifier + .fillMaxWidth() + .height(100.dp) + .padding(16.dp, 16.dp, 16.dp, 0.dp) + .clip(RoundedCornerShape(20.dp)) + .background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp)) + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .weight(1f) + .clickable { } + .fillMaxSize() + ) { + Icon( + imageVector = Icons.Outlined.Launch, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary + ) + Text( + text = "Launch", + color = MaterialTheme.colorScheme.primary, + fontSize = 16.sp, + fontWeight = FontWeight.Bold + ) + } + Divider( + modifier = Modifier + .width(.5.dp) + .fillMaxHeight() + .padding(vertical = 16.dp), + color = MaterialTheme.colorScheme.background + ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .weight(1f) + .clickable { } + .fillMaxSize() + ) { + Icon( + imageVector = Icons.Outlined.Delete, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary + ) + Text( + text = "Uninstall", + color = MaterialTheme.colorScheme.primary, + fontSize = 16.sp, + fontWeight = FontWeight.Bold + ) + } + Divider( + modifier = Modifier + .width(.5.dp) + .fillMaxHeight() + .padding(vertical = 16.dp), + color = MaterialTheme.colorScheme.background + ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .weight(1f) + .clickable { } + .fillMaxSize() + ) { + Icon( + imageVector = Icons.Outlined.Build, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary + ) + Text( + text = "Patch", + color = MaterialTheme.colorScheme.primary, + fontSize = 16.sp, + fontWeight = FontWeight.Bold + ) + } + } + } + ListItem( + headlineText = { + Text( + "Package name", + fontSize = 20.sp, + fontWeight = FontWeight(500) + ) + }, + supportingText = { + Text( + text = patchedApp.pkgName + ) + } + ) + ListItem( + headlineText = { + Text( + text = "Patched date", + fontSize = 20.sp, + fontWeight = FontWeight(500) + ) + }, + supportingText = { + Text( + text = patchedApp.patchedDate + ) + } + ) + ListItem( + modifier = Modifier.clickable { showDialog = true }, + headlineText = { + Text( + text = "Applied patches", + fontSize = 20.sp, + fontWeight = FontWeight(500) + ) + }, + supportingText = { + Text( + text = if (patchedApp.appliedPatches.count() == 1) { + "1 applied patch" + } else { + "${patchedApp.appliedPatches.count()} applied patches" + } + ) + } + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/PatchingScreenViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/PatchingScreenViewModel.kt index a2442d1..69a7e94 100644 --- a/app/src/main/java/app/revanced/manager/ui/viewmodel/PatchingScreenViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/PatchingScreenViewModel.kt @@ -21,6 +21,9 @@ import app.revanced.manager.patcher.PatcherUtils import app.revanced.manager.patcher.worker.PatcherWorker import app.revanced.manager.util.appName import java.io.File +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle class PatchingScreenViewModel( private val app: Application, @@ -125,8 +128,9 @@ class PatchingScreenViewModel( PatchedApp( appName = app.appName(applicationInfo), pkgName = applicationInfo.packageName, - version = versionName, - appliedPatches = patcherUtils.selectedPatches + appVersion = versionName, + appliedPatches = patcherUtils.selectedPatches, + patchedDate = LocalDateTime.now().format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)).toString() ) } ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e9eb6b..1f4b104 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,4 +66,6 @@ Failed! Permissions ReVanced Manager relies on some permissions to function properly, please give required permissions by pressing OK. + App info + Info \ No newline at end of file