Skip to content

Commit 79cc42a

Browse files
committed
refactor: creates nav graph skeleton
1 parent 9d0ed23 commit 79cc42a

4 files changed

Lines changed: 114 additions & 153 deletions

File tree

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,6 @@ val appModule = module {
284284
factory<MoveManagerImpl>() bind MoveManager::class
285285

286286
factory<RemoteBroadcastReceiver>()
287-
factory<SessionNotificationManager>()
288287
factory<RemoteSessionManager>()
289288
factory<RemoteVolumeProvider>()
290289
factory<LogHelper>()

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

Lines changed: 13 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,16 @@ package com.kelsos.mbrc
22

33
import android.content.Context
44
import android.content.Intent
5-
import android.content.res.Configuration
65
import android.os.Bundle
76
import android.os.Debug
87
import android.view.KeyEvent
9-
import android.view.MenuItem
108
import android.view.WindowManager
11-
import android.widget.ImageView
12-
import android.widget.TextView
13-
import androidx.annotation.ColorRes
14-
import androidx.annotation.StringRes
15-
import androidx.appcompat.app.ActionBarDrawerToggle
9+
import androidx.activity.compose.setContent
1610
import androidx.appcompat.app.AppCompatActivity
17-
import androidx.core.content.ContextCompat
18-
import androidx.drawerlayout.widget.DrawerLayout
1911
import androidx.lifecycle.lifecycleScope
20-
import androidx.navigation.NavController
21-
import androidx.navigation.findNavController
22-
import androidx.navigation.fragment.NavHostFragment
23-
import androidx.navigation.ui.NavigationUI.setupWithNavController
2412
import arrow.core.firstOrNone
13+
import com.kelsos.mbrc.app.RemoteApp
2514
import com.kelsos.mbrc.common.ui.BaseFragment
26-
import com.kelsos.mbrc.databinding.ActivityNavigationBinding
27-
import com.kelsos.mbrc.databinding.NavHeaderMainBinding
2815
import com.kelsos.mbrc.networking.connections.ConnectionStatus
2916
import kotlinx.coroutines.flow.collect
3017
import org.koin.androidx.fragment.android.setupKoinFragmentFactory
@@ -33,114 +20,14 @@ import org.koin.core.KoinExperimentalAPI
3320
import timber.log.Timber
3421

3522
class NavigationActivity : AppCompatActivity() {
36-
private lateinit var binding: ActivityNavigationBinding
37-
38-
private lateinit var connectText: TextView
39-
private lateinit var connect: ImageView
40-
private lateinit var drawerToggle: ActionBarDrawerToggle
4123

4224
private val viewmodel: NavigationViewModel by viewModel()
4325

44-
private val onNavigatedListener: NavController.OnDestinationChangedListener =
45-
NavController.OnDestinationChangedListener { _, destination, _ ->
46-
supportActionBar?.title = destination.label
47-
val destinationId = destination.id
48-
49-
Timber.v("dest: $destinationId ${destination.label}")
50-
51-
val displayHome = when (destinationId) {
52-
R.id.settings_fragment,
53-
R.id.help_fragment,
54-
R.id.connection_manager_fragment,
55-
R.id.genre_artists_fragment,
56-
R.id.artist_albums_fragment,
57-
R.id.album_tracks_fragment -> false
58-
else -> true
59-
}
60-
61-
drawerToggle.run {
62-
syncState()
63-
isDrawerIndicatorEnabled = displayHome
64-
}
65-
66-
val lockMode = if (!displayHome) {
67-
DrawerLayout.LOCK_MODE_LOCKED_CLOSED
68-
} else {
69-
DrawerLayout.LOCK_MODE_UNLOCKED
70-
}
71-
binding.drawerLayout.setDrawerLockMode(lockMode)
72-
}
73-
74-
private fun onConnection(connectionStatus: ConnectionStatus) {
75-
Timber.v("Handling new connection status $connectionStatus")
76-
77-
@StringRes val resId: Int
78-
@ColorRes val colorId: Int
79-
when (connectionStatus) {
80-
ConnectionStatus.Off -> {
81-
resId = R.string.drawer__connection__off
82-
colorId = R.color.black
83-
}
84-
ConnectionStatus.On -> {
85-
resId = R.string.drawer__connection__on
86-
colorId = R.color.accent
87-
}
88-
ConnectionStatus.Active -> {
89-
resId = R.string.drawer__connection__active
90-
colorId = R.color.power_on
91-
}
92-
}
93-
94-
connectText.setText(resId)
95-
connect.setColorFilter(ContextCompat.getColor(this, colorId))
96-
}
97-
98-
private fun setupConnectionIndicator() {
99-
val header = binding.navView.getHeaderView(0)
100-
val binding = NavHeaderMainBinding.bind(header)
101-
connectText = binding.navConnectText
102-
connect = binding.connectButton.apply {
103-
setOnClickListener {
104-
viewmodel.connect()
105-
}
106-
setOnLongClickListener {
107-
viewmodel.connect()
108-
true
109-
}
110-
}
111-
}
112-
113-
private fun setupToolbar() {
114-
setSupportActionBar(binding.toolbar)
115-
supportActionBar?.run {
116-
setDisplayHomeAsUpEnabled(true)
117-
setHomeButtonEnabled(true)
118-
}
119-
}
120-
121-
private fun setupNavigationDrawer() {
122-
drawerToggle = ActionBarDrawerToggle(
123-
this,
124-
binding.drawerLayout,
125-
R.string.drawer_open,
126-
R.string.drawer_close
127-
)
128-
binding.drawerLayout.addDrawerListener(drawerToggle)
129-
val navHostFragment = supportFragmentManager.findFragmentById(
130-
R.id.main_navigation_fragment
131-
) as NavHostFragment
132-
val navController = navHostFragment.navController
133-
setupWithNavController(binding.navView, navController)
134-
navController.addOnDestinationChangedListener(onNavigatedListener)
135-
}
136-
13726
override fun onPostCreate(savedInstanceState: Bundle?) {
13827
super.onPostCreate(savedInstanceState)
139-
drawerToggle.syncState()
14028
var auto = true
14129
lifecycleScope.launchWhenStarted {
14230
viewmodel.connection.collect { status ->
143-
onConnection(status)
14431
if (auto && status != ConnectionStatus.Active) {
14532
auto = false
14633
viewmodel.connect()
@@ -151,8 +38,14 @@ class NavigationActivity : AppCompatActivity() {
15138

15239
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
15340
return when (keyCode) {
154-
KeyEvent.KEYCODE_VOLUME_UP -> true
155-
KeyEvent.KEYCODE_VOLUME_DOWN -> true
41+
KeyEvent.KEYCODE_VOLUME_UP -> {
42+
viewmodel.incrementVolume()
43+
true
44+
}
45+
KeyEvent.KEYCODE_VOLUME_DOWN -> {
46+
viewmodel.descrementVolume()
47+
true
48+
}
15649
else -> super.onKeyUp(keyCode, event)
15750
}
15851
}
@@ -161,11 +54,9 @@ class NavigationActivity : AppCompatActivity() {
16154
override fun onCreate(savedInstanceState: Bundle?) {
16255
setupKoinFragmentFactory()
16356
super.onCreate(savedInstanceState)
164-
binding = ActivityNavigationBinding.inflate(layoutInflater)
165-
setContentView(binding.root)
166-
setupToolbar()
167-
setupNavigationDrawer()
168-
setupConnectionIndicator()
57+
setContent {
58+
RemoteApp(viewmodel)
59+
}
16960
viewmodel.startService()
17061
}
17162

@@ -185,16 +76,6 @@ class NavigationActivity : AppCompatActivity() {
18576
}
18677
}
18778

188-
override fun onNavigateUp(): Boolean {
189-
return findNavController(R.id.main_navigation_fragment).navigateUp()
190-
}
191-
192-
override fun onDestroy() {
193-
val navController = findNavController(R.id.main_navigation_fragment)
194-
navController.removeOnDestinationChangedListener(onNavigatedListener)
195-
super.onDestroy()
196-
}
197-
19879
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
19980
return when (keyCode) {
20081
KeyEvent.KEYCODE_VOLUME_UP -> {
@@ -209,26 +90,6 @@ class NavigationActivity : AppCompatActivity() {
20990
}
21091
}
21192

212-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
213-
// The action bar home/up action should open or close the drawer.
214-
// [ActionBarDrawerToggle] will take care of this.
215-
if (!drawerToggle.isDrawerIndicatorEnabled) {
216-
return findNavController(R.id.main_navigation_fragment).navigateUp()
217-
}
218-
219-
if (drawerToggle.onOptionsItemSelected(item)) {
220-
return true
221-
}
222-
223-
return super.onOptionsItemSelected(item)
224-
}
225-
226-
override fun onConfigurationChanged(newConfig: Configuration) {
227-
super.onConfigurationChanged(newConfig)
228-
// Pass any configuration change to the drawer toggle.
229-
drawerToggle.onConfigurationChanged(newConfig)
230-
}
231-
23293
override fun onBackPressed() {
23394
val fragments = supportFragmentManager.fragments
23495

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
package com.kelsos.mbrc.app
22

3+
import androidx.compose.material.ScaffoldState
4+
import androidx.compose.material.rememberScaffoldState
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.runtime.remember
7+
import androidx.compose.runtime.rememberCoroutineScope
8+
import androidx.navigation.NavController
9+
import androidx.navigation.NavHostController
10+
import androidx.navigation.compose.NavHost
11+
import androidx.navigation.compose.composable
12+
import androidx.navigation.compose.rememberNavController
13+
import kotlinx.coroutines.launch
14+
315
sealed class Destination(val route: String) {
416
object Home : Destination("home")
517
object Library : Destination("library")
@@ -13,3 +25,44 @@ sealed class Destination(val route: String) {
1325

1426
fun matches(route: String): Boolean = route == this.route
1527
}
28+
29+
@Composable
30+
fun AppNavGraph(
31+
navController: NavHostController = rememberNavController(),
32+
scaffoldState: ScaffoldState = rememberScaffoldState(),
33+
startDestination: Destination = Destination.Home
34+
) {
35+
val actions = remember(navController) { AppActions(navController) }
36+
val coroutineScope = rememberCoroutineScope()
37+
val openDrawer: () -> Unit = { coroutineScope.launch { scaffoldState.drawerState.open() } }
38+
39+
NavHost(
40+
navController = navController,
41+
startDestination = startDestination.route
42+
) {
43+
composable(Destination.Home.route) {
44+
}
45+
composable(Destination.Library.route) {
46+
}
47+
composable(Destination.NowPlaying.route) {
48+
}
49+
composable(Destination.Playlists.route) {
50+
}
51+
composable(Destination.Radio.route) {
52+
}
53+
composable(Destination.Lyrics.route) {
54+
}
55+
composable(Destination.OutputSelection.route) {
56+
}
57+
composable(Destination.Settings.route) {
58+
}
59+
composable(Destination.Help.route) {
60+
}
61+
}
62+
}
63+
64+
class AppActions(navController: NavController) {
65+
val upPress: () -> Unit = {
66+
navController.navigateUp()
67+
}
68+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.kelsos.mbrc.app
2+
3+
import androidx.compose.material.Scaffold
4+
import androidx.compose.material.rememberScaffoldState
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.runtime.collectAsState
7+
import androidx.compose.runtime.getValue
8+
import androidx.compose.runtime.rememberCoroutineScope
9+
import androidx.lifecycle.viewmodel.compose.viewModel
10+
import androidx.navigation.compose.currentBackStackEntryAsState
11+
import androidx.navigation.compose.rememberNavController
12+
import com.kelsos.mbrc.NavigationViewModel
13+
import com.kelsos.mbrc.networking.connections.ConnectionStatus
14+
import com.kelsos.mbrc.theme.RemoteTheme
15+
16+
@Composable
17+
fun RemoteApp(viewModel: NavigationViewModel = viewModel()) {
18+
RemoteTheme {
19+
val navController = rememberNavController()
20+
val coroutineScope = rememberCoroutineScope()
21+
val scaffoldState = rememberScaffoldState()
22+
23+
val navBackStackEntry by navController.currentBackStackEntryAsState()
24+
val currentRoute = navBackStackEntry?.destination?.route ?: Destination.Home.route
25+
26+
val connection by viewModel.connection.collectAsState(initial = ConnectionStatus.Off)
27+
28+
Scaffold(
29+
scaffoldState = scaffoldState,
30+
drawerContent = {
31+
AppDrawer(
32+
currentRoute = currentRoute,
33+
navigateTo = { destination ->
34+
navController.navigate(destination.route)
35+
},
36+
connection = connection,
37+
onConnect = { viewModel.connect() },
38+
exitApp = {}
39+
)
40+
}
41+
) {
42+
AppNavGraph(
43+
navController = navController,
44+
scaffoldState = scaffoldState
45+
)
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)