Skip to content

Commit b36795e

Browse files
committed
Merge branch 'dev' into feat/improve-patcher-design
2 parents 82a71a7 + 0300da9 commit b36795e

File tree

16 files changed

+192
-53
lines changed

16 files changed

+192
-53
lines changed

.github/ISSUE_TEMPLATE/feature_request.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
name: ⭐ Feature request
2+
description: Create a detailed request for a new feature.
3+
title: 'feat: '
4+
labels: ['Feature request']
15
body:
26
- type: markdown
37
attributes:

app/CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,31 @@
1+
# app [1.26.0-dev.11](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.10...v1.26.0-dev.11) (2025-10-25)
2+
3+
4+
### Features
5+
6+
* Add pure black theme ([#2824](https://github.com/ReVanced/revanced-manager/issues/2824)) ([3d75ffe](https://github.com/ReVanced/revanced-manager/commit/3d75ffe6a7a39efdebe13dbd07c937c1de409ead))
7+
8+
# app [1.26.0-dev.10](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.9...v1.26.0-dev.10) (2025-10-06)
9+
10+
11+
### Bug Fixes
12+
13+
* prevent back presses during installation ([2ff7072](https://github.com/ReVanced/revanced-manager/commit/2ff70728b490b92f212a82dcf599bc0c23f589e7))
14+
15+
# app [1.26.0-dev.9](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.8...v1.26.0-dev.9) (2025-10-06)
16+
17+
18+
### Bug Fixes
19+
20+
* Instantly re-fetch patch bundle on pre-release preference update ([d5671db](https://github.com/ReVanced/revanced-manager/commit/d5671db3a77541c07bbbb4c3baca02f3ba0703f2)), closes [#2784](https://github.com/ReVanced/revanced-manager/issues/2784)
21+
22+
# app [1.26.0-dev.8](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.7...v1.26.0-dev.8) (2025-10-06)
23+
24+
25+
### Bug Fixes
26+
27+
* Offcenter loading indicator in AppSelector ([12d92ba](https://github.com/ReVanced/revanced-manager/commit/12d92ba8110f5d1ac78aeecfa575444b5c53f561))
28+
129
# app [1.26.0-dev.7](https://github.com/ReVanced/revanced-manager/compare/v1.26.0-dev.6...v1.26.0-dev.7) (2025-10-03)
230

331

app/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version = 1.26.0-dev.7
1+
version = 1.26.0-dev.11

app/src/main/java/app/revanced/manager/MainActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class MainActivity : ComponentActivity() {
8181
)
8282
val theme by vm.prefs.theme.getAsState()
8383
val dynamicColor by vm.prefs.dynamicColor.getAsState()
84+
val pureBlackTheme by vm.prefs.pureBlackTheme.getAsState()
8485

8586
EventEffect(vm.legacyImportActivityFlow) {
8687
try {
@@ -91,7 +92,8 @@ class MainActivity : ComponentActivity() {
9192

9293
ReVancedManagerTheme(
9394
darkTheme = theme == Theme.SYSTEM && isSystemInDarkTheme() || theme == Theme.DARK,
94-
dynamicColor = dynamicColor
95+
dynamicColor = dynamicColor,
96+
pureBlackTheme = pureBlackTheme
9597
) {
9698
ReVancedManager(vm)
9799
}

app/src/main/java/app/revanced/manager/domain/manager/PreferencesManager.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class PreferencesManager(
99
context: Context
1010
) : BasePreferencesManager(context, "settings") {
1111
val dynamicColor = booleanPreference("dynamic_color", true)
12+
val pureBlackTheme = booleanPreference("pure_black_theme", false)
1213
val theme = enumPreference("theme", Theme.SYSTEM)
1314

1415
val api = stringPreference("api_url", "https://api.revanced.app")

app/src/main/java/app/revanced/manager/ui/component/bundle/BundleInformationDialog.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,15 @@ fun BundleInformationDialog(
190190
prefs.usePatchesPrereleases.update(
191191
it
192192
)
193+
onUpdate()
193194
}
194195
}
195196
)
196197
},
197198
modifier = Modifier.clickable {
198199
composableScope.launch {
199200
prefs.usePatchesPrereleases.update(!useBundlePrerelease)
201+
onUpdate()
200202
}
201203
}
202204
)

app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import app.revanced.manager.ui.model.StepCategory
5555
import app.revanced.manager.ui.viewmodel.PatcherViewModel
5656
import app.revanced.manager.util.APK_MIMETYPE
5757
import app.revanced.manager.util.EventEffect
58+
import app.revanced.manager.util.toast
5859

5960
@OptIn(ExperimentalMaterial3Api::class)
6061
@Composable
@@ -76,11 +77,10 @@ fun PatcherScreen(
7677
var showInstallPicker by rememberSaveable { mutableStateOf(false) }
7778
var showDismissConfirmationDialog by rememberSaveable { mutableStateOf(false) }
7879

79-
fun onPageBack() {
80-
if(patcherSucceeded == null)
81-
showDismissConfirmationDialog = true
82-
else
83-
onLeave()
80+
fun onPageBack() = when {
81+
patcherSucceeded == null -> showDismissConfirmationDialog = true
82+
viewModel.isInstalling -> context.toast(context.getString(R.string.patcher_install_in_progress))
83+
else -> onLeave()
8484
}
8585

8686
BackHandler(onBack = ::onPageBack)

app/src/main/java/app/revanced/manager/ui/screen/settings/DownloadsSettingsScreen.kt

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package app.revanced.manager.ui.screen.settings
22

33
import androidx.annotation.StringRes
44
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Column
57
import androidx.compose.foundation.layout.fillMaxSize
68
import androidx.compose.foundation.layout.fillMaxWidth
79
import androidx.compose.foundation.layout.padding
@@ -10,10 +12,13 @@ import androidx.compose.material.icons.Icons
1012
import androidx.compose.material.icons.filled.Delete
1113
import androidx.compose.material.icons.outlined.Delete
1214
import androidx.compose.material3.AlertDialog
15+
import androidx.compose.material3.Card
16+
import androidx.compose.material3.CardDefaults
1317
import androidx.compose.material3.ExperimentalMaterial3Api
1418
import androidx.compose.material3.Icon
1519
import androidx.compose.material3.IconButton
1620
import androidx.compose.material3.MaterialTheme
21+
import androidx.compose.material3.OutlinedCard
1722
import androidx.compose.material3.Scaffold
1823
import androidx.compose.material3.Text
1924
import androidx.compose.material3.TextButton
@@ -28,6 +33,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
2833
import androidx.compose.runtime.setValue
2934
import androidx.compose.ui.Modifier
3035
import androidx.compose.ui.input.nestedscroll.nestedScroll
36+
import androidx.compose.ui.platform.LocalContext
3137
import androidx.compose.ui.res.stringResource
3238
import androidx.compose.ui.text.style.TextAlign
3339
import androidx.compose.ui.unit.dp
@@ -36,10 +42,10 @@ import app.revanced.manager.R
3642
import app.revanced.manager.network.downloader.DownloaderPluginState
3743
import app.revanced.manager.ui.component.AppLabel
3844
import app.revanced.manager.ui.component.AppTopBar
45+
import app.revanced.manager.ui.component.ConfirmDialog
3946
import app.revanced.manager.ui.component.ExceptionViewerDialog
4047
import app.revanced.manager.ui.component.GroupHeader
4148
import app.revanced.manager.ui.component.LazyColumnWithScrollbar
42-
import app.revanced.manager.ui.component.ConfirmDialog
4349
import app.revanced.manager.ui.component.haptics.HapticCheckbox
4450
import app.revanced.manager.ui.component.settings.SettingsListItem
4551
import app.revanced.manager.ui.viewmodel.DownloadsViewModel
@@ -52,6 +58,7 @@ fun DownloadsSettingsScreen(
5258
onBackClick: () -> Unit,
5359
viewModel: DownloadsViewModel = koinViewModel()
5460
) {
61+
val context = LocalContext.current
5562
val downloadedApps by viewModel.downloadedApps.collectAsStateWithLifecycle(emptyList())
5663
val pluginStates by viewModel.downloaderPluginStates.collectAsStateWithLifecycle()
5764
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
@@ -75,7 +82,7 @@ fun DownloadsSettingsScreen(
7582
onBackClick = onBackClick,
7683
actions = {
7784
if (viewModel.appSelection.isNotEmpty()) {
78-
IconButton(onClick = { showDeleteConfirmationDialog = true }) {
85+
IconButton(onClick = { viewModel.deleteApps() }) {
7986
Icon(Icons.Default.Delete, stringResource(R.string.delete))
8087
}
8188
}
@@ -121,6 +128,11 @@ fun DownloadsSettingsScreen(
121128
.digest(androidSignature.toByteArray())
122129
hash.toHexString(format = HexFormat.UpperCase)
123130
}
131+
val appName = remember {
132+
packageInfo.applicationInfo?.loadLabel(context.packageManager)
133+
?.toString()
134+
?: packageName
135+
}
124136

125137
when (state) {
126138
is DownloaderPluginState.Loaded -> TrustDialog(
@@ -130,6 +142,8 @@ fun DownloadsSettingsScreen(
130142
packageName,
131143
signature
132144
),
145+
pluginName = appName,
146+
signature = signature,
133147
onDismiss = ::dismiss,
134148
onConfirm = {
135149
viewModel.revokePluginTrust(packageName)
@@ -147,10 +161,10 @@ fun DownloadsSettingsScreen(
147161
is DownloaderPluginState.Untrusted -> TrustDialog(
148162
title = R.string.downloader_plugin_trust_dialog_title,
149163
body = stringResource(
150-
R.string.downloader_plugin_trust_dialog_body,
151-
packageName,
152-
signature
164+
R.string.downloader_plugin_trust_dialog_body
153165
),
166+
pluginName = appName,
167+
signature = signature,
154168
onDismiss = ::dismiss,
155169
onConfirm = {
156170
viewModel.trustPlugin(packageName)
@@ -226,6 +240,8 @@ fun DownloadsSettingsScreen(
226240
private fun TrustDialog(
227241
@StringRes title: Int,
228242
body: String,
243+
pluginName: String,
244+
signature: String,
229245
onDismiss: () -> Unit,
230246
onConfirm: () -> Unit
231247
) {
@@ -238,10 +254,39 @@ private fun TrustDialog(
238254
},
239255
dismissButton = {
240256
TextButton(onClick = onDismiss) {
241-
Text(stringResource(R.string.dismiss))
257+
Text(stringResource(R.string.cancel))
242258
}
243259
},
244260
title = { Text(stringResource(title)) },
245-
text = { Text(body) }
261+
text = {
262+
Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
263+
Text(body)
264+
Card {
265+
Column(
266+
Modifier.padding(12.dp),
267+
verticalArrangement = Arrangement.spacedBy(12.dp)
268+
) {
269+
Text(
270+
stringResource(
271+
R.string.downloader_plugin_trust_dialog_plugin,
272+
pluginName
273+
),
274+
)
275+
OutlinedCard(
276+
colors = CardDefaults.outlinedCardColors(
277+
containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
278+
)
279+
) {
280+
Text(
281+
stringResource(
282+
R.string.downloader_plugin_trust_dialog_signature,
283+
signature.chunked(2).joinToString(" ")
284+
), modifier = Modifier.padding(12.dp)
285+
)
286+
}
287+
}
288+
}
289+
}
290+
}
246291
)
247292
}

app/src/main/java/app/revanced/manager/ui/screen/settings/GeneralSettingsScreen.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package app.revanced.manager.ui.screen.settings
22

33
import android.os.Build
4+
import androidx.compose.animation.AnimatedVisibility
45
import androidx.compose.foundation.clickable
56
import androidx.compose.foundation.layout.Column
67
import androidx.compose.foundation.layout.Row
@@ -96,6 +97,14 @@ fun GeneralSettingsScreen(
9697
description = R.string.dynamic_color_description
9798
)
9899
}
100+
AnimatedVisibility(theme != Theme.LIGHT) {
101+
BooleanItem(
102+
preference = prefs.pureBlackTheme,
103+
coroutineScope = coroutineScope,
104+
headline = R.string.pure_black_theme,
105+
description = R.string.pure_black_theme_description
106+
)
107+
}
99108
}
100109
}
101110
}

app/src/main/java/app/revanced/manager/ui/theme/Theme.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ private val LightColorScheme = lightColorScheme(
8080
fun ReVancedManagerTheme(
8181
darkTheme: Boolean,
8282
dynamicColor: Boolean,
83+
pureBlackTheme: Boolean,
8384
content: @Composable () -> Unit
8485
) {
8586
val colorScheme = when {
@@ -93,6 +94,10 @@ fun ReVancedManagerTheme(
9394

9495
darkTheme -> DarkColorScheme
9596
else -> LightColorScheme
97+
}.let {
98+
if (darkTheme && pureBlackTheme)
99+
it.copy(background = Color.Black, surface = Color.Black)
100+
else it
96101
}
97102

98103
val view = LocalView.current

0 commit comments

Comments
 (0)