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.

ActivityChips now SplitToggleChips so tags can be optionally set at enable time

authored by

kantahrek and committed by
Joseph Hale
(Feb 26, 2024, 10:27 PM -0700) ea8b6e88 8ae3ebac

+60 -13
+40 -3
wear/src/main/java/com/example/util/simpletimetracker/presentation/components/ActivitiesList.kt
··· 6 6 */ 7 7 package com.example.util.simpletimetracker.presentation.components 8 8 9 + import android.widget.Toast 9 10 import androidx.compose.runtime.Composable 11 + import androidx.compose.runtime.rememberCoroutineScope 12 + import androidx.compose.ui.platform.LocalContext 10 13 import androidx.compose.ui.tooling.preview.Preview 11 14 import androidx.wear.tooling.preview.devices.WearDevices 12 15 import com.example.util.simpletimetracker.presentation.layout.ScaffoldedScrollingColumn 16 + import com.example.util.simpletimetracker.presentation.remember.rememberRPCClient 13 17 import com.example.util.simpletimetracker.wearrpc.Activity 14 18 import com.example.util.simpletimetracker.wearrpc.CurrentActivity 19 + import kotlinx.coroutines.Dispatchers 20 + import kotlinx.coroutines.launch 15 21 16 22 @Composable 17 23 fun ActivitiesList( ··· 21 27 onDeselectActivity: (activity: Activity) -> Unit, 22 28 onRefresh: () -> Unit, 23 29 ) { 30 + val coroutineScope = rememberCoroutineScope() 31 + val rpcClient = rememberRPCClient() 32 + val context = LocalContext.current 33 + 24 34 ScaffoldedScrollingColumn { 25 35 for (activity in activities) { 26 36 val currentActivity = currentActivities.filter { it.id == activity.id }.getOrNull(0) ··· 29 39 activity, 30 40 startedAt = currentActivity?.startedAt, 31 41 tags = currentActivity?.tags ?: arrayOf(), 32 - onClick = { if (it) onSelectActivity(activity) else onDeselectActivity(activity) }, 42 + onSelectActivity = { 43 + coroutineScope.launch(Dispatchers.Default) { 44 + val activityTags = rpcClient.queryTagsForActivity(activity.id) 45 + coroutineScope.launch(Dispatchers.Main) { 46 + if (activityTags.isNotEmpty()) { 47 + onSelectActivity(activity) 48 + } else { 49 + Toast.makeText(context, "Activity has no tags", Toast.LENGTH_SHORT).show() 50 + } 51 + } 52 + } 53 + }, 54 + onSelectActivitySkipTagSelection = { 55 + coroutineScope.launch(Dispatchers.Default) { 56 + rpcClient.setCurrentActivities( 57 + currentActivities.plus( 58 + CurrentActivity( 59 + activity.id, 60 + System.currentTimeMillis(), 61 + arrayOf(), 62 + ), 63 + ), 64 + ) 65 + } 66 + }, 67 + onDeselectActivity = { 68 + onDeselectActivity(activity) 69 + }, 33 70 ) 34 71 } 35 72 } ··· 50 87 Activity(4321, "Sleep", "🛏️", "#0000FA"), 51 88 ) 52 89 val currents = arrayOf( 53 - CurrentActivity(id = 4321, startedAt = 1708241427000L, tags = arrayOf()) 90 + CurrentActivity(id = 4321, startedAt = 1708241427000L, tags = arrayOf()), 54 91 ) 55 92 ActivitiesList( 56 93 activities, 57 94 currentActivities = currents, 58 95 onSelectActivity = { /* `it` is the selected activity */ }, 59 96 onDeselectActivity = { /* `it` is the deselected activity */ }, 60 - onRefresh = { /* What to do when requesting a refresh */ } 97 + onRefresh = { /* What to do when requesting a refresh */ }, 61 98 ) 62 99 }
+20 -9
wear/src/main/java/com/example/util/simpletimetracker/presentation/components/ActivityChip.kt
··· 11 11 import androidx.compose.runtime.getValue 12 12 import androidx.compose.runtime.mutableStateOf 13 13 import androidx.compose.runtime.remember 14 + import androidx.compose.runtime.rememberCoroutineScope 14 15 import androidx.compose.runtime.setValue 15 16 import androidx.compose.ui.Modifier 16 17 import androidx.compose.ui.semantics.contentDescription ··· 18 19 import androidx.compose.ui.text.style.TextOverflow 19 20 import androidx.compose.ui.tooling.preview.Preview 20 21 import androidx.compose.ui.unit.dp 22 + import androidx.wear.compose.material.SplitToggleChip 21 23 import androidx.wear.compose.material.Switch 22 24 import androidx.wear.compose.material.Text 23 - import androidx.wear.compose.material.ToggleChip 24 25 import androidx.wear.compose.material.ToggleChipDefaults 26 + import com.example.util.simpletimetracker.presentation.remember.rememberRPCClient 25 27 import com.example.util.simpletimetracker.presentation.theme.hexCodeToColor 26 28 import com.example.util.simpletimetracker.wearrpc.Activity 27 29 import com.example.util.simpletimetracker.wearrpc.Tag ··· 35 37 activity: Activity, 36 38 startedAt: Long? = null, 37 39 tags: Array<Tag> = arrayOf(), 38 - onClick: (Boolean) -> Unit = {}, 40 + onSelectActivity: () -> Unit = {}, 41 + onSelectActivitySkipTagSelection: () -> Unit = {}, 42 + onDeselectActivity: () -> Unit = {}, 39 43 ) { 44 + val coroutineScope = rememberCoroutineScope() 45 + val rpcClient = rememberRPCClient() 46 + 40 47 val briefIcon = if (activity.icon.startsWith("ic_")) { 41 48 "?" 42 49 } else { ··· 57 64 .fillMaxWidth(0.9f) 58 65 .padding(top = 10.dp) 59 66 var switchChecked by remember { mutableStateOf(startedAt != null) } 60 - ToggleChip( 67 + SplitToggleChip( 61 68 modifier = modifier, 62 69 label = { 63 70 Text( ··· 73 80 null 74 81 } 75 82 }, 76 - colors = ToggleChipDefaults.toggleChipColors( 77 - checkedStartBackgroundColor = color, 78 - checkedEndBackgroundColor = color, 79 - uncheckedStartBackgroundColor = color, 80 - uncheckedEndBackgroundColor = color, 83 + colors = ToggleChipDefaults.splitToggleChipColors( 84 + backgroundColor = color, 81 85 ), 82 86 onCheckedChange = { 87 + if (it) { 88 + onSelectActivitySkipTagSelection() 89 + } else { 90 + onDeselectActivity() 91 + } 83 92 switchChecked = it 84 - onClick(switchChecked) 85 93 }, 86 94 checked = switchChecked, 95 + onClick = { 96 + onSelectActivity() 97 + }, 87 98 toggleControl = { 88 99 Switch( 89 100 checked = switchChecked,
-1
wear/src/main/java/com/example/util/simpletimetracker/presentation/screens/ActivitiesScreen.kt
··· 11 11 import com.example.util.simpletimetracker.presentation.remember.rememberCurrentActivities 12 12 import com.example.util.simpletimetracker.wearrpc.Activity 13 13 14 - 15 14 @Composable 16 15 fun ActivitiesScreen(onSelectActivity: (activityId: Long) -> Unit) { 17 16 val (activities, refreshActivities) = rememberActivities()