Skip to content

Commit a4fc2e4

Browse files
authored
Increase contrast for drawer items in Monochrome (#1647)
1 parent 329f2cd commit a4fc2e4

3 files changed

Lines changed: 107 additions & 14 deletions

File tree

app/src/main/java/com/capyreader/app/ui/articles/SavedSearchRow.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.capyreader.app.ui.articles
22

33
import androidx.compose.material3.MaterialTheme
4-
import androidx.compose.material3.NavigationDrawerItem
54
import androidx.compose.runtime.Composable
65
import androidx.compose.ui.tooling.preview.Preview
6+
import com.capyreader.app.ui.articles.feeds.DrawerItem
77
import com.jocmp.capy.SavedSearch
88

99
@Composable
@@ -12,7 +12,7 @@ fun SavedSearchRow(
1212
selected: Boolean,
1313
savedSearch: SavedSearch,
1414
) {
15-
NavigationDrawerItem(
15+
DrawerItem(
1616
label = { ListTitle(savedSearch.name) },
1717
selected = selected,
1818
onClick = {

app/src/main/java/com/capyreader/app/ui/articles/feeds/DrawerItem.kt

Lines changed: 103 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,39 @@ import androidx.compose.foundation.layout.padding
1010
import androidx.compose.foundation.layout.width
1111
import androidx.compose.foundation.shape.CircleShape
1212
import androidx.compose.material3.LocalContentColor
13+
import androidx.compose.material3.MaterialTheme
1314
import androidx.compose.material3.NavigationDrawerItemColors
1415
import androidx.compose.material3.NavigationDrawerItemDefaults
1516
import androidx.compose.material3.Surface
17+
import androidx.compose.material3.Text
1618
import androidx.compose.runtime.Composable
1719
import androidx.compose.runtime.CompositionLocalProvider
1820
import androidx.compose.ui.Alignment
1921
import androidx.compose.ui.Modifier
2022
import androidx.compose.ui.draw.clip
23+
import androidx.compose.ui.graphics.Color
2124
import androidx.compose.ui.graphics.Shape
2225
import androidx.compose.ui.semantics.Role
26+
import androidx.compose.ui.tooling.preview.Preview
2327
import androidx.compose.ui.unit.dp
28+
import com.capyreader.app.preferences.AppTheme
29+
import com.capyreader.app.ui.theme.CapyTheme
30+
import com.capyreader.app.ui.theme.LocalAppTheme
2431

2532
@Composable
2633
fun DrawerItem(
2734
label: @Composable () -> Unit,
2835
selected: Boolean,
2936
onClick: () -> Unit,
30-
onLongClick: () -> Unit,
3137
modifier: Modifier = Modifier,
38+
onLongClick: () -> Unit = {},
3239
icon: (@Composable () -> Unit)? = null,
3340
badge: (@Composable () -> Unit)? = null,
3441
shape: Shape = CircleShape,
35-
colors: NavigationDrawerItemColors = NavigationDrawerItemDefaults.colors(),
3642
) {
43+
val colors = NavigationDrawerItemDefaults.colors()
44+
val mappedColors = colors.mapToTheme(selected = selected)
45+
3746
Surface(
3847
modifier = modifier
3948
.heightIn(min = 56.dp)
@@ -45,26 +54,111 @@ fun DrawerItem(
4554
role = Role.Tab,
4655
),
4756
shape = shape,
48-
color = colors.containerColor(selected).value,
57+
color = mappedColors.containerColor,
4958
) {
5059
Row(
5160
Modifier.padding(start = 16.dp, end = 24.dp),
5261
verticalAlignment = Alignment.CenterVertically
5362
) {
5463
if (icon != null) {
55-
val iconColor = colors.iconColor(selected).value
56-
CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
64+
CompositionLocalProvider(
65+
LocalContentColor provides mappedColors.iconColor,
66+
content = icon
67+
)
5768
Spacer(Modifier.width(12.dp))
5869
}
5970
Box(Modifier.weight(1f)) {
60-
val labelColor = colors.textColor(selected).value
61-
CompositionLocalProvider(LocalContentColor provides labelColor, content = label)
71+
CompositionLocalProvider(
72+
LocalContentColor provides mappedColors.textColor,
73+
content = label
74+
)
6275
}
6376
if (badge != null) {
6477
Spacer(Modifier.width(12.dp))
65-
val badgeColor = colors.badgeColor(selected).value
66-
CompositionLocalProvider(LocalContentColor provides badgeColor, content = badge)
78+
CompositionLocalProvider(
79+
LocalContentColor provides mappedColors.badgeColor,
80+
content = badge
81+
)
6782
}
6883
}
6984
}
7085
}
86+
87+
private data class DrawerColors(
88+
val containerColor: Color,
89+
val iconColor: Color,
90+
val textColor: Color,
91+
val badgeColor: Color,
92+
)
93+
94+
@Composable
95+
private fun NavigationDrawerItemColors.mapToTheme(
96+
selected: Boolean,
97+
): DrawerColors {
98+
val isMonochrome = LocalAppTheme.current == AppTheme.MONOCHROME
99+
val useMonochromeSelected = selected && isMonochrome
100+
val unselectedTextColor = textColor(false).value
101+
val surfaceColor = MaterialTheme.colorScheme.surface
102+
103+
return DrawerColors(
104+
containerColor = if (useMonochromeSelected) {
105+
unselectedTextColor
106+
} else {
107+
containerColor(selected).value
108+
},
109+
iconColor = if (useMonochromeSelected) {
110+
surfaceColor
111+
} else {
112+
iconColor(selected).value
113+
},
114+
textColor = if (useMonochromeSelected) {
115+
surfaceColor
116+
} else {
117+
textColor(selected).value
118+
},
119+
badgeColor = if (useMonochromeSelected) {
120+
surfaceColor
121+
} else {
122+
badgeColor(selected).value
123+
},
124+
)
125+
}
126+
127+
@Preview
128+
@Composable
129+
fun DrawerItemSelectedPreview() {
130+
CapyTheme {
131+
DrawerItem(
132+
label = { Text("Title Goes Here") },
133+
selected = true,
134+
onClick = {},
135+
onLongClick = {},
136+
)
137+
}
138+
}
139+
140+
@Preview
141+
@Composable
142+
fun DrawerItemSelectedMonochromePreview() {
143+
CapyTheme(AppTheme.MONOCHROME) {
144+
DrawerItem(
145+
label = { Text("Title Goes Here") },
146+
selected = true,
147+
onClick = {},
148+
onLongClick = {},
149+
)
150+
}
151+
}
152+
153+
@Preview
154+
@Composable
155+
fun DrawerItemPreview() {
156+
CapyTheme {
157+
DrawerItem(
158+
label = { Text("Title Goes Here") },
159+
selected = false,
160+
onClick = {},
161+
onLongClick = {},
162+
)
163+
}
164+
}

app/src/main/java/com/capyreader/app/ui/articles/feeds/FeedList.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import androidx.compose.material3.HorizontalDivider
1919
import androidx.compose.material3.Icon
2020
import androidx.compose.material3.IconButton
2121
import androidx.compose.material3.MaterialTheme
22-
import androidx.compose.material3.NavigationDrawerItem
2322
import androidx.compose.material3.Text
2423
import androidx.compose.runtime.Composable
2524
import androidx.compose.ui.Alignment
@@ -127,7 +126,7 @@ fun FeedList(
127126
)
128127
}
129128
}
130-
NavigationDrawerItem(
129+
DrawerItem(
131130
icon = { ArticleStatusIcon(status = articleStatus) },
132131
label = {
133132
ListTitle(
@@ -142,7 +141,7 @@ fun FeedList(
142141
)
143142

144143
if (showTodayFilter) {
145-
NavigationDrawerItem(
144+
DrawerItem(
146145
icon = {
147146
Icon(
148147
Icons.Rounded.Today,

0 commit comments

Comments
 (0)