Skip to content

Commit

Permalink
feat: app selector screen
Browse files Browse the repository at this point in the history
  • Loading branch information
CnC-Robert committed May 6, 2023
1 parent 9065c0d commit 54f0a69
Show file tree
Hide file tree
Showing 17 changed files with 575 additions and 113 deletions.
23 changes: 12 additions & 11 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,29 +46,29 @@ dependencies {
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
implementation("androidx.core:core-splashscreen:1.0.1")
implementation("androidx.activity:activity-compose:1.7.1")
implementation("androidx.paging:paging-common-ktx:3.1.1")

// Compose
implementation(platform("androidx.compose:compose-bom:2023.04.01"))
implementation(platform("androidx.compose:compose-bom:2023.05.00"))
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")
implementation("androidx.compose.material:material-icons-extended")
implementation("androidx.compose.material3:material3:1.1.0-rc01")

// Accompanist
val accompanistVersion = "0.30.1"
implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")
//val accompanistVersion = "0.30.1"
//implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-placeholder-material:$accompanistVersion")
implementation("com.google.accompanist:accompanist-drawablepainter:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-drawablepainter:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-flowlayout:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-permissions:$accompanistVersion")

// Coil (async image loading, network image)
implementation("io.coil-kt:coil-compose:2.2.2")

// KotlinX
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")

// Material 3
implementation("androidx.compose.material3:material3")


// ReVanced
implementation("app.revanced:revanced-patcher:7.0.0")

Expand All @@ -86,4 +86,5 @@ dependencies {
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
}

}
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
</intent-filter>
</activity>

<service android:name=".installer.service.InstallService" />
<service android:name=".installer.service.UninstallService" />
<service android:name=".service.InstallService" />
<service android:name=".service.UninstallService" />
</application>
</manifest>
30 changes: 25 additions & 5 deletions app/src/main/java/app/revanced/manager/compose/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,38 @@ import androidx.activity.compose.setContent
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.isSystemInDarkTheme
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.destination.Destination
import app.revanced.manager.compose.ui.screen.AppSelectorScreen
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 app.revanced.manager.compose.util.PM
import dev.olshevski.navigation.reimagined.AnimatedNavHost
import dev.olshevski.navigation.reimagined.NavBackHandler
import dev.olshevski.navigation.reimagined.navigate
import dev.olshevski.navigation.reimagined.pop
import dev.olshevski.navigation.reimagined.rememberNavController
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject

class MainActivity : ComponentActivity() {
private val prefs: PreferencesManager by inject()
private val mainScope = MainScope()

@ExperimentalAnimationApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

installSplashScreen()

val context = this
mainScope.launch(Dispatchers.IO) {
PM.loadApps(context)
}

setContent {
ReVancedManagerTheme(
darkTheme = prefs.theme == Theme.SYSTEM && isSystemInDarkTheme() || prefs.theme == Theme.DARK,
Expand All @@ -34,12 +48,18 @@ class MainActivity : ComponentActivity() {
NavBackHandler(navController)

AnimatedNavHost(
controller = navController,
controller = navController
) { destination ->
when (destination) {
is Destination.Dashboard -> {
DashboardScreen()
}

is Destination.Dashboard -> { DashboardScreen(
onAppSelectorClick = { navController.navigate(Destination.AppSelector) }
) }

is Destination.AppSelector -> AppSelectorScreen(
onBackClick = { navController.pop() }
)

}
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.revanced.manager.compose.installer.service
package app.revanced.manager.compose.service

import android.app.Service
import android.content.Intent
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.revanced.manager.compose.installer.service
package app.revanced.manager.compose.service

import android.app.Service
import android.content.Intent
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package app.revanced.manager.compose.ui.component

import android.graphics.drawable.Drawable
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Android
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.unit.dp
import coil.compose.rememberAsyncImagePainter

@Composable
fun AppIcon(
drawable: Drawable?,
contentDescription: String?,
size: Int = 48
) {
if (drawable == null) {
val image = rememberVectorPainter(Icons.Default.Android)
val colorFilter = ColorFilter.tint(LocalContentColor.current)

Image(
image,
contentDescription,
Modifier.size(size.dp),
colorFilter = colorFilter
)
} else {
val image = rememberAsyncImagePainter(drawable)

Image(
image,
contentDescription,
Modifier.size(size.dp)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package app.revanced.manager.compose.ui.component

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.dp

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AppScaffold(
topBar: @Composable (TopAppBarScrollBehavior) -> Unit = {},
bottomBar: @Composable () -> Unit = {},
floatingActionButton: @Composable () -> Unit = {},
content: @Composable (PaddingValues) -> Unit
) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { topBar(scrollBehavior) },
bottomBar = bottomBar,
floatingActionButton = floatingActionButton,
content = content
)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AppTopBar(
title: String,
onBackClick: (() -> Unit)? = null,
actions: @Composable (RowScope.() -> Unit) = {},
scrollBehavior: TopAppBarScrollBehavior? = null
) {
val containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.0.dp)

TopAppBar(
title = { Text(title) },
scrollBehavior = scrollBehavior,
navigationIcon = {
if (onBackClick != null) {
IconButton(onClick = onBackClick) {
Icon(
imageVector = Icons.Default.ArrowBack,
contentDescription = null
)
}
}
},
actions = actions,
colors = TopAppBarDefaults.topAppBarColors(
containerColor = containerColor
)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package app.revanced.manager.compose.ui.component

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CircularProgressIndicator
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.dp
import app.revanced.manager.compose.R

@Composable
fun LoadingIndicator(progress: Float? = null, text: Int? = R.string.loading_body) {
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
if (text != null)
Text(stringResource(text))
if (progress == null) {
CircularProgressIndicator(modifier = Modifier.padding(vertical = 16.dp))
} else {
CircularProgressIndicator(progress = progress, modifier = Modifier.padding(vertical = 16.dp))
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.revanced.manager.compose.destination
package app.revanced.manager.compose.ui.destination

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
Expand All @@ -8,4 +8,7 @@ sealed interface Destination: Parcelable {
@Parcelize
object Dashboard: Destination

@Parcelize
object AppSelector: Destination

}
Loading

0 comments on commit 54f0a69

Please sign in to comment.