Skip to content

Commit 0992e63

Browse files
authored
feat: Add confirmation dialog to "Reset" options (#2576)
1 parent aebad0b commit 0992e63

File tree

10 files changed

+314
-58
lines changed

10 files changed

+314
-58
lines changed

app/src/main/java/app/revanced/manager/data/room/options/OptionDao.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ abstract class OptionDao {
2727
abstract suspend fun createOptionGroup(group: OptionGroup)
2828

2929
@Query("DELETE FROM option_groups WHERE patch_bundle = :uid")
30-
abstract suspend fun clearForPatchBundle(uid: Int)
30+
abstract suspend fun resetOptionsForPatchBundle(uid: Int)
3131

3232
@Query("DELETE FROM option_groups WHERE package_name = :packageName")
33-
abstract suspend fun clearForPackage(packageName: String)
33+
abstract suspend fun resetOptionsForPackage(packageName: String)
3434

3535
@Query("DELETE FROM option_groups")
3636
abstract suspend fun reset()

app/src/main/java/app/revanced/manager/data/room/selection/SelectionDao.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.room.Insert
55
import androidx.room.MapColumn
66
import androidx.room.Query
77
import androidx.room.Transaction
8+
import kotlinx.coroutines.flow.Flow
89

910
@Dao
1011
abstract class SelectionDao {
@@ -34,11 +35,14 @@ abstract class SelectionDao {
3435
@Insert
3536
abstract suspend fun createSelection(selection: PatchSelection)
3637

38+
@Query("SELECT package_name FROM patch_selections")
39+
abstract fun getPackagesWithSelection(): Flow<List<String>>
40+
3741
@Query("DELETE FROM patch_selections WHERE patch_bundle = :uid")
38-
abstract suspend fun clearForPatchBundle(uid: Int)
42+
abstract suspend fun resetForPatchBundle(uid: Int)
3943

4044
@Query("DELETE FROM patch_selections WHERE package_name = :packageName")
41-
abstract suspend fun clearForPackage(packageName: String)
45+
abstract suspend fun resetForPackage(packageName: String)
4246

4347
@Query("DELETE FROM patch_selections")
4448
abstract suspend fun reset()

app/src/main/java/app/revanced/manager/domain/repository/PatchOptionsRepository.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class PatchOptionsRepository(db: AppDatabase) {
7676
fun getPackagesWithSavedOptions() =
7777
dao.getPackagesWithOptions().map(Iterable<String>::toSet).distinctUntilChanged()
7878

79-
suspend fun clearOptionsForPackage(packageName: String) = dao.clearForPackage(packageName)
80-
suspend fun clearOptionsForPatchBundle(uid: Int) = dao.clearForPatchBundle(uid)
79+
suspend fun resetOptionsForPackage(packageName: String) = dao.resetOptionsForPackage(packageName)
80+
suspend fun resetOptionsForPatchBundle(uid: Int) = dao.resetOptionsForPatchBundle(uid)
8181
suspend fun reset() = dao.reset()
8282
}

app/src/main/java/app/revanced/manager/domain/repository/PatchSelectionRepository.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package app.revanced.manager.domain.repository
33
import app.revanced.manager.data.room.AppDatabase
44
import app.revanced.manager.data.room.AppDatabase.Companion.generateUid
55
import app.revanced.manager.data.room.selection.PatchSelection
6+
import kotlinx.coroutines.flow.distinctUntilChanged
7+
import kotlinx.coroutines.flow.map
68

79
class PatchSelectionRepository(db: AppDatabase) {
810
private val dao = db.selectionDao()
@@ -25,16 +27,23 @@ class PatchSelectionRepository(db: AppDatabase) {
2527
)
2628
})
2729

28-
suspend fun clearSelection(packageName: String) {
29-
dao.clearForPackage(packageName)
30+
fun getPackagesWithSavedSelection() =
31+
dao.getPackagesWithSelection().map(Iterable<String>::toSet).distinctUntilChanged()
32+
33+
suspend fun resetSelectionForPackage(packageName: String) {
34+
dao.resetForPackage(packageName)
35+
}
36+
37+
suspend fun resetSelectionForPatchBundle(uid: Int) {
38+
dao.resetForPatchBundle(uid)
3039
}
3140

3241
suspend fun reset() = dao.reset()
3342

3443
suspend fun export(bundleUid: Int): SerializedSelection = dao.exportSelection(bundleUid)
3544

3645
suspend fun import(bundleUid: Int, selection: SerializedSelection) {
37-
dao.clearForPatchBundle(bundleUid)
46+
dao.resetForPatchBundle(bundleUid)
3847
dao.updateSelections(selection.entries.associate { (packageName, patches) ->
3948
getOrCreateSelection(bundleUid, packageName) to patches.toSet()
4049
})

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@ import androidx.compose.material3.Text
1313
import androidx.compose.runtime.Composable
1414
import androidx.compose.runtime.LaunchedEffect
1515
import androidx.compose.runtime.getValue
16+
import androidx.compose.runtime.remember
1617
import androidx.compose.ui.Alignment
1718
import androidx.compose.ui.Modifier
1819
import androidx.compose.ui.unit.dp
20+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1921
import app.revanced.manager.domain.bundles.PatchBundleSource
2022
import app.revanced.manager.domain.bundles.PatchBundleSource.Extensions.nameState
23+
import kotlinx.coroutines.flow.map
2124

2225
@OptIn(ExperimentalMaterial3Api::class)
2326
@Composable
@@ -54,6 +57,10 @@ fun BundleSelector(bundles: List<PatchBundleSource>, onFinish: (PatchBundleSourc
5457
}
5558
bundles.forEach {
5659
val name by it.nameState
60+
val version by remember(it) {
61+
it.propsFlow().map { props -> props?.version }
62+
}.collectAsStateWithLifecycle(null)
63+
5764
Row(
5865
verticalAlignment = Alignment.CenterVertically,
5966
horizontalArrangement = Arrangement.Center,
@@ -65,7 +72,7 @@ fun BundleSelector(bundles: List<PatchBundleSource>, onFinish: (PatchBundleSourc
6572
}
6673
) {
6774
Text(
68-
name,
75+
"$name $version",
6976
style = MaterialTheme.typography.titleMedium,
7077
color = MaterialTheme.colorScheme.onSurface
7178
)

app/src/main/java/app/revanced/manager/ui/component/settings/SettingsListItem.kt

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
package app.revanced.manager.ui.component.settings
22

3+
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.animateContentSize
5+
import androidx.compose.animation.core.FastOutSlowInEasing
6+
import androidx.compose.animation.core.tween
7+
import androidx.compose.foundation.clickable
8+
import androidx.compose.foundation.layout.Column
9+
import androidx.compose.foundation.layout.fillMaxWidth
310
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.material.icons.Icons
12+
import androidx.compose.material.icons.filled.ExpandLess
13+
import androidx.compose.material.icons.filled.ExpandMore
14+
import androidx.compose.material3.Icon
415
import androidx.compose.material3.ListItemColors
516
import androidx.compose.material3.ListItemDefaults
617
import androidx.compose.material3.MaterialTheme
@@ -10,6 +21,10 @@ import androidx.compose.ui.Modifier
1021
import androidx.compose.ui.unit.Dp
1122
import androidx.compose.ui.unit.dp
1223
import androidx.compose.material3.ListItem
24+
import androidx.compose.runtime.getValue
25+
import androidx.compose.runtime.mutableStateOf
26+
import androidx.compose.runtime.remember
27+
import androidx.compose.runtime.setValue
1328

1429
@Composable
1530
fun SettingsListItem(
@@ -67,4 +82,48 @@ fun SettingsListItem(
6782
colors = colors,
6883
tonalElevation = tonalElevation,
6984
shadowElevation = shadowElevation
70-
)
85+
)
86+
87+
@Composable
88+
fun ExpandableSettingListItem(
89+
headlineContent: String,
90+
supportingContent: String,
91+
expandableContent: @Composable () -> Unit
92+
) {
93+
var expanded by remember { mutableStateOf(false) }
94+
95+
Column(
96+
modifier = Modifier
97+
.fillMaxWidth()
98+
.animateContentSize()
99+
) {
100+
SettingsListItem(
101+
modifier = Modifier
102+
.clickable{ expanded = !expanded },
103+
headlineContent = headlineContent,
104+
supportingContent = supportingContent,
105+
trailingContent = {
106+
Icon(
107+
imageVector = if (expanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore,
108+
contentDescription = null
109+
)
110+
}
111+
)
112+
113+
AnimatedVisibility(visible = expanded) {
114+
Column(
115+
modifier = Modifier
116+
.fillMaxWidth()
117+
.padding(bottom = 12.dp, start = 16.dp, end = 16.dp)
118+
.animateContentSize(
119+
animationSpec = tween(
120+
durationMillis = 500,
121+
easing = FastOutSlowInEasing
122+
)
123+
)
124+
) {
125+
expandableContent()
126+
}
127+
}
128+
}
129+
}

0 commit comments

Comments
 (0)