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.

feat: Support settings controlling tag picking

The phone app has several settings controlling the behavior of
when to show a tag picker.

This commit implements support for the following settings
- Whether or not to show a tag picker at all
- If a tag picker is allowed, only show it for activities which have
at least one non-general tag.

closes thehale/SimpleTimeTracker-WearOS#15

Joseph Hale (Feb 26, 2024, 10:27 PM -0700) b1ea192b 6a00fcc9

+36 -24
+1 -3
wear/src/main/java/com/example/util/simpletimetracker/presentation/navigation/MainNavigator.kt
··· 21 21 startDestination = "activities" 22 22 ) { 23 23 composable("activities") { 24 - ActivitiesScreen(onSelectActivity = { id -> 25 - navController.navigate("activities/$id/tags") 26 - }) 24 + ActivitiesScreen(navController) 27 25 } 28 26 composable("activities/{id}/tags") { 29 27 TagsScreen(activityId = it.arguments?.getString("id")?.toLong()!!, onSelectTag = {
+35 -21
wear/src/main/java/com/example/util/simpletimetracker/presentation/screens/ActivitiesScreen.kt
··· 5 5 */ 6 6 package com.example.util.simpletimetracker.presentation.screens 7 7 8 + import android.util.Log 8 9 import androidx.compose.runtime.Composable 9 10 import androidx.compose.runtime.rememberCoroutineScope 11 + import androidx.navigation.NavController 10 12 import com.example.util.simpletimetracker.presentation.components.ActivitiesList 11 13 import com.example.util.simpletimetracker.presentation.mediators.CurrentActivitiesMediator 12 14 import com.example.util.simpletimetracker.presentation.remember.rememberActivities 13 15 import com.example.util.simpletimetracker.presentation.remember.rememberCurrentActivities 14 16 import com.example.util.simpletimetracker.presentation.remember.rememberRPCClient 15 17 import com.example.util.simpletimetracker.wearrpc.Activity 18 + import com.example.util.simpletimetracker.wearrpc.StartActivityMediator 16 19 import kotlinx.coroutines.Dispatchers 17 20 import kotlinx.coroutines.launch 18 21 19 22 @Composable 20 - fun ActivitiesScreen(onSelectActivity: (activityId: Long) -> Unit) { 23 + fun ActivitiesScreen(navigation: NavController) { 21 24 val coroutineScope = rememberCoroutineScope() 22 25 val rpc = rememberRPCClient() 23 26 val (activities, refreshActivities) = rememberActivities() 24 27 val (currentActivities, refreshCurrentActivities) = rememberCurrentActivities() 25 - val currentActivitiesMediator = CurrentActivitiesMediator(rpc, currentActivities) 26 28 val refresh = { 27 29 refreshActivities() 28 30 refreshCurrentActivities() 29 31 } 32 + val currentActivitiesMediator = CurrentActivitiesMediator(rpc, currentActivities) 33 + val startActivityWithoutTags: (Activity) -> Unit = { 34 + Log.d("ActivitiesScreen", "Starting ${it.name} (#${it.id}) without tags") 35 + coroutineScope.launch(Dispatchers.Default) { 36 + currentActivitiesMediator.start(it.id) 37 + refresh() 38 + } 39 + } 40 + val startActivityWithTags: (Activity) -> Unit = { 41 + coroutineScope.launch(Dispatchers.Main) { 42 + Log.d("ActivitiesScreen", "Starting ${it.name} (#${it.id}) with tags") 43 + navigation.navigate("activities/${it.id}/tags") 44 + } 45 + } 46 + val stopActivity: (Activity) -> Unit = { 47 + Log.d("ActivitiesScreen", "Stopping ${it.name} (#${it.id})") 48 + coroutineScope.launch(Dispatchers.Default) { 49 + currentActivitiesMediator.stop(it.id) 50 + refresh() 51 + } 52 + } 53 + 54 + val startActivitiesMediator = StartActivityMediator( 55 + rpc, 56 + onRequestStartActivity = startActivityWithoutTags, 57 + onRequestTagSelection = startActivityWithTags, 58 + ) 59 + 30 60 31 61 ActivitiesList( 32 62 activities, 33 63 currentActivities, 34 64 onSelectActivity = { 35 65 coroutineScope.launch(Dispatchers.Default) { 36 - val activityTags = rpc.queryTagsForActivity(it.id) 37 - if (activityTags.isNotEmpty()) { 38 - coroutineScope.launch(Dispatchers.Main) { onSelectActivity(it.id) } 39 - } else { 40 - currentActivitiesMediator.start(it.id) 41 - refresh() 42 - } 43 - } 44 - }, 45 - onEnableActivity = { 46 - coroutineScope.launch(Dispatchers.Default) { 47 - currentActivitiesMediator.start(it.id) 48 - refresh() 49 - } 50 - }, 51 - onDisableActivity = { deselectedActivity: Activity -> 52 - coroutineScope.launch(Dispatchers.Default) { 53 - currentActivitiesMediator.stop(deselectedActivity.id) 54 - refresh() 66 + startActivitiesMediator.requestStart(it) 55 67 } 56 68 }, 69 + onEnableActivity = startActivityWithoutTags, 70 + onDisableActivity = stopActivity, 57 71 onRefresh = refresh, 58 72 ) 59 73 }