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.

move credits to app settings

razeeman (Mar 2, 2024, 10:13 PM +0300) 86a754eb 6559db36

+89 -90
+4
core/src/main/java/com/example/util/simpletimetracker/core/viewData/SettingsBlock.kt
··· 92 92 TranslatorsTop, 93 93 TranslatorsTitle, 94 94 TranslatorsBottom, 95 + 96 + ContributorsTop, 97 + ContributorsTitle, 98 + ContributorsBottom, 95 99 }
+17
core/src/main/res/values/contributors.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <resources> 3 + 4 + <string-array name="contributors"> 5 + <item>Joseph Hale @thehale</item> 6 + <item>\@gyrraf</item> 7 + <item>\@kantahrek</item> 8 + <item>\@Zolax9</item> 9 + <item>\@rec0de</item> 10 + <item>Ben Halbach @bahalbach</item> 11 + <item>John Veness @JohnVeness</item> 12 + <item>\@preethamrn</item> 13 + <item>\@Poussinou</item> 14 + <item>Ilya Bizyaev @IlyaBizyaev</item> 15 + </string-array> 16 + 17 + </resources>
+1
core/src/main/res/values/strings.xml
··· 271 271 <string name="settings_version">Version</string> 272 272 <string name="settings_email_chooser_title">Send with…</string> 273 273 <string name="settings_translators">Translators</string> 274 + <string name="settings_contributors">Contributors</string> 274 275 <string name="settings_automated_tracking">Automated tracking</string> 275 276 <string name="settings_automated_tracking_text"><![CDATA[ 276 277 Automatic tracking is possible through integration with third-party applications that allow to automate actions based on certain events. These applications, when a certain event occurs, can send a message to the app to start or stop the activity timer.<br/>
+3 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsTranslatorAdapterDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_settings.adapter 2 2 3 + import androidx.core.view.isVisible 3 4 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 4 5 import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 5 6 import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData as ViewData ··· 13 14 item as ViewData 14 15 15 16 tvItemSettingsTranslators.text = item.translator 17 + tvItemSettingsTranslatorsLanguage.isVisible = !item.language.isNullOrBlank() 16 18 tvItemSettingsTranslatorsLanguage.text = item.language 17 19 } 18 20 } 19 21 20 22 data class SettingsTranslatorViewData( 21 23 val translator: String, 22 - val language: String, 24 + val language: String? = null, 23 25 ) : ViewHolderType { 24 26 25 27 override fun getUniqueId(): Long = translator.hashCode().toLong()
+45
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsContributorsViewDataInteractor.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.interactor 2 + 3 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 4 + import com.example.util.simpletimetracker.core.viewData.SettingsBlock 5 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 6 + import com.example.util.simpletimetracker.feature_settings.R 7 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBottomViewData 8 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTextViewData 9 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData 10 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData 11 + import javax.inject.Inject 12 + 13 + class SettingsContributorsViewDataInteractor @Inject constructor( 14 + private val resourceRepo: ResourceRepo, 15 + ) { 16 + 17 + fun execute(): List<ViewHolderType> { 18 + val result = mutableListOf<ViewHolderType>() 19 + 20 + result += SettingsTopViewData( 21 + block = SettingsBlock.ContributorsTop, 22 + ) 23 + 24 + result += SettingsTextViewData( 25 + block = SettingsBlock.ContributorsTitle, 26 + title = resourceRepo.getString(R.string.settings_contributors), 27 + subtitle = "", 28 + layoutIsClickable = false, 29 + ) 30 + 31 + result += loadContributorsViewData() 32 + 33 + result += SettingsBottomViewData( 34 + block = SettingsBlock.ContributorsBottom, 35 + ) 36 + 37 + return result 38 + } 39 + 40 + private fun loadContributorsViewData(): List<SettingsTranslatorViewData> { 41 + return resourceRepo 42 + .getStringArray(R.array.contributors) 43 + .map { SettingsTranslatorViewData(it) } 44 + } 45 + }
+3
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 12 12 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 13 13 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsAdditionalViewModelDelegate 14 14 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsBackupViewModelDelegate 15 + import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsContributorsViewModelDelegate 15 16 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsDisplayViewModelDelegate 16 17 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsExportViewModelDelegate 17 18 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsMainViewModelDelegate ··· 38 39 private val backupDelegate: SettingsBackupViewModelDelegate, 39 40 private val exportDelegate: SettingsExportViewModelDelegate, 40 41 private val translatorsDelegate: SettingsTranslatorsViewModelDelegate, 42 + private val contributorsDelegate: SettingsContributorsViewModelDelegate, 41 43 ) : BaseViewModel(), SettingsParent { 42 44 43 45 val content: LiveData<List<ViewHolderType>> by lazySuspend { loadContent() } ··· 275 277 result += backupDelegate.getViewData() 276 278 result += exportDelegate.getViewData() 277 279 result += translatorsDelegate.getViewData() 280 + result += contributorsDelegate.getViewData() 278 281 return result 279 282 } 280 283
+15
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsContributorsViewModelDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.viewModel.delegate 2 + 3 + import com.example.util.simpletimetracker.core.base.ViewModelDelegate 4 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 5 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsContributorsViewDataInteractor 6 + import javax.inject.Inject 7 + 8 + class SettingsContributorsViewModelDelegate @Inject constructor( 9 + private val settingsContributorsViewDataInteractor: SettingsContributorsViewDataInteractor, 10 + ) : ViewModelDelegate() { 11 + 12 + fun getViewData(): List<ViewHolderType> { 13 + return settingsContributorsViewDataInteractor.execute() 14 + } 15 + }
+1
features/feature_settings/src/main/res/layout/item_settings_translator.xml
··· 24 24 app:layout_constraintEnd_toStartOf="@id/tvItemSettingsTranslatorsLanguage" 25 25 app:layout_constraintStart_toStartOf="parent" 26 26 app:layout_constraintTop_toTopOf="parent" 27 + app:layout_goneMarginEnd="4dp" 27 28 tools:text="Translator" /> 28 29 29 30 <androidx.appcompat.widget.AppCompatTextView
-5
wear/src/main/java/com/example/util/simpletimetracker/presentation/components/ActivitiesList.kt
··· 26 26 onEnableActivity: (activity: WearActivity) -> Unit, 27 27 onDisableActivity: (activity: WearActivity) -> Unit, 28 28 onRefresh: () -> Unit, 29 - footer: @Composable () -> Unit = {} 30 29 ) { 31 30 ScaffoldedScrollingColumn { 32 31 if (activities.isEmpty()) { ··· 53 52 } 54 53 55 54 item { RefreshButton(onClick = onRefresh) } 56 - item { footer() } 57 55 } 58 56 } 59 57 ··· 87 85 onEnableActivity = { /* `it` is the enabled activity */ }, 88 86 onDisableActivity = { /* `it` is the disabled activity */ }, 89 87 onRefresh = { /* What to do when requesting a refresh */ }, 90 - footer = { 91 - Text("Sample Footer") 92 - } 93 88 ) 94 89 }
-25
wear/src/main/java/com/example/util/simpletimetracker/presentation/components/CreditsButton.kt
··· 1 - /* 2 - * This Source Code Form is subject to the terms of the Mozilla Public 3 - * License, v. 2.0. If a copy of the MPL was not distributed with this 4 - * file, You can obtain one at https://mozilla.org/MPL/2.0/. 5 - */ 6 - package com.example.util.simpletimetracker.presentation.components 7 - 8 - import androidx.compose.runtime.Composable 9 - import androidx.compose.ui.graphics.Color 10 - import androidx.compose.ui.platform.LocalContext 11 - import androidx.wear.compose.material.ChipDefaults 12 - import androidx.wear.compose.material.CompactChip 13 - import androidx.wear.compose.material.Text 14 - import com.example.util.simpletimetracker.R 15 - 16 - @Composable 17 - fun CreditsButton(onClick: () -> Unit) { 18 - CompactChip( 19 - onClick = onClick, 20 - label = { Text(LocalContext.current.getString(R.string.credits_button)) }, 21 - colors = ChipDefaults.chipColors( 22 - backgroundColor = Color.Transparent 23 - ) 24 - ) 25 - }
-8
wear/src/main/java/com/example/util/simpletimetracker/presentation/navigation/WearNavigator.kt
··· 10 10 import androidx.wear.compose.navigation.composable 11 11 import androidx.wear.compose.navigation.rememberSwipeDismissableNavController 12 12 import com.example.util.simpletimetracker.presentation.screens.ActivitiesScreen 13 - import com.example.util.simpletimetracker.presentation.screens.CreditsScreen 14 13 import com.example.util.simpletimetracker.presentation.screens.TagsScreen 15 14 16 15 object Route { 17 16 const val Activities = "activities" 18 17 const val Tags = "activities/{id}/tags" 19 - const val Credits = "credits" 20 18 } 21 19 22 20 @Composable ··· 32 30 val route = Route.Tags.replace("{id}", it.toString()) 33 31 navigation.navigate(route) 34 32 }, 35 - onRequestCredits = { 36 - navigation.navigate(Route.Credits) 37 - }, 38 33 ) 39 34 } 40 35 composable(Route.Tags) { ··· 49 44 navigation.navigateToRoot(Route.Activities) 50 45 }, 51 46 ) 52 - } 53 - composable(Route.Credits) { 54 - CreditsScreen() 55 47 } 56 48 } 57 49 }
-6
wear/src/main/java/com/example/util/simpletimetracker/presentation/screens/ActivitiesScreen.kt
··· 6 6 package com.example.util.simpletimetracker.presentation.screens 7 7 8 8 import androidx.compose.runtime.Composable 9 - import androidx.compose.runtime.LaunchedEffect 10 9 import androidx.compose.runtime.collectAsState 11 10 import androidx.hilt.navigation.compose.hiltViewModel 12 11 import com.example.util.simpletimetracker.presentation.components.ActivitiesList 13 - import com.example.util.simpletimetracker.presentation.components.CreditsButton 14 12 import com.example.util.simpletimetracker.presentation.screens.ActivitiesViewModel.Effect 15 13 import com.example.util.simpletimetracker.presentation.utils.collectEffects 16 - import kotlinx.coroutines.flow.collect 17 - import kotlinx.coroutines.flow.onEach 18 14 19 15 @Composable 20 16 fun ActivitiesScreen( 21 17 onRequestTagSelection: (activityId: Long) -> Unit, 22 - onRequestCredits: () -> Unit, 23 18 ) { 24 19 val viewModel = hiltViewModel<ActivitiesViewModel>() 25 20 viewModel.init() ··· 38 33 onEnableActivity = viewModel::startActivityWithoutTags, 39 34 onDisableActivity = viewModel::stopActivity, 40 35 onRefresh = viewModel::refresh, 41 - footer = { CreditsButton(onClick = onRequestCredits) }, 42 36 ) 43 37 }
-41
wear/src/main/java/com/example/util/simpletimetracker/presentation/screens/CreditsScreen.kt
··· 1 - /* 2 - * This Source Code Form is subject to the terms of the Mozilla Public 3 - * License, v. 2.0. If a copy of the MPL was not distributed with this 4 - * file, You can obtain one at https://mozilla.org/MPL/2.0/. 5 - */ 6 - package com.example.util.simpletimetracker.presentation.screens 7 - 8 - import androidx.compose.runtime.Composable 9 - import androidx.compose.ui.platform.LocalContext 10 - import androidx.compose.ui.text.font.FontWeight 11 - import androidx.compose.ui.tooling.preview.Preview 12 - import androidx.wear.compose.material.Text 13 - import androidx.wear.tooling.preview.devices.WearDevices 14 - import com.example.util.simpletimetracker.presentation.layout.ScaffoldedScrollingColumn 15 - import com.example.util.simpletimetracker.R 16 - 17 - @Composable 18 - fun CreditsScreen() { 19 - ScaffoldedScrollingColumn{ 20 - item { Text(text = "Simple Time Tracker", fontWeight = FontWeight.Bold) } 21 - item { Text(text = "for WearOS") } 22 - item { Text(text = "") } 23 - item { Text(text = LocalContext.current.getString(R.string.credits_by)) } 24 - item { Text(text = "") } 25 - item { Text(text = "Joseph Hale") } 26 - item { Text(text = "https://jhale.dev") } 27 - item { Text(text = "") } 28 - item { Text(text = "@kantahrek") } 29 - item { Text(text = "") } 30 - item { Text(text = "Anton Razinkov") } 31 - item { Text(text = "@Razeeman") } 32 - 33 - } 34 - } 35 - 36 - 37 - @Preview(device = WearDevices.LARGE_ROUND) 38 - @Composable 39 - fun CreditsScreenPreview() { 40 - CreditsScreen() 41 - }
-2
wear/src/main/res/values-es/strings.xml
··· 4 4 <string name="refresh_button_default_content_description">Actualizar</string> 5 5 <string name="no_tags">Sin etiquetas</string> 6 6 <string name="no_activities">Sin actividades</string> 7 - <string name="credits_button">Reconocimientos</string> 8 - <string name="credits_by">por</string> 9 7 </resources>
-2
wear/src/main/res/values/strings.xml
··· 3 3 <string name="refresh_button_default_content_description">Refresh</string> 4 4 <string name="no_tags">No tags</string> 5 5 <string name="no_activities">No activities</string> 6 - <string name="credits_button">Credits</string> 7 - <string name="credits_by">by</string> 8 6 </resources>