Skip to content

Commit a81327a

Browse files
committed
WIP add record shortcuts
1 parent 7a3d4e1 commit a81327a

File tree

44 files changed

+858
-24
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+858
-24
lines changed

core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordQuickActionMapper.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickA
1313
import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickAction.MOVE
1414
import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickAction.MULTISELECT
1515
import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickAction.REPEAT
16+
import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickAction.SHORTCUT
1617
import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickAction.SPLIT
1718
import com.example.util.simpletimetracker.domain.recordAction.model.RecordQuickAction.STOP
1819
import javax.inject.Inject
@@ -30,6 +31,7 @@ class RecordQuickActionMapper @Inject constructor(
3031
MERGE -> R.string.change_record_merge
3132
SPLIT -> R.string.change_record_split
3233
ADJUST -> R.string.change_record_adjust
34+
SHORTCUT -> R.string.change_record_shortcut
3335
STOP -> R.string.notification_record_type_stop
3436
MULTISELECT -> R.string.change_record_multiselect
3537
CHANGE_ACTIVITY -> R.string.data_edit_change_activity
@@ -46,6 +48,7 @@ class RecordQuickActionMapper @Inject constructor(
4648
MERGE -> R.string.change_record_merge_hint
4749
SPLIT -> R.string.change_record_split_hint
4850
ADJUST -> R.string.change_record_change_adjacent_records
51+
SHORTCUT -> R.string.change_record_shortcut_hint
4952
STOP -> null
5053
MULTISELECT -> R.string.change_record_multiselect_hint
5154
CHANGE_ACTIVITY -> null
@@ -63,6 +66,7 @@ class RecordQuickActionMapper @Inject constructor(
6366
MERGE -> R.drawable.action_merge
6467
SPLIT -> R.drawable.action_divide
6568
ADJUST -> R.drawable.action_change
69+
SHORTCUT -> R.drawable.favorite_border
6670
STOP -> R.drawable.action_stop
6771
MULTISELECT -> R.drawable.action_multiselect
6872
CHANGE_ACTIVITY, CHANGE_TAG -> R.drawable.action_change_item
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.example.util.simpletimetracker.core.mapper
2+
3+
import com.example.util.simpletimetracker.domain.record.model.RecordBase
4+
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
5+
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
6+
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
7+
import com.example.util.simpletimetracker.feature_base_adapter.record.RecordViewData
8+
import com.example.util.simpletimetracker.feature_base_adapter.recordShortcut.RecordShortcutViewData
9+
import javax.inject.Inject
10+
11+
class RecordShortcutViewDataMapper @Inject constructor(
12+
private val iconMapper: IconMapper,
13+
private val colorMapper: ColorMapper,
14+
private val recordTagFullNameMapper: RecordTagFullNameMapper,
15+
) {
16+
17+
fun map(
18+
shortcut: RecordShortcut,
19+
recordType: RecordType,
20+
recordTags: List<RecordTag>,
21+
isDarkTheme: Boolean,
22+
): RecordShortcutViewData {
23+
val tagIds = shortcut.tags.map(RecordBase.Tag::tagId)
24+
25+
// Shortcut view is simplified record view.
26+
// So use record data without some data.
27+
val data = RecordViewData.Tracked(
28+
id = 0,
29+
timeStartedTimestamp = 0,
30+
timeEndedTimestamp = 0,
31+
name = recordType.name,
32+
tagName = recordTagFullNameMapper.getFullName(
33+
tags = recordTags.filter { it.id in tagIds },
34+
tagData = shortcut.tags,
35+
),
36+
timeStarted = "",
37+
timeFinished = "",
38+
duration = "",
39+
iconId = iconMapper.mapIcon(recordType.icon),
40+
color = colorMapper.mapToColorInt(
41+
color = recordType.color,
42+
isDarkTheme = isDarkTheme,
43+
),
44+
comment = shortcut.comment,
45+
// TODO SHORT move to one line after "name - tag"?
46+
// TODO SHORT remove "Shortcut" label and add hint?
47+
// TODO SHORT width wrapContent?
48+
)
49+
50+
return RecordShortcutViewData(
51+
id = shortcut.id,
52+
record = data,
53+
)
54+
}
55+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class BackupPartialRepoImpl @Inject constructor(
9797
).let { recordRepo.add(it) }
9898
originalRecordIdToAddedId[originalId] = addedId
9999
}
100+
// TODO SHORT
100101
params.data.categories.values.getNotExistingValues().forEach { category ->
101102
val originalId = category.id
102103
val addedId = category.copy(
@@ -133,6 +134,7 @@ class BackupPartialRepoImpl @Inject constructor(
133134
recordTagId = newTagId,
134135
).let { recordToRecordTagRepo.add(it) }
135136
}
137+
// TODO SHORT
136138
params.data.typeToTag.getNotExistingValues().forEach { typeToTag ->
137139
val newTypeId = originalTypeIdToAddedId[typeToTag.recordTypeId]
138140
?: return@forEach
@@ -242,6 +244,7 @@ class BackupPartialRepoImpl @Inject constructor(
242244
val typesCurrent: List<RecordType> = recordTypeRepo.getAll()
243245
val records: MutableList<Record> = mutableListOf()
244246
val recordsCurrent: List<Record> = recordRepo.getAll().map { it.copy(tags = emptyList()) }
247+
// TODO SHORT
245248
val categories: MutableList<Category> = mutableListOf()
246249
val categoriesCurrent: List<Category> = categoryRepo.getAll()
247250
val typeToCategory: MutableList<RecordTypeCategory> = mutableListOf()
@@ -250,6 +253,7 @@ class BackupPartialRepoImpl @Inject constructor(
250253
val tagsCurrent: List<RecordTag> = recordTagRepo.getAll()
251254
val recordToTag: MutableList<RecordToRecordTag> = mutableListOf()
252255
val recordToTagCurrent: List<RecordToRecordTag> = recordToRecordTagRepo.getAll()
256+
// TODO SHORT
253257
val typeToTag: MutableList<RecordTypeToTag> = mutableListOf()
254258
val typeToTagCurrent: List<RecordTypeToTag> = recordTypeToTagRepo.getAll()
255259
val typeToDefaultTag: MutableList<RecordTypeToDefaultTag> = mutableListOf()

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ class BackupRepoImpl @Inject constructor(
118118
fileOutputStream?.write(it.let(::toBackupString).toByteArray())
119119
}
120120
}
121+
// TODO SHORT
121122
categoryRepo.getAll().forEach {
122123
fileOutputStream?.write(it.let(::toBackupString).toByteArray())
123124
}
@@ -132,6 +133,7 @@ class BackupRepoImpl @Inject constructor(
132133
fileOutputStream?.write(it.let(::toBackupString).toByteArray())
133134
}
134135
}
136+
// TODO SHORT
135137
recordTypeToTagRepo.getAll().forEach {
136138
fileOutputStream?.write(it.let(::toBackupString).toByteArray())
137139
}
@@ -204,11 +206,11 @@ class BackupRepoImpl @Inject constructor(
204206
},
205207
dataHandler = DataHandler(
206208
types = recordTypeRepo::add,
207-
records = recordRepo::add,
209+
records = recordRepo::add, // TODO SHORT
208210
categories = categoryRepo::add,
209211
typeToCategory = recordTypeCategoryRepo::add,
210212
tags = recordTagRepo::add,
211-
recordToTag = recordToRecordTagRepo::add,
213+
recordToTag = recordToRecordTagRepo::add, // TODO SHORT
212214
typeToTag = recordTypeToTagRepo::add,
213215
typeToDefaultTag = recordTypeToDefaultTagRepo::add,
214216
activityFilters = activityFilterRepo::add,

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import com.example.util.simpletimetracker.data_local.record.RecordDBO
2424
import com.example.util.simpletimetracker.data_local.record.RecordDao
2525
import com.example.util.simpletimetracker.data_local.record.RunningRecordDBO
2626
import com.example.util.simpletimetracker.data_local.record.RunningRecordDao
27+
import com.example.util.simpletimetracker.data_local.recordShortcut.RecordShortcutDBO
28+
import com.example.util.simpletimetracker.data_local.recordShortcut.RecordShortcutDao
29+
import com.example.util.simpletimetracker.data_local.recordTag.RecordShortcutToRecordTagDBO
30+
import com.example.util.simpletimetracker.data_local.recordTag.RecordShortcutToRecordTagDao
2731
import com.example.util.simpletimetracker.data_local.recordTag.RecordTagDBO
2832
import com.example.util.simpletimetracker.data_local.recordTag.RecordTagDao
2933
import com.example.util.simpletimetracker.data_local.recordTag.RecordToRecordTagDBO
@@ -49,6 +53,7 @@ import com.example.util.simpletimetracker.data_local.recordType.RecordTypeGoalDa
4953
RecordTagDBO::class,
5054
RecordToRecordTagDBO::class,
5155
RunningRecordToRecordTagDBO::class,
56+
RecordShortcutToRecordTagDBO::class,
5257
RecordTypeToTagDBO::class,
5358
RecordTypeToDefaultTagDBO::class,
5459
ActivityFilterDBO::class,
@@ -59,8 +64,9 @@ import com.example.util.simpletimetracker.data_local.recordType.RecordTypeGoalDa
5964
FavouriteColorDBO::class,
6065
ActivitySuggestionDBO::class,
6166
DurationSuggestionDBO::class,
67+
RecordShortcutDBO::class,
6268
],
63-
version = 27,
69+
version = 28,
6470
exportSchema = true,
6571
)
6672
abstract class AppDatabase : RoomDatabase() {
@@ -81,6 +87,8 @@ abstract class AppDatabase : RoomDatabase() {
8187

8288
abstract fun runningRecordToRecordTagDao(): RunningRecordToRecordTagDao
8389

90+
abstract fun recordShortcutToRecordTagDao(): RecordShortcutToRecordTagDao
91+
8492
abstract fun recordTypeToTagDao(): RecordTypeToTagDao
8593

8694
abstract fun recordTypeToDefaultTagDao(): RecordTypeToDefaultTagDao
@@ -101,6 +109,8 @@ abstract class AppDatabase : RoomDatabase() {
101109

102110
abstract fun durationSuggestionDao(): DurationSuggestionDao
103111

112+
abstract fun recordShortcutDao(): RecordShortcutDao
113+
104114
companion object {
105115
const val DATABASE_NAME = "simpleTimeTrackerDB"
106116
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class AppDatabaseMigrations {
3535
migration_24_25,
3636
migration_25_26,
3737
migration_26_27,
38+
migration_27_28,
3839
)
3940

4041
private val migration_1_2 = object : Migration(1, 2) {
@@ -343,5 +344,16 @@ class AppDatabaseMigrations {
343344
)
344345
}
345346
}
347+
348+
private val migration_27_28 = object : Migration(27, 28) {
349+
override fun migrate(database: SupportSQLiteDatabase) {
350+
database.execSQL(
351+
"CREATE TABLE IF NOT EXISTS `recordShortcuts` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type_id` INTEGER NOT NULL, `comment` TEXT NOT NULL)"
352+
)
353+
database.execSQL(
354+
"CREATE TABLE IF NOT EXISTS `recordShortcutToRecordTag` (`shortcut_id` INTEGER NOT NULL, `record_tag_id` INTEGER NOT NULL, `record_tag_numeric_value` REAL, PRIMARY KEY(`shortcut_id`, `record_tag_id`))"
355+
)
356+
}
357+
}
346358
}
347359
}

data_local/src/main/java/com/example/util/simpletimetracker/data_local/di/DataLocalModule.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import com.example.util.simpletimetracker.data_local.recordType.RecordTypeGoalDa
2323
import com.example.util.simpletimetracker.data_local.recordTag.RecordTypeToDefaultTagDao
2424
import com.example.util.simpletimetracker.data_local.recordTag.RecordTypeToTagDao
2525
import com.example.util.simpletimetracker.data_local.record.RunningRecordDao
26+
import com.example.util.simpletimetracker.data_local.recordShortcut.RecordShortcutDao
27+
import com.example.util.simpletimetracker.data_local.recordTag.RecordShortcutToRecordTagDao
2628
import com.example.util.simpletimetracker.data_local.recordTag.RunningRecordToRecordTagDao
2729
import dagger.Module
2830
import dagger.Provides
@@ -109,6 +111,12 @@ class DataLocalModule {
109111
return database.runningRecordToRecordTagDao()
110112
}
111113

114+
@Provides
115+
@Singleton
116+
fun getRecordShortcutToRecordTagDao(database: AppDatabase): RecordShortcutToRecordTagDao {
117+
return database.recordShortcutToRecordTagDao()
118+
}
119+
112120
@Provides
113121
@Singleton
114122
fun getRecordTypeToTagDao(database: AppDatabase): RecordTypeToTagDao {
@@ -168,4 +176,10 @@ class DataLocalModule {
168176
fun getDurationSuggestionDao(database: AppDatabase): DurationSuggestionDao {
169177
return database.durationSuggestionDao()
170178
}
179+
180+
@Provides
181+
@Singleton
182+
fun getRecordShortcutDao(database: AppDatabase): RecordShortcutDao {
183+
return database.recordShortcutDao()
184+
}
171185
}

data_local/src/main/java/com/example/util/simpletimetracker/data_local/di/DataLocalModuleBinds.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import com.example.util.simpletimetracker.data_local.backup.BackupRepoImpl
2323
import com.example.util.simpletimetracker.data_local.durationSuggestion.DurationSuggestionRepoImpl
2424
import com.example.util.simpletimetracker.data_local.file.CsvRepoImpl
2525
import com.example.util.simpletimetracker.data_local.file.IcsRepoImpl
26+
import com.example.util.simpletimetracker.data_local.recordShortcut.RecordShortcutRepoImpl
27+
import com.example.util.simpletimetracker.data_local.recordTag.RecordShortcutToRecordTagRepoImpl
2628
import com.example.util.simpletimetracker.data_local.sharing.SharingRepoImpl
2729
import com.example.util.simpletimetracker.domain.activityFilter.repo.ActivityFilterRepo
2830
import com.example.util.simpletimetracker.domain.activitySuggestion.repo.ActivitySuggestionRepo
@@ -47,6 +49,8 @@ import com.example.util.simpletimetracker.domain.backup.repo.BackupRepo
4749
import com.example.util.simpletimetracker.domain.backup.repo.CsvRepo
4850
import com.example.util.simpletimetracker.domain.backup.repo.IcsRepo
4951
import com.example.util.simpletimetracker.domain.durationSuggestion.repo.DurationSuggestionRepo
52+
import com.example.util.simpletimetracker.domain.recordShortcut.repo.RecordShortcutRepo
53+
import com.example.util.simpletimetracker.domain.recordTag.repo.RecordShortcutToRecordTagRepo
5054
import com.example.util.simpletimetracker.domain.sharing.SharingRepo
5155
import dagger.Binds
5256
import dagger.Module
@@ -122,6 +126,10 @@ interface DataLocalModuleBinds {
122126
@Singleton
123127
fun bindRunningRecordToRecordTagRepo(impl: RunningRecordToRecordTagRepoImpl): RunningRecordToRecordTagRepo
124128

129+
@Binds
130+
@Singleton
131+
fun bindRecordShortcutToRecordTagRepo(impl: RecordShortcutToRecordTagRepoImpl): RecordShortcutToRecordTagRepo
132+
125133
@Binds
126134
@Singleton
127135
fun bindActivityFilterRepo(impl: ActivityFilterRepoImpl): ActivityFilterRepo
@@ -153,4 +161,8 @@ interface DataLocalModuleBinds {
153161
@Binds
154162
@Singleton
155163
fun bindDurationSuggestionRepo(impl: DurationSuggestionRepoImpl): DurationSuggestionRepo
164+
165+
@Binds
166+
@Singleton
167+
fun bindRecordShortcutRepo(impl: RecordShortcutRepoImpl): RecordShortcutRepo
156168
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.example.util.simpletimetracker.data_local.recordShortcut
2+
3+
import androidx.room.ColumnInfo
4+
import androidx.room.Entity
5+
import androidx.room.PrimaryKey
6+
7+
@Entity(tableName = "recordShortcuts")
8+
data class RecordShortcutDBO(
9+
@PrimaryKey(autoGenerate = true)
10+
@ColumnInfo(name = "id")
11+
val id: Long,
12+
13+
@ColumnInfo(name = "type_id")
14+
val typeId: Long,
15+
16+
@ColumnInfo(name = "comment")
17+
val comment: String,
18+
)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.example.util.simpletimetracker.data_local.recordShortcut
2+
3+
import androidx.room.Dao
4+
import androidx.room.Insert
5+
import androidx.room.OnConflictStrategy
6+
import androidx.room.Query
7+
import androidx.room.Transaction
8+
9+
@Dao
10+
interface RecordShortcutDao {
11+
12+
@Transaction
13+
@Query("SELECT * FROM recordShortcuts")
14+
suspend fun getAll(): List<RecordShortcutWithRecordTagsDBO>
15+
16+
@Transaction
17+
@Query("SELECT * FROM recordShortcuts WHERE type_id IN (:typesIds)")
18+
suspend fun getByType(typesIds: List<Long>): List<RecordShortcutWithRecordTagsDBO>
19+
20+
@Transaction
21+
@Query("SELECT * FROM recordShortcuts WHERE id = :id LIMIT 1")
22+
suspend fun get(id: Long): RecordShortcutWithRecordTagsDBO?
23+
24+
@Insert(onConflict = OnConflictStrategy.REPLACE)
25+
suspend fun insert(record: RecordShortcutDBO): Long
26+
27+
@Query("DELETE FROM recordShortcuts WHERE id = :id")
28+
suspend fun delete(id: Long)
29+
30+
@Query("DELETE FROM recordShortcuts WHERE type_id = :typeId")
31+
suspend fun deleteByType(typeId: Long)
32+
33+
@Query("DELETE FROM recordShortcuts")
34+
suspend fun clear()
35+
}

0 commit comments

Comments
 (0)