1
1
package org.ooni.probe.ui.dashboard
2
2
3
3
import androidx.compose.foundation.Image
4
+ import androidx.compose.foundation.background
4
5
import androidx.compose.foundation.clickable
5
6
import androidx.compose.foundation.layout.Box
6
7
import androidx.compose.foundation.layout.Column
@@ -18,10 +19,10 @@ import androidx.compose.foundation.lazy.items
18
19
import androidx.compose.foundation.shape.RoundedCornerShape
19
20
import androidx.compose.material3.Button
20
21
import androidx.compose.material3.ButtonDefaults
21
- import androidx.compose.material3.ElevatedButton
22
22
import androidx.compose.material3.Icon
23
23
import androidx.compose.material3.LinearProgressIndicator
24
24
import androidx.compose.material3.MaterialTheme
25
+ import androidx.compose.material3.OutlinedButton
25
26
import androidx.compose.material3.Surface
26
27
import androidx.compose.material3.Text
27
28
import androidx.compose.material3.pulltorefresh.PullToRefreshContainer
@@ -30,7 +31,10 @@ import androidx.compose.runtime.Composable
30
31
import androidx.compose.runtime.LaunchedEffect
31
32
import androidx.compose.ui.Alignment
32
33
import androidx.compose.ui.Modifier
34
+ import androidx.compose.ui.graphics.ColorFilter
35
+ import androidx.compose.ui.graphics.SolidColor
33
36
import androidx.compose.ui.input.nestedscroll.nestedScroll
37
+ import androidx.compose.ui.layout.ContentScale
34
38
import androidx.compose.ui.text.font.FontWeight
35
39
import androidx.compose.ui.text.style.TextAlign
36
40
import androidx.compose.ui.unit.dp
@@ -44,6 +48,7 @@ import ooniprobe.composeapp.generated.resources.Modal_DisableVPN_Title
44
48
import ooniprobe.composeapp.generated.resources.OONIRun_Run
45
49
import ooniprobe.composeapp.generated.resources.Res
46
50
import ooniprobe.composeapp.generated.resources.app_name
51
+ import ooniprobe.composeapp.generated.resources.dashboard_arc
47
52
import ooniprobe.composeapp.generated.resources.ic_timer
48
53
import ooniprobe.composeapp.generated.resources.ic_warning
49
54
import ooniprobe.composeapp.generated.resources.logo_probe
@@ -74,6 +79,24 @@ fun DashboardScreen(
74
79
pullToRefreshState.endRefresh()
75
80
}
76
81
Box (Modifier .nestedScroll(pullToRefreshState.nestedScrollConnection)) {
82
+ // Colorful top background
83
+ Column {
84
+ Box (
85
+ Modifier
86
+ .fillMaxWidth()
87
+ .background(MaterialTheme .colorScheme.primary)
88
+ .height(144 .dp)
89
+ .padding(WindowInsets .statusBars.asPaddingValues()),
90
+ )
91
+ Image (
92
+ painterResource(Res .drawable.dashboard_arc),
93
+ contentDescription = null ,
94
+ contentScale = ContentScale .FillWidth ,
95
+ colorFilter = ColorFilter .tint(MaterialTheme .colorScheme.primary),
96
+ modifier = Modifier .fillMaxWidth(),
97
+ )
98
+ }
99
+
77
100
Column (
78
101
horizontalAlignment = Alignment .CenterHorizontally ,
79
102
modifier = Modifier
@@ -83,8 +106,10 @@ fun DashboardScreen(
83
106
Image (
84
107
painterResource(Res .drawable.logo_probe),
85
108
contentDescription = stringResource(Res .string.app_name),
86
- modifier = Modifier .padding(36 .dp)
87
- .padding(WindowInsets .statusBars.asPaddingValues()),
109
+ modifier = Modifier
110
+ .padding(vertical = 20 .dp)
111
+ .padding(WindowInsets .statusBars.asPaddingValues())
112
+ .height(72 .dp),
88
113
)
89
114
90
115
TestRunStateSection (state.testRunState, onEvent)
@@ -147,9 +172,16 @@ private fun TestRunStateSection(
147
172
) {
148
173
when (state) {
149
174
is TestRunState .Idle -> {
150
- ElevatedButton (
175
+ OutlinedButton (
151
176
onClick = { onEvent(DashboardViewModel .Event .RunTestsClick ) },
152
- colors = ButtonDefaults .buttonColors(),
177
+ colors = ButtonDefaults .outlinedButtonColors(
178
+ contentColor = MaterialTheme .colorScheme.primary,
179
+ containerColor = MaterialTheme .colorScheme.onPrimary,
180
+ ),
181
+ border = ButtonDefaults .outlinedButtonBorder.copy(
182
+ brush = SolidColor (MaterialTheme .colorScheme.primary),
183
+ ),
184
+ elevation = ButtonDefaults .elevatedButtonElevation(defaultElevation = 4 .dp),
153
185
) {
154
186
Text (
155
187
stringResource(Res .string.OONIRun_Run ),
@@ -185,8 +217,10 @@ private fun TestRunStateSection(
185
217
is TestRunState .Running -> {
186
218
Column (
187
219
horizontalAlignment = Alignment .CenterHorizontally ,
188
- modifier = Modifier .clickable { onEvent(DashboardViewModel .Event .RunningTestClick ) }
189
- .padding(horizontal = 16 .dp, vertical = 8 .dp),
220
+ modifier = Modifier
221
+ .clickable { onEvent(DashboardViewModel .Event .RunningTestClick ) }
222
+ .padding(horizontal = 16 .dp)
223
+ .padding(top = 32 .dp, bottom = 8 .dp),
190
224
) {
191
225
state.testType?.let { testType ->
192
226
Row {
@@ -245,7 +279,9 @@ private fun TestRunStateSection(
245
279
TestRunState .Stopping -> {
246
280
Column (
247
281
horizontalAlignment = Alignment .CenterHorizontally ,
248
- modifier = Modifier .padding(horizontal = 16 .dp, vertical = 8 .dp),
282
+ modifier = Modifier
283
+ .padding(horizontal = 16 .dp)
284
+ .padding(top = 32 .dp, bottom = 8 .dp),
249
285
) {
250
286
Text (
251
287
text = stringResource(Res .string.Dashboard_Running_Stopping_Title ),
0 commit comments