Skip to content

Commit 62d6f00

Browse files
committed
improved UX in backup screen
1 parent f839305 commit 62d6f00

3 files changed

Lines changed: 47 additions & 22 deletions

File tree

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ fun BackupAndRestoreScreen(
9595
val lastCloudBackupTime = LocalSettings.current.lastCloudBackupTime
9696
val lastCloudBackupType = LocalSettings.current.lastCloudBackupType
9797

98-
val isFetchingCloudBackupTime by backupAndRestoreViewModel.isFetchingCloudBackupTime.collectAsState()
98+
val isFetchingCloudBackupTime by backupAndRestoreViewModel.isFetchingCloudBackup.collectAsState()
9999
var isLastBackupDetailsCardExpanded by rememberSaveable { mutableStateOf(false) }
100100

101101
val googleUserState by backupAndRestoreViewModel.googleUserState.collectAsState()
@@ -387,8 +387,6 @@ private fun LastBackupTimeCard(
387387
if (isExpanded) CardCornerShape.FIRST_CARD else RoundedCornerShape(cardHeight / 2)
388388

389389
val perUserLastCloudBackupTime = when {
390-
!userState.isSignedIn -> stringResource(R.string.not_signed_in)
391-
392390
isFetching -> stringResource(R.string.fetching_backup_time)
393391

394392
lastCloudBackupTime.isNotEmpty() ->
@@ -398,18 +396,27 @@ private fun LastBackupTimeCard(
398396
"$date | $time"
399397
}
400398

399+
else -> ""
400+
}
401+
402+
val perUserLastCloudBackupType = when {
403+
!userState.isSignedIn -> stringResource(R.string.not_signed_in)
404+
405+
isFetching -> stringResource(R.string.fetching_backup_type)
406+
407+
lastCloudBackupType.isNotEmpty() -> lastCloudBackupType
408+
401409
else -> stringResource(R.string.none)
402410
}
403411

404412
val formattedLastLocalBackupTime =
405-
if (lastLocalBackupTime.isEmpty()) stringResource(R.string.none)
413+
if (lastLocalBackupTime.isEmpty()) "-- -- -- | --:--"
406414
else lastLocalBackupTime.split(" ").let { parts ->
407415
val date = parts.getOrNull(0).orEmpty()
408416
val time = parts.getOrNull(1).orEmpty()
409417
"$date | $time"
410418
}
411419

412-
413420
Column(modifier = modifier.animateContentSize()) {
414421
RoundedCornerCard(
415422
modifier = Modifier
@@ -454,7 +461,7 @@ private fun LastBackupTimeCard(
454461
roundedCornerShape = CardCornerShape.MIDDLE_CARD,
455462
icon = painterResource(R.drawable.ic_mobile),
456463
title = stringResource(R.string.device_backup_local),
457-
backupType = lastLocalBackupType,
464+
backupType = lastLocalBackupType.ifEmpty { stringResource(R.string.none) },
458465
timeDescription = formattedLastLocalBackupTime
459466
)
460467

@@ -463,7 +470,7 @@ private fun LastBackupTimeCard(
463470
roundedCornerShape = CardCornerShape.LAST_CARD,
464471
icon = painterResource(R.drawable.ic_cloud_done),
465472
title = stringResource(R.string.cloud_backup_google_drive),
466-
backupType = lastCloudBackupType,
473+
backupType = perUserLastCloudBackupType,
467474
timeDescription = perUserLastCloudBackupTime
468475
)
469476
}
@@ -486,7 +493,7 @@ private fun TimeCard(
486493
BackupType.SETTINGS_ONLY.name -> stringResource(R.string.settings_only)
487494
BackupType.DATABASE_ONLY.name -> stringResource(R.string.databases_only)
488495
BackupType.SETTINGS_AND_DATABASE.name -> stringResource(R.string.all_data)
489-
else -> stringResource(R.string.none)
496+
else -> backupType
490497
}
491498

492499
RoundedCornerCard(
@@ -523,11 +530,13 @@ private fun TimeCard(
523530
modifier = Modifier.alpha(0.9f)
524531
)
525532

526-
Text(
527-
text = timeDescription,
528-
style = MaterialTheme.typography.bodySmall,
529-
modifier = Modifier.alpha(0.9f)
530-
)
533+
if (timeDescription.isNotEmpty()) {
534+
Text(
535+
text = timeDescription,
536+
style = MaterialTheme.typography.bodySmall,
537+
modifier = Modifier.alpha(0.9f)
538+
)
539+
}
531540
}
532541
}
533542
}

app/src/main/java/in/hridayan/ashell/settings/presentation/page/backup/viewmodel/BackupAndRestoreViewModel.kt

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ class BackupAndRestoreViewModel @Inject constructor(
7070
private val _cloudBackupType = MutableStateFlow<String?>(null)
7171
val cloudBackupType: StateFlow<String?> = _cloudBackupType.asStateFlow()
7272

73-
private val _isFetchingCloudBackupTime = MutableStateFlow(false)
74-
val isFetchingCloudBackupTime: StateFlow<Boolean> = _isFetchingCloudBackupTime.asStateFlow()
73+
private val _isFetchingCloudBackup = MutableStateFlow(false)
74+
val isFetchingCloudBackup: StateFlow<Boolean> = _isFetchingCloudBackup.asStateFlow()
7575

7676
private val _showCloudRestoreConfirm = MutableStateFlow(false)
7777
val showCloudRestoreConfirm: StateFlow<Boolean> = _showCloudRestoreConfirm.asStateFlow()
@@ -173,7 +173,7 @@ class BackupAndRestoreViewModel @Inject constructor(
173173

174174
if (authorized) {
175175
// This is done to show correct last backup time per Google account
176-
syncCloudBackupTimeSilently()
176+
syncCloudBackupDetailsOnSignIn()
177177
}
178178
},
179179
onFailure = { error ->
@@ -192,6 +192,7 @@ class BackupAndRestoreViewModel @Inject constructor(
192192
viewModelScope.launch {
193193
googleAuthRepository.signOut()
194194
_uiEvent.emit(SettingsUiEvent.ShowToast(context.getString(R.string.signed_out)))
195+
settingsRepository.setString(SettingsKeys.LAST_CLOUD_BACKUP_TIME, "")
195196
}
196197
}
197198

@@ -213,7 +214,7 @@ class BackupAndRestoreViewModel @Inject constructor(
213214

214215
null -> {
215216
Log.d(TAG, "onConsentGranted: no pending operation to retry")
216-
syncCloudBackupTimeSilently()
217+
syncCloudBackupDetailsOnSignIn()
217218
}
218219
}
219220
}
@@ -310,24 +311,25 @@ class BackupAndRestoreViewModel @Inject constructor(
310311
}
311312
}
312313

313-
private fun syncCloudBackupTimeSilently() {
314+
private fun syncCloudBackupDetailsOnSignIn() {
314315
viewModelScope.launch {
315316
Log.d(TAG, "syncCloudBackupTimeSilently: starting...")
316317

317-
_isFetchingCloudBackupTime.value = true
318+
_isFetchingCloudBackup.value = true
318319

319320
val result = googleDriveRepository.downloadBackup()
320321

321322
if (result == null) {
322323
if (googleDriveRepository.isConsentPending) {
323324
Log.d(TAG, "syncCloudBackupTimeSilently: consent required, skipping for now")
324-
_isFetchingCloudBackupTime.value = false
325+
_isFetchingCloudBackup.value = false
325326
return@launch
326327
}
327328

328329
Log.d(TAG, "syncCloudBackupTimeSilently: no backup found")
329330
settingsRepository.setString(SettingsKeys.LAST_CLOUD_BACKUP_TIME, "")
330-
_isFetchingCloudBackupTime.value = false
331+
settingsRepository.setString(SettingsKeys.LAST_CLOUD_BACKUP_TYPE, "")
332+
_isFetchingCloudBackup.value = false
331333
return@launch
332334
}
333335

@@ -346,7 +348,20 @@ class BackupAndRestoreViewModel @Inject constructor(
346348
Log.e(TAG, "syncCloudBackupTimeSilently: failed to extract time")
347349
}
348350

349-
_isFetchingCloudBackupTime.value = false
351+
val type = backupAndRestoreRepository.getBackupTypeFromBytes(bytes)
352+
353+
if (type != null) {
354+
Log.d(TAG, "syncCloudBackupTypeSilently: extracted type=$type")
355+
356+
settingsRepository.setString(
357+
SettingsKeys.LAST_CLOUD_BACKUP_TYPE,
358+
type
359+
)
360+
} else {
361+
Log.e(TAG, "syncCloudBackupTypeSilently: failed to extract type")
362+
}
363+
364+
_isFetchingCloudBackup.value = false
350365
}
351366
}
352367

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<string name="back_button">Back button</string>
2929
<string name="backup">Backup</string>
3030
<string name="backup_scheduler">Backup scheduler</string>
31+
<string name="fetching_backup_type">Fetching backup type…</string>
3132
<string name="des_backup_scheduler">Automatically schedule backups at selected intervals</string>
3233
<string name="backup_all_data">Backup all data</string>
3334
<string name="backup_and_restore">Backup &amp; restore</string>

0 commit comments

Comments
 (0)