A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

add widget background transparency setting

razeeman (Jan 2, 2024, 4:07 PM +0300) e8e88778 899ddf91

+265 -29
+1
core/src/main/res/values-ar/strings.xml
··· 221 221 <string name="settings_show_records_calendar">إظهار المتتبعات في عرض تقويم</string> 222 222 <string name="settings_reverse_order_in_calendar">ترتيب عكسي للمتتبعات</string> 223 223 <string name="settings_days_in_calendar">الأيام في التقويم</string> 224 + <string name="settings_widget_transparency">القطعة شفافية الخلفية</string> 224 225 <string name="settings_show_activity_filters">إظهار عوامل تصفية النشاط على الشاشة الرئيسية</string> 225 226 <string name="settings_show_goals_separately">إظهار الأهداف في علامة تبويب منفصلة</string> 226 227 <string name="settings_allow_multitasking">السماح بتعدد المهام</string>
+1
core/src/main/res/values-ca/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Mostra els enregistraments en vista de calendari</string> 222 222 <string name="settings_reverse_order_in_calendar">Inverteix l\'ordre dels enregistraments</string> 223 223 <string name="settings_days_in_calendar">Dies al calendari</string> 224 + <string name="settings_widget_transparency">Transparència de fons del widget</string> 224 225 <string name="settings_show_activity_filters">Mostra els filtres d\'activitat a la pantalla principal.</string> 225 226 <string name="settings_show_goals_separately">Mostra els objectius en una pestanya separada</string> 226 227 <string name="settings_allow_multitasking">Permet la multitasca</string>
+1
core/src/main/res/values-de/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Datensätze in der Kalenderansicht anzeigen</string> 222 222 <string name="settings_reverse_order_in_calendar">Umgekehrte Reihenfolge der Aufzeichnungen</string> 223 223 <string name="settings_days_in_calendar">Tage im Kalender</string> 224 + <string name="settings_widget_transparency">Widget-Hintergrundtransparenz</string> 224 225 <string name="settings_show_activity_filters">Aktivitätsfilter auf dem Hauptbildschirm anzeigen</string> 225 226 <string name="settings_show_goals_separately">Ziele auf einer separaten Registerkarte anzeigen</string> 226 227 <string name="settings_allow_multitasking">Multitasking erlauben</string>
+1
core/src/main/res/values-es/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Mostrar registros en la vista de calendario</string> 222 222 <string name="settings_reverse_order_in_calendar">Orden inverso de registros</string> 223 223 <string name="settings_days_in_calendar">Días en el calendario</string> 224 + <string name="settings_widget_transparency">Transparencia del fondo del widget</string> 224 225 <string name="settings_show_activity_filters">Mostrar filtros de actividad en la pantalla principal</string> 225 226 <string name="settings_show_goals_separately">Mostrar objetivos en una pestaña separada</string> 226 227 <string name="settings_allow_multitasking">Permitir el registro multitarea</string>
+1
core/src/main/res/values-fa/strings.xml
··· 221 221 <string name="settings_show_records_calendar">نمایش تاریخچه ها در نمای تقویم</string> 222 222 <string name="settings_reverse_order_in_calendar">ترتیب برعکس تاریخچه ها</string> 223 223 <string name="settings_days_in_calendar">روزها در تقویم</string> 224 + <string name="settings_widget_transparency">شفافیت پس زمینه ویجت</string> 224 225 <string name="settings_show_activity_filters">فیلتر فعالیت ها را در صفحه اصلی نمایش بده</string> 225 226 <string name="settings_show_goals_separately">نمایش اهداف در یک برگه جداگانه</string> 226 227 <string name="settings_allow_multitasking">انجام دادن همزمان فعالیت ها</string>
+1
core/src/main/res/values-fr/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Utiliser une vue calendrier pour la liste des enregistrements</string> 222 222 <string name="settings_reverse_order_in_calendar">Inverser l\'ordre des enregistrements</string> 223 223 <string name="settings_days_in_calendar">Jours dans le calendrier</string> 224 + <string name="settings_widget_transparency">Transparence de l\'arrière-plan du widget</string> 224 225 <string name="settings_show_activity_filters">Afficher les filtres d\'activité sur l\'écran principal</string> 225 226 <string name="settings_show_goals_separately">Afficher les objectifs dans un onglet séparé</string> 226 227 <string name="settings_allow_multitasking">Autoriser le multitâche</string>
+1
core/src/main/res/values-hi/strings.xml
··· 221 221 <string name="settings_show_records_calendar">कैलेंडर दृश्य में रिकॉर्ड दिखाएं</string> 222 222 <string name="settings_reverse_order_in_calendar">अभिलेखों का उल्टा क्रम</string> 223 223 <string name="settings_days_in_calendar">कैलेंडर में दिन</string> 224 + <string name="settings_widget_transparency">विजेट पृष्ठभूमि पारदर्शिता</string> 224 225 <string name="settings_show_activity_filters">मुख्य स्क्रीन पर गतिविधि फ़िल्टर दिखाएं</string> 225 226 <string name="settings_show_goals_separately">एक अलग टैब पर लक्ष्य दिखाएँ</string> 226 227 <string name="settings_allow_multitasking">मल्टीटास्किंग की अनुमति दें</string>
+1
core/src/main/res/values-in/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Tampilkan rekor dalam tampilan kalender</string> 222 222 <string name="settings_reverse_order_in_calendar">Urutan terbalik catatan</string> 223 223 <string name="settings_days_in_calendar">Hari dalam kalender</string> 224 + <string name="settings_widget_transparency">Transparansi latar belakang widget</string> 224 225 <string name="settings_show_activity_filters">Tampilkan filter aktivitas di layar utama</string> 225 226 <string name="settings_show_goals_separately">Tampilkan sasaran di tab terpisah</string> 226 227 <string name="settings_allow_multitasking">Izinkan tugas ganda</string>
+1
core/src/main/res/values-it/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Mostra i record nella vista calendario</string> 222 222 <string name="settings_reverse_order_in_calendar">Ordine inverso dei record</string> 223 223 <string name="settings_days_in_calendar">Giorni in calendario</string> 224 + <string name="settings_widget_transparency">Trasparenza dello sfondo del widget</string> 224 225 <string name="settings_show_activity_filters">Mostra i filtri delle attività sulla schermata principale</string> 225 226 <string name="settings_show_goals_separately">Mostra gli obiettivi in una scheda separata</string> 226 227 <string name="settings_allow_multitasking">Abilita multitasking</string>
+1
core/src/main/res/values-ja/strings.xml
··· 221 221 <string name="settings_show_records_calendar">カレンダービューで計測記録を表示</string> 222 222 <string name="settings_reverse_order_in_calendar">レコードの逆順</string> 223 223 <string name="settings_days_in_calendar">カレンダーの日数</string> 224 + <string name="settings_widget_transparency">ウィジェットの背景の透明度</string> 224 225 <string name="settings_show_activity_filters">メイン画面にアクティビティ フィルタを表示する</string> 225 226 <string name="settings_show_goals_separately">別のタブに目標を表示する</string> 226 227 <string name="settings_allow_multitasking">マルチタスクを可能にする</string>
+1
core/src/main/res/values-ko/strings.xml
··· 221 221 <string name="settings_show_records_calendar">기록을 캘린더 형식으로 보기</string> 222 222 <string name="settings_reverse_order_in_calendar">순서 뒤집기</string> 223 223 <string name="settings_days_in_calendar">표시할 일 수</string> 224 + <string name="settings_widget_transparency">위젯 배경 투명도</string> 224 225 <string name="settings_show_activity_filters">메인 화면에 활동 필터 표시</string> 225 226 <string name="settings_show_goals_separately">목표 탭 분리</string> 226 227 <string name="settings_allow_multitasking">멀티태스킹 활성화</string>
+1
core/src/main/res/values-nl/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Toon records in kalenderweergave</string> 222 222 <string name="settings_reverse_order_in_calendar">Omgekeerde volgorde van records</string> 223 223 <string name="settings_days_in_calendar">Dagen in kalender</string> 224 + <string name="settings_widget_transparency">Widgetachtergrondtransparantie</string> 224 225 <string name="settings_show_activity_filters">Activiteitsfilters weergeven op hoofdscherm</string> 225 226 <string name="settings_show_goals_separately">Toon doelen op een apart tabblad</string> 226 227 <string name="settings_allow_multitasking">Multitasking toestaan</string>
+1
core/src/main/res/values-pt/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Mostrar registros na visualização de calendário</string> 222 222 <string name="settings_reverse_order_in_calendar">Ordem inversa dos registros</string> 223 223 <string name="settings_days_in_calendar">Dias no calendário</string> 224 + <string name="settings_widget_transparency">Transparência de fundo do widget</string> 224 225 <string name="settings_show_activity_filters">Mostrar filtros de atividade na tela principal</string> 225 226 <string name="settings_show_goals_separately">Mostrar metas em uma guia separada</string> 226 227 <string name="settings_allow_multitasking">Permitir atividades simultâneas</string>
+1
core/src/main/res/values-ru/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Показывать записи в виде календаря</string> 222 222 <string name="settings_reverse_order_in_calendar">Обратный порядок записей</string> 223 223 <string name="settings_days_in_calendar">Дней в календаре</string> 224 + <string name="settings_widget_transparency">Прозрачность фона виджета</string> 224 225 <string name="settings_show_activity_filters">Показывать фильтры активности на главном экране</string> 225 226 <string name="settings_show_goals_separately">Показывать цели на отдельной вкладке</string> 226 227 <string name="settings_allow_multitasking">Разрешить многозадачность</string>
+1
core/src/main/res/values-sv/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Visa händelser i kalendervy</string> 222 222 <string name="settings_reverse_order_in_calendar">Byt ordning på händelser</string> 223 223 <string name="settings_days_in_calendar">Dagar i kalendern</string> 224 + <string name="settings_widget_transparency">Transparens för widgetbakgrund</string> 224 225 <string name="settings_show_activity_filters">Visa aktivitetsfilter på huvudskärmen</string> 225 226 <string name="settings_show_goals_separately">Visa mål på en separat flik</string> 226 227 <string name="settings_allow_multitasking">Tillåt multitasking</string>
+1
core/src/main/res/values-tr/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Kayıtları takvim görünümünde göster</string> 222 222 <string name="settings_reverse_order_in_calendar">Kayıtların ters sırası</string> 223 223 <string name="settings_days_in_calendar">Takvimdeki günler</string> 224 + <string name="settings_widget_transparency">Widget arka plan şeffaflığı</string> 224 225 <string name="settings_show_activity_filters">Aktivite filtrelerini ana ekranda göster</string> 225 226 <string name="settings_show_goals_separately">Hedefleri ayrı bir sekmede göster</string> 226 227 <string name="settings_allow_multitasking">Çoklu göreve izin ver</string>
+1
core/src/main/res/values-uk/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Показувати записи в календарі</string> 222 222 <string name="settings_reverse_order_in_calendar">Зворотний порядок записів</string> 223 223 <string name="settings_days_in_calendar">Дні в календарі</string> 224 + <string name="settings_widget_transparency">Прозорість фону віджета</string> 224 225 <string name="settings_show_activity_filters">Показувати фільтри активності на головному екрані</string> 225 226 <string name="settings_show_goals_separately">Показати цілі на окремій вкладці</string> 226 227 <string name="settings_allow_multitasking">Дозволити багатозадачність</string>
+1
core/src/main/res/values-zh-rTW/strings.xml
··· 221 221 <string name="settings_show_records_calendar">顯示月曆檢視紀錄</string> 222 222 <string name="settings_reverse_order_in_calendar">反轉記錄順序</string> 223 223 <string name="settings_days_in_calendar">日曆中的天數</string> 224 + <string name="settings_widget_transparency">小部件背景透明度</string> 224 225 <string name="settings_show_activity_filters">主視窗上顯示活動過濾器</string> 225 226 <string name="settings_show_goals_separately">在單獨的選項卡上顯示目標</string> 226 227 <string name="settings_allow_multitasking">允許多任務</string>
+1
core/src/main/res/values-zh/strings.xml
··· 221 221 <string name="settings_show_records_calendar">在日历视图中显示记录</string> 222 222 <string name="settings_reverse_order_in_calendar">倒序记录</string> 223 223 <string name="settings_days_in_calendar">日历中的天数</string> 224 + <string name="settings_widget_transparency">小部件背景透明度</string> 224 225 <string name="settings_show_activity_filters">在主屏幕上显示活动过滤器</string> 225 226 <string name="settings_show_goals_separately">在单独的选项卡上显示目标</string> 226 227 <string name="settings_allow_multitasking">允许同时对多个活动进行追踪</string>
+1
core/src/main/res/values/strings.xml
··· 221 221 <string name="settings_show_records_calendar">Show records in calendar view</string> 222 222 <string name="settings_reverse_order_in_calendar">Reverse order of records</string> 223 223 <string name="settings_days_in_calendar">Days in calendar</string> 224 + <string name="settings_widget_transparency">Widget background transparency</string> 224 225 <string name="settings_show_activity_filters">Show activity filters on main screen</string> 225 226 <string name="settings_show_goals_separately">Show goals on a separate tab</string> 226 227 <string name="settings_allow_multitasking">Allow multitasking</string>
+5
data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt
··· 241 241 KEY_REPEAT_BUTTON_TYPE, 0 242 242 ) 243 243 244 + override var widgetBackgroundTransparencyPercent: Long by prefs.delegate( 245 + KEY_WIDGET_TRANSPARENCY_PERCENT, 60 246 + ) 247 + 244 248 override fun setWidget(widgetId: Int, recordType: Long) { 245 249 prefs.edit().putLong(KEY_WIDGET + widgetId, recordType).apply() 246 250 } ··· 434 438 private const val KEY_AUTOMATIC_EXPORT_ERROR = "automaticExportError" 435 439 private const val KEY_AUTOMATIC_EXPORT_LAST_SAVE_TIME = "automaticExportLastSaveTime" 436 440 private const val KEY_REPEAT_BUTTON_TYPE = "repeatButtonType" 441 + private const val KEY_WIDGET_TRANSPARENCY_PERCENT = "widgetTransparencyPercent" 437 442 private const val KEY_WIDGET = "widget_" 438 443 private const val KEY_STATISTICS_WIDGET_FILTERED_TYPES = "statistics_widget_filtered_types_" 439 444 private const val KEY_STATISTICS_WIDGET_FILTERED_CATEGORIES = "statistics_widget_filtered_categories_"
+8
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt
··· 559 559 } 560 560 } 561 561 562 + suspend fun setWidgetBackgroundTransparencyPercent(value: Long) = withContext(Dispatchers.IO) { 563 + prefsRepo.widgetBackgroundTransparencyPercent = value 564 + } 565 + 566 + suspend fun getWidgetBackgroundTransparencyPercent(): Long = withContext(Dispatchers.IO) { 567 + prefsRepo.widgetBackgroundTransparencyPercent 568 + } 569 + 562 570 suspend fun clear() = withContext(Dispatchers.IO) { 563 571 prefsRepo.clear() 564 572 }
+5
domain/src/main/java/com/example/util/simpletimetracker/domain/model/WidgetTransparencyPercent.kt
··· 1 + package com.example.util.simpletimetracker.domain.model 2 + 3 + data class WidgetTransparencyPercent( 4 + val value: Long, 5 + )
+2
domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt
··· 111 111 112 112 var repeatButtonType: Int 113 113 114 + var widgetBackgroundTransparencyPercent: Long 115 + 114 116 fun setWidget(widgetId: Int, recordType: Long) 115 117 116 118 fun getWidget(widgetId: Int): Long
+33
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt
··· 23 23 import com.example.util.simpletimetracker.domain.model.DayOfWeek 24 24 import com.example.util.simpletimetracker.domain.model.DaysInCalendar 25 25 import com.example.util.simpletimetracker.domain.model.RepeatButtonType 26 + import com.example.util.simpletimetracker.domain.model.WidgetTransparencyPercent 26 27 import com.example.util.simpletimetracker.domain.model.count 27 28 import com.example.util.simpletimetracker.feature_settings.R 28 29 import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData ··· 33 34 import com.example.util.simpletimetracker.feature_settings.viewData.LanguageViewData 34 35 import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 35 36 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 37 + import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData 36 38 import com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 37 39 import com.example.util.simpletimetracker.navigation.params.screen.HelpDialogParams 38 40 import java.util.Calendar ··· 58 60 DaysInCalendar.THREE, 59 61 DaysInCalendar.FIVE, 60 62 DaysInCalendar.SEVEN, 63 + ) 64 + 65 + private val widgetTransparencyList: List<WidgetTransparencyPercent> = listOf( 66 + WidgetTransparencyPercent(100), 67 + WidgetTransparencyPercent(80), 68 + WidgetTransparencyPercent(60), 69 + WidgetTransparencyPercent(40), 70 + WidgetTransparencyPercent(20), 71 + WidgetTransparencyPercent(0), 61 72 ) 62 73 63 74 private val dayOfWeekList: List<DayOfWeek> = listOf( ··· 135 146 136 147 fun toDaysInCalendar(position: Int): DaysInCalendar { 137 148 return daysInCalendarList.getOrElse(position) { daysInCalendarList.first() } 149 + } 150 + 151 + fun toWidgetTransparencyViewData(currentValue: WidgetTransparencyPercent): WidgetTransparencyViewData { 152 + return WidgetTransparencyViewData( 153 + items = widgetTransparencyList 154 + .map(::toWidgetTransparencyName) 155 + .map(CustomSpinner::CustomSpinnerTextItem), 156 + selectedPosition = toPosition(currentValue), 157 + selectedValue = toWidgetTransparencyName(currentValue), 158 + ) 159 + } 160 + 161 + fun toWidgetTransparency(position: Int): WidgetTransparencyPercent { 162 + return widgetTransparencyList.getOrElse(position) { widgetTransparencyList.first() } 138 163 } 139 164 140 165 fun toFirstDayOfWeekViewData(currentOrder: DayOfWeek): FirstDayOfWeekViewData { ··· 335 360 336 361 private fun toDaysInCalendarName(daysInCalendar: DaysInCalendar): String { 337 362 return daysInCalendar.count.toString() 363 + } 364 + 365 + private fun toPosition(widgetTransparency: WidgetTransparencyPercent): Int { 366 + return widgetTransparencyList.indexOf(widgetTransparency).takeUnless { it == -1 }.orZero() 367 + } 368 + 369 + private fun toWidgetTransparencyName(widgetTransparency: WidgetTransparencyPercent): String { 370 + return "${widgetTransparency.value}%" 338 371 } 339 372 340 373 private fun toPosition(dayOfWeek: DayOfWeek): Int {
+12
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 25 25 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 26 26 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData 27 27 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsUntrackedRangeViewData 28 + import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData 28 29 import com.example.util.simpletimetracker.feature_settings.viewModel.SettingsViewModel 29 30 import com.example.util.simpletimetracker.feature_views.extension.rotateDown 30 31 import com.example.util.simpletimetracker.feature_views.extension.rotateUp ··· 66 67 layoutSettingsTranslators.rvSettingsTranslators.adapter = translatorsAdapter 67 68 layoutSettingsMain.spinnerSettingsDarkMode.setProcessSameItemSelection(false) 68 69 layoutSettingsDisplay.spinnerSettingsDaysInCalendar.setProcessSameItemSelection(false) 70 + layoutSettingsDisplay.spinnerSettingsWidgetTransparency.setProcessSameItemSelection(false) 69 71 layoutSettingsDisplay.spinnerSettingsRecordTypeSort.setProcessSameItemSelection(false) 70 72 layoutSettingsAdditional.spinnerSettingsFirstDayOfWeek.setProcessSameItemSelection(false) 71 73 layoutSettingsAdditional.spinnerSettingsRepeatButtonType.setProcessSameItemSelection(false) ··· 103 105 with(viewModel.displayDelegate) { 104 106 layoutSettingsDisplayTitle.setOnClick(viewModel::onSettingsDisplayClick) 105 107 spinnerSettingsDaysInCalendar.onPositionSelected = ::onDaysInCalendarSelected 108 + spinnerSettingsWidgetTransparency.onPositionSelected = ::onWidgetTransparencySelected 106 109 spinnerSettingsRecordTypeSort.onPositionSelected = ::onRecordTypeOrderSelected 107 110 btnCardOrderManual.setOnClick(::onCardOrderManualClick) 108 111 checkboxSettingsShowUntrackedInRecords.setOnClick(::onShowUntrackedInRecordsClicked) ··· 231 234 untrackedRangeViewData.observe(::setUntrackedRangeViewData) 232 235 showRecordsCalendarCheckbox.observe(::updateShowRecordCalendarChecked) 233 236 daysInCalendarViewData.observe(::updateDaysInCalendarViewData) 237 + widgetTransparencyViewData.observe(::updateWidgetTransparencyViewData) 234 238 reverseOrderInCalendarCheckbox.observe(checkboxSettingsReverseOrderInCalendar::setChecked) 235 239 showActivityFiltersCheckbox.observe(checkboxSettingsShowActivityFilters::setChecked) 236 240 showGoalsSeparatelyCheckbox.observe(checkboxSettingsShowGoalsSeparately::setChecked) ··· 307 311 } 308 312 with(layoutSettingsDisplay) { 309 313 spinnerSettingsDaysInCalendar.jumpDrawablesToCurrentState() 314 + spinnerSettingsWidgetTransparency.jumpDrawablesToCurrentState() 310 315 spinnerSettingsRecordTypeSort.jumpDrawablesToCurrentState() 311 316 checkboxSettingsShowUntrackedInRecords.jumpDrawablesToCurrentState() 312 317 checkboxSettingsShowUntrackedInStatistics.jumpDrawablesToCurrentState() ··· 374 379 spinnerSettingsDaysInCalendar.setData(viewData.items, viewData.selectedPosition) 375 380 tvSettingsDaysInCalendarValue.text = viewData.items 376 381 .getOrNull(viewData.selectedPosition)?.text.orEmpty() 382 + } 383 + 384 + private fun updateWidgetTransparencyViewData( 385 + viewData: WidgetTransparencyViewData, 386 + ) = with(binding.layoutSettingsDisplay) { 387 + spinnerSettingsWidgetTransparency.setData(viewData.items, viewData.selectedPosition) 388 + tvSettingsWidgetTransparencyValue.text = viewData.selectedValue 377 389 } 378 390 379 391 private fun updateFirstDayOfWeekViewData(
+9
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewData/WidgetTransparencyViewData.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.viewData 2 + 3 + import com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 4 + 5 + data class WidgetTransparencyViewData( 6 + val items: List<CustomSpinner.CustomSpinnerItem>, 7 + val selectedPosition: Int, 8 + val selectedValue: String, 9 + )
+27
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsDisplayViewModelDelegate.kt
··· 9 9 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 10 10 import com.example.util.simpletimetracker.domain.interactor.WidgetInteractor 11 11 import com.example.util.simpletimetracker.domain.model.CardOrder 12 + import com.example.util.simpletimetracker.domain.model.WidgetTransparencyPercent 12 13 import com.example.util.simpletimetracker.domain.model.WidgetType 13 14 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 14 15 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 15 16 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 16 17 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsUntrackedRangeViewData 18 + import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData 17 19 import com.example.util.simpletimetracker.feature_settings.viewModel.SettingsViewModel 18 20 import com.example.util.simpletimetracker.navigation.Router 19 21 import com.example.util.simpletimetracker.navigation.params.screen.CardOrderDialogParams ··· 48 50 by lazySuspend { prefsInteractor.getReverseOrderInCalendar() } 49 51 val daysInCalendarViewData: LiveData<DaysInCalendarViewData> 50 52 by lazySuspend { loadDaysInCalendarViewData() } 53 + val widgetTransparencyViewData: LiveData<WidgetTransparencyViewData> 54 + by lazySuspend { loadWidgetTransparencyViewData() } 51 55 val showActivityFiltersCheckbox: LiveData<Boolean> 52 56 by lazySuspend { prefsInteractor.getShowActivityFilters() } 53 57 val showGoalsSeparatelyCheckbox: LiveData<Boolean> ··· 89 93 if (newValue == currentValue) return@launch 90 94 prefsInteractor.setDaysInCalendar(newValue) 91 95 updateDaysInCalendarViewData() 96 + } 97 + } 98 + 99 + fun onWidgetTransparencySelected(position: Int) { 100 + delegateScope.launch { 101 + val currentValue = prefsInteractor.getWidgetBackgroundTransparencyPercent() 102 + .let(::WidgetTransparencyPercent) 103 + val newValue = settingsMapper.toWidgetTransparency(position) 104 + if (newValue == currentValue) return@launch 105 + prefsInteractor.setWidgetBackgroundTransparencyPercent(newValue.value) 106 + updateWidgetTransparencyViewData() 107 + widgetInteractor.updateWidgets() 92 108 } 93 109 } 94 110 ··· 300 316 private suspend fun loadDaysInCalendarViewData(): DaysInCalendarViewData { 301 317 return prefsInteractor.getDaysInCalendar() 302 318 .let(settingsMapper::toDaysInCalendarViewData) 319 + } 320 + 321 + private suspend fun updateWidgetTransparencyViewData() { 322 + val data = loadWidgetTransparencyViewData() 323 + widgetTransparencyViewData.set(data) 324 + } 325 + 326 + private suspend fun loadWidgetTransparencyViewData(): WidgetTransparencyViewData { 327 + return prefsInteractor.getWidgetBackgroundTransparencyPercent() 328 + .let(::WidgetTransparencyPercent) 329 + .let(settingsMapper::toWidgetTransparencyViewData) 303 330 } 304 331 305 332 private suspend fun updateCardOrderViewData() {
+44
features/feature_settings/src/main/res/layout/settings_display_layout.xml
··· 450 450 <androidx.constraintlayout.widget.ConstraintLayout 451 451 android:layout_width="match_parent" 452 452 android:layout_height="wrap_content" 453 + app:layout_constraintBottom_toBottomOf="parent"> 454 + 455 + <androidx.appcompat.widget.AppCompatTextView 456 + android:id="@+id/tvSettingsWidgetTransparency" 457 + style="@style/SettingsText" 458 + android:layout_width="0dp" 459 + android:layout_height="wrap_content" 460 + android:text="@string/settings_widget_transparency" 461 + app:layout_constraintEnd_toStartOf="@id/tvSettingsWidgetTransparencyValue" 462 + app:layout_constraintStart_toStartOf="parent" 463 + app:layout_constraintTop_toTopOf="parent" /> 464 + 465 + <androidx.appcompat.widget.AppCompatTextView 466 + android:id="@+id/tvSettingsWidgetTransparencyValue" 467 + android:layout_width="wrap_content" 468 + android:layout_height="0dp" 469 + android:layout_marginEnd="32dp" 470 + android:gravity="end|center_vertical" 471 + android:paddingStart="8dp" 472 + android:paddingEnd="8dp" 473 + android:textColor="?appTextPrimaryColor" 474 + app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsWidgetTransparency" 475 + app:layout_constraintEnd_toEndOf="@id/spinnerSettingsWidgetTransparency" 476 + app:layout_constraintTop_toTopOf="@id/spinnerSettingsWidgetTransparency" 477 + tools:text="50%" /> 478 + 479 + <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 480 + android:id="@+id/spinnerSettingsWidgetTransparency" 481 + android:layout_width="wrap_content" 482 + android:layout_height="0dp" 483 + android:layout_marginEnd="8dp" 484 + app:layout_constraintBottom_toBottomOf="@id/tvSettingsWidgetTransparency" 485 + app:layout_constraintEnd_toEndOf="parent" 486 + app:layout_constraintTop_toTopOf="@id/tvSettingsWidgetTransparency" /> 487 + 488 + </androidx.constraintlayout.widget.ConstraintLayout> 489 + 490 + <View 491 + style="@style/SettingsDivider" 492 + android:layout_width="match_parent" /> 493 + 494 + <androidx.constraintlayout.widget.ConstraintLayout 495 + android:layout_width="match_parent" 496 + android:layout_height="wrap_content" 453 497 android:paddingTop="12dp"> 454 498 455 499 <androidx.appcompat.widget.AppCompatTextView
+10
features/feature_views/src/main/java/com/example/util/simpletimetracker/feature_views/ColorUtils.kt
··· 2 2 3 3 import android.graphics.Color 4 4 import androidx.annotation.ColorInt 5 + import androidx.annotation.FloatRange 6 + import androidx.core.graphics.ColorUtils 5 7 6 8 object ColorUtils { 7 9 ··· 34 36 this[2] += factor 35 37 } 36 38 }.let(Color::HSVToColor) 39 + } 40 + 41 + @ColorInt 42 + fun changeAlpha( 43 + @ColorInt color: Int, 44 + @FloatRange(from = 0.0, to = 1.0) alpha: Float, 45 + ): Int { 46 + return ColorUtils.setAlphaComponent(color, (255 * alpha).toInt()) 37 47 } 38 48 }
+13 -5
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/quickSettings/WidgetQuickSettingsProvider.kt
··· 48 48 override fun onUpdate( 49 49 context: Context?, 50 50 appWidgetManager: AppWidgetManager?, 51 - appWidgetIds: IntArray? 51 + appWidgetIds: IntArray?, 52 52 ) { 53 53 appWidgetIds?.forEach { widgetId -> 54 54 updateAppWidget(context, appWidgetManager, widgetId) ··· 64 64 private fun updateAppWidget( 65 65 context: Context?, 66 66 appWidgetManager: AppWidgetManager?, 67 - appWidgetId: Int 67 + appWidgetId: Int, 68 68 ) { 69 69 if (context == null || appWidgetManager == null) return 70 70 71 71 GlobalScope.launch(Dispatchers.Main) { 72 + val backgroundTransparency = prefsInteractor.getWidgetBackgroundTransparencyPercent() 72 73 val name: String 73 74 val isChecked: Boolean 74 75 when (prefsInteractor.getQuickSettingsWidget(appWidgetId)) { ··· 82 83 } 83 84 } 84 85 85 - val view = prepareView(context, name, isChecked) 86 + val view = prepareView( 87 + context = context, 88 + name = name, 89 + isChecked = isChecked, 90 + backgroundTransparency = backgroundTransparency, 91 + ) 86 92 measureView(context, view) 87 93 val bitmap = view.getBitmapFromView() 88 94 ··· 98 104 context: Context, 99 105 name: String, 100 106 isChecked: Boolean, 107 + backgroundTransparency: Long, 101 108 ): View { 102 109 val icon = if (isChecked) { 103 110 RecordTypeIcon.Image(R.drawable.checkbox_checked) ··· 118 125 itemIcon = icon 119 126 itemIconColor = iconColor 120 127 itemName = name 128 + itemBackgroundAlpha = 1f - backgroundTransparency / 100f 121 129 }.let(container::addView) 122 130 123 131 return container ··· 138 146 } 139 147 140 148 private fun onClick( 141 - widgetId: Int 149 + widgetId: Int, 142 150 ) { 143 151 GlobalScope.launch(Dispatchers.Main) { 144 152 when (prefsInteractor.getQuickSettingsWidget(widgetId)) { ··· 157 165 158 166 private fun getPendingSelfIntent( 159 167 context: Context, 160 - widgetId: Int 168 + widgetId: Int, 161 169 ): PendingIntent { 162 170 val intent = Intent(context, javaClass) 163 171 intent.action = ON_CLICK_ACTION
+14
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/quickSettings/customView/WidgetQuickSettingsView.kt
··· 6 6 import android.view.LayoutInflater 7 7 import androidx.cardview.widget.CardView 8 8 import androidx.core.content.ContextCompat 9 + import com.example.util.simpletimetracker.feature_views.ColorUtils 9 10 import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon 10 11 import com.example.util.simpletimetracker.feature_widget.R 11 12 import com.example.util.simpletimetracker.feature_widget.databinding.WidgetQuickSettingsViewLayoutBinding ··· 45 46 itemIconColor = getColor(R.styleable.WidgetQuickSettingsView_itemIconColor, Color.WHITE) 46 47 } 47 48 49 + if (hasValue(R.styleable.WidgetQuickSettingsView_itemBackgroundAlpha)) { 50 + itemBackgroundAlpha = getFloat(R.styleable.WidgetQuickSettingsView_itemBackgroundAlpha, 0.5f) 51 + } 52 + 48 53 recycle() 49 54 } 50 55 } ··· 64 69 var itemIconColor: Int = 0 65 70 set(value) { 66 71 binding.ivWidgetQuickSettingsIcon.itemIconColor = value 72 + field = value 73 + } 74 + 75 + var itemBackgroundAlpha: Float = 0.5f 76 + set(value) { 77 + ColorUtils.changeAlpha( 78 + color = ContextCompat.getColor(context, R.color.widget_universal_background_color), 79 + alpha = value, 80 + ).let(::setCardBackgroundColor) 67 81 field = value 68 82 } 69 83 }
+15 -11
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/single/WidgetSingleProvider.kt
··· 5 5 import android.appwidget.AppWidgetProvider 6 6 import android.content.Context 7 7 import android.content.Intent 8 - import android.graphics.Color 9 8 import android.os.SystemClock 10 9 import android.view.ContextThemeWrapper 11 10 import android.view.LayoutInflater ··· 31 30 import com.example.util.simpletimetracker.domain.interactor.RemoveRunningRecordMediator 32 31 import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 33 32 import com.example.util.simpletimetracker.domain.interactor.WidgetInteractor 33 + import com.example.util.simpletimetracker.feature_views.ColorUtils 34 34 import com.example.util.simpletimetracker.feature_views.RecordTypeView 35 35 import com.example.util.simpletimetracker.feature_views.extension.getBitmapFromView 36 36 import com.example.util.simpletimetracker.feature_views.extension.measureExactly ··· 128 128 GlobalScope.launch(Dispatchers.Main) { 129 129 val view: View 130 130 val recordTypeId = prefsInteractor.getWidget(appWidgetId) 131 + val backgroundTransparency = prefsInteractor.getWidgetBackgroundTransparencyPercent() 131 132 val typeIds = typeIdsToUpdate 132 133 if (typeIds.isNotEmpty() && recordTypeId !in typeIds) return@launch 133 134 val runningRecord = runningRecordInteractor.get(recordTypeId) ··· 145 146 recordTypeColor = viewData.color, 146 147 isRunning = false, 147 148 isChecked = false, 149 + backgroundTransparency = backgroundTransparency, 148 150 ) 149 151 } else { 150 152 val recordType = recordTypeInteractor.get(recordTypeId) ··· 175 177 ?.let { colorMapper.mapToColorInt(it, isDarkTheme) }, 176 178 isRunning = runningRecord != null && recordType != null, 177 179 isChecked = isChecked, 180 + backgroundTransparency = backgroundTransparency, 178 181 ) 179 182 } 180 183 ··· 204 207 recordTypeColor: Int?, 205 208 isRunning: Boolean, 206 209 isChecked: Boolean?, 210 + backgroundTransparency: Long, 207 211 ): View { 208 212 val icon = recordTypeIcon 209 213 ?: RecordTypeIcon.Image(R.drawable.unknown) ··· 211 215 val name = recordTypeName 212 216 ?: R.string.widget_load_error.let(resourceRepo::getString) 213 217 214 - val color = if (isRunning && recordTypeColor != null) { 215 - recordTypeColor 218 + val textColor = if (isRunning) { 219 + resourceRepo.getColor(R.color.colorIcon) 216 220 } else { 217 - Color.BLACK 221 + resourceRepo.getColor(R.color.widget_universal_empty_color) 218 222 } 219 223 220 - val viewAlpha = if (isRunning) { 221 - ENABLED_ALPHA 224 + val color = if (isRunning && recordTypeColor != null) { 225 + recordTypeColor 222 226 } else { 223 - DISABLED_ALPHA 227 + ColorUtils.changeAlpha( 228 + color = resourceRepo.getColor(R.color.widget_universal_background_color), 229 + alpha = 1f - backgroundTransparency / 100f, 230 + ) 224 231 } 225 232 226 233 // TODO setting alpha on cardView doesn't work for some reason, wrap in layout before setting ··· 232 239 getCheckmarkOutline().setAllMargins(4) 233 240 itemIcon = icon 234 241 itemName = name 242 + itemIconColor = textColor 235 243 itemColor = color 236 244 itemWithCheck = isChecked != null 237 245 itemIsChecked = isChecked.orFalse() 238 - alpha = viewAlpha 239 246 }.let(container::addView) 240 247 241 248 return container ··· 314 321 private const val ON_CLICK_ACTION = 315 322 "com.example.util.simpletimetracker.feature_widget.widget.onclick" 316 323 private const val ARGS_WIDGET_ID = "widgetId" 317 - 318 - private const val ENABLED_ALPHA = 1f 319 - private const val DISABLED_ALPHA = 0.5f 320 324 } 321 325 }
+6 -2
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/statistics/WidgetStatisticsChartProvider.kt
··· 114 114 context: Context, 115 115 appWidgetId: Int, 116 116 ): View { 117 - // TODO remove blocking 118 117 val isDarkTheme = prefsInteractor.getDarkMode() 119 118 val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() 120 119 val showSeconds = prefsInteractor.getShowSeconds() 121 120 val widgetData = prefsInteractor.getStatisticsWidget(appWidgetId) 121 + val backgroundTransparency = prefsInteractor.getWidgetBackgroundTransparencyPercent() 122 122 val types = recordTypeInteractor.getAll().associateBy(RecordType::id) 123 123 124 124 val filterType = widgetData.chartFilterType ··· 157 157 "\n" + total 158 158 159 159 return WidgetStatisticsChartView(ContextThemeWrapper(context, R.style.AppTheme)).apply { 160 - setSegments(chart, totalTracked) 160 + setSegments( 161 + data = chart, 162 + total = totalTracked, 163 + backgroundAlpha = 1f - backgroundTransparency / 100f, 164 + ) 161 165 } 162 166 } 163 167
+10 -1
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/statistics/customView/WidgetStatisticsChartView.kt
··· 5 5 import android.view.LayoutInflater 6 6 import androidx.cardview.widget.CardView 7 7 import androidx.core.content.ContextCompat 8 + import com.example.util.simpletimetracker.feature_views.ColorUtils 8 9 import com.example.util.simpletimetracker.feature_views.extension.visible 9 10 import com.example.util.simpletimetracker.feature_views.pieChart.PiePortion 10 11 import com.example.util.simpletimetracker.feature_widget.R ··· 31 32 useCompatPadding = false 32 33 } 33 34 34 - fun setSegments(data: List<PiePortion>, total: String) = with(binding) { 35 + fun setSegments( 36 + data: List<PiePortion>, 37 + total: String, 38 + backgroundAlpha: Float, 39 + ) = with(binding) { 40 + ColorUtils.changeAlpha( 41 + color = ContextCompat.getColor(context, R.color.widget_universal_background_color), 42 + alpha = backgroundAlpha, 43 + ).let(::setCardBackgroundColor) 35 44 if (data.isEmpty()) { 36 45 switchDataVisibility(hasData = false) 37 46 } else {
+15 -5
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/WidgetUniversalProvider.kt
··· 47 47 override fun onUpdate( 48 48 context: Context?, 49 49 appWidgetManager: AppWidgetManager?, 50 - appWidgetIds: IntArray? 50 + appWidgetIds: IntArray?, 51 51 ) { 52 52 appWidgetIds?.forEach { widgetId -> 53 53 updateAppWidget(context, appWidgetManager, widgetId) ··· 57 57 private fun updateAppWidget( 58 58 context: Context?, 59 59 appWidgetManager: AppWidgetManager?, 60 - appWidgetId: Int 60 + appWidgetId: Int, 61 61 ) { 62 62 if (context == null || appWidgetManager == null) return 63 63 ··· 65 65 val runningRecords: List<RunningRecord> = runningRecordInteractor.getAll() 66 66 val recordTypes = recordTypeInteractor.getAll().associateBy { it.id } 67 67 val isDarkTheme = prefsInteractor.getDarkMode() 68 + val backgroundTransparency = prefsInteractor.getWidgetBackgroundTransparencyPercent() 68 69 69 70 val data = runningRecords 70 - .let { widgetUniversalViewDataMapper.mapToWidgetViewData(it, recordTypes, isDarkTheme) } 71 + .let { 72 + widgetUniversalViewDataMapper.mapToWidgetViewData( 73 + runningRecords = it, 74 + recordTypes = recordTypes, 75 + isDarkTheme = isDarkTheme, 76 + backgroundTransparency = backgroundTransparency, 77 + ) 78 + } 71 79 .takeUnless { it.data.isEmpty() } 72 - ?: widgetUniversalViewDataMapper.mapToEmptyWidgetViewData() 80 + ?: widgetUniversalViewDataMapper.mapToEmptyWidgetViewData( 81 + backgroundTransparency = backgroundTransparency, 82 + ) 73 83 74 84 val view = prepareView(context, data) 75 85 measureView(context, view) ··· 95 105 data: WidgetUniversalViewData, 96 106 ): View { 97 107 return WidgetUniversalView( 98 - ContextThemeWrapper(context, R.style.AppTheme) 108 + ContextThemeWrapper(context, R.style.AppTheme), 99 109 ).apply { 100 110 setData(data) 101 111 }
+7 -2
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/customView/WidgetUniversalView.kt
··· 5 5 import android.view.LayoutInflater 6 6 import androidx.cardview.widget.CardView 7 7 import androidx.core.content.ContextCompat 8 + import com.example.util.simpletimetracker.feature_views.ColorUtils 8 9 import com.example.util.simpletimetracker.feature_widget.R 9 10 import com.example.util.simpletimetracker.feature_widget.databinding.WidgetUniversalViewLayoutBinding 10 11 11 12 class WidgetUniversalView @JvmOverloads constructor( 12 13 context: Context, 13 14 attrs: AttributeSet? = null, 14 - defStyleAttr: Int = 0 15 + defStyleAttr: Int = 0, 15 16 ) : CardView( 16 17 context, 17 18 attrs, 18 - defStyleAttr 19 + defStyleAttr, 19 20 ) { 20 21 21 22 private val binding: WidgetUniversalViewLayoutBinding = WidgetUniversalViewLayoutBinding ··· 32 33 fun setData(viewData: WidgetUniversalViewData) = with(binding) { 33 34 iconsWidgetUniversal.setIconColor(viewData.iconColor) 34 35 iconsWidgetUniversal.setData(viewData.data) 36 + ColorUtils.changeAlpha( 37 + color = ContextCompat.getColor(context, R.color.widget_universal_background_color), 38 + alpha = viewData.backgroundAlpha, 39 + ).let(::setCardBackgroundColor) 35 40 invalidate() 36 41 } 37 42 }
+2 -1
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/customView/WidgetUniversalViewData.kt
··· 4 4 5 5 data class WidgetUniversalViewData( 6 6 val data: List<IconStackData>, 7 - @ColorInt val iconColor: Int 7 + @ColorInt val iconColor: Int, 8 + val backgroundAlpha: Float, 8 9 )
+6 -1
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt
··· 24 24 runningRecords: List<RunningRecord>, 25 25 recordTypes: Map<Long, RecordType>, 26 26 isDarkTheme: Boolean, 27 + backgroundTransparency: Long, 27 28 ): WidgetUniversalViewData { 28 29 val data = runningRecords.map { runningRecord -> 29 30 val recordType = recordTypes[runningRecord.id] ··· 41 42 return WidgetUniversalViewData( 42 43 data = data, 43 44 iconColor = R.color.white.let(resourceRepo::getColor), 45 + backgroundAlpha = 1f - backgroundTransparency / 100f, 44 46 ) 45 47 } 46 48 47 - fun mapToEmptyWidgetViewData(): WidgetUniversalViewData { 49 + fun mapToEmptyWidgetViewData( 50 + backgroundTransparency: Long, 51 + ): WidgetUniversalViewData { 48 52 val icon = RecordTypeIcon.Image(R.drawable.ic_alarm_on_24px) 49 53 val color = R.color.transparent.let(resourceRepo::getColor) 50 54 val data = IconStackData(icon, color) ··· 52 56 return WidgetUniversalViewData( 53 57 data = listOf(data), 54 58 iconColor = R.color.widget_universal_empty_color.let(resourceRepo::getColor), 59 + backgroundAlpha = 1f - backgroundTransparency / 100f, 55 60 ) 56 61 } 57 62
+1
features/feature_widget/src/main/res/values/attrs.xml
··· 11 11 <attr name="itemIcon" /> 12 12 <attr name="itemIconColor" /> 13 13 <attr name="itemName" /> 14 + <attr name="itemBackgroundAlpha" format="fraction"/> 14 15 </declare-styleable> 15 16 </resources>
+1 -1
features/feature_widget/src/main/res/values/colors.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <resources> 3 - <color name="widget_universal_background_color">#80000000</color> 3 + <color name="widget_universal_background_color">#000000</color> 4 4 <color name="widget_universal_empty_color">#99FFFFFF</color> 5 5 </resources>