diff --git a/app/src/main/java/eu/m724/pojavbackup/core/backup/BackupWorker.kt b/app/src/main/java/eu/m724/pojavbackup/core/backup/BackupWorker.kt index 67ce3fc..f73383b 100644 --- a/app/src/main/java/eu/m724/pojavbackup/core/backup/BackupWorker.kt +++ b/app/src/main/java/eu/m724/pojavbackup/core/backup/BackupWorker.kt @@ -33,9 +33,11 @@ class BackupWorker @AssistedInject constructor( val backup = backupRepository.createBackup() - // TODO multiple destinations support and remove those !! + val settings = settingsRepository.getSettings() + val worldIds = settingsRepository.getIncludedWorldIds(settings.worldOrder) - val backupUri = settingsRepository.getDestinations().first().uri.toUri() + // TODO multiple destinations support and remove those !! + val backupUri = settings.destinationsList.first().uri.toUri() val backupDirectory = DocumentFile.fromTreeUri(applicationContext, backupUri)!! .createDirectory(DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.now()) + " (" + backup.id + ")")!! @@ -43,7 +45,7 @@ class BackupWorker @AssistedInject constructor( statusUpdate("#${backup.id} Initialized") Log.d(TAG, "Initialized backup: ${backup.id}") - settingsRepository.getIncludedWorldIds().forEach { + worldIds.forEach { statusUpdate("#${backup.id} Backing up world $it") Log.d(TAG, "Backing up world $it") @@ -63,7 +65,7 @@ class BackupWorker @AssistedInject constructor( contentResolver = applicationContext.contentResolver, source = world.getOrThrow().documentFile!!, target = it, - inflate = true + inflate = settings.improvement ) } } diff --git a/app/src/main/java/eu/m724/pojavbackup/core/datastore/SettingsRepository.kt b/app/src/main/java/eu/m724/pojavbackup/core/datastore/SettingsRepository.kt index c59b5d4..5e5fcae 100644 --- a/app/src/main/java/eu/m724/pojavbackup/core/datastore/SettingsRepository.kt +++ b/app/src/main/java/eu/m724/pojavbackup/core/datastore/SettingsRepository.kt @@ -23,10 +23,29 @@ class SettingsRepository @Inject constructor( return dataStore.data.first() } + suspend fun updateSettings( + improvement: Boolean? = null + ) { + dataStore.updateData { + val builder = it.toBuilder() + + if (improvement != null) { + builder.setImprovement(improvement) + } + + // add here + + builder.build() + } + } + /* Worlds */ suspend fun getIncludedWorldIds(): List { - val worldOrder = getSettings().worldOrder + return getIncludedWorldIds(getSettings().worldOrder) + } + + fun getIncludedWorldIds(worldOrder: WorldOrder): List { return worldOrder.worldIdsList.subList(0, worldOrder.separatorIndex) } diff --git a/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreen.kt b/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreen.kt index d3287f4..2bb5069 100644 --- a/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreen.kt +++ b/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreen.kt @@ -2,8 +2,10 @@ package eu.m724.pojavbackup.settings.screen.options import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Button +import androidx.compose.material3.Checkbox import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -18,6 +20,18 @@ fun OptionsScreen( navController: NavController, ) { val viewModel: OptionsScreenViewModel = hiltViewModel() + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + Column { + Toggle( + title = "Optimal mode", + description = "Uses less space, but requires special treatment to restore", + checked = uiState.improvement, + onCheckedChange = { + viewModel.setOptions(improvement = it) + } + ) + } Column( modifier = Modifier.fillMaxSize(), @@ -32,7 +46,26 @@ fun OptionsScreen( Text("Backup now") } - val status by viewModel.backupStatus.collectAsStateWithLifecycle() - Text(text = status) + Text(uiState.backupStatus) + } +} + +@Composable +fun Toggle( + title: String, + description: String, + checked: Boolean, + onCheckedChange: (Boolean) -> Unit +) { + Row { + Checkbox( + checked = checked, + onCheckedChange = onCheckedChange + ) + + Column { + Text(title) + Text(description) + } } } \ No newline at end of file diff --git a/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenUiState.kt b/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenUiState.kt new file mode 100644 index 0000000..e8f97f7 --- /dev/null +++ b/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenUiState.kt @@ -0,0 +1,6 @@ +package eu.m724.pojavbackup.settings.screen.options + +data class OptionsScreenUiState( + val improvement: Boolean = false, + val backupStatus: String = "" +) diff --git a/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenViewModel.kt b/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenViewModel.kt index e4e8a0e..392ea6b 100644 --- a/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenViewModel.kt +++ b/app/src/main/java/eu/m724/pojavbackup/settings/screen/options/OptionsScreenViewModel.kt @@ -9,25 +9,30 @@ import androidx.work.WorkRequest import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import eu.m724.pojavbackup.core.backup.BackupWorker +import eu.m724.pojavbackup.core.datastore.SettingsRepository import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import java.util.UUID import javax.inject.Inject @HiltViewModel class OptionsScreenViewModel @Inject constructor( - @ApplicationContext private val appContext: Context + @ApplicationContext private val appContext: Context, + private val settingsRepository: SettingsRepository ) : ViewModel() { - private val _backupStatus = MutableStateFlow("Not running") - val backupStatus: StateFlow = _backupStatus.asStateFlow() + private val _uiState = MutableStateFlow(OptionsScreenUiState()) + val uiState: StateFlow = _uiState.asStateFlow() private val workManager = WorkManager .getInstance(appContext) fun backupNow() { - _backupStatus.value = "Starting" + _uiState.update { + it.copy(backupStatus = "Starting") + } val uuid = UUID.randomUUID() @@ -40,12 +45,26 @@ class OptionsScreenViewModel @Inject constructor( viewModelScope.launch { workManager.getWorkInfoByIdFlow(uuid).collect { workInfo -> - _backupStatus.value = workInfo?.state.toString() - - workInfo?.progress?.getString("status")?.let { - _backupStatus.value = it + _uiState.update { + it.copy( + backupStatus = workInfo?.state.toString() + workInfo?.progress?.getString("status") + ) } } } } + + fun setOptions( + improvement: Boolean? = true + ) { + _uiState.update { + it.copy( + improvement = improvement ?: it.improvement + ) + } + + viewModelScope.launch { + settingsRepository.updateSettings(improvement = improvement) + } + } } \ No newline at end of file diff --git a/app/src/main/proto/settings.proto b/app/src/main/proto/settings.proto index b1f5089..3b91cf4 100644 --- a/app/src/main/proto/settings.proto +++ b/app/src/main/proto/settings.proto @@ -20,6 +20,7 @@ message Settings { repeated BackupDestination destinations = 3; string sourceUri = 4; + bool improvement = 5; }