Skip to content

Commit d637481

Browse files
committed
refactor: implements navigation header in compose
1 parent e3f6773 commit d637481

4 files changed

Lines changed: 103 additions & 9 deletions

File tree

app/src/main/java/com/kelsos/mbrc/NavigationActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ class NavigationActivity : AppCompatActivity() {
7878
@ColorRes val colorId: Int
7979
when (connectionStatus) {
8080
ConnectionStatus.Off -> {
81-
resId = R.string.drawer_connection_status_off
81+
resId = R.string.drawer__connection__off
8282
colorId = R.color.black
8383
}
8484
ConnectionStatus.On -> {
85-
resId = R.string.drawer_connection_status_on
85+
resId = R.string.drawer__connection__on
8686
colorId = R.color.accent
8787
}
8888
ConnectionStatus.Active -> {
89-
resId = R.string.drawer_connection_status_active
89+
resId = R.string.drawer__connection__active
9090
colorId = R.color.power_on
9191
}
9292
}

app/src/main/java/com/kelsos/mbrc/app/AppDrawer.kt

Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
package com.kelsos.mbrc.app
22

33
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.border
46
import androidx.compose.foundation.layout.Arrangement
57
import androidx.compose.foundation.layout.Column
68
import androidx.compose.foundation.layout.Row
79
import androidx.compose.foundation.layout.Spacer
810
import androidx.compose.foundation.layout.fillMaxSize
911
import androidx.compose.foundation.layout.fillMaxWidth
12+
import androidx.compose.foundation.layout.height
1013
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.foundation.layout.size
1115
import androidx.compose.foundation.layout.width
16+
import androidx.compose.foundation.shape.CircleShape
1217
import androidx.compose.material.Divider
18+
import androidx.compose.material.Icon
19+
import androidx.compose.material.IconButton
1320
import androidx.compose.material.MaterialTheme
1421
import androidx.compose.material.Surface
1522
import androidx.compose.material.Text
@@ -19,6 +26,7 @@ import androidx.compose.material.icons.filled.Close
1926
import androidx.compose.material.icons.filled.Help
2027
import androidx.compose.material.icons.filled.Home
2128
import androidx.compose.material.icons.filled.LibraryMusic
29+
import androidx.compose.material.icons.filled.PowerSettingsNew
2230
import androidx.compose.material.icons.filled.QueueMusic
2331
import androidx.compose.material.icons.filled.Radio
2432
import androidx.compose.material.icons.filled.Settings
@@ -28,22 +36,32 @@ import androidx.compose.material.icons.filled.ViewList
2836
import androidx.compose.runtime.Composable
2937
import androidx.compose.ui.Alignment
3038
import androidx.compose.ui.Modifier
39+
import androidx.compose.ui.draw.clip
3140
import androidx.compose.ui.graphics.Color
3241
import androidx.compose.ui.graphics.ColorFilter
3342
import androidx.compose.ui.graphics.vector.ImageVector
43+
import androidx.compose.ui.layout.ContentScale
44+
import androidx.compose.ui.res.painterResource
3445
import androidx.compose.ui.res.stringResource
3546
import androidx.compose.ui.tooling.preview.Preview
3647
import androidx.compose.ui.unit.dp
3748
import 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
3853
import com.kelsos.mbrc.theme.RemoteTheme
3954

4055
@Composable
4156
fun 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
184274
fun RemoteDrawerPreview() {
185275
RemoteTheme {
186-
AppDrawer(Destination.Home.route, {}, {})
276+
AppDrawer(Destination.Home.route, {}, ConnectionStatus.Active, {}, {})
187277
}
188278
}

app/src/main/java/com/kelsos/mbrc/theme/Color.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@ import androidx.compose.ui.graphics.Color
55
val Primary = Color(0xffff9800)
66
val PrimaryDark = Color(0xffe65100)
77
val Accent = Color(0xffff5722)
8+
val PrimaryLight = Color(0xffffecb3)
9+
val LightGray = Color(0xffbdbdbd)
10+
val Connected = Color(0xff33a328)

app/src/main/res/values/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
<string name="alert_invalid_port_number">The valid port range is from 1 to 65535</string>
2323
<string name="now_playing_search">Search</string>
2424
<string name="preferences_open_source">open_source</string>
25-
<string name="drawer_connection_status_off">Offline</string>
26-
<string name="drawer_connection_status_on">Authenticating</string>
27-
<string name="drawer_connection_status_active">Connected</string>
25+
<string name="drawer__connection__off">Offline</string>
26+
<string name="drawer__connection__on">Authenticating</string>
27+
<string name="drawer__connection__active">Connected</string>
2828
<string name="settings_dialog_hint_name">Computer name</string>
2929
<string name="settings_dialog_hint_host">Hostname / IP</string>
3030
<string name="settings_dialog_hint_port">Port number</string>
@@ -193,4 +193,5 @@
193193
<string name="library_album_tracks__title">%1$s by %2$s</string>
194194
<string name="library__action_only_album_artists">Display only album artists</string>
195195
<string name="library_details__empty_content">Placeholder image for an empty list</string>
196+
<string name="drawer__connect__content">Connect to the plugin</string>
196197
</resources>

0 commit comments

Comments
 (0)