Skip to content

Commit 642b280

Browse files
committed
WIP_backup Scheduler
1 parent de29288 commit 642b280

9 files changed

Lines changed: 167 additions & 0 deletions

File tree

app/src/main/java/in/hridayan/ashell/navigation/NavGraph.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import `in`.hridayan.ashell.onboarding.presentation.screens.OnboardingScreen
2727
import `in`.hridayan.ashell.settings.presentation.page.about.screens.AboutScreen
2828
import `in`.hridayan.ashell.settings.presentation.page.autoupdate.screens.AutoUpdateScreen
2929
import `in`.hridayan.ashell.settings.presentation.page.backup.screens.BackupAndRestoreScreen
30+
import `in`.hridayan.ashell.settings.presentation.page.backup.screens.BackupSchedulerScreen
3031
import `in`.hridayan.ashell.settings.presentation.page.behavior.screens.BehaviorScreen
3132
import `in`.hridayan.ashell.settings.presentation.page.changelog.screens.ChangelogScreen
3233
import `in`.hridayan.ashell.settings.presentation.page.crashhistory.screens.CrashDetailsScreen
@@ -159,6 +160,13 @@ fun Navigation(isFirstLaunch: Boolean = false) {
159160
BackupAndRestoreScreen()
160161
}
161162

163+
composable<NavRoutes.BackupSchedulerScreen>(
164+
enterTransition = { slideFadeInFromRight() },
165+
popExitTransition = { slideFadeOutToRight() }
166+
) {
167+
BackupSchedulerScreen()
168+
}
169+
162170
composable<NavRoutes.LocalAdbScreen>(
163171
enterTransition = { slideFadeInFromRight() },
164172
exitTransition = { slideFadeOutToLeft() },

app/src/main/java/in/hridayan/ashell/navigation/NavRoutes.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ sealed class NavRoutes {
1313
@Serializable
1414
object BackupAndRestoreScreen : NavRoutes()
1515

16+
@Serializable
17+
object BackupSchedulerScreen : NavRoutes()
18+
1619
@Serializable
1720
object BehaviorScreen : NavRoutes()
1821

app/src/main/java/in/hridayan/ashell/settings/data/SettingsKeys.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ enum class SettingsKeys(val default: Any?) {
3838
BACKUP_APP_DATA(null),
3939
RESTORE_APP_DATA(null),
4040
RESET_APP_SETTINGS(null),
41+
BACKUP_SCHEDULER(null),
4142
LAST_LOCAL_BACKUP_TIME(""),
4243
CLEAR_OUTPUT_CONFIRMATION(true),
4344
OUTPUT_SAVE_DIRECTORY(

app/src/main/java/in/hridayan/ashell/settings/presentation/page/backup/screens/BackupAndRestoreScreen.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import `in`.hridayan.ashell.core.presentation.components.shape.CardCornerShape
5858
import `in`.hridayan.ashell.core.presentation.components.shape.CardCornerShape.getRoundedShape
5959
import `in`.hridayan.ashell.core.utils.getFileNameFromUri
6060
import `in`.hridayan.ashell.core.utils.showToast
61+
import `in`.hridayan.ashell.navigation.LocalNavController
6162
import `in`.hridayan.ashell.settings.domain.model.BackupType
6263
import `in`.hridayan.ashell.settings.domain.model.GoogleUserState
6364
import `in`.hridayan.ashell.settings.presentation.components.dialog.BackupDestinationDialog
@@ -81,6 +82,7 @@ fun BackupAndRestoreScreen(
8182
) {
8283
val context = LocalContext.current
8384
val res = LocalResources.current
85+
val navController = LocalNavController.current
8486
val settings = settingsViewModel.backupPageList
8587
val dialogManager = LocalDialogManager.current
8688
val localBackupTime by backupAndRestoreViewModel.localBackupTime.collectAsState()
@@ -173,6 +175,8 @@ fun BackupAndRestoreScreen(
173175
backupAndRestoreViewModel.signInWithGoogle()
174176
}
175177

178+
is SettingsUiEvent.Navigate -> navController.navigate(event.route)
179+
176180
else -> {}
177181
}
178182
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
@file:OptIn(ExperimentalMaterial3Api::class)
2+
3+
package `in`.hridayan.ashell.settings.presentation.page.backup.screens
4+
5+
import androidx.compose.foundation.layout.Spacer
6+
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.foundation.layout.height
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.lazy.LazyColumn
10+
import androidx.compose.foundation.lazy.itemsIndexed
11+
import androidx.compose.foundation.lazy.rememberLazyListState
12+
import androidx.compose.material3.ExperimentalMaterial3Api
13+
import androidx.compose.material3.MaterialTheme
14+
import androidx.compose.material3.Text
15+
import androidx.compose.runtime.Composable
16+
import androidx.compose.runtime.LaunchedEffect
17+
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.input.nestedscroll.nestedScroll
19+
import androidx.compose.ui.res.stringResource
20+
import androidx.compose.ui.unit.dp
21+
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
22+
import `in`.hridayan.ashell.R
23+
import `in`.hridayan.ashell.core.common.LocalDialogManager
24+
import `in`.hridayan.ashell.core.presentation.components.shape.CardCornerShape.getRoundedShape
25+
import `in`.hridayan.ashell.settings.presentation.components.item.PreferenceItemView
26+
import `in`.hridayan.ashell.settings.presentation.components.scaffold.SettingsScaffold
27+
import `in`.hridayan.ashell.settings.presentation.event.SettingsUiEvent
28+
import `in`.hridayan.ashell.settings.presentation.model.PreferenceGroup
29+
import `in`.hridayan.ashell.settings.presentation.viewmodel.SettingsViewModel
30+
31+
@Composable
32+
fun BackupSchedulerScreen(
33+
modifier: Modifier = Modifier,
34+
settingsViewModel: SettingsViewModel = hiltViewModel()
35+
) {
36+
val settings = settingsViewModel.backupSchedulerPageList
37+
val dialogManager = LocalDialogManager.current
38+
39+
val listState = rememberLazyListState()
40+
41+
LaunchedEffect(Unit) {
42+
settingsViewModel.uiEvent.collect { event ->
43+
when (event) {
44+
is SettingsUiEvent.ShowDialog -> {
45+
dialogManager.show(event.key)
46+
}
47+
48+
else -> {}
49+
}
50+
}
51+
}
52+
53+
SettingsScaffold(
54+
modifier = modifier,
55+
listState = listState,
56+
topBarTitle = stringResource(R.string.backup_scheduler),
57+
content = { innerPadding, topBarScrollBehavior ->
58+
LazyColumn(
59+
modifier = Modifier
60+
.fillMaxWidth()
61+
.nestedScroll(topBarScrollBehavior.nestedScrollConnection),
62+
contentPadding = innerPadding
63+
) {
64+
itemsIndexed(settings) { index, group ->
65+
when (group) {
66+
is PreferenceGroup.Category -> {
67+
Text(
68+
text = stringResource(group.categoryNameResId),
69+
style = MaterialTheme.typography.labelLarge,
70+
color = MaterialTheme.colorScheme.primary,
71+
modifier = Modifier
72+
.animateItem()
73+
.padding(
74+
start = 20.dp,
75+
end = 20.dp,
76+
top = 30.dp,
77+
bottom = 10.dp
78+
)
79+
)
80+
val visibleItems = group.items.filter { it.isLayoutVisible }
81+
82+
visibleItems.forEachIndexed { i, item ->
83+
val shape = getRoundedShape(i, visibleItems.size)
84+
85+
PreferenceItemView(
86+
item = item,
87+
modifier = Modifier.animateItem(),
88+
roundedShape = shape
89+
)
90+
}
91+
}
92+
93+
is PreferenceGroup.Items -> {
94+
val visibleItems = group.items.filter { it.isLayoutVisible }
95+
96+
visibleItems.forEachIndexed { i, item ->
97+
val shape = getRoundedShape(i, visibleItems.size)
98+
99+
PreferenceItemView(
100+
item = item,
101+
modifier = Modifier.animateItem(),
102+
roundedShape = shape
103+
)
104+
}
105+
}
106+
107+
else -> {}
108+
}
109+
}
110+
111+
item {
112+
Spacer(
113+
modifier = Modifier
114+
.fillMaxWidth()
115+
.height(25.dp)
116+
)
117+
}
118+
}
119+
})
120+
}

app/src/main/java/in/hridayan/ashell/settings/presentation/provider/SettingsProvider.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,12 @@ object SettingsProvider {
264264
titleResId = R.string.backup_all_data,
265265
descriptionResId = R.string.des_backup_all_data,
266266
iconResId = R.drawable.ic_upload_file
267+
),
268+
nullPreferenceItem(
269+
key = SettingsKeys.BACKUP_SCHEDULER,
270+
titleResId = R.string.backup_scheduler,
271+
descriptionResId = R.string.des_backup_scheduler,
272+
iconResId = R.drawable.ic_schedule
267273
)
268274
),
269275

@@ -288,4 +294,8 @@ object SettingsProvider {
288294
)
289295
)
290296
)
297+
298+
val backupSchedulerPageList: List<PreferenceGroup> = listOf(
299+
300+
)
291301
}

app/src/main/java/in/hridayan/ashell/settings/presentation/viewmodel/SettingsViewModel.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ class SettingsViewModel @Inject constructor(
6363
var backupPageList by mutableStateOf<List<PreferenceGroup>>(emptyList())
6464
private set
6565

66+
var backupSchedulerPageList by mutableStateOf<List<PreferenceGroup>>(emptyList())
67+
private set
68+
6669
fun loadSettings() {
6770
viewModelScope.launch {
6871
val settings = SettingsProvider.settingsPageList
@@ -71,6 +74,7 @@ class SettingsViewModel @Inject constructor(
7174
val behavior = SettingsProvider.behaviorPageList
7275
val autoUpdate = SettingsProvider.autoUpdatePageList
7376
val backup = SettingsProvider.backupPageList
77+
val backupScheduler = SettingsProvider.backupSchedulerPageList
7478
val about = SettingsProvider.aboutPageList
7579

7680
settingsPageList = settings
@@ -79,6 +83,7 @@ class SettingsViewModel @Inject constructor(
7983
behaviorPageList = behavior
8084
autoUpdatePageList = autoUpdate
8185
backupPageList = backup
86+
backupSchedulerPageList = backupScheduler
8287
aboutPageList = about
8388
}
8489
}
@@ -244,6 +249,10 @@ class SettingsViewModel @Inject constructor(
244249
}
245250
}
246251

252+
SettingsKeys.BACKUP_SCHEDULER -> _uiEvent.emit(
253+
SettingsUiEvent.Navigate(NavRoutes.BackupSchedulerScreen)
254+
)
255+
247256
// Restore: show source dialog if signed in, else go straight to local
248257
SettingsKeys.RESTORE_APP_DATA -> {
249258
if (googleAuthRepository.googleUserState.value.isSignedIn) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:tint="?attr/colorControlNormal"
5+
android:viewportWidth="960"
6+
android:viewportHeight="960">
7+
<path
8+
android:fillColor="@android:color/white"
9+
android:pathData="M520,464L520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320L440,479Q440,487 443,494.5Q446,502 452,508L584,640Q595,651 612,651Q629,651 640,640Q651,629 651,612Q651,595 640,584L520,464ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM480,800Q613,800 706.5,706.5Q800,613 800,480Q800,347 706.5,253.5Q613,160 480,160Q347,160 253.5,253.5Q160,347 160,480Q160,613 253.5,706.5Q347,800 480,800Z" />
10+
</vector>

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
<string name="back">Back</string>
2828
<string name="back_button">Back button</string>
2929
<string name="backup">Backup</string>
30+
<string name="backup_scheduler">Backup scheduler</string>
31+
<string name="des_backup_scheduler">Automatically schedule backups at selected intervals</string>
3032
<string name="backup_all_data">Backup all data</string>
3133
<string name="backup_and_restore">Backup &amp; restore</string>
3234
<string name="backup_app_database">Backup app database</string>

0 commit comments

Comments
 (0)