diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt index 0e5bec2e..8a1ca6e3 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt @@ -98,7 +98,7 @@ class AddRecordTest : BaseUiTest() { val timeEndedPreview = timeEndedTimestamp.let { timeMapper.formatTime(it, true) } checkPreviewUpdated(hasDescendant(withText(timeStartedPreview))) checkPreviewUpdated(hasDescendant(withText(timeEndedPreview))) - checkPreviewUpdated(hasDescendant(withText("2$hourString 3$minuteString"))) + checkPreviewUpdated(hasDescendant(withText("2$hourString 3$minuteString(2.05$hourString)"))) // Activity not selected clickOnViewWithText(R.string.change_record_save) @@ -139,7 +139,7 @@ class AddRecordTest : BaseUiTest() { hasDescendant(withTag(icon)), hasDescendant(withText(timeStartedPreview)), hasDescendant(withText(timeEndedPreview)), - hasDescendant(withText("2$hourString 3$minuteString")), + hasDescendant(withText("2$hourString 3$minuteString(2.05$hourString)")), hasDescendant(withText(comment)), isCompletelyDisplayed() ) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt index cad0a3e3..d4e61c62 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt @@ -590,7 +590,7 @@ class StatisticsDetailTest : BaseUiTest() { onView(withId(R.id.cardStatisticsDetailAverage)).perform(nestedScrollTo()) checkCard(R.string.statistics_detail_shortest_record, "1$hourString 0$minuteString") - checkCard(R.string.statistics_detail_average_record, "1$hourString 30$minuteString") + checkCard(R.string.statistics_detail_average_record, "1$hourString 30$minuteString(1.50$hourString)") checkCard(R.string.statistics_detail_longest_record, "2$hourString 0$minuteString") onView(withId(R.id.cardStatisticsDetailDates)).perform(nestedScrollTo()) diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt index ce56bf06..e2fcd60a 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt @@ -364,6 +364,15 @@ class TimeMapper @Inject constructor( return res } + private fun createProportional(hr: Long, min: Long): String { + val hourString = "h" + val minutesProportion = min / 60f + val proportional = hr + minutesProportion + val proportionalString = "%.2f".format(proportional) + + return "($proportionalString$hourString)" + } + private fun toDayDateTitle(daysFromToday: Int): String { val calendar = Calendar.getInstance() -- 2.51.2 From c710b714bf82e8cf908780f6d56da62fd00b5506 Mon Sep 17 00:00:00 2001 From: Sebastian Konieczek Date: Wed, 15 Sep 2021 16:41:33 +0200 Subject: [PATCH 2/4] rename method --- .../example/util/simpletimetracker/core/mapper/TimeMapper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt index e2fcd60a..e2dc68be 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt @@ -364,7 +364,7 @@ class TimeMapper @Inject constructor( return res } - private fun createProportional(hr: Long, min: Long): String { + private fun formatIntervalProportional(hr: Long, min: Long): String { val hourString = "h" val minutesProportion = min / 60f val proportional = hr + minutesProportion -- 2.51.2 From 7287a858e9f166efc388ad2bcb1dff8a3da074be Mon Sep 17 00:00:00 2001 From: Sebastian Konieczek Date: Wed, 22 Sep 2021 14:21:24 +0200 Subject: [PATCH 3/4] add toggle setting instead of constantly displaying proportional minutes WIP - tests missing --- .../util/simpletimetracker/AddRecordTest.kt | 4 +- .../simpletimetracker/ChangeRecordTest.kt | 4 +- .../simpletimetracker/StatisticsDetailTest.kt | 2 +- .../core/mapper/RecordViewDataMapper.kt | 10 +++-- .../core/mapper/TimeMapper.kt | 15 ++++--- core/src/main/res/values-in/strings.xml | 1 + core/src/main/res/values-ru/strings.xml | 1 + core/src/main/res/values-uk/strings.xml | 1 + core/src/main/res/values-zh/strings.xml | 1 + core/src/main/res/values/strings.xml | 1 + .../data_local/repo/PrefsRepoImpl.kt | 4 ++ .../domain/interactor/PrefsInteractor.kt | 8 ++++ .../domain/repo/PrefsRepo.kt | 2 + .../ChangeRecordViewDataInteractor.kt | 4 +- .../mapper/ChangeRecordViewDataMapper.kt | 5 ++- .../interactor/RecordsViewDataInteractor.kt | 7 +++- .../mapper/RecordsViewDataMapper.kt | 12 ++++-- .../RecordsAllViewDataInteractor.kt | 4 +- .../mapper/RecordsAllViewDataMapper.kt | 6 ++- .../feature_settings/mapper/SettingsMapper.kt | 4 ++ .../feature_settings/view/SettingsFragment.kt | 3 ++ .../viewModel/SettingsViewModel.kt | 38 +++++++++++++++++ .../src/main/res/layout/settings_fragment.xml | 41 +++++++++++++++++++ .../StatisticsViewDataInteractor.kt | 9 ++-- .../mapper/StatisticsViewDataMapper.kt | 38 ++++++++++------- .../StatisticsDetailStatsInteractor.kt | 4 +- .../mapper/StatisticsDetailViewDataMapper.kt | 25 ++++++----- 27 files changed, 197 insertions(+), 57 deletions(-) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt index 8a1ca6e3..0e5bec2e 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt @@ -98,7 +98,7 @@ class AddRecordTest : BaseUiTest() { val timeEndedPreview = timeEndedTimestamp.let { timeMapper.formatTime(it, true) } checkPreviewUpdated(hasDescendant(withText(timeStartedPreview))) checkPreviewUpdated(hasDescendant(withText(timeEndedPreview))) - checkPreviewUpdated(hasDescendant(withText("2$hourString 3$minuteString(2.05$hourString)"))) + checkPreviewUpdated(hasDescendant(withText("2$hourString 3$minuteString"))) // Activity not selected clickOnViewWithText(R.string.change_record_save) @@ -139,7 +139,7 @@ class AddRecordTest : BaseUiTest() { hasDescendant(withTag(icon)), hasDescendant(withText(timeStartedPreview)), hasDescendant(withText(timeEndedPreview)), - hasDescendant(withText("2$hourString 3$minuteString(2.05$hourString)")), + hasDescendant(withText("2$hourString 3$minuteString")), hasDescendant(withText(comment)), isCompletelyDisplayed() ) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt index d48c83d3..093e36c0 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt @@ -67,7 +67,7 @@ class ChangeRecordTest : BaseUiTest() { var timeEndedPreview = timeEndedTimestamp .let { timeMapper.formatTime(it, true) } var timeRangePreview = (timeEndedTimestamp - timeStartedTimestamp) - .let(timeMapper::formatInterval) + .let{ timeMapper.formatInterval( it, false ) } typeTextIntoView(R.id.etChangeRecordComment, comment) closeSoftKeyboard() @@ -158,7 +158,7 @@ class ChangeRecordTest : BaseUiTest() { timeEndedPreview = timeEndedTimestamp .let { timeMapper.formatTime(it, true) } timeRangePreview = (timeEndedTimestamp - timeStartedTimestamp) - .let(timeMapper::formatInterval) + .let{ timeMapper.formatInterval(it, false) } checkViewIsDisplayed(allOf(withId(R.id.tvChangeRecordTimeStarted), withText(timeStarted))) checkViewIsDisplayed(allOf(withId(R.id.tvChangeRecordTimeEnded), withText(timeEnded))) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt index d4e61c62..cad0a3e3 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt @@ -590,7 +590,7 @@ class StatisticsDetailTest : BaseUiTest() { onView(withId(R.id.cardStatisticsDetailAverage)).perform(nestedScrollTo()) checkCard(R.string.statistics_detail_shortest_record, "1$hourString 0$minuteString") - checkCard(R.string.statistics_detail_average_record, "1$hourString 30$minuteString(1.50$hourString)") + checkCard(R.string.statistics_detail_average_record, "1$hourString 30$minuteString") checkCard(R.string.statistics_detail_longest_record, "2$hourString 0$minuteString") onView(withId(R.id.cardStatisticsDetailDates)).perform(nestedScrollTo()) diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt index f80885de..9dd1c927 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt @@ -23,7 +23,8 @@ class RecordViewDataMapper @Inject constructor( timeStarted: Long, timeEnded: Long, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): RecordViewData { return RecordViewData.Tracked( id = record.id, @@ -34,7 +35,7 @@ class RecordViewDataMapper @Inject constructor( timeFinished = timeEnded .let { timeMapper.formatTime(it, useMilitaryTime) }, duration = (timeEnded - timeStarted) - .let(timeMapper::formatInterval), + .let{ timeMapper.formatInterval(it, useProportionalMinutes) }, iconId = recordType.icon .let(iconMapper::mapIcon), color = recordType.color @@ -48,7 +49,8 @@ class RecordViewDataMapper @Inject constructor( timeStarted: Long, timeEnded: Long, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): RecordViewData { return RecordViewData.Untracked( name = R.string.untracked_time_name @@ -61,7 +63,7 @@ class RecordViewDataMapper @Inject constructor( .let { timeMapper.formatTime(it, useMilitaryTime) }, timeEndedTimestamp = timeEnded, duration = (timeEnded - timeStarted) - .let(timeMapper::formatInterval), + .let{ timeMapper.formatInterval(it, useProportionalMinutes) }, iconId = RecordTypeIcon.Image(R.drawable.unknown), color = colorMapper.toUntrackedColor(isDarkTheme), comment = "" diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt index e2dc68be..88f2a162 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt @@ -82,12 +82,12 @@ class TimeMapper @Inject constructor( } // 1h 7m - fun formatInterval(interval: Long): String = - formatInterval(interval, forceSeconds = false) + fun formatInterval(interval: Long, useProportionalMinutes: Boolean): String = + formatInterval(interval, forceSeconds = false, useProportionalMinutes) // 1h 7m 21s fun formatIntervalWithForcedSeconds(interval: Long): String = - formatInterval(interval, forceSeconds = true) + formatInterval(interval, forceSeconds = true, useProportionalMinutes = false) fun toTimestampShifted(rangesFromToday: Int, range: RangeLength): Long { val calendarStep = when (range) { @@ -335,7 +335,7 @@ class TimeMapper @Inject constructor( return rangeStart to rangeEnd } - private fun formatInterval(interval: Long, forceSeconds: Boolean): String { + private fun formatInterval(interval: Long, forceSeconds: Boolean, useProportionalMinutes: Boolean): String { val hourString = resourceRepo.getString(R.string.time_hour) val minuteString = resourceRepo.getString(R.string.time_minute) val secondString = resourceRepo.getString(R.string.time_second) @@ -350,6 +350,9 @@ class TimeMapper @Inject constructor( interval - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) ) + if(useProportionalMinutes && !forceSeconds) + return formatIntervalProportional(hr, min) + val willShowHours = hr != 0L val willShowMinutes = willShowHours || min != 0L val willShowSeconds = (!willShowHours && !willShowMinutes) || forceSeconds @@ -365,12 +368,12 @@ class TimeMapper @Inject constructor( } private fun formatIntervalProportional(hr: Long, min: Long): String { - val hourString = "h" + val hourString = resourceRepo.getString(R.string.time_hour) val minutesProportion = min / 60f val proportional = hr + minutesProportion val proportionalString = "%.2f".format(proportional) - return "($proportionalString$hourString)" + return "$proportionalString $hourString" } private fun toDayDateTitle(daysFromToday: Int): String { diff --git a/core/src/main/res/values-in/strings.xml b/core/src/main/res/values-in/strings.xml index a183a9ab..641adcf5 100644 --- a/core/src/main/res/values-in/strings.xml +++ b/core/src/main/res/values-in/strings.xml @@ -152,6 +152,7 @@ Dinonaktifkan Mode gelap Pakai format 24-jam + Gunakan format minit berkadar Ubah ukuran kartu kegiatan Arsip Sunting label-label diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml index 096f507f..da1e104e 100644 --- a/core/src/main/res/values-ru/strings.xml +++ b/core/src/main/res/values-ru/strings.xml @@ -152,6 +152,7 @@ Выкл. Темный режим 24-часовой формат + Используйте пропорциональный минутный формат Изменить размер карточки активности Архив Редактировать теги diff --git a/core/src/main/res/values-uk/strings.xml b/core/src/main/res/values-uk/strings.xml index bb19d29d..de1a2020 100644 --- a/core/src/main/res/values-uk/strings.xml +++ b/core/src/main/res/values-uk/strings.xml @@ -152,6 +152,7 @@ Вимкнено Темний режим Використовувати 24-годинний формат + Використовуйте пропорційний хвилинний формат Змінити розмір картки активності Архів Редагувати теги diff --git a/core/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml index 3e2ee386..2512ce15 100644 --- a/core/src/main/res/values-zh/strings.xml +++ b/core/src/main/res/values-zh/strings.xml @@ -152,6 +152,7 @@ 不启用 深色模式 使用24小时格式 + 使用比例分钟格式 更改活动卡片大小 存档 编辑标签 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index c0fd4a82..ccd8914a 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -152,6 +152,7 @@ Disabled Dark mode Use 24-hour format + Use proportional minute format Change activity card size Archive Edit tags diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt index b967125e..0bd5ce21 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt @@ -64,6 +64,9 @@ class PrefsRepoImpl @Inject constructor( override var useMilitaryTimeFormat: Boolean by prefs.delegate( KEY_USE_MILITARY_TIME_FORMAT, true ) + override var useProportionalMinutes: Boolean by prefs.delegate( + KEY_USE_PROPORTIONAL_MINUTES, false + ) override var showRecordTagSelection: Boolean by prefs.delegate( KEY_SHOW_RECORD_TAG_SELECTION, false @@ -123,6 +126,7 @@ class PrefsRepoImpl @Inject constructor( private const val KEY_DARK_MODE = "darkMode" private const val KEY_NUMBER_OF_CARDS = "numberOfCards" // 0 - default width private const val KEY_USE_MILITARY_TIME_FORMAT = "useMilitaryTimeFormat" + private const val KEY_USE_PROPORTIONAL_MINUTES = "useProportionalMinutes" private const val KEY_SHOW_RECORD_TAG_SELECTION = "showRecordTagSelection" private const val KEY_WIDGET = "widget_" private const val KEY_CARD_ORDER_MANUAL = "cardOrderManual" diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt index d8d1ebf4..79b12a8e 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt @@ -147,6 +147,14 @@ class PrefsInteractor @Inject constructor( prefsRepo.useMilitaryTimeFormat = isUsed } + suspend fun getUseProportionalMinutes(): Boolean = withContext(Dispatchers.IO) { + prefsRepo.useProportionalMinutes + } + + suspend fun setUseProportionalMinutes(isUsed: Boolean) = withContext(Dispatchers.IO) { + prefsRepo.useProportionalMinutes = isUsed + } + suspend fun getShowRecordTagSelection(): Boolean = withContext(Dispatchers.IO) { prefsRepo.showRecordTagSelection } diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt index d81a0cbf..8e8176d4 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt @@ -26,6 +26,8 @@ interface PrefsRepo { var useMilitaryTimeFormat: Boolean + var useProportionalMinutes: Boolean + var showRecordTagSelection: Boolean fun setWidget(widgetId: Int, recordType: Long) diff --git a/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt b/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt index 16ba875a..73d29a6c 100644 --- a/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt +++ b/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt @@ -20,13 +20,15 @@ class ChangeRecordViewDataInteractor @Inject constructor( val tag = recordTagInteractor.get(record.tagId) val isDarkTheme = prefsInteractor.getDarkMode() val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() + val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() return changeRecordViewDataMapper.map( record = record, recordType = type, recordTag = tag, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } } \ No newline at end of file diff --git a/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt b/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt index 90a01ad6..af7d5e2a 100644 --- a/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt +++ b/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt @@ -22,7 +22,8 @@ class ChangeRecordViewDataMapper @Inject constructor( recordType: RecordType?, recordTag: RecordTag?, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): ChangeRecordViewData { return ChangeRecordViewData( name = recordType?.name.orEmpty(), @@ -41,7 +42,7 @@ class ChangeRecordViewDataMapper @Inject constructor( .orEmpty(), duration = record ?.let { it.timeEnded - it.timeStarted } - ?.let(timeMapper::formatInterval) + ?.let{timeMapper.formatInterval(it, useProportionalMinutes)} .orEmpty(), iconId = recordType?.icon.orEmpty() .let(iconMapper::mapIcon), diff --git a/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/interactor/RecordsViewDataInteractor.kt b/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/interactor/RecordsViewDataInteractor.kt index 27a64c3b..d30a3c3b 100644 --- a/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/interactor/RecordsViewDataInteractor.kt +++ b/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/interactor/RecordsViewDataInteractor.kt @@ -20,6 +20,7 @@ class RecordsViewDataInteractor @Inject constructor( suspend fun getViewData(shift: Int): List { val isDarkTheme = prefsInteractor.getDarkMode() val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() + val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() val recordTypes = recordTypeInteractor.getAll().map { it.id to it }.toMap() val recordTags = recordTagInteractor.getAll().map { it.id to it }.toMap() val (rangeStart, rangeEnd) = getRange(shift) @@ -38,7 +39,8 @@ class RecordsViewDataInteractor @Inject constructor( rangeStart = rangeStart, rangeEnd = rangeEnd, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } .let { trackedRecords -> @@ -55,7 +57,8 @@ class RecordsViewDataInteractor @Inject constructor( rangeStart = rangeStart, rangeEnd = rangeEnd, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } .let { untrackedRecords -> trackedRecords + untrackedRecords } diff --git a/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/mapper/RecordsViewDataMapper.kt b/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/mapper/RecordsViewDataMapper.kt index 8a29893c..c5cf3cdf 100644 --- a/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/mapper/RecordsViewDataMapper.kt +++ b/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/mapper/RecordsViewDataMapper.kt @@ -26,7 +26,8 @@ class RecordsViewDataMapper @Inject constructor( rangeStart: Long, rangeEnd: Long, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): ViewHolderType { val (timeStarted, timeEnded) = clampToRange(record, rangeStart, rangeEnd) @@ -37,7 +38,8 @@ class RecordsViewDataMapper @Inject constructor( timeStarted = timeStarted, timeEnded = timeEnded, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } @@ -46,7 +48,8 @@ class RecordsViewDataMapper @Inject constructor( rangeStart: Long, rangeEnd: Long, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): RecordViewData { val (timeStarted, timeEnded) = clampToRange(record, rangeStart, rangeEnd) @@ -54,7 +57,8 @@ class RecordsViewDataMapper @Inject constructor( timeStarted = timeStarted, timeEnded = timeEnded, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } diff --git a/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/interactor/RecordsAllViewDataInteractor.kt b/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/interactor/RecordsAllViewDataInteractor.kt index 7028a6fc..89e3b7e2 100644 --- a/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/interactor/RecordsAllViewDataInteractor.kt +++ b/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/interactor/RecordsAllViewDataInteractor.kt @@ -37,6 +37,7 @@ class RecordsAllViewDataInteractor @Inject constructor( ): List { val isDarkTheme = prefsInteractor.getDarkMode() val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() + val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() val recordTypes = recordTypeInteractor.getAll().map { it.id to it }.toMap() val recordTags = recordTagInteractor.getAll().map { it.id to it }.toMap() val typesSelected = typesFilterInteractor.getTypeIds(filter) @@ -63,7 +64,8 @@ class RecordsAllViewDataInteractor @Inject constructor( recordType = recordTypes[record.typeId] ?: return@mapNotNull null, recordTag = recordTags[record.tagId], isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) ) } diff --git a/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/mapper/RecordsAllViewDataMapper.kt b/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/mapper/RecordsAllViewDataMapper.kt index 7dc3fcd9..c70bfe04 100644 --- a/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/mapper/RecordsAllViewDataMapper.kt +++ b/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/mapper/RecordsAllViewDataMapper.kt @@ -29,7 +29,8 @@ class RecordsAllViewDataMapper @Inject constructor( recordType: RecordType, recordTag: RecordTag?, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): ViewHolderType { val (timeStarted, timeEnded) = record.timeStarted to record.timeEnded @@ -40,7 +41,8 @@ class RecordsAllViewDataMapper @Inject constructor( timeStarted = timeStarted, timeEnded = timeEnded, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } diff --git a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt index 285d7025..cf343e22 100644 --- a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt +++ b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt @@ -79,6 +79,10 @@ class SettingsMapper @Inject constructor( return timeMapper.formatTime(hintTime, useMilitaryTime) } + fun toUseProportionalMinutesHint(useProportionalMinutes: Boolean): String { + return timeMapper.formatInterval(5400000, useProportionalMinutes) + } + private fun toPosition(cardOrder: CardOrder): Int { return cardOrderList.indexOf(cardOrder).takeUnless { it == -1 }.orZero() } diff --git a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt index 5d5cc307..5de07d3c 100644 --- a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt +++ b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt @@ -66,6 +66,7 @@ class SettingsFragment : groupSettingsInactivityReminder.setOnClick(viewModel::onInactivityReminderClicked) checkboxSettingsDarkMode.setOnClick(viewModel::onDarkModeClicked) checkboxSettingsUseMilitaryTime.setOnClick(viewModel::onUseMilitaryTimeClicked) + checkboxSettingsUseProportionalMinutes.setOnClick(viewModel::onUseProportionalMinutesClicked) tvSettingsChangeCardSize.setOnClick(viewModel::onChangeCardSizeClick) layoutSettingsEditCategories.setOnClick(viewModel::onEditCategoriesClick) checkboxSettingsShowRecordTagSelection.setOnClick(viewModel::onShowRecordTagSelectionClicked) @@ -88,8 +89,10 @@ class SettingsFragment : inactivityReminderViewData.observe(tvSettingsInactivityReminderTime::setText) darkModeCheckbox.observe(checkboxSettingsDarkMode::setChecked) useMilitaryTimeCheckbox.observe(checkboxSettingsUseMilitaryTime::setChecked) + useProportionalMinutesCheckbox.observe(checkboxSettingsUseProportionalMinutes::setChecked) showRecordTagSelectionCheckbox.observe(checkboxSettingsShowRecordTagSelection::setChecked) useMilitaryTimeHint.observe(tvSettingsUseMilitaryTimeHint::setText) + useProportionalMinutesHint.observe(tvSettingsUseProportionalMinutesHint::setText) themeChanged.observe(::changeTheme) } } diff --git a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt index a19ba886..fb926690 100644 --- a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt +++ b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt @@ -137,6 +137,24 @@ class SettingsViewModel @Inject constructor( } } + val useProportionalMinutesCheckbox: LiveData by lazy { + MutableLiveData().let { initial -> + viewModelScope.launch { + initial.value = prefsInteractor.getUseProportionalMinutes() + } + initial + } + } + + val useProportionalMinutesHint: LiveData by lazy { + MutableLiveData().let { initial -> + viewModelScope.launch { + initial.value = loadUseProportionalMinutesViewData() + } + initial + } + } + val themeChanged: LiveData = MutableLiveData(false) fun onVisible() { @@ -273,6 +291,16 @@ class SettingsViewModel @Inject constructor( } } + fun onUseProportionalMinutesClicked() { + viewModelScope.launch { + val newValue = !prefsInteractor.getUseProportionalMinutes() + prefsInteractor.setUseProportionalMinutes(newValue) + (useProportionalMinutesCheckbox as MutableLiveData).value = newValue + notificationTypeInteractor.updateNotifications() + updateUseProportionalMinutesViewData() + } + } + fun onShowRecordTagSelectionClicked() { viewModelScope.launch { val newValue = !prefsInteractor.getShowRecordTagSelection() @@ -389,11 +417,21 @@ class SettingsViewModel @Inject constructor( (useMilitaryTimeHint as MutableLiveData).value = data } + private suspend fun updateUseProportionalMinutesViewData() { + val data = loadUseProportionalMinutesViewData() + (useProportionalMinutesHint as MutableLiveData).value = data + } + private suspend fun loadUseMilitaryTimeViewData(): String { return prefsInteractor.getUseMilitaryTimeFormat() .let(settingsMapper::toUseMilitaryTimeHint) } + private suspend fun loadUseProportionalMinutesViewData(): String { + return prefsInteractor.getUseProportionalMinutes() + .let(settingsMapper::toUseProportionalMinutesHint) + } + companion object { private const val ALERT_DIALOG_TAG = "alert_dialog_tag" private const val INACTIVITY_DURATION_DIALOG_TAG = "inactivity_duration_dialog_tag" diff --git a/feature_settings/src/main/res/layout/settings_fragment.xml b/feature_settings/src/main/res/layout/settings_fragment.xml index 1e365942..77306115 100644 --- a/feature_settings/src/main/res/layout/settings_fragment.xml +++ b/feature_settings/src/main/res/layout/settings_fragment.xml @@ -353,6 +353,47 @@ + + + + + + + + + + + + diff --git a/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsViewDataInteractor.kt b/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsViewDataInteractor.kt index de9f3e40..930bcbae 100644 --- a/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsViewDataInteractor.kt +++ b/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsViewDataInteractor.kt @@ -33,6 +33,7 @@ class StatisticsViewDataInteractor @Inject constructor( val filterType = prefsInteractor.getChartFilterType() val isDarkTheme = prefsInteractor.getDarkMode() val firstDayOfWeek = prefsInteractor.getFirstDayOfWeek() + val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() val showDuration = rangeLength != RangeLength.ALL val list: List @@ -47,13 +48,13 @@ class StatisticsViewDataInteractor @Inject constructor( val statistics = getStatistics(rangeLength, shift, typesFiltered, firstDayOfWeek) list = statisticsViewDataMapper.mapActivities( - statistics, types, typesFiltered, showDuration, isDarkTheme + statistics, types, typesFiltered, showDuration, isDarkTheme, useProportionalMinutes ) chart = statisticsViewDataMapper.mapActivitiesToChart( statistics, types, typesFiltered, isDarkTheme ) totalTracked = statisticsViewDataMapper.mapActivitiesTotalTracked( - statistics, typesFiltered + statistics, typesFiltered, useProportionalMinutes ) } ChartFilterType.CATEGORY -> { @@ -64,13 +65,13 @@ class StatisticsViewDataInteractor @Inject constructor( val statistics = getStatisticsCategory(rangeLength, shift, firstDayOfWeek) list = statisticsViewDataMapper.mapCategories( - statistics, categories, categoriesFiltered, showDuration, isDarkTheme + statistics, categories, categoriesFiltered, showDuration, isDarkTheme, useProportionalMinutes ) chart = statisticsViewDataMapper.mapCategoriesToChart( statistics, categories, types, typeCategories, categoriesFiltered, isDarkTheme ) totalTracked = statisticsViewDataMapper.mapCategoriesTotalTracked( - statistics, categoriesFiltered + statistics, categoriesFiltered, useProportionalMinutes ) } } diff --git a/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt b/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt index d4e6eb09..515cad9b 100644 --- a/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt +++ b/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt @@ -34,7 +34,8 @@ class StatisticsViewDataMapper @Inject constructor( recordTypes: List, recordTypesFiltered: List, showDuration: Boolean, - isDarkTheme: Boolean + isDarkTheme: Boolean, + useProportionalMinutes: Boolean ): List { val statisticsFiltered = statistics.filterNot { it.typeId in recordTypesFiltered } val recordTypesMap = recordTypes.map { it.id to it }.toMap() @@ -50,7 +51,8 @@ class StatisticsViewDataMapper @Inject constructor( recordType = recordTypesMap[statistic.typeId], showDuration = showDuration, isDarkTheme = isDarkTheme, - statisticsSize = statisticsSize + statisticsSize = statisticsSize, + useProportionalMinutes = useProportionalMinutes, ) ?: return@mapNotNull null ) to statistic.duration } @@ -63,7 +65,8 @@ class StatisticsViewDataMapper @Inject constructor( categories: List, categoriesFiltered: List, showDuration: Boolean, - isDarkTheme: Boolean + isDarkTheme: Boolean, + useProportionalMinutes: Boolean ): List { val statisticsFiltered = statistics.filterNot { it.categoryId in categoriesFiltered } val categoriesMap = categories.map { it.id to it }.toMap() @@ -79,7 +82,8 @@ class StatisticsViewDataMapper @Inject constructor( category = categoriesMap[statistic.categoryId], showDuration = showDuration, isDarkTheme = isDarkTheme, - statisticsSize = statisticsSize + statisticsSize = statisticsSize, + useProportionalMinutes = useProportionalMinutes, ) ?: return@mapNotNull null ) to statistic.duration } @@ -148,24 +152,26 @@ class StatisticsViewDataMapper @Inject constructor( // TODO statistics into sealed class and simplify fun mapActivitiesTotalTracked( statistics: List, - recordTypesFiltered: List + recordTypesFiltered: List, + useProportionalMinutes: Boolean ): ViewHolderType { val statisticsFiltered = statistics .filterNot { it.typeId in recordTypesFiltered || it.typeId == -1L } val totalTracked = statisticsFiltered.map(Statistics::duration).sum() - return mapTotalTracked(totalTracked) + return mapTotalTracked(totalTracked, useProportionalMinutes) } fun mapCategoriesTotalTracked( statistics: List, - categoriesFiltered: List + categoriesFiltered: List, + useProportionalMinutes: Boolean ): ViewHolderType { val statisticsFiltered = statistics .filterNot { it.categoryId in categoriesFiltered || it.categoryId == -1L } val totalTracked = statisticsFiltered.map(StatisticsCategory::duration).sum() - return mapTotalTracked(totalTracked) + return mapTotalTracked(totalTracked, useProportionalMinutes) } fun mapToEmpty(): ViewHolderType { @@ -186,7 +192,8 @@ class StatisticsViewDataMapper @Inject constructor( recordType: RecordType?, showDuration: Boolean, isDarkTheme: Boolean, - statisticsSize: Int + statisticsSize: Int, + useProportionalMinutes: Boolean ): StatisticsViewData? { val durationPercent = statisticsMapper.getDurationPercentString( sumDuration = sumDuration, @@ -201,7 +208,7 @@ class StatisticsViewDataMapper @Inject constructor( name = R.string.untracked_time_name .let(resourceRepo::getString), duration = statistics.duration - .let(timeMapper::formatInterval), + .let { timeMapper.formatInterval(it, useProportionalMinutes) }, percent = durationPercent, icon = RecordTypeIcon.Image(R.drawable.unknown), color = colorMapper.toUntrackedColor(isDarkTheme) @@ -212,7 +219,7 @@ class StatisticsViewDataMapper @Inject constructor( id = statistics.typeId, name = recordType.name, duration = if (showDuration) { - statistics.duration.let(timeMapper::formatInterval) + statistics.duration.let{ timeMapper.formatInterval(it, useProportionalMinutes) } } else { "" }, @@ -236,7 +243,8 @@ class StatisticsViewDataMapper @Inject constructor( category: Category?, showDuration: Boolean, isDarkTheme: Boolean, - statisticsSize: Int + statisticsSize: Int, + useProportionalMinutes: Boolean ): StatisticsViewData? { val durationPercent = statisticsMapper.getDurationPercentString( sumDuration = sumDuration, @@ -249,7 +257,7 @@ class StatisticsViewDataMapper @Inject constructor( id = statistics.categoryId, name = category.name, duration = if (showDuration) { - statistics.duration.let(timeMapper::formatInterval) + statistics.duration.let{ timeMapper.formatInterval(it, useProportionalMinutes) } } else { "" }, @@ -312,10 +320,10 @@ class StatisticsViewDataMapper @Inject constructor( } } - private fun mapTotalTracked(totalTracked: Long): ViewHolderType { + private fun mapTotalTracked(totalTracked: Long, useProportionalMinutes: Boolean): ViewHolderType { return StatisticsInfoViewData( name = resourceRepo.getString(R.string.statistics_total_tracked), - text = totalTracked.let(timeMapper::formatInterval) + text = totalTracked.let{ timeMapper.formatInterval(it, useProportionalMinutes) } ) } } \ No newline at end of file diff --git a/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailStatsInteractor.kt b/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailStatsInteractor.kt index 98a01c1b..334c9625 100644 --- a/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailStatsInteractor.kt +++ b/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailStatsInteractor.kt @@ -31,6 +31,7 @@ class StatisticsDetailStatsInteractor @Inject constructor( val isDarkTheme = prefsInteractor.getDarkMode() val firstDayOfWeek = prefsInteractor.getFirstDayOfWeek() val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() + val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() val types = recordTypeInteractor.getAll() val tags = recordTagInteractor.getAll() @@ -52,7 +53,8 @@ class StatisticsDetailStatsInteractor @Inject constructor( types = types, tags = tags, isDarkTheme = isDarkTheme, - useMilitaryTime = useMilitaryTime + useMilitaryTime = useMilitaryTime, + useProportionalMinutes = useProportionalMinutes ) } } \ No newline at end of file diff --git a/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt b/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt index 91a60c1a..88a09694 100644 --- a/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt +++ b/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt @@ -46,7 +46,8 @@ class StatisticsDetailViewDataMapper @Inject constructor( types: List, tags: List, isDarkTheme: Boolean, - useMilitaryTime: Boolean + useMilitaryTime: Boolean, + useProportionalMinutes: Boolean ): StatisticsDetailStatsViewData { val recordsSorted = records.sortedBy { it.timeStarted } val durations = records.map(::mapToDuration) @@ -71,22 +72,23 @@ class StatisticsDetailViewDataMapper @Inject constructor( records = records, typesMap = types.map { it.id to it }.toMap(), tagsMap = tags.map { it.id to it }.toMap(), - isDarkTheme = isDarkTheme + isDarkTheme = isDarkTheme, + useProportionalMinutes = useProportionalMinutes ) return mapToStatsViewData( totalDuration = totalDuration - .let(timeMapper::formatInterval), + .let{ timeMapper.formatInterval(it, useProportionalMinutes) }, timesTracked = timesTracked, timesTrackedIcon = recordsAllIcon, shortestRecord = shortest - ?.let(timeMapper::formatInterval) + ?.let{ timeMapper.formatInterval(it, useProportionalMinutes) } ?: emptyValue, averageRecord = average - ?.let(timeMapper::formatInterval) + ?.let{ timeMapper.formatInterval(it, useProportionalMinutes) } ?: emptyValue, longestRecord = longest - ?.let(timeMapper::formatInterval) + ?.let{ timeMapper.formatInterval(it, useProportionalMinutes) } ?: emptyValue, firstRecord = first ?.let { timeMapper.formatDateTimeYear(it, useMilitaryTime) } @@ -422,7 +424,8 @@ class StatisticsDetailViewDataMapper @Inject constructor( records: List, typesMap: Map, tagsMap: Map, - isDarkTheme: Boolean + isDarkTheme: Boolean, + useProportionalMinutes: Boolean ): List { val tags = records.groupBy { it.tagId } .takeUnless { it.isEmpty() } @@ -444,7 +447,8 @@ class StatisticsDetailViewDataMapper @Inject constructor( duration = duration, sumDuration = sumDuration, isDarkTheme = isDarkTheme, - statisticsSize = tagsSize + statisticsSize = tagsSize, + useProportionalMinutes = useProportionalMinutes, ) to duration } .sortedByDescending { (_, duration) -> duration } @@ -457,7 +461,8 @@ class StatisticsDetailViewDataMapper @Inject constructor( duration: Long, sumDuration: Long, isDarkTheme: Boolean, - statisticsSize: Int + statisticsSize: Int, + useProportionalMinutes: Boolean ): StatisticsViewData { val durationPercent = statisticsMapper.getDurationPercentString( sumDuration = sumDuration, @@ -470,7 +475,7 @@ class StatisticsDetailViewDataMapper @Inject constructor( name = tag?.name ?: R.string.change_record_untagged.let(resourceRepo::getString), duration = duration - .let(timeMapper::formatInterval), + .let{ timeMapper.formatInterval(it, useProportionalMinutes) }, percent = durationPercent, icon = recordType?.icon ?.let(iconMapper::mapIcon) -- 2.51.2 From 96aedbd4ad81d4847cc35a37e75dd31e9e4da894 Mon Sep 17 00:00:00 2001 From: Sebastian Konieczek Date: Wed, 22 Sep 2021 15:08:28 +0200 Subject: [PATCH 4/4] add settings test --- .../util/simpletimetracker/SettingsTest.kt | 19 +++++++++++++++++++ .../feature_settings/mapper/SettingsMapper.kt | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt index 5bf0978b..a02f0073 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt @@ -610,6 +610,25 @@ class SettingsTest : BaseUiTest() { checkViewIsDisplayed(allOf(withId(R.id.tvSettingsUseMilitaryTimeHint), withText("13:00"))) } + @Test + fun proportionalMinutes() { + // Check settings + NavUtils.openSettingsScreen() + onView(withId(R.id.tvSettingsUseProportionalMinutesHint)).perform(nestedScrollTo()) + onView(withId(R.id.checkboxSettingsUseProportionalMinutes)).check(matches(isNotChecked())) + checkViewIsDisplayed(allOf(withId(R.id.tvSettingsUseProportionalMinutesHint), withText("1h 15m"))) + + // Change settings + clickOnViewWithId(R.id.checkboxSettingsUseProportionalMinutes) + onView(withId(R.id.checkboxSettingsUseProportionalMinutes)).check(matches(isChecked())) + checkViewIsDisplayed(allOf(withId(R.id.tvSettingsUseProportionalMinutesHint), withSubstring("1.25 h"))) + + // Change settings + clickOnViewWithId(R.id.checkboxSettingsUseProportionalMinutes) + onView(withId(R.id.checkboxSettingsUseProportionalMinutes)).check(matches(isNotChecked())) + checkViewIsDisplayed(allOf(withId(R.id.tvSettingsUseProportionalMinutesHint), withText("1h 15m"))) + } + @Test fun firstDayOfWeek() { // If today is sunday: diff --git a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt index cf343e22..7be9a0a7 100644 --- a/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt +++ b/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt @@ -80,7 +80,7 @@ class SettingsMapper @Inject constructor( } fun toUseProportionalMinutesHint(useProportionalMinutes: Boolean): String { - return timeMapper.formatInterval(5400000, useProportionalMinutes) + return timeMapper.formatInterval(4500000, useProportionalMinutes) } private fun toPosition(cardOrder: CardOrder): Int {