11package com.kelsos.mbrc.app
22
33import androidx.compose.foundation.Image
4+ import androidx.compose.foundation.background
5+ import androidx.compose.foundation.border
46import androidx.compose.foundation.layout.Arrangement
57import androidx.compose.foundation.layout.Column
68import androidx.compose.foundation.layout.Row
79import androidx.compose.foundation.layout.Spacer
810import androidx.compose.foundation.layout.fillMaxSize
911import androidx.compose.foundation.layout.fillMaxWidth
12+ import androidx.compose.foundation.layout.height
1013import androidx.compose.foundation.layout.padding
14+ import androidx.compose.foundation.layout.size
1115import androidx.compose.foundation.layout.width
16+ import androidx.compose.foundation.shape.CircleShape
1217import androidx.compose.material.Divider
18+ import androidx.compose.material.Icon
19+ import androidx.compose.material.IconButton
1320import androidx.compose.material.MaterialTheme
1421import androidx.compose.material.Surface
1522import androidx.compose.material.Text
@@ -19,6 +26,7 @@ import androidx.compose.material.icons.filled.Close
1926import androidx.compose.material.icons.filled.Help
2027import androidx.compose.material.icons.filled.Home
2128import androidx.compose.material.icons.filled.LibraryMusic
29+ import androidx.compose.material.icons.filled.PowerSettingsNew
2230import androidx.compose.material.icons.filled.QueueMusic
2331import androidx.compose.material.icons.filled.Radio
2432import androidx.compose.material.icons.filled.Settings
@@ -28,22 +36,32 @@ import androidx.compose.material.icons.filled.ViewList
2836import androidx.compose.runtime.Composable
2937import androidx.compose.ui.Alignment
3038import androidx.compose.ui.Modifier
39+ import androidx.compose.ui.draw.clip
3140import androidx.compose.ui.graphics.Color
3241import androidx.compose.ui.graphics.ColorFilter
3342import androidx.compose.ui.graphics.vector.ImageVector
43+ import androidx.compose.ui.layout.ContentScale
44+ import androidx.compose.ui.res.painterResource
3445import androidx.compose.ui.res.stringResource
3546import androidx.compose.ui.tooling.preview.Preview
3647import androidx.compose.ui.unit.dp
3748import com.kelsos.mbrc.R
49+ import com.kelsos.mbrc.networking.connections.ConnectionStatus
50+ import com.kelsos.mbrc.theme.Accent
51+ import com.kelsos.mbrc.theme.Connected
52+ import com.kelsos.mbrc.theme.Primary
3853import com.kelsos.mbrc.theme.RemoteTheme
3954
4055@Composable
4156fun AppDrawer (
4257 currentRoute : String ,
4358 navigateTo : (destination: Destination ) -> Unit ,
44- closeDrawer : () -> Unit
59+ connection : ConnectionStatus ,
60+ onConnect : () -> Unit ,
61+ exitApp : () -> Unit
4562) {
4663 Column (modifier = Modifier .fillMaxSize()) {
64+ AppHeader (connection, onConnect)
4765 DrawerButton (
4866 icon = Icons .Filled .Home ,
4967 label = stringResource(id = R .string.nav_home),
@@ -115,7 +133,7 @@ fun AppDrawer(
115133 icon = Icons .Filled .Close ,
116134 label = stringResource(id = R .string.nav_exit),
117135 isSelected = false ,
118- action = { TODO ( " implement exit " ) }
136+ action = { exitApp( ) }
119137 )
120138 }
121139}
@@ -179,10 +197,82 @@ private fun DrawerButton(
179197 }
180198}
181199
200+ @Composable
201+ fun AppHeader (connection : ConnectionStatus , onConnect : () -> Unit ) {
202+ Surface (
203+ color = Color .Transparent ,
204+ modifier = Modifier
205+ .fillMaxWidth()
206+ .height(128 .dp)
207+ .background(Primary )
208+ .padding(16 .dp)
209+ ) {
210+ Row (
211+ horizontalArrangement = Arrangement .SpaceBetween
212+ ) {
213+ Column (
214+ modifier = Modifier
215+ .align(Alignment .CenterVertically )
216+ ) {
217+ Image (
218+ painter = painterResource(id = R .mipmap.ic_launcher),
219+ contentDescription = null ,
220+ contentScale = ContentScale .Inside ,
221+ modifier = Modifier
222+ .size(56 .dp)
223+ .clip(CircleShape )
224+ .background(Color .White )
225+ .border(1 .dp, Color .Black , CircleShape )
226+ )
227+ }
228+ Column (
229+ modifier = Modifier
230+ .align(Alignment .CenterVertically )
231+ ) {
232+ val color = when (connection) {
233+ ConnectionStatus .Active -> Connected
234+ ConnectionStatus .Off -> Color .Black
235+ ConnectionStatus .On -> Accent
236+ }
237+
238+ IconButton (
239+ onClick = { onConnect() },
240+ modifier = Modifier
241+ .clip(CircleShape )
242+ .background(Color .LightGray )
243+ .border(1 .dp, Color .DarkGray , CircleShape )
244+ ) {
245+ Icon (
246+ imageVector = Icons .Filled .PowerSettingsNew ,
247+ tint = color,
248+ contentDescription = stringResource(id = R .string.drawer__connect__content)
249+ )
250+ }
251+ }
252+ }
253+ Row (
254+ horizontalArrangement = Arrangement .End ,
255+ verticalAlignment = Alignment .Bottom
256+ ) {
257+ ConnectionLabel (connection = connection)
258+ }
259+ }
260+ }
261+
262+ @Composable
263+ fun ConnectionLabel (connection : ConnectionStatus ) {
264+ val textId = when (connection) {
265+ ConnectionStatus .Active -> R .string.drawer__connection__active
266+ ConnectionStatus .Off -> R .string.drawer__connection__off
267+ ConnectionStatus .On -> R .string.drawer__connection__on
268+ }
269+ Text (text = stringResource(id = textId), style = MaterialTheme .typography.subtitle2)
270+ }
271+
182272@Preview
183273@Composable
184274fun RemoteDrawerPreview () {
185275 RemoteTheme {
186- AppDrawer (Destination .Home .route, {}, {})
276+ AppDrawer (Destination .Home .route, {}, ConnectionStatus . Active , {}, {})
187277 }
188278}
0 commit comments