Skip to content

Commit 47c1fd6

Browse files
committed
Add WidgetBottomBarElement explanations
1 parent 177aad2 commit 47c1fd6

File tree

7 files changed

+94
-34
lines changed

7 files changed

+94
-34
lines changed

app/src/main/kotlin/com/w2sv/wifiwidget/ui/screens/widgetconfiguration/components/configuration/CheckRowColumn.kt

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ import com.w2sv.wifiwidget.ui.designsystem.InfoIcon
5050
import com.w2sv.wifiwidget.ui.designsystem.KeyboardArrowRightIcon
5151
import com.w2sv.wifiwidget.ui.designsystem.SubPropertyKeyboardArrowRightIcon
5252
import com.w2sv.wifiwidget.ui.designsystem.nestedContentBackground
53+
import com.w2sv.wifiwidget.ui.theme.onSurfaceVariantLowAlpha
5354
import com.w2sv.wifiwidget.ui.utils.alphaDecreased
5455
import com.w2sv.wifiwidget.ui.utils.contentDescription
56+
import com.w2sv.wifiwidget.ui.utils.offsetClip
5557
import com.w2sv.wifiwidget.ui.utils.shake
5658
import kotlinx.collections.immutable.ImmutableList
5759
import sh.calvin.reorderable.ReorderableItem
@@ -263,35 +265,47 @@ private fun CheckRowBase(
263265
val label = stringResource(id = data.property.labelRes)
264266
val checkBoxCD = stringResource(id = R.string.set_unset, label)
265267

266-
Row(
267-
verticalAlignment = Alignment.CenterVertically,
268-
modifier = modifier
269-
.fillMaxWidth()
270-
.padding(start = CheckRowDefaults.startPadding)
271-
.then(data.modifier)
272-
.thenIfNotNull(data.shakeController) { shake(it) }
273-
) {
274-
leadingIcon?.run {
275-
invoke()
276-
Spacer(Modifier.width(CheckRowDefaults.leadingIconLabelPadding))
268+
Column {
269+
Row(
270+
verticalAlignment = Alignment.CenterVertically,
271+
modifier = modifier
272+
.fillMaxWidth()
273+
.padding(start = CheckRowDefaults.startPadding)
274+
.then(data.modifier)
275+
.thenIfNotNull(data.shakeController) { shake(it) }
276+
) {
277+
leadingIcon?.run {
278+
invoke()
279+
Spacer(Modifier.width(CheckRowDefaults.leadingIconLabelPadding))
280+
}
281+
Text(
282+
text = label,
283+
modifier = Modifier.weight(1.0f),
284+
fontSize = fontSize,
285+
color = labelColor
286+
)
287+
data.showInfoDialog?.let {
288+
InfoIconButton(
289+
onClick = it,
290+
contentDescription = stringResource(id = R.string.info_icon_cd, label)
291+
)
292+
}
293+
Checkbox(
294+
checked = data.isChecked(),
295+
onCheckedChange = { data.onCheckedChange(it) },
296+
modifier = Modifier.contentDescription(checkBoxCD)
297+
)
277298
}
278-
Text(
279-
text = label,
280-
fontSize = fontSize,
281-
color = labelColor,
282-
modifier = Modifier.weight(1.0f)
283-
)
284-
data.showInfoDialog?.let {
285-
InfoIconButton(
286-
onClick = it,
287-
contentDescription = stringResource(id = R.string.info_icon_cd, label)
299+
data.explanation?.let {
300+
Text(
301+
stringResource(it),
302+
color = MaterialTheme.colorScheme.onSurfaceVariantLowAlpha,
303+
fontSize = 13.sp,
304+
modifier = Modifier
305+
.padding(start = 56.dp)
306+
.offsetClip(dy = (-10).dp)
288307
)
289308
}
290-
Checkbox(
291-
checked = data.isChecked(),
292-
onCheckedChange = { data.onCheckedChange(it) },
293-
modifier = Modifier.contentDescription(checkBoxCD)
294-
)
295309
}
296310
}
297311

app/src/main/kotlin/com/w2sv/wifiwidget/ui/screens/widgetconfiguration/components/configuration/CheckRowColumnElement.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.w2sv.wifiwidget.ui.screens.widgetconfiguration.components.configuration
22

3+
import androidx.annotation.StringRes
34
import androidx.compose.material3.MaterialTheme
45
import androidx.compose.runtime.Composable
56
import androidx.compose.runtime.Immutable
@@ -19,6 +20,7 @@ sealed interface CheckRowColumnElement {
1920
@Immutable
2021
data class CheckRow<T : WidgetProperty>(
2122
val property: T,
23+
@param:StringRes val explanation: Int? = null,
2224
val isChecked: () -> Boolean,
2325
val onCheckedChange: (Boolean) -> Unit,
2426
val show: () -> Boolean = { true },
@@ -39,6 +41,7 @@ sealed interface CheckRowColumnElement {
3941
companion object {
4042
fun <T : WidgetProperty> fromIsCheckedMap(
4143
property: T,
44+
@StringRes explanation: Int? = null,
4245
isCheckedMap: MutableMap<T, Boolean>,
4346
allowCheckChange: (Boolean) -> Boolean = { true },
4447
onCheckedChangedDisallowed: () -> Unit = {},
@@ -50,6 +53,7 @@ sealed interface CheckRowColumnElement {
5053
): CheckRow<T> =
5154
CheckRow(
5255
property = property,
56+
explanation = explanation,
5357
isChecked = { isCheckedMap.getValue(property) },
5458
onCheckedChange = {
5559
if (allowCheckChange(it)) {

app/src/main/kotlin/com/w2sv/wifiwidget/ui/screens/widgetconfiguration/components/configuration/WidgetConfigurationCard.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ fun rememberWidgetConfigurationCardProperties(
149149
WidgetBottomBarElement.entries.map {
150150
CheckRowColumnElement.CheckRow.fromIsCheckedMap(
151151
property = it,
152+
explanation = it.explanation,
152153
isCheckedMap = widgetConfiguration.bottomRowMap
153154
)
154155
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.w2sv.wifiwidget.ui.utils
2+
3+
import androidx.compose.ui.Modifier
4+
import androidx.compose.ui.layout.LayoutModifier
5+
import androidx.compose.ui.layout.Measurable
6+
import androidx.compose.ui.layout.MeasureResult
7+
import androidx.compose.ui.layout.MeasureScope
8+
import androidx.compose.ui.unit.Constraints
9+
import androidx.compose.ui.unit.Dp
10+
import kotlin.math.abs
11+
12+
/**
13+
* Shifts your child by [dy] (down if +, up if −) and
14+
* clips away the overflowing |dy| at the opposite edge.
15+
*/
16+
fun Modifier.offsetClip(dy: Dp): Modifier =
17+
then(OffsetClipModifier(dy))
18+
19+
/**
20+
* Offsets the contents vertically by [dy]:
21+
* - positive [dy] → content shifts *down* and bottom is clipped
22+
* - negative [dy] → content shifts *up* and top is clipped
23+
*
24+
* The layout height is reduced by |dy| so nothing overflows.
25+
*/
26+
private data class OffsetClipModifier(val dy: Dp) : LayoutModifier {
27+
override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult {
28+
val placeable = measurable.measure(constraints)
29+
val offsetPx = dy.roundToPx()
30+
// shrink height by the abs offset
31+
val clippedHeight = (placeable.height - abs(offsetPx)).coerceAtLeast(0)
32+
return layout(placeable.width, clippedHeight) {
33+
// positive offsetPx → place down; negative → place up
34+
placeable.place(0, offsetPx)
35+
}
36+
}
37+
}

benchmarking/src/main/kotlin/com/w2sv/wifiwidget/baselineprofile/CriticalUserJourneyBaselineProfile.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ class CriticalUserJourneyBaselineProfile {
3030
private fun UiDevice.criticalUserJourney() {
3131
closeLocationAccessPermissionRationalAndRequestDialogIfOpen()
3232

33-
flingObject(ResourceNames.wifiPropertyColumn, Direction.DOWN)
33+
flingObject(ResourceNames.WIFI_PROPERTY_COLUMN, Direction.DOWN)
3434

3535
goToWidgetConfigurationScreen()
3636
waitForIdle()
3737

38-
flingObject(ResourceNames.widgetConfigurationColumn, Direction.DOWN)
38+
flingObject(ResourceNames.WIDGET_CONFIGURATION_COLUMN, Direction.DOWN)
3939

4040
pressBack()
4141
}
@@ -54,6 +54,6 @@ private fun UiDevice.goToWidgetConfigurationScreen() {
5454
}
5555

5656
private object ResourceNames {
57-
const val wifiPropertyColumn = "wifiPropertyColumn"
58-
const val widgetConfigurationColumn = "widgetConfigurationColumn"
57+
const val WIFI_PROPERTY_COLUMN = "wifiPropertyColumn"
58+
const val WIDGET_CONFIGURATION_COLUMN = "widgetConfigurationColumn"
5959
}

core/domain/src/main/kotlin/com/w2sv/domain/model/WidgetBottomBarElement.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package com.w2sv.domain.model
33
import androidx.annotation.StringRes
44
import com.w2sv.core.domain.R
55

6-
enum class WidgetBottomBarElement(@param:StringRes override val labelRes: Int) : WidgetProperty {
6+
enum class WidgetBottomBarElement(@param:StringRes override val labelRes: Int, @param:StringRes val explanation: Int? = null) :
7+
WidgetProperty {
78
LastRefreshTimeDisplay(R.string.display_last_refresh_time),
8-
RefreshButton(R.string.refresh_button),
9-
GoToWifiSettingsButton(R.string.open_wifi_settings_button),
10-
GoToWidgetSettingsButton(R.string.open_widget_settings_button)
9+
RefreshButton(R.string.refresh_button, R.string.refresh_button_explanation),
10+
GoToWifiSettingsButton(R.string.open_wifi_settings_button, R.string.go_to_wifi_settings_button_explanation),
11+
GoToWidgetSettingsButton(R.string.open_widget_settings_button, R.string.go_to_widget_settings_button_explanation)
1112
}

core/domain/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,7 @@
100100
<string name="continent">Continent</string>
101101
<string name="left">Left</string>
102102
<string name="right">Right</string>
103+
<string name="refresh_button_explanation">Trigger a data refresh</string>
104+
<string name="go_to_wifi_settings_button_explanation">Open your device\'s wifi settings</string>
105+
<string name="go_to_widget_settings_button_explanation">Open this screen</string>
103106
</resources>

0 commit comments

Comments
 (0)