Skip to content

Commit c743707

Browse files
committed
add statistics to wear
1 parent 2bd6fec commit c743707

File tree

46 files changed

+1105
-112
lines changed

Some content is hidden

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

46 files changed

+1105
-112
lines changed

app/src/main/java/com/example/util/simpletimetracker/di/AppModuleBinds.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.example.util.simpletimetracker.di
22

3+
import com.example.util.simpletimetracker.core.common.repo.BaseResourceRepo
34
import com.example.util.simpletimetracker.core.interactor.GetCurrentDayInteractorImpl
45
import com.example.util.simpletimetracker.core.interactor.IsSystemInDarkModeInteractorImpl
56
import com.example.util.simpletimetracker.core.interactor.GetUntrackedRecordsInteractorImpl
67
import com.example.util.simpletimetracker.core.mapper.AppColorMapperImpl
78
import com.example.util.simpletimetracker.core.provider.ApplicationDataProvider
9+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
810
import com.example.util.simpletimetracker.domain.color.mapper.AppColorMapper
911
import com.example.util.simpletimetracker.domain.daysOfWeek.interactor.GetCurrentDayInteractor
1012
import com.example.util.simpletimetracker.domain.record.interactor.GetUntrackedRecordsInteractor
@@ -24,6 +26,10 @@ interface AppModuleBinds {
2426
@Singleton
2527
fun bindAppColorMapper(impl: AppColorMapperImpl): AppColorMapper
2628

29+
@Binds
30+
@Singleton
31+
fun bindResourceRepo(impl: ResourceRepo): BaseResourceRepo
32+
2733
@Binds
2834
@Singleton
2935
fun bindApplicationDataProvider(impl: ApplicationDataProviderImpl): ApplicationDataProvider

core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies {
2121
api(project(":resources"))
2222
api(project(":feature_base_adapter"))
2323
api(project(":feature_views"))
24+
api(project(":core:common"))
2425

2526
api(libs.androidx.appcompat)
2627
api(libs.androidx.recyclerView)

core/common/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

core/common/build.gradle.kts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import com.example.util.simpletimetracker.Base
2+
import com.example.util.simpletimetracker.applyAndroidLibrary
3+
4+
plugins {
5+
alias(libs.plugins.gradleLibrary)
6+
alias(libs.plugins.kotlin)
7+
alias(libs.plugins.kotlinParcelize)
8+
}
9+
10+
applyAndroidLibrary()
11+
12+
android {
13+
namespace = "${Base.namespace}.core.common"
14+
}
15+
16+
dependencies {
17+
implementation(project(":resources"))
18+
19+
implementation(libs.google.dagger)
20+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest />

domain/src/main/java/com/example/util/simpletimetracker/domain/statistics/mapper/StatisticsMapper.kt renamed to core/common/src/main/java/com/example/util/simpletimetracker/core/common/mapper/StatisticsMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.example.util.simpletimetracker.domain.statistics.mapper
1+
package com.example.util.simpletimetracker.core.common.mapper
22

33
import javax.inject.Inject
44
import kotlin.math.roundToLong
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.example.util.simpletimetracker.core.common.mapper
2+
3+
import com.example.util.simpletimetracker.core.common.R
4+
import com.example.util.simpletimetracker.core.common.repo.BaseResourceRepo
5+
import java.util.concurrent.TimeUnit
6+
import javax.inject.Inject
7+
import kotlin.math.abs
8+
9+
class TimeMapper @Inject constructor(
10+
private val resourceRepo: BaseResourceRepo,
11+
) {
12+
13+
/**
14+
* @param forceSeconds - true 1h 7m 21s, false 1h 7m
15+
* @param useProportionalMinutes - true 1.25h
16+
*/
17+
fun formatInterval(
18+
interval: Long,
19+
forceSeconds: Boolean,
20+
useProportionalMinutes: Boolean,
21+
): String {
22+
val hourString = resourceRepo.getString(R.string.time_hour)
23+
val minuteString = resourceRepo.getString(R.string.time_minute)
24+
val secondString = resourceRepo.getString(R.string.time_second)
25+
26+
val hr: Long = TimeUnit.MILLISECONDS.toHours(
27+
abs(interval),
28+
)
29+
val min: Long = TimeUnit.MILLISECONDS.toMinutes(
30+
abs(interval) - TimeUnit.HOURS.toMillis(hr),
31+
)
32+
val sec: Long = TimeUnit.MILLISECONDS.toSeconds(
33+
abs(interval) - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min),
34+
)
35+
36+
if (useProportionalMinutes) {
37+
return formatIntervalProportional(hr, min)
38+
}
39+
40+
val willShowHours: Boolean
41+
val willShowMinutes: Boolean
42+
val willShowSeconds: Boolean
43+
44+
if (forceSeconds) {
45+
willShowHours = hr != 0L
46+
willShowMinutes = willShowHours || min != 0L
47+
willShowSeconds = true
48+
} else {
49+
willShowHours = hr != 0L
50+
willShowMinutes = true
51+
willShowSeconds = false
52+
}
53+
54+
var res = ""
55+
if (willShowHours) res += "$hr$hourString "
56+
if (willShowMinutes) res += "$min$minuteString"
57+
if (willShowMinutes && willShowSeconds) res += " "
58+
if (willShowSeconds) res += "$sec$secondString"
59+
60+
res = if (interval < 0) "-$res" else res
61+
62+
return res
63+
}
64+
65+
private fun formatIntervalProportional(hr: Long, min: Long): String {
66+
val hourString = resourceRepo.getString(R.string.time_hour)
67+
val minutesProportion = min / 60f
68+
val proportional = hr + minutesProportion
69+
val proportionalString = "%.2f".format(proportional)
70+
71+
return "$proportionalString$hourString"
72+
}
73+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.util.simpletimetracker.core.common.repo
2+
3+
import androidx.annotation.StringRes
4+
5+
interface BaseResourceRepo {
6+
7+
fun getString(@StringRes stringResId: Int): String
8+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.example.util.simpletimetracker.core.repo.ResourceRepo
55
import com.example.util.simpletimetracker.core.viewData.StatisticsDataHolder
66
import com.example.util.simpletimetracker.domain.base.UNCATEGORIZED_ITEM_ID
77
import com.example.util.simpletimetracker.domain.base.UNTRACKED_ITEM_ID
8-
import com.example.util.simpletimetracker.domain.statistics.mapper.StatisticsMapper
8+
import com.example.util.simpletimetracker.core.common.mapper.StatisticsMapper
99
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
1010
import com.example.util.simpletimetracker.domain.statistics.model.Statistics
1111
import com.example.util.simpletimetracker.feature_base_adapter.statistics.StatisticsViewData

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

Lines changed: 8 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
package com.example.util.simpletimetracker.core.mapper
22

33
import com.example.util.simpletimetracker.core.R
4+
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper
45
import com.example.util.simpletimetracker.core.extension.setToStartOfDay
56
import com.example.util.simpletimetracker.core.extension.setWeekToFirstDay
67
import com.example.util.simpletimetracker.core.extension.shift
7-
import com.example.util.simpletimetracker.domain.base.CurrentTimestampProvider
88
import com.example.util.simpletimetracker.core.provider.LocaleProvider
99
import com.example.util.simpletimetracker.core.repo.ResourceRepo
10-
import com.example.util.simpletimetracker.domain.extension.padDuration
10+
import com.example.util.simpletimetracker.domain.base.CurrentTimestampProvider
1111
import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
12+
import com.example.util.simpletimetracker.domain.extension.padDuration
1213
import com.example.util.simpletimetracker.domain.record.model.Range
1314
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
1415
import java.text.SimpleDateFormat
1516
import java.util.Calendar
1617
import java.util.Locale
1718
import java.util.concurrent.TimeUnit
1819
import javax.inject.Inject
19-
import kotlin.math.abs
2020

2121
class TimeMapper @Inject constructor(
2222
localeProvider: LocaleProvider,
2323
private val resourceRepo: ResourceRepo,
2424
private val currentTimestampProvider: CurrentTimestampProvider,
25+
private val commonTimeMapper: TimeMapper,
2526
) {
2627

2728
private val locale: Locale by lazy { localeProvider.get() }
@@ -467,56 +468,16 @@ class TimeMapper @Inject constructor(
467468
.getActualMaximum(field)
468469
}
469470

470-
/**
471-
* @param forceSeconds - true 1h 7m 21s, false 1h 7m
472-
* @param useProportionalMinutes - true 1.25h
473-
*/
474471
fun formatInterval(
475472
interval: Long,
476473
forceSeconds: Boolean,
477474
useProportionalMinutes: Boolean,
478475
): String {
479-
val hourString = resourceRepo.getString(R.string.time_hour)
480-
val minuteString = resourceRepo.getString(R.string.time_minute)
481-
val secondString = resourceRepo.getString(R.string.time_second)
482-
483-
val hr: Long = TimeUnit.MILLISECONDS.toHours(
484-
abs(interval),
485-
)
486-
val min: Long = TimeUnit.MILLISECONDS.toMinutes(
487-
abs(interval) - TimeUnit.HOURS.toMillis(hr),
488-
)
489-
val sec: Long = TimeUnit.MILLISECONDS.toSeconds(
490-
abs(interval) - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min),
476+
return commonTimeMapper.formatInterval(
477+
interval = interval,
478+
forceSeconds = forceSeconds,
479+
useProportionalMinutes = useProportionalMinutes,
491480
)
492-
493-
if (useProportionalMinutes) {
494-
return formatIntervalProportional(hr, min)
495-
}
496-
497-
val willShowHours: Boolean
498-
val willShowMinutes: Boolean
499-
val willShowSeconds: Boolean
500-
501-
if (forceSeconds) {
502-
willShowHours = hr != 0L
503-
willShowMinutes = willShowHours || min != 0L
504-
willShowSeconds = true
505-
} else {
506-
willShowHours = hr != 0L
507-
willShowMinutes = true
508-
willShowSeconds = false
509-
}
510-
511-
var res = ""
512-
if (willShowHours) res += "$hr$hourString "
513-
if (willShowMinutes) res += "$min$minuteString"
514-
if (willShowMinutes && willShowSeconds) res += " "
515-
if (willShowSeconds) res += "$sec$secondString"
516-
517-
res = if (interval < 0) "-$res" else res
518-
519-
return res
520481
}
521482

522483
@Suppress("unused")
@@ -555,15 +516,6 @@ class TimeMapper @Inject constructor(
555516
}
556517
}
557518

558-
private fun formatIntervalProportional(hr: Long, min: Long): String {
559-
val hourString = resourceRepo.getString(R.string.time_hour)
560-
val minutesProportion = min / 60f
561-
val proportional = hr + minutesProportion
562-
val proportionalString = "%.2f".format(proportional)
563-
564-
return "$proportionalString$hourString"
565-
}
566-
567519
fun toDayDateTitle(
568520
daysFromToday: Int,
569521
startOfDayShift: Long,

0 commit comments

Comments
 (0)