From 3a2e7b2c3d16fe4b88e1e774dde6b5cdc5d4af45 Mon Sep 17 00:00:00 2001 From: Wing <44992537+wingio@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:02:14 -0500 Subject: [PATCH 1/3] Move libs to version catalog --- app/build.gradle.kts | 74 +++++++--------------------------- gradle/libs.versions.toml | 85 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 59 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 56c0e6e3..cda0a366 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -90,68 +90,24 @@ android { } dependencies { - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.core:core-splashscreen:1.0.1") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0") - implementation("androidx.paging:paging-compose:1.0.0-alpha18") - implementation("androidx.work:work-runtime-ktx:2.8.1") + implementation(platform(libs.compose.bom)) - implementation(platform("androidx.compose:compose-bom:2022.10.00")) - implementation("androidx.activity:activity-compose:1.7.1") - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3") - implementation("androidx.compose.material:material-icons-extended") + implementation(libs.bundles.accompanist) + implementation(libs.bundles.androidx) + implementation(libs.bundles.coil) + implementation(libs.bundles.compose) + implementation(libs.bundles.koin) + implementation(libs.bundles.ktor) + implementation(libs.bundles.shizuku) + implementation(libs.bundles.voyager) - val koinVersion = "3.2.0" - - implementation("io.insert-koin:koin-core:$koinVersion") - implementation("io.insert-koin:koin-android:$koinVersion") - implementation("io.insert-koin:koin-androidx-compose:$koinVersion") - - val accompanistVersion = "0.29.1-alpha" - - implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion") - implementation("com.google.accompanist:accompanist-pager:$accompanistVersion") - implementation("com.google.accompanist:accompanist-permissions:$accompanistVersion") - - val voyagerVersion = "1.0.0-rc03" - - implementation("cafe.adriel.voyager:voyager-navigator:$voyagerVersion") - implementation("cafe.adriel.voyager:voyager-tab-navigator:$voyagerVersion") - implementation("cafe.adriel.voyager:voyager-transitions:$voyagerVersion") - implementation("cafe.adriel.voyager:voyager-koin:$voyagerVersion") - - val coilVersion = "2.2.2" - - implementation("io.coil-kt:coil:$coilVersion") - implementation("io.coil-kt:coil-compose:$coilVersion") - - val ktorVersion = "2.1.1" - - implementation("io.ktor:ktor-client-core:$ktorVersion") - implementation("io.ktor:ktor-client-cio:$ktorVersion") - implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") - implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") - implementation("io.ktor:ktor-client-logging:$ktorVersion") - - val shizukuVersion = "13.1.0" - - implementation("dev.rikka.shizuku:api:$shizukuVersion") - implementation("dev.rikka.shizuku:provider:$shizukuVersion") - - implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.1") - implementation("io.github.diamondminer88:zip-android:2.1.1@aar") implementation(files("libs/lspatch.aar")) - - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2022.10.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") + implementation(libs.kotlinx.datetime) + implementation(libs.zip.android) { + artifact { + type = "aar" + } + } } fun getCurrentBranch(): String? = diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..16c1a984 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,85 @@ +[versions] + +# AndroidX +androidx-core-ktx = "1.9.0" +androidx-core-splashscreen = "1.0.1" +androidx-lifecycle-runtime = "2.6.0" +androidx-paging-compose = "1.0.0-alpha18" +androidx-work-runtime = "2.8.1" + +# Compose +compose-activity = "1.7.1" +compose-bom = "2022.10.00" + +# Misc. +accompanist = "0.29.1-alpha" +coil = "2.2.2" +koin = "3.2.0" +kotlinx-datetime = "0.4.1" +ktor = "2.1.1" +shizuku = "13.1.0" +voyager = "1.0.0-rc03" +zip-android = "2.1.1" + +[libraries] + +# Accompanist +accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanist" } +accompanist-permissions = { group = "com.google.accompanist", name = "accompanist-permissions", version.ref = "accompanist" } +accompanist-systemuicontroller = { group = "com.google.accompanist", name = "accompanist-systemuicontroller", version.ref = "accompanist" } + +# AndroidX +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core-ktx" } +androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidx-core-splashscreen" } +androidx-lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle-runtime" } +androidx-paging-compose = { group = "androidx.paging", name = "paging-compose", version.ref = "androidx-paging-compose" } +androidx-work-runtime = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "androidx-work-runtime" } + +# Coil +coil = { group = "io.coil-kt", name = "coil", version.ref = "coil" } +coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } + +# Compose +compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "compose-activity" } +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +compose-material3 = { group = "androidx.compose.material3", name = "material3" } +compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended" } +compose-ui = { group = "androidx.compose.ui", name = "ui" } +compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } + +# Koin +koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } +koin-androidx-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" } +koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } + +# Ktor +ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" } +ktor-client-cio = { group = "io.ktor", name = "ktor-client-cio", version.ref = "ktor" } +ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" } +ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" } +ktor-client-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktor" } + +# Shizuku +shizuku-api = { group = "dev.rikka.shizuku", name = "api", version.ref = "shizuku" } +shizuku-provider = { group = "dev.rikka.shizuku", name = "provider", version.ref = "shizuku" } + +# Voyager +voyager-navigator = { group = "cafe.adriel.voyager", name = "voyager-navigator", version.ref = "voyager" } +voyager-tab-navigator = { group = "cafe.adriel.voyager", name = "voyager-tab-navigator", version.ref = "voyager" } +voyager-transitions = { group = "cafe.adriel.voyager", name = "voyager-transitions", version.ref = "voyager" } +voyager-koin = { group = "cafe.adriel.voyager", name = "voyager-koin", version.ref = "voyager" } + +# Misc. +kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinx-datetime" } +zip-android = { group = "io.github.diamondminer88", name = "zip-android", version.ref = "zip-android" } + +[bundles] +accompanist = ["accompanist-pager", "accompanist-permissions", "accompanist-systemuicontroller"] +androidx = ["androidx-work-runtime", "androidx-paging-compose", "androidx-lifecycle-runtime", "androidx-core-splashscreen", "androidx-core-ktx"] +coil = ["coil", "coil-compose"] +compose = ["compose-activity", "compose-material-icons-extended", "compose-material3", "compose-ui", "compose-ui-graphics", "compose-ui-tooling-preview"] +koin = ["koin-android", "koin-androidx-compose", "koin-core"] +ktor = ["ktor-client-cio", "ktor-client-content-negotiation", "ktor-client-core", "ktor-client-logging", "ktor-serialization-kotlinx-json"] +shizuku = ["shizuku-api", "shizuku-provider"] +voyager = ["voyager-koin", "voyager-navigator", "voyager-tab-navigator", "voyager-transitions"] \ No newline at end of file From 0d1c1a9d9f362c7f2cf4545626100257aa80d22a Mon Sep 17 00:00:00 2001 From: Wing <44992537+wingio@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:25:38 -0500 Subject: [PATCH 2/3] Add plugins to version catalog --- app/build.gradle.kts | 6 +++--- build.gradle.kts | 6 +++--- gradle/libs.versions.toml | 11 ++++++++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cda0a366..874e9298 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,9 +1,9 @@ import java.io.ByteArrayOutputStream plugins { - id("com.android.application") - kotlin("android") - kotlin("plugin.serialization") version "1.7.20" + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.serialization) } android { diff --git a/build.gradle.kts b/build.gradle.kts index 278a8bbb..3ff35e6a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.2.0" apply false - id("com.android.library") version "8.2.0" apply false - kotlin("android") version "1.7.20" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlin.android) apply false } tasks.withType().all { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 16c1a984..6b44a2a0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,7 @@ [versions] +# Plugins +agp = "8.2.0" +kotlin = "1.7.20" # AndroidX androidx-core-ktx = "1.9.0" @@ -82,4 +85,10 @@ compose = ["compose-activity", "compose-material-icons-extended", "compose-mater koin = ["koin-android", "koin-androidx-compose", "koin-core"] ktor = ["ktor-client-cio", "ktor-client-content-negotiation", "ktor-client-core", "ktor-client-logging", "ktor-serialization-kotlinx-json"] shizuku = ["shizuku-api", "shizuku-provider"] -voyager = ["voyager-koin", "voyager-navigator", "voyager-tab-navigator", "voyager-transitions"] \ No newline at end of file +voyager = ["voyager-koin", "voyager-navigator", "voyager-tab-navigator", "voyager-transitions"] + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } \ No newline at end of file From 2db26b9d5f7381b88406e399e96071036310da05 Mon Sep 17 00:00:00 2001 From: Wing <44992537+wingio@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:43:57 -0500 Subject: [PATCH 3/3] Bump dependencies --- app/build.gradle.kts | 2 +- .../vendetta/manager/di/ViewModelModule.kt | 2 - .../manager/network/service/HttpService.kt | 1 - .../manager/ui/activity/MainActivity.kt | 3 +- .../components/settings/SettingsTextField.kt | 1 - .../manager/ui/screen/home/HomeScreen.kt | 14 +--- .../ui/screen/installer/InstallerScreen.kt | 5 +- .../vendetta/manager/ui/theme/Theme.kt | 16 +--- .../ui/viewmodel/home/HomeViewModel.kt | 10 +-- .../viewmodel/installer/InstallerViewModel.kt | 15 ++-- .../ui/viewmodel/main/MainViewModel.kt | 77 ------------------- .../settings/AdvancedSettingsViewModel.kt | 4 +- .../manager/ui/widgets/about/ListItem.kt | 2 +- .../manager/ui/widgets/home/Commit.kt | 1 - .../manager/ui/widgets/home/CommitList.kt | 21 +++-- .../ui/widgets/settings/ThemePicker.kt | 57 +++++++------- .../ui/widgets/settings/ThemePickerOption.kt | 6 +- .../vendetta/manager/utils/LazyUtils.kt | 20 +++++ .../beefers/vendetta/manager/utils/Utils.kt | 3 +- gradle/libs.versions.toml | 31 ++++---- 20 files changed, 102 insertions(+), 189 deletions(-) delete mode 100644 app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt create mode 100644 app/src/main/java/dev/beefers/vendetta/manager/utils/LazyUtils.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 874e9298..5c2ac9da 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -60,7 +60,7 @@ android { } composeOptions { - kotlinCompilerExtensionVersion = "1.3.2" + kotlinCompilerExtensionVersion = "1.5.6" } androidComponents { diff --git a/app/src/main/java/dev/beefers/vendetta/manager/di/ViewModelModule.kt b/app/src/main/java/dev/beefers/vendetta/manager/di/ViewModelModule.kt index 8d4336fa..56a8c405 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/di/ViewModelModule.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/di/ViewModelModule.kt @@ -2,7 +2,6 @@ package dev.beefers.vendetta.manager.di import dev.beefers.vendetta.manager.ui.viewmodel.home.HomeViewModel import dev.beefers.vendetta.manager.ui.viewmodel.installer.InstallerViewModel -import dev.beefers.vendetta.manager.ui.viewmodel.main.MainViewModel import dev.beefers.vendetta.manager.ui.viewmodel.settings.AdvancedSettingsViewModel import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module @@ -10,6 +9,5 @@ import org.koin.dsl.module val viewModelModule = module { factoryOf(::InstallerViewModel) factoryOf(::AdvancedSettingsViewModel) - factoryOf(::MainViewModel) factoryOf(::HomeViewModel) } \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/network/service/HttpService.kt b/app/src/main/java/dev/beefers/vendetta/manager/network/service/HttpService.kt index 97a897c2..b0fc0f63 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/network/service/HttpService.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/network/service/HttpService.kt @@ -8,7 +8,6 @@ import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.request import io.ktor.client.statement.bodyAsText import io.ktor.http.isSuccess -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json class HttpService( diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/activity/MainActivity.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/activity/MainActivity.kt index 5ffd5dcd..7d98d57b 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/activity/MainActivity.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/activity/MainActivity.kt @@ -5,6 +5,7 @@ import android.content.pm.PackageManager import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.compose.animation.ExperimentalAnimationApi import androidx.core.app.ActivityCompat import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen @@ -26,9 +27,9 @@ class MainActivity : ComponentActivity() { private val preferences: PreferenceManager by inject() - @OptIn(ExperimentalAnimationApi::class) override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() + enableEdgeToEdge() super.onCreate(savedInstanceState) val version = intent.getStringExtra(Intents.Extras.VERSION) diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/components/settings/SettingsTextField.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/components/settings/SettingsTextField.kt index 7df39c4d..0b4fa8a3 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/components/settings/SettingsTextField.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/components/settings/SettingsTextField.kt @@ -6,7 +6,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -@OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsTextField( label: String, diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt index b95f4671..4c55a16b 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt @@ -2,19 +2,14 @@ package dev.beefers.vendetta.manager.ui.screen.home import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete @@ -23,8 +18,6 @@ import androidx.compose.material.icons.filled.OpenInNew import androidx.compose.material.icons.filled.Refresh import androidx.compose.material.icons.outlined.Settings import androidx.compose.material3.Button -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.Divider import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -39,14 +32,10 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.paging.LoadState import androidx.paging.compose.collectAsLazyPagingItems -import androidx.paging.compose.itemsIndexed import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.koin.getScreenModel import cafe.adriel.voyager.navigator.LocalNavigator @@ -60,7 +49,6 @@ import dev.beefers.vendetta.manager.ui.screen.settings.SettingsScreen import dev.beefers.vendetta.manager.ui.viewmodel.home.HomeViewModel import dev.beefers.vendetta.manager.ui.widgets.AppIcon import dev.beefers.vendetta.manager.ui.widgets.dialog.StoragePermissionsDialog -import dev.beefers.vendetta.manager.ui.widgets.home.Commit import dev.beefers.vendetta.manager.ui.widgets.home.CommitList import dev.beefers.vendetta.manager.ui.widgets.updater.UpdateDialog import dev.beefers.vendetta.manager.utils.Constants @@ -70,7 +58,7 @@ import org.koin.androidx.compose.get class HomeScreen : Screen { - @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) + @OptIn(ExperimentalFoundationApi::class) @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/installer/InstallerScreen.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/installer/InstallerScreen.kt index 7d06bc32..d47bd8e5 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/installer/InstallerScreen.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/installer/InstallerScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.core.util.Consumer import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.ScreenKey import cafe.adriel.voyager.koin.getScreenModel @@ -45,7 +44,6 @@ import dev.beefers.vendetta.manager.ui.widgets.dialog.BackWarningDialog import dev.beefers.vendetta.manager.ui.widgets.dialog.DownloadFailedDialog import dev.beefers.vendetta.manager.ui.widgets.installer.StepGroupCard import dev.beefers.vendetta.manager.utils.DiscordVersion -import kotlinx.coroutines.delay import org.koin.core.parameter.parametersOf import java.util.UUID @@ -56,7 +54,6 @@ class InstallerScreen( override val key: ScreenKey = "Installer-${UUID.randomUUID()}" @Composable - @OptIn(ExperimentalMaterial3Api::class) override fun Content() { val nav = LocalNavigator.currentOrThrow val activity = LocalContext.current as? ComponentActivity @@ -135,7 +132,7 @@ class InstallerScreen( .padding(16.dp) .verticalScroll(rememberScrollState()) ) { - for (group in InstallerViewModel.InstallStepGroup.values()) { + for (group in InstallerViewModel.InstallStepGroup.entries) { StepGroupCard( name = stringResource(group.nameRes), isCurrent = expandedGroup == group, diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/theme/Theme.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/theme/Theme.kt index f7ec4445..7d5d2208 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/theme/Theme.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/theme/Theme.kt @@ -1,6 +1,5 @@ package dev.beefers.vendetta.manager.ui.theme -import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme @@ -9,12 +8,7 @@ import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.core.view.WindowCompat -import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.beefers.vendetta.manager.domain.manager.PreferenceManager import dev.beefers.vendetta.manager.domain.manager.Theme import org.koin.androidx.compose.get @@ -30,7 +24,7 @@ fun VendettaManagerTheme( Theme.DARK -> true Theme.LIGHT -> false } - val systemUiController = rememberSystemUiController() + val colorScheme = when { dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { val context = LocalContext.current @@ -40,14 +34,6 @@ fun VendettaManagerTheme( darkTheme -> darkColorScheme() else -> lightColorScheme() } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - WindowCompat.setDecorFitsSystemWindows(window, false) - systemUiController.setSystemBarsColor(Color.Transparent, darkIcons = !darkTheme) - } - } MaterialTheme( colorScheme = colorScheme, diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt index 8877eeca..da2c291f 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt @@ -12,7 +12,7 @@ import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.cachedIn import cafe.adriel.voyager.core.model.ScreenModel -import cafe.adriel.voyager.core.model.coroutineScope +import cafe.adriel.voyager.core.model.screenModelScope import dev.beefers.vendetta.manager.BuildConfig import dev.beefers.vendetta.manager.domain.manager.DownloadManager import dev.beefers.vendetta.manager.domain.manager.InstallManager @@ -52,7 +52,7 @@ class HomeViewModel( var showUpdateDialog by mutableStateOf(false) var isUpdating by mutableStateOf(false) - val commits = Pager(PagingConfig(pageSize = 30)) { CommitsPagingSource(repo) }.flow.cachedIn(coroutineScope) + val commits = Pager(PagingConfig(pageSize = 30)) { CommitsPagingSource(repo) }.flow.cachedIn(screenModelScope) init { getDiscordVersions() @@ -60,7 +60,7 @@ class HomeViewModel( } fun getDiscordVersions() { - coroutineScope.launch { + screenModelScope.launch { discordVersions = repo.getLatestDiscordVersions().dataOrNull if (prefs.autoClearCache) autoClearCache() } @@ -106,7 +106,7 @@ class HomeViewModel( } private fun checkForUpdate() { - coroutineScope.launch { + screenModelScope.launch { release = repo.getLatestRelease("VendettaManager").dataOrNull release?.let { showUpdateDialog = it.tagName.toInt() > BuildConfig.VERSION_CODE @@ -122,7 +122,7 @@ class HomeViewModel( } fun downloadAndInstallUpdate() { - coroutineScope.launch { + screenModelScope.launch { val update = File(cacheDir, "update.apk") if (update.exists()) update.delete() isUpdating = true diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/installer/InstallerViewModel.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/installer/InstallerViewModel.kt index 37124382..c30d89c0 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/installer/InstallerViewModel.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/installer/InstallerViewModel.kt @@ -8,11 +8,12 @@ import android.util.Log import androidx.annotation.StringRes import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import cafe.adriel.voyager.core.model.ScreenModel -import cafe.adriel.voyager.core.model.coroutineScope +import cafe.adriel.voyager.core.model.screenModelScope import com.github.diamondminer88.zip.ZipCompression import com.github.diamondminer88.zip.ZipReader import com.github.diamondminer88.zip.ZipWriter @@ -41,7 +42,6 @@ import kotlinx.coroutines.withContext import org.lsposed.patch.util.Logger import java.io.File import java.util.concurrent.atomic.AtomicBoolean -import kotlin.time.ExperimentalTime import kotlin.time.measureTimedValue class InstallerViewModel( @@ -49,7 +49,7 @@ class InstallerViewModel( private val downloadManager: DownloadManager, private val preferences: PreferenceManager, private val discordVersion: DiscordVersion, - val installManager: InstallManager + private val installManager: InstallManager ) : ScreenModel { var backDialogOpened by mutableStateOf(false) private set @@ -119,7 +119,7 @@ class InstallerViewModel( } } - private val job = coroutineScope.launch(Dispatchers.Main) { + private val job = screenModelScope.launch(Dispatchers.Main) { if (installationRunning.getAndSet(true)) { return@launch } @@ -431,7 +431,6 @@ class InstallerViewModel( } } - @OptIn(ExperimentalTime::class) private inline fun step(step: InstallStep, block: InstallStepData.() -> T): T? { if (isFinished) return null steps[step]!!.status = InstallStatus.ONGOING @@ -470,7 +469,7 @@ class InstallerViewModel( DownloadResult.Success -> {} is DownloadResult.Cancelled -> { - if (result.systemTriggered) coroutineScope.launch(Dispatchers.Main) { + if (result.systemTriggered) screenModelScope.launch(Dispatchers.Main) { context.showToast(R.string.msg_download_cancelled) } @@ -478,7 +477,7 @@ class InstallerViewModel( } is DownloadResult.Error -> { - coroutineScope.launch(Dispatchers.Main) { + screenModelScope.launch(Dispatchers.Main) { context.showToast(R.string.msg_download_failed) } @@ -527,7 +526,7 @@ class InstallerViewModel( progress: Float? = null ) { var status by mutableStateOf(status) - var duration by mutableStateOf(duration) + var duration by mutableFloatStateOf(duration) var cached by mutableStateOf(cached) var progress by mutableStateOf(progress) } diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt deleted file mode 100644 index 645586d4..00000000 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt +++ /dev/null @@ -1,77 +0,0 @@ -package dev.beefers.vendetta.manager.ui.viewmodel.main - -import android.content.Context -import android.os.Environment -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue -import cafe.adriel.voyager.core.model.ScreenModel -import cafe.adriel.voyager.core.model.coroutineScope -import dev.beefers.vendetta.manager.BuildConfig -import dev.beefers.vendetta.manager.domain.manager.DownloadManager -import dev.beefers.vendetta.manager.domain.manager.InstallMethod -import dev.beefers.vendetta.manager.domain.manager.PreferenceManager -import dev.beefers.vendetta.manager.domain.repository.RestRepository -import dev.beefers.vendetta.manager.installer.Installer -import dev.beefers.vendetta.manager.installer.session.SessionInstaller -import dev.beefers.vendetta.manager.installer.shizuku.ShizukuInstaller -import dev.beefers.vendetta.manager.network.dto.Release -import dev.beefers.vendetta.manager.network.utils.dataOrNull -import dev.beefers.vendetta.manager.network.utils.ifSuccessful -import dev.beefers.vendetta.manager.utils.isMiui -import kotlinx.coroutines.launch -import java.io.File - -class MainViewModel( - private val repo: RestRepository, - private val downloadManager: DownloadManager, - private val preferenceManager: PreferenceManager, - private val context: Context -) : ScreenModel { - private val cacheDir = context.externalCacheDir ?: File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DOWNLOADS).resolve("VendettaManager").also { it.mkdirs() } - var release by mutableStateOf(null) - private set - - var showUpdateDialog by mutableStateOf(false) - - var isUpdating by mutableStateOf(false) - - init { - checkForUpdate() - } - - private fun checkForUpdate() { - coroutineScope.launch { - release = repo.getLatestRelease("VendettaManager").dataOrNull - release?.let { - showUpdateDialog = it.tagName.toInt() > BuildConfig.VERSION_CODE - } - repo.getLatestRelease("VendettaXposed").ifSuccessful { - if (preferenceManager.moduleVersion != it.tagName) { - preferenceManager.moduleVersion = it.tagName - val module = File(cacheDir, "vendetta.apk") - if (module.exists()) module.delete() - } - } - } - } - - fun downloadAndInstallUpdate() { - coroutineScope.launch { - val update = File(cacheDir, "update.apk") - if (update.exists()) update.delete() - isUpdating = true - downloadManager.downloadUpdate(update) - isUpdating = false - - val installer: Installer = if (preferenceManager.installMethod == InstallMethod.SHIZUKU) { - ShizukuInstaller(context) - } else { - SessionInstaller(context) - } - - installer.installApks(silent = !isMiui, update) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/settings/AdvancedSettingsViewModel.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/settings/AdvancedSettingsViewModel.kt index 2c7fa54e..01f1eca7 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/settings/AdvancedSettingsViewModel.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/settings/AdvancedSettingsViewModel.kt @@ -6,7 +6,7 @@ import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager import cafe.adriel.voyager.core.model.ScreenModel -import cafe.adriel.voyager.core.model.coroutineScope +import cafe.adriel.voyager.core.model.screenModelScope import dev.beefers.vendetta.manager.R import dev.beefers.vendetta.manager.domain.manager.InstallMethod import dev.beefers.vendetta.manager.domain.manager.PreferenceManager @@ -45,7 +45,7 @@ class AdvancedSettingsViewModel( fun setInstallMethod(method: InstallMethod) { when (method) { - InstallMethod.SHIZUKU -> coroutineScope.launch { + InstallMethod.SHIZUKU -> screenModelScope.launch { if (ShizukuPermissions.waitShizukuPermissions()) { prefs.installMethod = InstallMethod.SHIZUKU } else { diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt index 010d3cd4..462aee33 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt @@ -32,7 +32,7 @@ fun ListItem( modifier = Modifier .clickable( enabled = onClick != null, - onClick = onClick ?: { -> } + onClick = onClick ?: { } ) .padding(16.dp) .fillMaxWidth() diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/Commit.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/Commit.kt index a01dc56f..0085c6aa 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/Commit.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/Commit.kt @@ -1,6 +1,5 @@ package dev.beefers.vendetta.manager.ui.widgets.home -import android.annotation.SuppressLint import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/CommitList.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/CommitList.kt index aba36f67..32774fa5 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/CommitList.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/home/CommitList.kt @@ -20,9 +20,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems -import androidx.paging.compose.itemsIndexed import dev.beefers.vendetta.manager.R import dev.beefers.vendetta.manager.network.dto.Commit +import dev.beefers.vendetta.manager.utils.itemsIndexed @Composable fun CommitList( @@ -38,18 +38,15 @@ fun CommitList( items = commits, key = { _, commit -> commit.sha } ) { i, commit -> - if (commit != null) { - Column { - Commit(commit = commit) - if (i < commits.itemSnapshotList.lastIndex) { - Divider( - thickness = 0.5.dp, - color = MaterialTheme.colorScheme.outline.copy(alpha = 0.3f), - modifier = Modifier.padding(horizontal = 16.dp) - ) - } + Column { + Commit(commit = commit) + if (i < commits.itemSnapshotList.lastIndex) { + Divider( + thickness = 0.5.dp, + color = MaterialTheme.colorScheme.outline.copy(alpha = 0.3f), + modifier = Modifier.padding(horizontal = 16.dp) + ) } - } } diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePicker.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePicker.kt index 4207cf1a..fece0db6 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePicker.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePicker.kt @@ -1,6 +1,7 @@ package dev.beefers.vendetta.manager.ui.widgets.settings import android.annotation.SuppressLint +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.isSystemInDarkTheme @@ -13,6 +14,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.selection.selectableGroup import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons @@ -36,9 +39,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.google.accompanist.pager.ExperimentalPagerApi -import com.google.accompanist.pager.HorizontalPager -import com.google.accompanist.pager.rememberPagerState import dev.beefers.vendetta.manager.R import dev.beefers.vendetta.manager.domain.manager.PreferenceManager import dev.beefers.vendetta.manager.domain.manager.Theme @@ -48,12 +48,14 @@ import kotlinx.coroutines.launch @Composable @SuppressLint("NewApi") // Dynamic color option shouldn't ever be enabled on unsupported apis anyways -@OptIn(ExperimentalPagerApi::class) +@OptIn(ExperimentalFoundationApi::class) fun ThemePicker( prefs: PreferenceManager ) { val context = LocalContext.current - val pagerState = rememberPagerState(prefs.theme.ordinal) + val pagerState = rememberPagerState(prefs.theme.ordinal) { + Theme.entries.size + } val scope = rememberCoroutineScope() val lightScheme = remember(prefs.monet) { if(prefs.monet) dynamicLightColorScheme(context) else lightColorScheme() } @@ -65,9 +67,7 @@ fun ThemePicker( ) { Box { HorizontalPager( - count = 3, state = pagerState, - itemSpacing = 50.dp, contentPadding = PaddingValues(16.dp) ) { page -> val (colors, theme) = when (page) { @@ -77,27 +77,32 @@ fun ThemePicker( else -> systemTheme to Theme.SYSTEM } - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(12.dp), - modifier = Modifier - .clip(RoundedCornerShape(16.dp)) - .thenIf(prefs.theme == theme) { - background(MaterialTheme.colorScheme.tertiaryContainer) - } - .clickable { prefs.theme = theme } - .padding(16.dp) + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.fillMaxWidth() ) { - ThemePreview( - colorScheme = colors, - modifier = Modifier.contentDescription(theme.labelRes, merge = true) - ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(12.dp), + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .thenIf(prefs.theme == theme) { + background(MaterialTheme.colorScheme.tertiaryContainer) + } + .clickable { prefs.theme = theme } + .padding(16.dp) + ) { + ThemePreview( + colorScheme = colors, + modifier = Modifier.contentDescription(theme.labelRes, merge = true) + ) - Text( - text = stringResource(theme.labelRes), - style = MaterialTheme.typography.labelLarge, - fontSize = 16.sp - ) + Text( + text = stringResource(theme.labelRes), + style = MaterialTheme.typography.labelLarge, + fontSize = 16.sp + ) + } } } diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePickerOption.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePickerOption.kt index 9a82e8ed..fd3d9533 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePickerOption.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/settings/ThemePickerOption.kt @@ -3,12 +3,14 @@ package dev.beefers.vendetta.manager.ui.widgets.settings import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.tween import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.size +import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons @@ -22,15 +24,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -import com.google.accompanist.pager.ExperimentalPagerApi -import com.google.accompanist.pager.PagerState import dev.beefers.vendetta.manager.domain.manager.PreferenceManager import dev.beefers.vendetta.manager.domain.manager.Theme import dev.beefers.vendetta.manager.utils.contentDescription import kotlinx.coroutines.launch +@OptIn(ExperimentalFoundationApi::class) @Composable -@OptIn(ExperimentalPagerApi::class) fun ThemePickerOption( theme: Theme, colors: ColorScheme, diff --git a/app/src/main/java/dev/beefers/vendetta/manager/utils/LazyUtils.kt b/app/src/main/java/dev/beefers/vendetta/manager/utils/LazyUtils.kt new file mode 100644 index 00000000..12e0a735 --- /dev/null +++ b/app/src/main/java/dev/beefers/vendetta/manager/utils/LazyUtils.kt @@ -0,0 +1,20 @@ +package dev.beefers.vendetta.manager.utils + +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.runtime.Composable +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.itemContentType + +inline fun LazyListScope.itemsIndexed( + items: LazyPagingItems, + noinline key: ((i: Int, item: T) -> Any)? = null, + crossinline itemContent: @Composable (i: Int, item: T) -> Unit +) { + items( + count = items.itemCount, + key = { i -> key?.invoke(i, items[i]!!) ?: Unit }, + contentType = items.itemContentType() + ) { + itemContent(it, items[it]!!) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt b/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt index 47542496..0d086c8b 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt @@ -9,6 +9,7 @@ import android.os.Looper import android.widget.Toast import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.drawable.toBitmap import dev.beefers.vendetta.manager.BuildConfig import java.io.BufferedReader @@ -45,7 +46,7 @@ fun Context.getBitmap(@DrawableRes icon: Int, size: Int): Bitmap { cachedBitmaps[icon]?.let { it[size]?.let { bitmap -> return bitmap } } val sizePx = size.dp - val bitmap = getDrawable(icon)!!.toBitmap( + val bitmap = AppCompatResources.getDrawable(this, icon)!!.toBitmap( height = sizePx, width = sizePx ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6b44a2a0..bb41a402 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,27 +1,27 @@ [versions] # Plugins -agp = "8.2.0" -kotlin = "1.7.20" +agp = "8.2.2" +kotlin = "1.9.21" # AndroidX -androidx-core-ktx = "1.9.0" +androidx-core-ktx = "1.12.0" androidx-core-splashscreen = "1.0.1" -androidx-lifecycle-runtime = "2.6.0" -androidx-paging-compose = "1.0.0-alpha18" -androidx-work-runtime = "2.8.1" +androidx-lifecycle-runtime = "2.7.0" +androidx-paging-compose = "3.2.1" +androidx-work-runtime = "2.9.0" # Compose -compose-activity = "1.7.1" -compose-bom = "2022.10.00" +compose-activity = "1.8.2" +compose-bom = "2023.10.01" # Misc. -accompanist = "0.29.1-alpha" -coil = "2.2.2" -koin = "3.2.0" -kotlinx-datetime = "0.4.1" -ktor = "2.1.1" +accompanist = "0.33.2-alpha" +coil = "2.4.0" +koin = "3.4.0" +kotlinx-datetime = "0.5.0" +ktor = "2.3.3" shizuku = "13.1.0" -voyager = "1.0.0-rc03" +voyager = "1.1.0-alpha02" zip-android = "2.1.1" [libraries] @@ -69,6 +69,7 @@ shizuku-provider = { group = "dev.rikka.shizuku", name = "provider", version.ref # Voyager voyager-navigator = { group = "cafe.adriel.voyager", name = "voyager-navigator", version.ref = "voyager" } +voyager-screenmodel = { group = "cafe.adriel.voyager", name = "voyager-screenmodel", version.ref = "voyager" } voyager-tab-navigator = { group = "cafe.adriel.voyager", name = "voyager-tab-navigator", version.ref = "voyager" } voyager-transitions = { group = "cafe.adriel.voyager", name = "voyager-transitions", version.ref = "voyager" } voyager-koin = { group = "cafe.adriel.voyager", name = "voyager-koin", version.ref = "voyager" } @@ -85,7 +86,7 @@ compose = ["compose-activity", "compose-material-icons-extended", "compose-mater koin = ["koin-android", "koin-androidx-compose", "koin-core"] ktor = ["ktor-client-cio", "ktor-client-content-negotiation", "ktor-client-core", "ktor-client-logging", "ktor-serialization-kotlinx-json"] shizuku = ["shizuku-api", "shizuku-provider"] -voyager = ["voyager-koin", "voyager-navigator", "voyager-tab-navigator", "voyager-transitions"] +voyager = ["voyager-koin", "voyager-navigator", "voyager-tab-navigator", "voyager-transitions", "voyager-screenmodel"] [plugins] android-application = { id = "com.android.application", version.ref = "agp" }