Skip to content

Commit d3411c4

Browse files
committed
refactor
1 parent 59962bc commit d3411c4

14 files changed

Lines changed: 103 additions & 49 deletions

File tree

app/src/main/java/com/example/util/simpletimetracker/navigation/ActionResolverImpl.kt

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.example.util.simpletimetracker.navigation
33
import android.app.Activity
44
import android.content.ActivityNotFoundException
55
import android.content.Intent
6-
import android.net.Uri
76
import android.os.Build
87
import android.provider.Settings
98
import androidx.activity.ComponentActivity
@@ -23,6 +22,7 @@ import com.example.util.simpletimetracker.navigation.params.action.SendEmailPara
2322
import com.example.util.simpletimetracker.navigation.params.action.ShareFileParams
2423
import timber.log.Timber
2524
import javax.inject.Inject
25+
import androidx.core.net.toUri
2626

2727
class ActionResolverImpl @Inject constructor(
2828
private val resultContainer: ResultContainer,
@@ -53,17 +53,17 @@ class ActionResolverImpl @Inject constructor(
5353
}
5454

5555
private fun openMarket(activity: Activity?, params: OpenMarketParams) {
56-
val uri = Uri.parse(MARKET_INTENT + params.packageName)
56+
val uri = (MARKET_INTENT + params.packageName).toUri()
5757
val intent = Intent(Intent.ACTION_VIEW, uri)
5858
intent.setPackage(MARKET_PACKAGE)
5959
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
6060

6161
try {
6262
activity?.startActivity(intent)
63-
} catch (e: ActivityNotFoundException) {
63+
} catch (_: ActivityNotFoundException) {
6464
Intent(
6565
Intent.ACTION_VIEW,
66-
Uri.parse(MARKET_LINK + params.packageName),
66+
(MARKET_LINK + params.packageName).toUri(),
6767
).apply {
6868
intent.setPackage(MARKET_PACKAGE)
6969
}.let {
@@ -76,14 +76,14 @@ class ActionResolverImpl @Inject constructor(
7676
activity?.startActivity(
7777
Intent(
7878
Intent.ACTION_VIEW,
79-
Uri.parse(params.link),
79+
params.link.toUri(),
8080
),
8181
)
8282
}
8383

8484
private fun sendEmail(activity: Activity?, params: SendEmailParams) {
8585
val intent = Intent(Intent.ACTION_SENDTO).apply {
86-
data = Uri.parse(EMAIL_URI)
86+
data = EMAIL_URI.toUri()
8787
params.email?.let { putExtra(Intent.EXTRA_EMAIL, arrayOf(it)) }
8888
params.subject?.let { putExtra(Intent.EXTRA_SUBJECT, it) }
8989
params.body?.let { putExtra(Intent.EXTRA_TEXT, it) }
@@ -92,7 +92,7 @@ class ActionResolverImpl @Inject constructor(
9292

9393
try {
9494
activity?.startActivity(Intent.createChooser(intent, params.chooserTitle))
95-
} catch (e: ActivityNotFoundException) {
95+
} catch (_: ActivityNotFoundException) {
9696
params.notHandledCallback?.invoke()
9797
}
9898
}
@@ -126,43 +126,42 @@ class ActionResolverImpl @Inject constructor(
126126

127127
private fun openSystemSettings(activity: Activity?, data: OpenSystemSettings) {
128128
val packageName by lazy { applicationDataProvider.getPackageName() }
129+
val intent = Intent()
129130

130-
// TODO refactor
131131
when (data) {
132132
is OpenSystemSettings.ExactAlarms -> runCatching {
133133
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
134-
val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)
135-
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
136-
intent.data = Uri.parse("package:$packageName")
137-
activity?.startActivity(intent)
134+
intent.action = Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM
135+
intent.data = "package:$packageName".toUri()
138136
}
139137
}
140138

141139
is OpenSystemSettings.Notifications -> runCatching {
142-
val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
143-
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
144-
.apply { putExtra(Settings.EXTRA_APP_PACKAGE, packageName) }
140+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
141+
intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
142+
intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
145143
} else {
146-
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
147-
.apply { this.data = Uri.parse("package:$packageName") }
144+
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
145+
intent.data = "package:$packageName".toUri()
148146
}
149-
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
150-
activity?.startActivity(intent)
151147
}
152148
}
149+
150+
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
151+
runCatching { activity?.startActivity(intent) }
153152
}
154153

155154
private fun shareFile(activity: Activity?, data: ShareFileParams) {
156155
try {
157-
val uri = Uri.parse(data.uriString)
156+
val uri = data.uriString.toUri()
158157
val type = allowDiskRead { data.type ?: activity?.contentResolver?.getType(uri) }
159158
val intent = Intent(Intent.ACTION_SEND).apply {
160159
setDataAndType(uri, type)
161160
putExtra(Intent.EXTRA_STREAM, uri)
162161
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
163162
}
164163
activity?.startActivity(Intent.createChooser(intent, null))
165-
} catch (e: ActivityNotFoundException) {
164+
} catch (_: ActivityNotFoundException) {
166165
data.notHandledCallback.invoke()
167166
}
168167
}

core/src/main/java/com/example/util/simpletimetracker/core/interactor/GetUntrackedRecordsInteractorImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class GetUntrackedRecordsInteractorImpl @Inject constructor(
3333
val maxEnd = System.currentTimeMillis().dropMillis()
3434

3535
// If range is all records - calculate from first records to current time.
36-
val actualRange = if (range.timeStarted == 0L && range.timeEnded == 0L) {
36+
val actualRange = if (range.isUndefined) {
3737
Range(timeStarted = minStart, timeEnded = maxEnd)
3838
} else {
3939
range

core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ class RecordFilterInteractor @Inject constructor(
222222
fun RecordBase.selectedByDate(): Boolean {
223223
if (ranges.isEmpty()) return true
224224
// Overall range.
225-
if (ranges.any { it.timeStarted == 0L && it.timeEnded == 0L }) return true
225+
if (ranges.any { it.isUndefined }) return true
226226
return ranges.any { range -> timeStarted < range.timeEnded && timeEnded > range.timeStarted }
227227
}
228228

@@ -349,7 +349,7 @@ class RecordFilterInteractor @Inject constructor(
349349
range: Range,
350350
runningRecords: List<RunningRecord>,
351351
): List<RecordBase> {
352-
val records = if (range.timeStarted == 0L && range.timeEnded == 0L) {
352+
val records = if (range.isUndefined) {
353353
interactor.getAll() + runningRecords
354354
} else {
355355
interactor.getFromRange(range) +

domain/common/src/main/java/com/example/util/simpletimetracker/domain/record/model/Range.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.example.util.simpletimetracker.domain.record.model
22

3-
// TODO switch to typealias to avoid object creation.
43
data class Range(
54
val timeStarted: Long,
65
val timeEnded: Long,
76
) {
87

98
val duration: Long = timeEnded - timeStarted
109

10+
val isUndefined: Boolean = timeStarted == 0L && timeEnded == 0L
11+
1112
fun isOverlappingWith(other: Range): Boolean {
1213
return timeStarted < other.timeEnded && timeEnded > other.timeStarted
1314
}

domain/src/main/java/com/example/util/simpletimetracker/domain/statistics/interactor/StatisticsInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class StatisticsInteractor @Inject constructor(
123123
}
124124

125125
private fun rangeIsAllRecords(range: Range): Boolean {
126-
return range.timeStarted == 0L && range.timeEnded == 0L
126+
return range.isUndefined
127127
}
128128

129129
private fun mapStatisticsItem(

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -937,14 +937,13 @@ class RecordsFilterViewDataInteractor @Inject constructor(
937937
// TODO FILTER handle activity/category/tag removal?
938938
// TODO FILTER selectable filter on top, change text "Filter" to star icon.
939939
// TODO FILTER add icons to activities/tags.
940-
// TODO FILTER order activities/categories/tags.
941940
suspend fun getFavouriteFiltersSelectionViewData(
942941
filters: List<RecordsFilter>,
943942
extra: RecordsFilterParams,
944943
isDeleteEnabled: Boolean,
945-
recordTypes: Map<Long, RecordType>,
946-
categories: Map<Long, Category>,
947-
recordTags: Map<Long, RecordTag>,
944+
recordTypes: List<RecordType>,
945+
categories: List<Category>,
946+
recordTags: List<RecordTag>,
948947
): List<ViewHolderType> {
949948
val result: MutableList<ViewHolderType> = mutableListOf()
950949
val isDarkTheme = prefsInteractor.getDarkMode()
@@ -954,6 +953,12 @@ class RecordsFilterViewDataInteractor @Inject constructor(
954953
val currentAvailableFilters = filterAvailableFilters(extra, filters)
955954
val isSaveEnabled = currentAvailableFilters.isNotEmpty()
956955
val filters = favouriteRecordsFilterInteractor.getAll()
956+
val recordTypesMap = recordTypes.associateBy { it.id }
957+
val recordTypesOrder = recordTypes.map { it.id }
958+
val categoriesMap = categories.associateBy { it.id }
959+
val categoriesOrder = categories.map { it.id }
960+
val recordTagsMap = recordTags.associateBy { it.id }
961+
val recordTagsOrder = recordTags.map { it.id }
957962

958963
fun mapActiveColor(isActive: Boolean): Int {
959964
return if (isActive) {
@@ -973,9 +978,12 @@ class RecordsFilterViewDataInteractor @Inject constructor(
973978
startOfDayShift = startOfDayShift,
974979
firstDayOfWeek = firstDayOfWeek,
975980
isDarkTheme = isDarkTheme,
976-
recordTypes = recordTypes,
977-
categories = categories,
978-
recordTags = recordTags,
981+
recordTypes = recordTypesMap,
982+
recordTypesOrder = recordTypesOrder,
983+
categories = categoriesMap,
984+
categoriesOrder = categoriesOrder,
985+
recordTags = recordTagsMap,
986+
recordTagsOrder = recordTagsOrder,
979987
)
980988
}.addBetweenEach {
981989
"\n"

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/mapper/RecordsFilterFavouriteViewDataMapper.kt

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@ class RecordsFilterFavouriteViewDataMapper @Inject constructor(
3636
firstDayOfWeek: DayOfWeek,
3737
isDarkTheme: Boolean,
3838
recordTypes: Map<Long, RecordType>,
39+
recordTypesOrder: List<Long>,
3940
categories: Map<Long, Category>,
41+
categoriesOrder: List<Long>,
4042
recordTags: Map<Long, RecordTag>,
43+
recordTagsOrder: List<Long>,
4144
): CharSequence {
4245
val exclude = resourceRepo.getString(R.string.records_filter_exclude)
4346
val unknownText = "?"
@@ -143,20 +146,32 @@ class RecordsFilterFavouriteViewDataMapper @Inject constructor(
143146
)
144147
is RecordsFilter.Activity -> {
145148
mapItems(
146-
selected = filter.selected.map(::mapActivityItem),
147-
filtered = filter.filtered.map(::mapActivityItem),
149+
selected = filter.selected
150+
.sortActivities(recordTypesOrder)
151+
.map(::mapActivityItem),
152+
filtered = filter.filtered
153+
.sortActivities(recordTypesOrder)
154+
.map(::mapActivityItem),
148155
)
149156
}
150157
is RecordsFilter.Category -> {
151158
mapItems(
152-
selected = filter.selected.map(::mapCategoryItem),
153-
filtered = filter.filtered.map(::mapCategoryItem),
159+
selected = filter.selected
160+
.sortCategories(categoriesOrder)
161+
.map(::mapCategoryItem),
162+
filtered = filter.filtered
163+
.sortCategories(categoriesOrder)
164+
.map(::mapCategoryItem),
154165
)
155166
}
156167
is RecordsFilter.Tags -> {
157168
mapItems(
158-
selected = filter.selected.map(::mapTagItem),
159-
filtered = filter.filtered.map(::mapTagItem),
169+
selected = filter.selected
170+
.sortTags(recordTagsOrder)
171+
.map(::mapTagItem),
172+
filtered = filter.filtered
173+
.sortTags(recordTagsOrder)
174+
.map(::mapTagItem),
160175
)
161176
}
162177
is RecordsFilter.DaysOfWeek -> {
@@ -174,4 +189,32 @@ class RecordsFilterFavouriteViewDataMapper @Inject constructor(
174189
}
175190
}
176191
}
192+
193+
private fun List<Long>.sortActivities(
194+
order: List<Long>,
195+
): List<Long> {
196+
return this.sortedBy { order.indexOf(it) }
197+
}
198+
199+
private fun List<RecordsFilter.CategoryItem>.sortCategories(
200+
order: List<Long>,
201+
): List<RecordsFilter.CategoryItem> {
202+
return this.sortedBy {
203+
when (it) {
204+
is RecordsFilter.CategoryItem.Categorized -> order.indexOf(it.categoryId)
205+
is RecordsFilter.CategoryItem.Uncategorized -> Int.MAX_VALUE
206+
}
207+
}
208+
}
209+
210+
private fun List<RecordsFilter.TagItem>.sortTags(
211+
order: List<Long>,
212+
): List<RecordsFilter.TagItem> {
213+
return this.sortedBy {
214+
when (it) {
215+
is RecordsFilter.TagItem.Tagged -> order.indexOf(it.tagId)
216+
is RecordsFilter.TagItem.Untagged -> Int.MAX_VALUE
217+
}
218+
}
219+
}
177220
}

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/viewModel/RecordsFilterViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -933,9 +933,9 @@ class RecordsFilterViewModel @Inject constructor(
933933
filters = filters,
934934
extra = extra,
935935
isDeleteEnabled = isDeleteFavouriteEnabled,
936-
recordTypes = getTypesCache().associateBy { it.id },
937-
categories = getCategoriesCache().associateBy { it.id },
938-
recordTags = getTagsCache().associateBy { it.id },
936+
recordTypes = getTypesCache(),
937+
categories = getCategoriesCache(),
938+
recordTags = getTagsCache(),
939939
)
940940
}
941941
}

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailAdjacentActivitiesInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class StatisticsDetailAdjacentActivitiesInteractor @Inject constructor(
113113
firstDayOfWeek = firstDayOfWeek,
114114
startOfDayShift = startOfDayShift,
115115
)
116-
return if (range.timeStarted == 0L && range.timeEnded == 0L) {
116+
return if (range.isUndefined) {
117117
recordInteractor.getAll()
118118
} else {
119119
recordInteractor.getFromRange(range)

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailDataDistributionInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class StatisticsDetailDataDistributionInteractor @Inject constructor(
8686
mode = dataDistributionMode,
8787
graph = dataDistributionGraph,
8888
selectedItemId = selectedItemId,
89-
records = if (range.timeStarted == 0L && range.timeEnded == 0L) {
89+
records = if (range.isUndefined) {
9090
records
9191
} else {
9292
rangeMapper.getRecordsFromRange(records, range)

0 commit comments

Comments
 (0)