diff --git a/.gitignore b/.gitignore
index aa724b77..154ff109 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 00000000..69e86158
--- /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 9b25cbed..61b779fe 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 bdc05311..25852407 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 2a44586f..2053c0f6 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 192e92e3..22de2271 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 00000000..bca37a17
--- /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 00000000..6774c066
--- /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 00000000..3d9f1e0a
--- /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 dcd4980d..07b500f8 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 4b3dd002..609150b3 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 3c5031eb..a2e90d87 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