@@ -3,52 +3,56 @@ package com.example.util.simpletimetracker.data_local.backup
33import android.content.ContentResolver
44import android.os.ParcelFileDescriptor
55import androidx.annotation.StringRes
6+ import androidx.core.net.toUri
67import com.example.util.simpletimetracker.core.R
78import com.example.util.simpletimetracker.core.repo.ResourceRepo
89import com.example.util.simpletimetracker.data_local.daysOfWeek.DaysOfWeekDataLocalMapper
9- import com.example.util.simpletimetracker.domain.extension.orEmpty
10- import com.example.util.simpletimetracker.domain.extension.orZero
11- import com.example.util.simpletimetracker.domain.backup.interactor.ClearDataInteractor
10+ import com.example.util.simpletimetracker.data_local.recordsFilter.FavouriteRecordsFilterDBO
11+ import com.example.util.simpletimetracker.data_local.recordsFilter.FavouriteRecordsFilterDao
1212import com.example.util.simpletimetracker.domain.activityFilter.model.ActivityFilter
13- import com.example.util.simpletimetracker.domain.color.model.AppColor
13+ import com.example.util.simpletimetracker.domain.activityFilter.repo.ActivityFilterRepo
14+ import com.example.util.simpletimetracker.domain.activitySuggestion.model.ActivitySuggestion
15+ import com.example.util.simpletimetracker.domain.activitySuggestion.repo.ActivitySuggestionRepo
16+ import com.example.util.simpletimetracker.domain.backup.interactor.ClearDataInteractor
1417import com.example.util.simpletimetracker.domain.backup.model.BackupOptionsData
18+ import com.example.util.simpletimetracker.domain.backup.model.ResultCode
19+ import com.example.util.simpletimetracker.domain.backup.repo.BackupRepo
20+ import com.example.util.simpletimetracker.domain.category.model.Category
21+ import com.example.util.simpletimetracker.domain.category.model.RecordTypeCategory
22+ import com.example.util.simpletimetracker.domain.category.repo.CategoryRepo
23+ import com.example.util.simpletimetracker.domain.category.repo.RecordTypeCategoryRepo
24+ import com.example.util.simpletimetracker.domain.color.model.AppColor
1525import com.example.util.simpletimetracker.domain.complexRule.model.ComplexRule
26+ import com.example.util.simpletimetracker.domain.complexRule.repo.ComplexRuleRepo
1627import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
28+ import com.example.util.simpletimetracker.domain.extension.orEmpty
29+ import com.example.util.simpletimetracker.domain.extension.orZero
1730import com.example.util.simpletimetracker.domain.favourite.model.FavouriteColor
1831import com.example.util.simpletimetracker.domain.favourite.model.FavouriteComment
1932import com.example.util.simpletimetracker.domain.favourite.model.FavouriteIcon
20- import com.example.util.simpletimetracker.domain.record.model.Record
21- import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
22- import com.example.util.simpletimetracker.domain.recordTag.model.RecordToRecordTag
23- import com.example.util.simpletimetracker.domain.recordType.model.RecordType
24- import com.example.util.simpletimetracker.domain.category.model.RecordTypeCategory
25- import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
26- import com.example.util.simpletimetracker.domain.recordTag.model.RecordTypeToDefaultTag
27- import com.example.util.simpletimetracker.domain.recordTag.model.RecordTypeToTag
28- import com.example.util.simpletimetracker.domain.activityFilter.repo.ActivityFilterRepo
29- import com.example.util.simpletimetracker.domain.activitySuggestion.model.ActivitySuggestion
30- import com.example.util.simpletimetracker.domain.activitySuggestion.repo.ActivitySuggestionRepo
31- import com.example.util.simpletimetracker.domain.category.repo.CategoryRepo
32- import com.example.util.simpletimetracker.domain.complexRule.repo.ComplexRuleRepo
3333import com.example.util.simpletimetracker.domain.favourite.repo.FavouriteColorRepo
3434import com.example.util.simpletimetracker.domain.favourite.repo.FavouriteCommentRepo
3535import com.example.util.simpletimetracker.domain.favourite.repo.FavouriteIconRepo
36+ import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
37+ import com.example.util.simpletimetracker.domain.record.model.Record
3638import com.example.util.simpletimetracker.domain.record.repo.RecordRepo
37- import com.example.util.simpletimetracker.domain.recordTag.repo.RecordTagRepo
38- import com.example.util.simpletimetracker.domain.recordTag.repo.RecordToRecordTagRepo
39- import com.example.util.simpletimetracker.domain.category.repo.RecordTypeCategoryRepo
40- import com.example.util.simpletimetracker.domain.recordType.repo.RecordTypeGoalRepo
41- import com.example.util.simpletimetracker.domain.recordType.repo.RecordTypeRepo
42- import com.example.util.simpletimetracker.domain.recordTag.repo.RecordTypeToDefaultTagRepo
43- import com.example.util.simpletimetracker.domain.recordTag.repo.RecordTypeToTagRepo
44- import com.example.util.simpletimetracker.domain.backup.repo.BackupRepo
45- import com.example.util.simpletimetracker.domain.backup.model.ResultCode
46- import com.example.util.simpletimetracker.domain.category.model.Category
4739import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
4840import com.example.util.simpletimetracker.domain.recordShortcut.repo.RecordShortcutRepo
4941import com.example.util.simpletimetracker.domain.recordTag.model.RecordShortcutToRecordTag
42+ import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
5043import com.example.util.simpletimetracker.domain.recordTag.model.RecordTagValueType
44+ import com.example.util.simpletimetracker.domain.recordTag.model.RecordToRecordTag
45+ import com.example.util.simpletimetracker.domain.recordTag.model.RecordTypeToDefaultTag
46+ import com.example.util.simpletimetracker.domain.recordTag.model.RecordTypeToTag
5147import com.example.util.simpletimetracker.domain.recordTag.repo.RecordShortcutToRecordTagRepo
48+ import com.example.util.simpletimetracker.domain.recordTag.repo.RecordTagRepo
49+ import com.example.util.simpletimetracker.domain.recordTag.repo.RecordToRecordTagRepo
50+ import com.example.util.simpletimetracker.domain.recordTag.repo.RecordTypeToDefaultTagRepo
51+ import com.example.util.simpletimetracker.domain.recordTag.repo.RecordTypeToTagRepo
52+ import com.example.util.simpletimetracker.domain.recordType.model.RecordType
53+ import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
54+ import com.example.util.simpletimetracker.domain.recordType.repo.RecordTypeGoalRepo
55+ import com.example.util.simpletimetracker.domain.recordType.repo.RecordTypeRepo
5256import kotlinx.coroutines.Dispatchers
5357import kotlinx.coroutines.withContext
5458import timber.log.Timber
@@ -60,8 +64,6 @@ import java.io.InputStream
6064import java.io.InputStreamReader
6165import javax.inject.Inject
6266import javax.inject.Singleton
63- import androidx.core.net.toUri
64- import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
6567
6668/* *
6769 * Do not change backup parts order, always add new to the end.
@@ -87,6 +89,7 @@ class BackupRepoImpl @Inject constructor(
8789 private val recordTypeGoalRepo : RecordTypeGoalRepo ,
8890 private val complexRuleRepo : ComplexRuleRepo ,
8991 private val recordShortcutRepo : RecordShortcutRepo ,
92+ private val favouriteRecordsFilterDao : FavouriteRecordsFilterDao ,
9093 private val clearDataInteractor : ClearDataInteractor ,
9194 private val prefsInteractor : PrefsInteractor ,
9295 private val resourceRepo : ResourceRepo ,
@@ -173,6 +176,12 @@ class BackupRepoImpl @Inject constructor(
173176 activitySuggestionRepo.getAll().forEach {
174177 fileOutputStream?.write(it.let (::toBackupString).toByteArray())
175178 }
179+ favouriteRecordsFilterDao.getAll().forEach {
180+ fileOutputStream?.write(it.main.let (::toBackupString).toByteArray())
181+ it.filters.forEach { filter ->
182+ fileOutputStream?.write(filter.let (::toBackupString).toByteArray())
183+ }
184+ }
176185 backupPrefsRepo.saveToBackupString().let {
177186 fileOutputStream?.write(it.toByteArray())
178187 }
@@ -188,6 +197,7 @@ class BackupRepoImpl @Inject constructor(
188197 fileOutputStream?.close()
189198 fileDescriptor?.close()
190199 } catch (e: IOException ) {
200+ Timber .e(e)
191201 // Do nothing
192202 }
193203 }
@@ -235,6 +245,8 @@ class BackupRepoImpl @Inject constructor(
235245 goals = recordTypeGoalRepo::add,
236246 rules = complexRuleRepo::add,
237247 activitySuggestion = activitySuggestionRepo::add,
248+ favRecordsFilters = favouriteRecordsFilterDao::insertMain,
249+ favRecordsFilter = favouriteRecordsFilterDao::insertFilter,
238250 settings = { if (restoreSettings) backupPrefsRepo.restoreFromBackupString(it) },
239251 ),
240252 )
@@ -389,6 +401,18 @@ class BackupRepoImpl @Inject constructor(
389401 }
390402 }
391403
404+ ROW_FAV_RECORD_FILTERS -> {
405+ favRecordsFiltersFromBackupString(parts).let {
406+ dataHandler.favRecordsFilters.invoke(it)
407+ }
408+ }
409+
410+ ROW_FAV_RECORD_FILTER -> {
411+ favRecordsFilterFromBackupString(parts).let {
412+ dataHandler.favRecordsFilter.invoke(it)
413+ }
414+ }
415+
392416 BackupPrefsRepo .PREFS_KEY -> {
393417 dataHandler.settings.invoke(parts)
394418 }
@@ -404,6 +428,7 @@ class BackupRepoImpl @Inject constructor(
404428 inputStream?.close()
405429 reader?.close()
406430 } catch (e: IOException ) {
431+ Timber .e(e)
407432 // Do nothing
408433 }
409434 }
@@ -624,6 +649,37 @@ class BackupRepoImpl @Inject constructor(
624649 )
625650 }
626651
652+ private fun toBackupString (data : FavouriteRecordsFilterDBO .MainDBO ): String {
653+ return String .format(
654+ " $ROW_FAV_RECORD_FILTERS \t %s\n " ,
655+ data.id.toString(),
656+ )
657+ }
658+
659+ private fun toBackupString (data : FavouriteRecordsFilterDBO .FilterDBO ): String {
660+ fun FavouriteRecordsFilterDBO.RangeDBO.toBackupString (): String {
661+ return listOf (this .rangeTimeStarted, this .rangeTimeEnded)
662+ .joinToString(separator = " ," )
663+ }
664+ return String .format(
665+ " $ROW_FAV_RECORD_FILTER \t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\n " ,
666+ data.id.toString(),
667+ data.ownerId.toString(),
668+ data.type.toString(),
669+ data.commonItemsIds.orEmpty(),
670+ data.commentItemsIds.orEmpty(),
671+ data.commentItemsText?.cleanTabs()?.replaceNewline().orEmpty(),
672+ data.duplicationItemsIds.orEmpty(),
673+ data.manuallyFilteredItemsIds.orEmpty(),
674+ data.range?.toBackupString().orEmpty(),
675+ data.rangeLength?.rangeType?.toString().orEmpty(),
676+ data.rangeLength?.customRange?.toBackupString().orEmpty(),
677+ data.rangeLength?.lastDays?.toString().orEmpty(),
678+ data.rangeLength?.position?.toString().orEmpty(),
679+ data.daysOfWeek.orEmpty(),
680+ )
681+ }
682+
627683 private fun recordTypeFromBackupString (parts : List <String >): Pair <RecordType , List <RecordTypeGoal >> {
628684 val typeId = parts.getOrNull(1 )?.toLongOrNull().orZero()
629685
@@ -911,6 +967,42 @@ class BackupRepoImpl @Inject constructor(
911967 )
912968 }
913969
970+ private fun favRecordsFiltersFromBackupString (parts : List <String >): FavouriteRecordsFilterDBO .MainDBO {
971+ return FavouriteRecordsFilterDBO .MainDBO (
972+ id = parts.getOrNull(1 )?.toLongOrNull().orZero(),
973+ )
974+ }
975+
976+ private fun favRecordsFilterFromBackupString (parts : List <String >): FavouriteRecordsFilterDBO .FilterDBO {
977+ fun String.rangeFromBackupString (): FavouriteRecordsFilterDBO .RangeDBO ? {
978+ val rangeParts = this .split(' ,' )
979+ return FavouriteRecordsFilterDBO .RangeDBO (
980+ rangeTimeStarted = rangeParts.getOrNull(0 )?.toLongOrNull() ? : return null ,
981+ rangeTimeEnded = rangeParts.getOrNull(1 )?.toLongOrNull() ? : return null ,
982+ )
983+ }
984+ return FavouriteRecordsFilterDBO .FilterDBO (
985+ id = parts.getOrNull(1 )?.toLongOrNull().orZero(),
986+ ownerId = parts.getOrNull(2 )?.toLongOrNull().orZero(),
987+ type = parts.getOrNull(3 )?.toLongOrNull().orZero(),
988+ commonItemsIds = parts.getOrNull(4 )?.takeUnless { it.isEmpty() },
989+ commentItemsIds = parts.getOrNull(5 )?.takeUnless { it.isEmpty() },
990+ commentItemsText = parts.getOrNull(6 )?.restoreNewline()?.takeUnless { it.isEmpty() },
991+ duplicationItemsIds = parts.getOrNull(7 )?.takeUnless { it.isEmpty() },
992+ manuallyFilteredItemsIds = parts.getOrNull(8 )?.takeUnless { it.isEmpty() },
993+ range = parts.getOrNull(9 )?.rangeFromBackupString(),
994+ rangeLength = run {
995+ FavouriteRecordsFilterDBO .RangeLengthDBO (
996+ rangeType = parts.getOrNull(10 )?.toLongOrNull() ? : return @run null ,
997+ customRange = parts.getOrNull(11 )?.rangeFromBackupString(),
998+ lastDays = parts.getOrNull(12 )?.toLongOrNull(),
999+ position = parts.getOrNull(13 )?.toLongOrNull() ? : return @run null ,
1000+ )
1001+ },
1002+ daysOfWeek = parts.getOrNull(14 )?.takeUnless { it.isEmpty() },
1003+ )
1004+ }
1005+
9141006 fun migrateTags (
9151007 types : List <RecordType >,
9161008 data : List <Pair <RecordTag , Long >>,
@@ -961,6 +1053,8 @@ class BackupRepoImpl @Inject constructor(
9611053 val goals : suspend (RecordTypeGoal ) -> Unit ,
9621054 val rules : suspend (ComplexRule ) -> Unit ,
9631055 val activitySuggestion : suspend (List <ActivitySuggestion >) -> Unit ,
1056+ val favRecordsFilters : suspend (FavouriteRecordsFilterDBO .MainDBO ) -> Unit ,
1057+ val favRecordsFilter : suspend (FavouriteRecordsFilterDBO .FilterDBO ) -> Unit ,
9641058 val settings : suspend (List <String >) -> Unit ,
9651059 )
9661060
@@ -983,5 +1077,7 @@ class BackupRepoImpl @Inject constructor(
9831077 private const val ROW_FAVOURITE_ICON = " favouriteIcon"
9841078 private const val ROW_RECORD_TYPE_GOAL = " recordTypeGoal"
9851079 private const val ROW_COMPLEX_RULE = " complexRule"
1080+ private const val ROW_FAV_RECORD_FILTERS = " favRecordsFilters"
1081+ private const val ROW_FAV_RECORD_FILTER = " favRecordsFilter"
9861082 }
9871083}
0 commit comments