44package com.tailscale.ipn.ui.view
55
66import androidx.annotation.StringRes
7+ import androidx.compose.foundation.background
78import androidx.compose.foundation.clickable
89import androidx.compose.foundation.focusable
910import androidx.compose.foundation.interaction.MutableInteractionSource
1011import androidx.compose.foundation.layout.Box
1112import androidx.compose.foundation.layout.RowScope
1213import androidx.compose.foundation.layout.padding
1314import androidx.compose.foundation.layout.width
15+ import androidx.compose.foundation.shape.CircleShape
1416import androidx.compose.material.icons.Icons
1517import androidx.compose.material.icons.automirrored.filled.ArrowBack
1618import androidx.compose.material.icons.filled.CheckCircle
@@ -24,10 +26,14 @@ import androidx.compose.material3.TopAppBar
2426import androidx.compose.material3.ripple
2527import androidx.compose.runtime.Composable
2628import androidx.compose.runtime.LaunchedEffect
29+ import androidx.compose.runtime.mutableStateOf
2730import androidx.compose.runtime.remember
2831import androidx.compose.ui.Modifier
32+ import androidx.compose.ui.draw.clip
2933import androidx.compose.ui.focus.FocusRequester
3034import androidx.compose.ui.focus.focusRequester
35+ import androidx.compose.ui.focus.onFocusChanged
36+ import androidx.compose.ui.graphics.Color
3137import androidx.compose.ui.res.stringResource
3238import androidx.compose.ui.unit.dp
3339import com.tailscale.ipn.ui.theme.topAppBar
@@ -77,23 +83,32 @@ fun Header(
7783
7884@Composable
7985fun BackArrow (action : () -> Unit , focusRequester : FocusRequester ) {
80- val modifier =
86+ val isFocused = remember { mutableStateOf(false ) }
87+
88+ val boxModifier =
8189 if (isAndroidTV()) {
8290 Modifier .focusRequester(focusRequester)
83- .focusable() // Ensure the composable can receive focus
91+ .clip(CircleShape ) // Ensure both the focus and click area are circular
92+ .background(
93+ if (isFocused.value) MaterialTheme .colorScheme.surface else Color .Transparent ,
94+ )
95+ .onFocusChanged { focusState -> isFocused.value = focusState.isFocused }
96+ .focusable()
8497 } else {
8598 Modifier
8699 }
87100
88- Box (modifier = modifier.padding(start = 8 .dp, end = 8 .dp)) {
101+ val iconModifier =
102+ Modifier .clickable(
103+ interactionSource = remember { MutableInteractionSource () },
104+ indication = ripple(bounded = false , radius = 24 .dp),
105+ onClick = action)
106+
107+ Box (modifier = boxModifier.padding(start = 8 .dp, end = 8 .dp)) {
89108 Icon (
90109 Icons .AutoMirrored .Filled .ArrowBack ,
91110 contentDescription = " Go back to the previous screen" ,
92- modifier =
93- Modifier .clickable(
94- interactionSource = remember { MutableInteractionSource () },
95- indication = ripple(bounded = true ),
96- onClick = action))
111+ modifier = iconModifier)
97112 }
98113}
99114
0 commit comments