diff --git a/app/src/main/java/app/revanced/manager/di/ViewModelModule.kt b/app/src/main/java/app/revanced/manager/di/ViewModelModule.kt
index 9bce104c..0c69767c 100644
--- a/app/src/main/java/app/revanced/manager/di/ViewModelModule.kt
+++ b/app/src/main/java/app/revanced/manager/di/ViewModelModule.kt
@@ -18,6 +18,7 @@ val viewModelModule = module {
viewModelOf(::ChangelogsViewModel)
viewModelOf(::ImportExportViewModel)
viewModelOf(::AboutViewModel)
+ viewModelOf(::DeveloperOptionsViewModel)
viewModelOf(::ContributorViewModel)
viewModelOf(::DownloadsViewModel)
viewModelOf(::InstalledAppsViewModel)
diff --git a/app/src/main/java/app/revanced/manager/ui/destination/SettingsDestination.kt b/app/src/main/java/app/revanced/manager/ui/destination/SettingsDestination.kt
index 6f880de6..e62ab4f4 100644
--- a/app/src/main/java/app/revanced/manager/ui/destination/SettingsDestination.kt
+++ b/app/src/main/java/app/revanced/manager/ui/destination/SettingsDestination.kt
@@ -6,35 +6,38 @@ import kotlinx.parcelize.Parcelize
sealed interface SettingsDestination : Parcelable {
@Parcelize
- object Settings : SettingsDestination
+ data object Settings : SettingsDestination
@Parcelize
- object General : SettingsDestination
+ data object General : SettingsDestination
@Parcelize
- object Advanced : SettingsDestination
+ data object Advanced : SettingsDestination
@Parcelize
- object Updates : SettingsDestination
+ data object Updates : SettingsDestination
@Parcelize
- object Downloads : SettingsDestination
+ data object Downloads : SettingsDestination
@Parcelize
- object ImportExport : SettingsDestination
+ data object ImportExport : SettingsDestination
@Parcelize
- object About : SettingsDestination
+ data object About : SettingsDestination
@Parcelize
data class Update(val downloadOnScreenEntry: Boolean = false) : SettingsDestination
@Parcelize
- object Changelogs : SettingsDestination
+ data object Changelogs : SettingsDestination
@Parcelize
- object Contributors: SettingsDestination
+ data object Contributors: SettingsDestination
@Parcelize
- object Licenses: SettingsDestination
+ data object Licenses: SettingsDestination
+
+ @Parcelize
+ data object DeveloperOptions: SettingsDestination
}
\ No newline at end of file
diff --git a/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt
index 08468808..690b2016 100644
--- a/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt
+++ b/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt
@@ -122,7 +122,8 @@ fun SettingsScreen(
is SettingsDestination.About -> AboutSettingsScreen(
onBackClick = backClick,
onContributorsClick = { navController.navigate(SettingsDestination.Contributors) },
- onLicensesClick = { navController.navigate(SettingsDestination.Licenses) }
+ onDeveloperOptionsClick = { navController.navigate(SettingsDestination.DeveloperOptions) },
+ onLicensesClick = { navController.navigate(SettingsDestination.Licenses) },
)
is SettingsDestination.Update -> UpdateScreen(
@@ -146,6 +147,8 @@ fun SettingsScreen(
onBackClick = backClick,
)
+ is SettingsDestination.DeveloperOptions -> DeveloperOptionsScreen(onBackClick = backClick)
+
is SettingsDestination.Settings -> {
Scaffold(
topBar = {
diff --git a/app/src/main/java/app/revanced/manager/ui/screen/settings/AboutSettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/settings/AboutSettingsScreen.kt
index c4425913..7ee21609 100644
--- a/app/src/main/java/app/revanced/manager/ui/screen/settings/AboutSettingsScreen.kt
+++ b/app/src/main/java/app/revanced/manager/ui/screen/settings/AboutSettingsScreen.kt
@@ -39,7 +39,6 @@ import app.revanced.manager.ui.component.ColumnWithScrollbar
import app.revanced.manager.ui.component.settings.SettingsListItem
import app.revanced.manager.ui.viewmodel.AboutViewModel
import app.revanced.manager.ui.viewmodel.AboutViewModel.Companion.getSocialIcon
-import app.revanced.manager.util.isDebuggable
import app.revanced.manager.util.openUrl
import com.google.accompanist.drawablepainter.rememberDrawablePainter
import org.koin.androidx.compose.koinViewModel
@@ -50,6 +49,7 @@ fun AboutSettingsScreen(
onBackClick: () -> Unit,
onContributorsClick: () -> Unit,
onLicensesClick: () -> Unit,
+ onDeveloperOptionsClick: () -> Unit,
viewModel: AboutViewModel = koinViewModel()
) {
val context = LocalContext.current
@@ -116,9 +116,11 @@ fun AboutSettingsScreen(
stringResource(R.string.contributors_description),
third = onContributorsClick
),
- Triple(stringResource(R.string.developer_options),
+ Triple(
+ stringResource(R.string.developer_options),
stringResource(R.string.developer_options_description),
- third = { /*TODO*/ }).takeIf { context.isDebuggable },
+ third = onDeveloperOptionsClick
+ ),
Triple(
stringResource(R.string.opensource_licenses),
stringResource(R.string.opensource_licenses_description),
diff --git a/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt
index 3817bd12..146ff325 100644
--- a/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt
+++ b/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt
@@ -71,6 +71,8 @@ fun AdvancedSettingsScreen(
.fillMaxSize()
.padding(paddingValues)
) {
+ GroupHeader(stringResource(R.string.manager))
+
val apiUrl by vm.prefs.api.getAsState()
var showApiUrlDialog by rememberSaveable { mutableStateOf(false) }
@@ -110,6 +112,14 @@ fun AdvancedSettingsScreen(
headline = R.string.process_runtime_memory_limit,
description = R.string.process_runtime_memory_limit_description,
)
+ BooleanItem(
+ preference = vm.prefs.multithreadingDexFileWriter,
+ coroutineScope = vm.viewModelScope,
+ headline = R.string.multithreaded_dex_file_writer,
+ description = R.string.multithreaded_dex_file_writer_description,
+ )
+
+ GroupHeader(stringResource(R.string.safeguards))
BooleanItem(
preference = vm.prefs.disablePatchVersionCompatCheck,
coroutineScope = vm.viewModelScope,
@@ -122,26 +132,6 @@ fun AdvancedSettingsScreen(
headline = R.string.suggested_version_safeguard,
description = R.string.suggested_version_safeguard_description
)
- BooleanItem(
- preference = vm.prefs.multithreadingDexFileWriter,
- coroutineScope = vm.viewModelScope,
- headline = R.string.multithreaded_dex_file_writer,
- description = R.string.multithreaded_dex_file_writer_description,
- )
-
- GroupHeader(stringResource(R.string.patch_bundles_section))
- SettingsListItem(
- headlineContent = stringResource(R.string.patch_bundles_redownload),
- modifier = Modifier.clickable {
- vm.redownloadBundles()
- }
- )
- SettingsListItem(
- headlineContent = stringResource(R.string.patch_bundles_reset),
- modifier = Modifier.clickable {
- vm.resetBundles()
- }
- )
GroupHeader(stringResource(R.string.device))
SettingsListItem(
diff --git a/app/src/main/java/app/revanced/manager/ui/screen/settings/DeveloperOptionsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/settings/DeveloperOptionsScreen.kt
new file mode 100644
index 00000000..f8f1e0cf
--- /dev/null
+++ b/app/src/main/java/app/revanced/manager/ui/screen/settings/DeveloperOptionsScreen.kt
@@ -0,0 +1,44 @@
+package app.revanced.manager.ui.screen.settings
+
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Scaffold
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import app.revanced.manager.R
+import app.revanced.manager.ui.component.AppTopBar
+import app.revanced.manager.ui.component.GroupHeader
+import app.revanced.manager.ui.component.settings.SettingsListItem
+import app.revanced.manager.ui.viewmodel.DeveloperOptionsViewModel
+import org.koin.androidx.compose.koinViewModel
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun DeveloperOptionsScreen(
+ onBackClick: () -> Unit,
+ vm: DeveloperOptionsViewModel = koinViewModel()
+) {
+ Scaffold(
+ topBar = {
+ AppTopBar(
+ title = stringResource(R.string.developer_options),
+ onBackClick = onBackClick
+ )
+ }
+ ) { paddingValues ->
+ Column(modifier = Modifier.padding(paddingValues)) {
+ GroupHeader(stringResource(R.string.patch_bundles_section))
+ SettingsListItem(
+ headlineContent = stringResource(R.string.patch_bundles_redownload),
+ modifier = Modifier.clickable(onClick = vm::redownloadBundles)
+ )
+ SettingsListItem(
+ headlineContent = stringResource(R.string.patch_bundles_reset),
+ modifier = Modifier.clickable(onClick = vm::redownloadBundles)
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt
index 5db843c0..cbad0045 100644
--- a/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt
+++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt
@@ -6,12 +6,10 @@ import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.revanced.manager.R
-import app.revanced.manager.domain.bundles.RemotePatchBundle
import app.revanced.manager.domain.manager.PreferencesManager
import app.revanced.manager.domain.repository.PatchBundleRepository
import app.revanced.manager.util.tag
import app.revanced.manager.util.toast
-import app.revanced.manager.util.uiSafe
import com.github.pgreze.process.Redirect
import com.github.pgreze.process.process
import kotlinx.coroutines.CancellationException
@@ -43,16 +41,6 @@ class AdvancedSettingsViewModel(
patchBundleRepository.reloadApiBundles()
}
- fun redownloadBundles() = viewModelScope.launch {
- uiSafe(app, R.string.source_download_fail, RemotePatchBundle.updateFailMsg) {
- patchBundleRepository.redownloadRemoteBundles()
- }
- }
-
- fun resetBundles() = viewModelScope.launch {
- patchBundleRepository.reset()
- }
-
fun exportDebugLogs(target: Uri) = viewModelScope.launch {
val exitCode = try {
withContext(Dispatchers.IO) {
diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/DeveloperOptionsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/DeveloperOptionsViewModel.kt
new file mode 100644
index 00000000..bc8d0527
--- /dev/null
+++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/DeveloperOptionsViewModel.kt
@@ -0,0 +1,27 @@
+package app.revanced.manager.ui.viewmodel
+
+import android.app.Application
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import app.revanced.manager.R
+import app.revanced.manager.domain.bundles.RemotePatchBundle
+import app.revanced.manager.domain.manager.PreferencesManager
+import app.revanced.manager.domain.repository.PatchBundleRepository
+import app.revanced.manager.util.uiSafe
+import kotlinx.coroutines.launch
+
+class DeveloperOptionsViewModel(
+ val prefs: PreferencesManager,
+ private val app: Application,
+ private val patchBundleRepository: PatchBundleRepository
+) : ViewModel() {
+ fun redownloadBundles() = viewModelScope.launch {
+ uiSafe(app, R.string.source_download_fail, RemotePatchBundle.updateFailMsg) {
+ patchBundleRepository.redownloadRemoteBundles()
+ }
+ }
+
+ fun resetBundles() = viewModelScope.launch {
+ patchBundleRepository.reset()
+ }
+}
\ 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 95ca818b..f1ef966c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -71,6 +71,7 @@
Choose between light or dark theme
Multi-threaded DEX file writer
Use multiple cores to write DEX files. This is faster, but uses more memory
+ Safeguards
Disable version compatibility check
The check restricts patches to supported app versions
Require suggested app version