-
Notifications
You must be signed in to change notification settings - Fork 131
/
BlinkyScreen.kt
92 lines (88 loc) · 3.75 KB
/
BlinkyScreen.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package no.nordicsemi.android.blinky.control.view
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import no.nordicsemi.android.blinky.control.R
import no.nordicsemi.android.blinky.control.viewmodel.BlinkyViewModel
import no.nordicsemi.android.blinky.spec.Blinky
import no.nordicsemi.android.common.logger.view.LoggerAppBarIcon
import no.nordicsemi.android.common.permission.RequireBluetooth
import no.nordicsemi.android.common.theme.view.NordicAppBar
import no.nordicsemi.android.common.ui.scanner.view.DeviceConnectingView
import no.nordicsemi.android.common.ui.scanner.view.DeviceDisconnectedView
import no.nordicsemi.android.common.ui.scanner.view.Reason
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLifecycleComposeApi::class)
@Composable
internal fun BlinkyScreen(
onNavigateUp: () -> Unit,
) {
val viewModel: BlinkyViewModel = hiltViewModel()
val state by viewModel.state.collectAsStateWithLifecycle()
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
NordicAppBar(
text = viewModel.deviceName,
onNavigationButtonClick = onNavigateUp,
actions = {
LoggerAppBarIcon(onClick = { viewModel.openLogger() })
}
)
RequireBluetooth {
when (state) {
Blinky.State.LOADING -> {
DeviceConnectingView(
modifier = Modifier.padding(16.dp),
) { padding ->
Button(
onClick = onNavigateUp,
modifier = Modifier.padding(padding),
) {
Text(text = stringResource(id = R.string.action_cancel))
}
}
}
Blinky.State.READY -> {
val ledState by viewModel.ledState.collectAsStateWithLifecycle()
val buttonState by viewModel.buttonState.collectAsStateWithLifecycle()
BlinkyControlView(
ledState = ledState,
buttonState = buttonState,
onStateChanged = { viewModel.turnLed(it) },
modifier = Modifier
.widthIn(max = 460.dp)
.verticalScroll(rememberScrollState())
.padding(16.dp)
)
}
Blinky.State.NOT_AVAILABLE -> {
DeviceDisconnectedView(
reason = Reason.LINK_LOSS,
modifier = Modifier.padding(16.dp),
) { padding ->
Button(
onClick = { viewModel.connect() },
modifier = Modifier.padding(padding),
) {
Text(text = stringResource(id = R.string.action_retry))
}
}
}
}
}
}
}