Skip to content

Commit 4ecec72

Browse files
committed
fix tags not changing on running record, widgets accessing cache between tag remove and add
1 parent ce7f7e1 commit 4ecec72

File tree

14 files changed

+25
-80
lines changed

14 files changed

+25
-80
lines changed

data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/RecordToRecordTagDao.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.room.OnConflictStrategy
77
import androidx.room.Query
88
import com.example.util.simpletimetracker.data_local.model.RecordToRecordTagDBO
99

10+
@Suppress("unused")
1011
@Dao
1112
interface RecordToRecordTagDao {
1213

data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/RecordTypeCategoryDao.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ import androidx.room.Delete
55
import androidx.room.Insert
66
import androidx.room.OnConflictStrategy
77
import androidx.room.Query
8-
import androidx.room.Transaction
98
import com.example.util.simpletimetracker.data_local.model.RecordTypeCategoryDBO
10-
import com.example.util.simpletimetracker.data_local.model.RecordTypeWithCategoriesDBO
119

1210
@Dao
1311
interface RecordTypeCategoryDao {
@@ -21,10 +19,6 @@ interface RecordTypeCategoryDao {
2119
@Query("SELECT record_type_id FROM recordTypeCategory WHERE category_id = :categoryId")
2220
suspend fun getTypeIdsByCategory(categoryId: Long): List<Long>
2321

24-
@Transaction
25-
@Query("SELECT * FROM recordTypes WHERE id = :typeId LIMIT 1")
26-
suspend fun getTypeWithCategories(typeId: Long): RecordTypeWithCategoriesDBO?
27-
2822
@Insert(onConflict = OnConflictStrategy.REPLACE)
2923
suspend fun insert(recordTypeCategoryDBO: List<RecordTypeCategoryDBO>)
3024

data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeWithCategoriesDBO.kt

Lines changed: 0 additions & 21 deletions
This file was deleted.

data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RecordToRecordTagRepoImpl.kt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,6 @@ class RecordToRecordTagRepoImpl @Inject constructor(
2222
dao.getAll().map(mapper::map)
2323
}
2424

25-
override suspend fun getTagIdsByRecordId(recordId: Long): List<Long> =
26-
withContext(Dispatchers.IO) {
27-
logDataAccess("get tag ids")
28-
dao.getTagIdsByRecordId(recordId)
29-
}
30-
3125
override suspend fun getRecordIdsByTagId(tagId: Long): List<Long> =
3226
withContext(Dispatchers.IO) {
3327
logDataAccess("get record ids")
@@ -54,16 +48,6 @@ class RecordToRecordTagRepoImpl @Inject constructor(
5448
}
5549
}
5650

57-
override suspend fun removeRecordTags(recordId: Long, tagIds: List<Long>) =
58-
withContext(Dispatchers.IO) {
59-
logDataAccess("remove record tags")
60-
tagIds.map {
61-
mapper.map(recordId = recordId, recordTagId = it)
62-
}.let {
63-
dao.delete(it)
64-
}
65-
}
66-
6751
override suspend fun removeAllByTagId(tagId: Long) =
6852
withContext(Dispatchers.IO) {
6953
logDataAccess("remove all by tagId")

data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RecordTypeCategoryRepoImpl.kt

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.example.util.simpletimetracker.data_local.repo
22

33
import com.example.util.simpletimetracker.data_local.database.RecordTypeCategoryDao
4-
import com.example.util.simpletimetracker.data_local.utils.withLockedCache
5-
import com.example.util.simpletimetracker.data_local.mapper.CategoryDataLocalMapper
64
import com.example.util.simpletimetracker.data_local.mapper.RecordTypeCategoryDataLocalMapper
75
import com.example.util.simpletimetracker.data_local.utils.removeIf
8-
import com.example.util.simpletimetracker.domain.model.Category
6+
import com.example.util.simpletimetracker.data_local.utils.withLockedCache
97
import com.example.util.simpletimetracker.domain.model.RecordTypeCategory
108
import com.example.util.simpletimetracker.domain.repo.RecordTypeCategoryRepo
119
import kotlinx.coroutines.sync.Mutex
@@ -15,7 +13,6 @@ import javax.inject.Singleton
1513
@Singleton
1614
class RecordTypeCategoryRepoImpl @Inject constructor(
1715
private val recordTypeCategoryDao: RecordTypeCategoryDao,
18-
private val categoryDataLocalMapper: CategoryDataLocalMapper,
1916
private val recordTypeCategoryDataLocalMapper: RecordTypeCategoryDataLocalMapper,
2017
) : RecordTypeCategoryRepo {
2118

@@ -29,16 +26,6 @@ class RecordTypeCategoryRepoImpl @Inject constructor(
2926
afterSourceAccess = { cache = it },
3027
)
3128

32-
override suspend fun getCategoriesByType(typeId: Long): List<Category> = mutex.withLockedCache(
33-
logMessage = "get categories",
34-
accessSource = {
35-
recordTypeCategoryDao.getTypeWithCategories(typeId)
36-
?.categories
37-
?.map(categoryDataLocalMapper::map)
38-
.orEmpty()
39-
},
40-
)
41-
4229
override suspend fun getCategoryIdsByType(typeId: Long): Set<Long> = mutex.withLockedCache(
4330
logMessage = "get category ids",
4431
accessCache = { cache?.filter { it.recordTypeId == typeId }?.map { it.categoryId }?.toSet() },

data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RecordTypeGoalRepoImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.example.util.simpletimetracker.data_local.database.RecordTypeGoalDao
44
import com.example.util.simpletimetracker.data_local.mapper.RecordTypeGoalDataLocalMapper
55
import com.example.util.simpletimetracker.data_local.utils.logDataAccess
66
import com.example.util.simpletimetracker.data_local.utils.removeIf
7+
import com.example.util.simpletimetracker.data_local.utils.replaceWith
78
import com.example.util.simpletimetracker.data_local.utils.withLockedCache
89
import com.example.util.simpletimetracker.domain.model.RecordTypeGoal
910
import com.example.util.simpletimetracker.domain.model.RecordTypeGoal.IdData
@@ -57,7 +58,7 @@ class RecordTypeGoalRepoImpl @Inject constructor(
5758
override suspend fun add(recordTypeGoal: RecordTypeGoal): Long = mutex.withLockedCache(
5859
logMessage = "add",
5960
accessSource = { dao.insert(recordTypeGoal.let(mapper::map)) },
60-
afterSourceAccess = { cache = null },
61+
afterSourceAccess = { cache = cache?.replaceWith(recordTypeGoal) { it.id == recordTypeGoal.id } },
6162
)
6263

6364
override suspend fun remove(id: Long) = mutex.withLockedCache(

data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RunningRecordRepoImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.example.util.simpletimetracker.data_local.repo
33
import com.example.util.simpletimetracker.data_local.database.RunningRecordDao
44
import com.example.util.simpletimetracker.data_local.mapper.RunningRecordDataLocalMapper
55
import com.example.util.simpletimetracker.data_local.utils.removeIf
6+
import com.example.util.simpletimetracker.data_local.utils.replaceWith
67
import com.example.util.simpletimetracker.data_local.utils.withLockedCache
78
import com.example.util.simpletimetracker.domain.model.RunningRecord
89
import com.example.util.simpletimetracker.domain.repo.RunningRecordRepo
@@ -41,7 +42,7 @@ class RunningRecordRepoImpl @Inject constructor(
4142
override suspend fun add(runningRecord: RunningRecord): Long = mutex.withLockedCache(
4243
logMessage = "add",
4344
accessSource = { dao.insert(runningRecord.let(mapper::map)) },
44-
afterSourceAccess = { cache = null },
45+
afterSourceAccess = { cache = cache?.replaceWith(runningRecord) { it.id == runningRecord.id } },
4546
)
4647

4748
override suspend fun remove(id: Long) = mutex.withLockedCache(

data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/CsvRepoImpl.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.example.util.simpletimetracker.domain.model.Range
1212
import com.example.util.simpletimetracker.domain.model.Record
1313
import com.example.util.simpletimetracker.domain.model.RecordTag
1414
import com.example.util.simpletimetracker.domain.model.RecordType
15+
import com.example.util.simpletimetracker.domain.repo.CategoryRepo
1516
import com.example.util.simpletimetracker.domain.repo.RecordRepo
1617
import com.example.util.simpletimetracker.domain.repo.RecordTagRepo
1718
import com.example.util.simpletimetracker.domain.repo.RecordTypeCategoryRepo
@@ -34,6 +35,7 @@ import timber.log.Timber
3435
class CsvRepoImpl @Inject constructor(
3536
private val contentResolver: ContentResolver,
3637
private val recordTypeRepo: RecordTypeRepo,
38+
private val categoryRepo: CategoryRepo,
3739
private val recordRepo: RecordRepo,
3840
private val recordTypeCategoryRepo: RecordTypeCategoryRepo,
3941
private val recordTagRepo: RecordTagRepo,
@@ -56,9 +58,10 @@ class CsvRepoImpl @Inject constructor(
5658
fileOutputStream?.write(CSV_HEADER.toByteArray())
5759

5860
val recordTypes = recordTypeRepo.getAll().associateBy { it.id }
61+
val categories = categoryRepo.getAll().associateBy { it.id }
5962
val recordTags = recordTagRepo.getAll()
60-
val categories = recordTypes.map { (id, _) ->
61-
id to recordTypeCategoryRepo.getCategoriesByType(id)
63+
val typeToCategories = recordTypes.map { (id, _) ->
64+
id to recordTypeCategoryRepo.getCategoryIdsByType(id).mapNotNull { categories[it] }
6265
}.toMap()
6366

6467
// Write data
@@ -73,7 +76,7 @@ class CsvRepoImpl @Inject constructor(
7376
toCsvString(
7477
record = record,
7578
recordType = recordTypes[record.typeId],
76-
categories = categories[record.typeId].orEmpty(),
79+
categories = typeToCategories[record.typeId].orEmpty(),
7780
recordTags = recordTags.filter { it.id in record.tagIds }
7881
)
7982
?.toByteArray()

data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/IcsRepoImpl.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.example.util.simpletimetracker.domain.model.Range
1010
import com.example.util.simpletimetracker.domain.model.Record
1111
import com.example.util.simpletimetracker.domain.model.RecordTag
1212
import com.example.util.simpletimetracker.domain.model.RecordType
13+
import com.example.util.simpletimetracker.domain.repo.CategoryRepo
1314
import com.example.util.simpletimetracker.domain.repo.RecordRepo
1415
import com.example.util.simpletimetracker.domain.repo.RecordTagRepo
1516
import com.example.util.simpletimetracker.domain.repo.RecordTypeCategoryRepo
@@ -30,6 +31,7 @@ import javax.inject.Inject
3031
class IcsRepoImpl @Inject constructor(
3132
private val contentResolver: ContentResolver,
3233
private val recordTypeRepo: RecordTypeRepo,
34+
private val categoryRepo: CategoryRepo,
3335
private val recordRepo: RecordRepo,
3436
private val recordTypeCategoryRepo: RecordTypeCategoryRepo,
3537
private val recordTagRepo: RecordTagRepo,
@@ -62,9 +64,10 @@ class IcsRepoImpl @Inject constructor(
6264
fileOutputStream?.write(ICS_HEADER.toByteArray())
6365

6466
val recordTypes = recordTypeRepo.getAll().associateBy { it.id }
67+
val categories = categoryRepo.getAll().associateBy { it.id }
6568
val recordTags = recordTagRepo.getAll()
66-
val categories = recordTypes.map { (id, _) ->
67-
id to recordTypeCategoryRepo.getCategoriesByType(id)
69+
val typeToCategories = recordTypes.map { (id, _) ->
70+
id to recordTypeCategoryRepo.getCategoryIdsByType(id).mapNotNull { categories[it] }
6871
}.toMap()
6972

7073
// Write data
@@ -79,7 +82,7 @@ class IcsRepoImpl @Inject constructor(
7982
toIcsString(
8083
record = record,
8184
recordType = recordTypes[record.typeId],
82-
categories = categories[record.typeId].orEmpty(),
85+
categories = typeToCategories[record.typeId].orEmpty(),
8386
recordTags = recordTags.filter { it.id in record.tagIds }
8487
)
8588
?.toByteArray()

data_local/src/main/java/com/example/util/simpletimetracker/data_local/utils/PrefsUtils.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,11 @@ internal inline fun logPrefsDataAccess(logMessage: String) {
102102
*/
103103
inline fun <T> List<T>.removeIf(crossinline filter: (T) -> Boolean): List<T> {
104104
return this.toMutableList().apply { removeAll { filter(it) } }
105+
}
106+
107+
/**
108+
* Produces a new list from original list by replacing elements satisfying filter block with new element.
109+
*/
110+
inline fun <T> List<T>.replaceWith(new: T, crossinline filter: (T) -> Boolean): List<T> {
111+
return this.removeIf(filter).toMutableList().apply { add(new) }
105112
}

0 commit comments

Comments
 (0)