Skip to content

Commit 3528409

Browse files
committed
add favourite records filters to backup
1 parent f36aa8f commit 3528409

4 files changed

Lines changed: 140 additions & 37 deletions

File tree

data_local/src/main/java/com/example/util/simpletimetracker/data_local/backup/BackupPartialRepoImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.example.util.simpletimetracker.data_local.backup
33
import com.example.util.simpletimetracker.core.R
44
import com.example.util.simpletimetracker.core.repo.ResourceRepo
55
import com.example.util.simpletimetracker.data_local.backup.BackupRepoImpl.DataHandler
6+
import com.example.util.simpletimetracker.data_local.recordsFilter.FavouriteRecordsFilterDBO
67
import com.example.util.simpletimetracker.domain.extension.orEmpty
78
import com.example.util.simpletimetracker.domain.extension.orZero
89
import com.example.util.simpletimetracker.domain.activityFilter.model.ActivityFilter
@@ -302,6 +303,8 @@ class BackupPartialRepoImpl @Inject constructor(
302303
val rulesCurrent: List<ComplexRule> = complexRuleRepo.getAll()
303304
val activitySuggestions: MutableList<ActivitySuggestion> = mutableListOf()
304305
val activitySuggestionsCurrent: List<ActivitySuggestion> = activitySuggestionRepo.getAll()
306+
val favRecordsFilters: MutableList<FavouriteRecordsFilterDBO.MainDBO> = mutableListOf() // Not used.
307+
val favRecordsFilter: MutableList<FavouriteRecordsFilterDBO.FilterDBO> = mutableListOf() // Not used.
305308
val settings: MutableList<List<String>> = mutableListOf()
306309

307310
val result = backupRepo.readBackup(
@@ -334,6 +337,8 @@ class BackupPartialRepoImpl @Inject constructor(
334337
goals = goals::add,
335338
rules = rules::add,
336339
activitySuggestion = activitySuggestions::addAll,
340+
favRecordsFilters = favRecordsFilters::add,
341+
favRecordsFilter = favRecordsFilter::add,
337342
settings = settings::add,
338343
),
339344
)

data_local/src/main/java/com/example/util/simpletimetracker/data_local/backup/BackupRepoImpl.kt

Lines changed: 125 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,56 @@ package com.example.util.simpletimetracker.data_local.backup
33
import android.content.ContentResolver
44
import android.os.ParcelFileDescriptor
55
import androidx.annotation.StringRes
6+
import androidx.core.net.toUri
67
import com.example.util.simpletimetracker.core.R
78
import com.example.util.simpletimetracker.core.repo.ResourceRepo
89
import 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
1212
import 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
1417
import 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
1525
import com.example.util.simpletimetracker.domain.complexRule.model.ComplexRule
26+
import com.example.util.simpletimetracker.domain.complexRule.repo.ComplexRuleRepo
1627
import 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
1730
import com.example.util.simpletimetracker.domain.favourite.model.FavouriteColor
1831
import com.example.util.simpletimetracker.domain.favourite.model.FavouriteComment
1932
import 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
3333
import com.example.util.simpletimetracker.domain.favourite.repo.FavouriteColorRepo
3434
import com.example.util.simpletimetracker.domain.favourite.repo.FavouriteCommentRepo
3535
import 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
3638
import 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
4739
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
4840
import com.example.util.simpletimetracker.domain.recordShortcut.repo.RecordShortcutRepo
4941
import com.example.util.simpletimetracker.domain.recordTag.model.RecordShortcutToRecordTag
42+
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
5043
import 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
5147
import 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
5256
import kotlinx.coroutines.Dispatchers
5357
import kotlinx.coroutines.withContext
5458
import timber.log.Timber
@@ -60,8 +64,6 @@ import java.io.InputStream
6064
import java.io.InputStreamReader
6165
import javax.inject.Inject
6266
import 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
}

data_local/src/main/java/com/example/util/simpletimetracker/data_local/recordsFilter/FavouriteRecordsFilterDataLocalMapper.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,18 @@ class FavouriteRecordsFilterDataLocalMapper @Inject constructor(
8484
.mapNotNull(String::toLongOrNull)
8585
val range = Range(
8686
timeStarted = rangeTimes.getOrNull(0) ?: return@mapNotNull null,
87-
timeEnded = rangeTimes.getOrNull(1) ?: return@mapNotNull null
87+
timeEnded = rangeTimes.getOrNull(1) ?: return@mapNotNull null,
8888
)
8989
RecordsFilter.ManuallyFilteredItem.Untracked(range)
9090
}
9191
else -> null
9292
}
9393
}.takeIf { it.isNotEmpty() }
9494
val commonItemsParts = dbo.commonItemsIds.orEmpty().split(GROUP_SEPARATOR)
95-
val commonItems = commonItemsParts.getOrNull(0)?.split(SEPARATOR)?.map { true to it }.orEmpty() +
96-
commonItemsParts.getOrNull(1)?.split(SEPARATOR)?.map { false to it }.orEmpty()
95+
val commonItems = commonItemsParts.getOrNull(0)
96+
?.split(SEPARATOR)?.map { true to it }.orEmpty() +
97+
commonItemsParts.getOrNull(1)
98+
?.split(SEPARATOR)?.map { false to it }.orEmpty()
9799

98100
val filter = when (dbo.type) {
99101
0L -> RecordsFilter.Untracked
@@ -205,7 +207,7 @@ class FavouriteRecordsFilterDataLocalMapper @Inject constructor(
205207
val commonItemsIds = when (domain) {
206208
is RecordsFilter.Activity -> {
207209
val items = domain.selected.map { true to it } +
208-
domain.filtered.map { false to it }
210+
domain.filtered.map { false to it }
209211
val itemsMapped = items.map { (selected, item) ->
210212
selected to item.toString()
211213
}
@@ -217,7 +219,7 @@ class FavouriteRecordsFilterDataLocalMapper @Inject constructor(
217219
}
218220
is RecordsFilter.Category -> {
219221
val items = domain.selected.map { true to it } +
220-
domain.filtered.map { false to it }
222+
domain.filtered.map { false to it }
221223
val itemsMapped = items.map { (selected, item) ->
222224
selected to when (item) {
223225
is RecordsFilter.CategoryItem.Categorized -> item.categoryId.toString()
@@ -232,7 +234,7 @@ class FavouriteRecordsFilterDataLocalMapper @Inject constructor(
232234
}
233235
is RecordsFilter.Tags -> {
234236
val items = domain.selected.map { true to it } +
235-
domain.filtered.map { false to it }
237+
domain.filtered.map { false to it }
236238
val itemsMapped = items.map { (selected, item) ->
237239
selected to when (item) {
238240
is RecordsFilter.TagItem.Tagged -> item.tagId.toString()
@@ -282,7 +284,7 @@ class FavouriteRecordsFilterDataLocalMapper @Inject constructor(
282284

283285
return FavouriteRecordsFilterDBO.FilterDBO(
284286
id = 0L,
285-
ownerId = 0L,
287+
ownerId = 0L, // Filled later.
286288
type = when (domain) {
287289
is RecordsFilter.Untracked -> 0L
288290
is RecordsFilter.Multitask -> 1L

features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/viewModel/DataEditViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ class DataEditViewModel @Inject constructor(
285285
untrackedSelectionAvailable = false,
286286
multitaskSelectionAvailable = false,
287287
duplicationsSelectionAvailable = true,
288-
favouriteSelectionAvailable = false, // TODO FILTER add to Data Edit?
288+
favouriteSelectionAvailable = true,
289289
addRunningRecords = false,
290290
),
291291
filters = filters.map(RecordsFilter::toParams),

0 commit comments

Comments
 (0)