Coverage Summary for Class: DrawerViewKt (com.vsevolodganin.clicktrack.ui)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
DrawerViewKt |
0%
(0/1)
|
0%
(0/6)
|
0%
(0/58)
|
0%
(0/80)
|
0%
(0/929)
|
package com.vsevolodganin.clicktrack.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsTopHeight
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ContactSupport
import androidx.compose.material.icons.filled.FitnessCenter
import androidx.compose.material.icons.filled.LibraryMusic
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.unit.dp
import com.vsevolodganin.clicktrack.drawer.DrawerState
import com.vsevolodganin.clicktrack.drawer.DrawerViewModel
import com.vsevolodganin.clicktrack.generated.resources.MR
import com.vsevolodganin.clicktrack.ui.theme.ClickTrackTheme
import com.vsevolodganin.clicktrack.utils.compose.Preview
import com.vsevolodganin.clicktrack.utils.compose.navigationBarsPadding
import com.vsevolodganin.clicktrack.utils.compose.statusBars
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@Composable
fun DrawerView(viewModel: DrawerViewModel) {
val state by viewModel.state.collectAsState()
Column(modifier = Modifier.navigationBarsPadding()) {
Box(
modifier = Modifier
.fillMaxWidth()
.windowInsetsTopHeight(WindowInsets.statusBars)
.background(
if (isSystemInDarkTheme()) {
Color.Transparent
} else {
Color.Black.copy(alpha = 0.4f)
},
),
)
Spacer(modifier = Modifier.height(12.dp))
DrawerButton(
icon = painterResource(MR.images.metronome),
label = stringResource(MR.strings.drawer_metronome),
isSelected = state.selectedItem == DrawerState.SelectedItem.METRONOME,
action = viewModel::navigateToMetronome,
)
DrawerButton(
icon = rememberVectorPainter(Icons.Filled.FitnessCenter),
label = stringResource(MR.strings.drawer_training),
isSelected = state.selectedItem == DrawerState.SelectedItem.TRAINING,
action = viewModel::navigateToTraining,
)
DrawerButton(
icon = painterResource(MR.images.polyrhythm),
label = stringResource(MR.strings.drawer_polyrhythms),
isSelected = state.selectedItem == DrawerState.SelectedItem.POLYRHYTHMS,
action = viewModel::navigateToPolyrhythms,
)
DrawerButton(
icon = rememberVectorPainter(Icons.Filled.LibraryMusic),
label = stringResource(MR.strings.drawer_sound_library),
isSelected = state.selectedItem == DrawerState.SelectedItem.SOUND_LIBRARY,
action = viewModel::navigateToSoundLibrary,
)
Spacer(modifier = Modifier.weight(1f))
DrawerButton(
icon = rememberVectorPainter(Icons.Filled.Settings),
label = stringResource(MR.strings.drawer_settings),
isSelected = state.selectedItem == DrawerState.SelectedItem.SETTINGS,
action = viewModel::navigateToSettings,
)
DrawerButton(
icon = rememberVectorPainter(Icons.AutoMirrored.Filled.ContactSupport),
label = stringResource(MR.strings.drawer_about),
isSelected = state.selectedItem == DrawerState.SelectedItem.ABOUT,
action = viewModel::navigateToAbout,
)
Spacer(modifier = Modifier.height(4.dp))
}
}
@Composable
private fun DrawerButton(icon: Painter, label: String, isSelected: Boolean, action: () -> Unit, modifier: Modifier = Modifier) {
val colors = MaterialTheme.colors
val textAndIconColor = if (isSelected) colors.secondary else colors.onSurface.copy(alpha = 0.9f)
val backgroundColor = if (isSelected) colors.secondary.copy(alpha = 0.12f) else Color.Transparent
Surface(
modifier = modifier
.padding(start = 8.dp, top = 4.dp, end = 8.dp)
.fillMaxWidth()
.height(48.dp),
color = backgroundColor,
shape = MaterialTheme.shapes.small,
) {
TextButton(
onClick = action,
modifier = Modifier.fillMaxWidth(),
) {
Row(
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth(),
) {
Icon(
painter = icon,
contentDescription = null,
tint = textAndIconColor,
modifier = Modifier.size(24.dp),
)
Spacer(Modifier.width(16.dp))
Text(
text = label,
style = MaterialTheme.typography.body2,
color = textAndIconColor,
)
}
}
}
}
@Preview
@Composable
private fun Preview() = ClickTrackTheme {
DrawerView(
viewModel = object : DrawerViewModel {
override val state: StateFlow<DrawerState> = MutableStateFlow(
DrawerState(
isOpened = true,
selectedItem = DrawerState.SelectedItem.METRONOME,
),
)
override fun openDrawer() = Unit
override fun closeDrawer() = Unit
override fun navigateToMetronome() = Unit
override fun navigateToTraining() = Unit
override fun navigateToPolyrhythms() = Unit
override fun navigateToSoundLibrary() = Unit
override fun navigateToSettings() = Unit
override fun navigateToAbout() = Unit
},
)
}