From d3dbe332625119feb18c794fd36caa761fe86823 Mon Sep 17 00:00:00 2001 From: Aunali321 <48486084+Aunali321@users.noreply.github.com> Date: Mon, 1 May 2023 00:57:14 +0530 Subject: [PATCH] feat: Dashboard Screen (#18) * feat: add Dashboard Screen and Sources Screen * fix: fix tab onClick not working * refactor: remove AppBar --------- Co-authored-by: CnC-Robert --- .gitignore | 4 + .idea/kotlinc.xml | 6 ++ app/build.gradle.kts | 6 +- .../revanced/manager/compose/MainActivity.kt | 13 ++- .../manager/compose/ManagerApplication.kt | 1 - .../compose/destination/AppDestination.kt | 4 +- .../compose/ui/screen/DashboardScreen.kt | 102 ++++++++++++++++++ .../compose/ui/screen/InstalledAppsScreen.kt | 23 ++++ .../compose/ui/screen/SourcesScreen.kt | 23 ++++ app/src/main/res/values/strings.xml | 5 + build.gradle.kts | 4 +- gradle.properties | 4 +- 12 files changed, 183 insertions(+), 12 deletions(-) create mode 100644 .idea/kotlinc.xml create mode 100644 app/src/main/java/app/revanced/manager/compose/ui/screen/DashboardScreen.kt create mode 100644 app/src/main/java/app/revanced/manager/compose/ui/screen/InstalledAppsScreen.kt create mode 100644 app/src/main/java/app/revanced/manager/compose/ui/screen/SourcesScreen.kt diff --git a/.gitignore b/.gitignore index aa724b7..154ff10 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,13 @@ /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml +/.idea/deploymentTargetDropDown.xml +/.idea/misc.xml +/.idea/gradle.xml .DS_Store /build /captures .externalNativeBuild .cxx local.properties + diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..69e8615 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9b25cbe..61b779f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,9 +48,11 @@ dependencies { implementation("androidx.activity:activity-compose:1.7.1") // Compose - implementation(platform("androidx.compose:compose-bom:2023.04.00")) + implementation(platform("androidx.compose:compose-bom:2023.04.01")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.paging:paging-common-ktx:3.1.1") + implementation("androidx.core:core-ktx:1.10.0") // Accompanist val accompanistVersion = "0.30.1" @@ -68,7 +70,7 @@ dependencies { // ReVanced - implementation("app.revanced:revanced-patcher:6.4.3") + implementation("app.revanced:revanced-patcher:7.0.0") // Koin implementation("io.insert-koin:koin-android:3.4.0") diff --git a/app/src/main/java/app/revanced/manager/compose/MainActivity.kt b/app/src/main/java/app/revanced/manager/compose/MainActivity.kt index bdc0531..2585240 100644 --- a/app/src/main/java/app/revanced/manager/compose/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/compose/MainActivity.kt @@ -5,12 +5,15 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.isSystemInDarkTheme -import app.revanced.manager.compose.domain.manager.PreferencesManager import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import app.revanced.manager.compose.destination.Destination +import app.revanced.manager.compose.domain.manager.PreferencesManager +import app.revanced.manager.compose.ui.screen.DashboardScreen import app.revanced.manager.compose.ui.theme.ReVancedManagerTheme import app.revanced.manager.compose.ui.theme.Theme -import dev.olshevski.navigation.reimagined.* +import dev.olshevski.navigation.reimagined.AnimatedNavHost +import dev.olshevski.navigation.reimagined.NavBackHandler +import dev.olshevski.navigation.reimagined.rememberNavController import org.koin.android.ext.android.inject class MainActivity : ComponentActivity() { @@ -26,7 +29,7 @@ class MainActivity : ComponentActivity() { darkTheme = prefs.theme == Theme.SYSTEM && isSystemInDarkTheme() || prefs.theme == Theme.DARK, dynamicColor = prefs.dynamicColor ) { - val navController = rememberNavController(startDestination = Destination.Home) + val navController = rememberNavController(startDestination = Destination.Dashboard) NavBackHandler(navController) @@ -34,7 +37,9 @@ class MainActivity : ComponentActivity() { controller = navController, ) { destination -> when (destination) { - Destination.Home -> {} // TODO: Add screens + is Destination.Dashboard -> { + DashboardScreen() + } } } } diff --git a/app/src/main/java/app/revanced/manager/compose/ManagerApplication.kt b/app/src/main/java/app/revanced/manager/compose/ManagerApplication.kt index 2a44586..2053c0f 100644 --- a/app/src/main/java/app/revanced/manager/compose/ManagerApplication.kt +++ b/app/src/main/java/app/revanced/manager/compose/ManagerApplication.kt @@ -16,7 +16,6 @@ class ManagerApplication: Application() { preferencesModule, repositoryModule, serviceModule, - viewModelModule ) } } diff --git a/app/src/main/java/app/revanced/manager/compose/destination/AppDestination.kt b/app/src/main/java/app/revanced/manager/compose/destination/AppDestination.kt index 192e92e..22de227 100644 --- a/app/src/main/java/app/revanced/manager/compose/destination/AppDestination.kt +++ b/app/src/main/java/app/revanced/manager/compose/destination/AppDestination.kt @@ -6,6 +6,6 @@ import kotlinx.parcelize.Parcelize sealed interface Destination: Parcelable { @Parcelize - object Home: Destination + object Dashboard: Destination -} // TODO: Add screens \ No newline at end of file +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/compose/ui/screen/DashboardScreen.kt b/app/src/main/java/app/revanced/manager/compose/ui/screen/DashboardScreen.kt new file mode 100644 index 0000000..bca37a1 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/compose/ui/screen/DashboardScreen.kt @@ -0,0 +1,102 @@ +package app.revanced.manager.compose.ui.screen + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.outlined.Info +import androidx.compose.material.icons.outlined.Notifications +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Tab +import androidx.compose.material3.TabRow +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import app.revanced.manager.compose.R +import kotlinx.coroutines.launch + +enum class DashboardPage( + val titleResId: Int, +) { + DASHBOARD(R.string.tab_apps), + SOURCES(R.string.tab_sources), +} + + +@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) +@Composable +fun DashboardScreen() { + val pages: Array = DashboardPage.values() + + val pagerState = rememberPagerState() + val coroutineScope = rememberCoroutineScope() + + Scaffold( + topBar = { + TopAppBar( + title = { Text("ReVanced Manager") }, + actions = { + IconButton(onClick = {}) { + Icon(imageVector = Icons.Outlined.Info, contentDescription = null) + } + IconButton(onClick = {}) { + Icon(imageVector = Icons.Outlined.Notifications, contentDescription = null) + } + IconButton(onClick = {}) { + Icon(imageVector = Icons.Outlined.Settings, contentDescription = null) + } + } + ) + }, + floatingActionButton = { + FloatingActionButton(onClick = {}) { + Icon(imageVector = Icons.Default.Add, contentDescription = null) + } + } + ) { paddingValues -> + Column(Modifier.padding(paddingValues)) { + TabRow(selectedTabIndex = pagerState.currentPage) { + pages.forEachIndexed { index, page -> + val title = stringResource(id = page.titleResId) + Tab( + selected = pagerState.currentPage == index, + onClick = { coroutineScope.launch { pagerState.animateScrollToPage(index) } }, + text = { Text(text = title) }, + selectedContentColor = MaterialTheme.colorScheme.primary, + unselectedContentColor = MaterialTheme.colorScheme.onSurface, + ) + } + } + + HorizontalPager( + pageCount = pages.size, + state = pagerState, + userScrollEnabled = true, + contentPadding = paddingValues, + pageContent = { index -> + when (pages[index]) { + DashboardPage.DASHBOARD -> { + InstalledAppsScreen() + } + + DashboardPage.SOURCES -> { + SourcesScreen() + } + } + } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/compose/ui/screen/InstalledAppsScreen.kt b/app/src/main/java/app/revanced/manager/compose/ui/screen/InstalledAppsScreen.kt new file mode 100644 index 0000000..6774c06 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/compose/ui/screen/InstalledAppsScreen.kt @@ -0,0 +1,23 @@ +package app.revanced.manager.compose.ui.screen + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.sp +import app.revanced.manager.compose.R + +@Composable +fun InstalledAppsScreen() { + Box(Modifier.fillMaxSize()) { + Text( + text = stringResource(R.string.no_patched_apps_found), + fontSize = 24.sp, + modifier = Modifier + .align(alignment = Alignment.Center) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/compose/ui/screen/SourcesScreen.kt b/app/src/main/java/app/revanced/manager/compose/ui/screen/SourcesScreen.kt new file mode 100644 index 0000000..3d9f1e0 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/compose/ui/screen/SourcesScreen.kt @@ -0,0 +1,23 @@ +package app.revanced.manager.compose.ui.screen + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.sp +import app.revanced.manager.compose.R + +@Composable +fun SourcesScreen() { + Box(Modifier.fillMaxSize()) { + Text( + text = stringResource(R.string.no_sources_set), + fontSize = 24.sp, + modifier = Modifier + .align(alignment = Alignment.Center) + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dcd4980..07b500f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,8 @@ ReVanced Manager + Dashboard + Apps + Sources + No sources set + No patched apps found \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 4b3dd00..609150b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.android.application") version "7.4.2" apply false - id("com.android.library") version "7.4.2" apply false + id("com.android.application") version "8.0.0" apply false + id("com.android.library") version "8.0.0" apply false id("org.jetbrains.kotlin.android") version "1.8.20" apply false } diff --git a/gradle.properties b/gradle.properties index 3c5031e..a2e90d8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,6 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +android.defaults.buildfeatures.buildconfig=true +android.nonFinalResIds=false \ No newline at end of file