Skip to content

Commit 5967ed9

Browse files
committed
Navigation Drawer animation; Wait until drawer animation finished before showing theme selection dialog
1 parent 9ac2f8c commit 5967ed9

File tree

2 files changed

+44
-32
lines changed

2 files changed

+44
-32
lines changed

app/src/main/kotlin/com/w2sv/wifiwidget/ui/home/HomeScreen.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,15 @@ import com.w2sv.wifiwidget.R
1212
import com.w2sv.wifiwidget.ui.home.configurationdialog.StatefulWidgetConfigurationDialogButton
1313
import com.w2sv.wifiwidget.ui.shared.JostText
1414
import com.w2sv.wifiwidget.ui.shared.WifiWidgetTopBar
15-
import kotlinx.coroutines.launch
1615
import java.util.*
1716

1817
@OptIn(ExperimentalMaterial3Api::class)
1918
@Composable
2019
internal fun HomeScreen() {
21-
val coroutineScope = rememberCoroutineScope()
22-
23-
StatefulNavigationDrawer { drawerState ->
20+
StatefulNavigationDrawer { openDrawer ->
2421
Scaffold(topBar = {
2522
WifiWidgetTopBar {
26-
coroutineScope.launch {
27-
drawerState.open()
28-
}
23+
openDrawer()
2924
}
3025
}) { paddingValues ->
3126
Column(

app/src/main/kotlin/com/w2sv/wifiwidget/ui/home/NavigationDrawer.kt

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import android.net.Uri
77
import androidx.activity.compose.BackHandler
88
import androidx.annotation.DrawableRes
99
import androidx.annotation.StringRes
10+
import androidx.compose.animation.core.FloatSpringSpec
11+
import androidx.compose.animation.core.Spring
1012
import androidx.compose.foundation.*
1113
import androidx.compose.foundation.layout.*
1214
import androidx.compose.foundation.shape.CircleShape
@@ -19,7 +21,6 @@ import androidx.compose.runtime.mutableStateOf
1921
import androidx.compose.runtime.remember
2022
import androidx.compose.runtime.rememberCoroutineScope
2123
import androidx.compose.runtime.saveable.rememberSaveable
22-
import androidx.compose.runtime.setValue
2324
import androidx.compose.ui.Alignment
2425
import androidx.compose.ui.Modifier
2526
import androidx.compose.ui.draw.clip
@@ -32,6 +33,7 @@ import androidx.compose.ui.tooling.preview.Preview
3233
import androidx.compose.ui.unit.dp
3334
import androidx.compose.ui.unit.sp
3435
import androidx.core.app.ShareCompat
36+
import com.w2sv.androidutils.extensions.launchDelayed
3537
import com.w2sv.androidutils.extensions.openUrl
3638
import com.w2sv.androidutils.extensions.playStoreUrl
3739
import com.w2sv.androidutils.extensions.showToast
@@ -60,55 +62,70 @@ fun StatefulNavigationDrawer(
6062
modifier: Modifier = Modifier,
6163
initialValue: DrawerValue = DrawerValue.Closed,
6264
viewModel: HomeActivity.ViewModel = androidx.lifecycle.viewmodel.compose.viewModel(),
63-
content: @Composable (DrawerState) -> Unit
65+
content: @Composable (() -> Unit) -> Unit
6466
) {
6567
val drawerState = rememberDrawerState(initialValue = initialValue)
6668
val scope = rememberCoroutineScope()
67-
val context = LocalContext.current
69+
val navigationDrawerAnim = FloatSpringSpec(Spring.DampingRatioMediumBouncy)
70+
71+
val closeDrawer: () -> Unit = {
72+
scope.launch {
73+
drawerState.animateTo(
74+
DrawerValue.Closed,
75+
navigationDrawerAnim
76+
)
77+
}
78+
}
6879

69-
var showThemeDialog by rememberSaveable {
80+
val (showThemeDialog, setShowThemeDialog) = rememberSaveable {
7081
mutableStateOf(false)
7182
}
7283

84+
ModalNavigationDrawer(
85+
modifier = modifier,
86+
drawerContent = {
87+
NavigationDrawerContent(
88+
closeDrawer = closeDrawer,
89+
onItemThemePressed = {
90+
// show dialog after delay for display of navigationDrawer close animation
91+
scope.launchDelayed(250L) {
92+
setShowThemeDialog(true)
93+
}
94+
}
95+
)
96+
},
97+
drawerState = drawerState
98+
) {
99+
content {
100+
scope.launch {
101+
drawerState.animateTo(DrawerValue.Open, navigationDrawerAnim)
102+
}
103+
}
104+
}
105+
73106
val theme by viewModel.inAppThemeState.collectAsState()
74107
val themeRequiringUpdate by viewModel.inAppThemeState.requiringUpdate.collectAsState()
108+
val context = LocalContext.current
75109

76110
if (showThemeDialog) {
77111
ThemeDialog(
78112
onDismissRequest = {
79113
viewModel.inAppThemeState.reset()
80-
showThemeDialog = false
114+
setShowThemeDialog(false)
81115
},
82116
theme = { theme },
83117
onThemeSelected = { viewModel.inAppThemeState.value = it },
84118
applyButtonEnabled = { themeRequiringUpdate },
85119
onApplyButtonPress = {
86120
viewModel.inAppThemeState.apply()
87-
showThemeDialog = false
121+
setShowThemeDialog(false)
88122
context.showToast("Updated Theme")
89123
}
90124
)
91125
}
92126

93-
val closeDrawer: () -> Unit = {
94-
scope.launch {
95-
drawerState.close()
96-
}
97-
}
98-
99-
BackHandler(drawerState.isOpen, closeDrawer)
100-
101-
ModalNavigationDrawer(
102-
modifier = modifier,
103-
drawerContent = {
104-
NavigationDrawerContent(
105-
closeDrawer = closeDrawer,
106-
onItemThemePressed = { showThemeDialog = true }
107-
)
108-
},
109-
drawerState = drawerState
110-
) {
111-
content(drawerState)
127+
BackHandler(enabled = drawerState.isOpen) {
128+
closeDrawer()
112129
}
113130
}
114131

0 commit comments

Comments
 (0)