@@ -17,13 +17,15 @@ import androidx.compose.foundation.layout.fillMaxSize
1717import androidx.compose.foundation.layout.fillMaxWidth
1818import androidx.compose.foundation.layout.padding
1919import androidx.compose.foundation.layout.size
20- import androidx.compose.foundation.lazy.grid.GridCells
21- import androidx.compose.foundation.lazy.grid.GridItemSpan
22- import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
20+ import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
21+ import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
22+ import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan
2323import androidx.compose.foundation.shape.RoundedCornerShape
24+ import androidx.compose.material3.AlertDialog
2425import androidx.compose.material3.Icon
2526import androidx.compose.material3.MaterialTheme
2627import androidx.compose.material3.Text
28+ import androidx.compose.material3.TextButton
2729import androidx.compose.runtime.Composable
2830import androidx.compose.runtime.LaunchedEffect
2931import androidx.compose.runtime.getValue
@@ -34,6 +36,7 @@ import androidx.compose.ui.Alignment
3436import androidx.compose.ui.Modifier
3537import androidx.compose.ui.draw.clip
3638import androidx.compose.ui.platform.LocalContext
39+ import androidx.compose.ui.platform.LocalUriHandler
3740import androidx.compose.ui.res.painterResource
3841import androidx.compose.ui.res.stringResource
3942import androidx.compose.ui.text.style.TextAlign
@@ -60,8 +63,8 @@ import com.androidvip.sysctlgui.ui.settings.components.SwitchSettingComponent
6063import com.androidvip.sysctlgui.ui.settings.components.TextSettingComponent
6164import com.androidvip.sysctlgui.ui.settings.model.SettingsViewEffect
6265import com.androidvip.sysctlgui.ui.settings.model.SettingsViewEvent
63- import com.androidvip.sysctlgui.utils.browse
6466import org.koin.androidx.compose.koinViewModel
67+ import com.androidvip.sysctlgui.data.R as DataR
6568
6669internal const val DISABLED_ALPHA = 0.38f
6770
@@ -71,8 +74,10 @@ internal fun SettingsScreen(
7174 viewModel : SettingsViewModel = koinViewModel(),
7275 onNavigate : (UiRoute ) -> Unit
7376) {
74- val state = viewModel.uiState.collectAsStateWithLifecycle()
77+ val state by viewModel.uiState.collectAsStateWithLifecycle()
7578 val context = LocalContext .current
79+ val uriHandler = LocalUriHandler .current
80+ var showRevertChangesDialog by remember { mutableStateOf(false ) }
7681 var hasNotificationPermission by remember {
7782 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
7883 mutableStateOf(
@@ -117,7 +122,7 @@ internal fun SettingsScreen(
117122 }
118123
119124 is SettingsViewEffect .OpenBrowser -> {
120- context.browse (effect.url)
125+ uriHandler.openUri (effect.url)
121126 }
122127
123128 is SettingsViewEffect .Navigate -> {
@@ -127,19 +132,27 @@ internal fun SettingsScreen(
127132 is SettingsViewEffect .ShowToast -> {
128133 Toast .makeText(context, effect.message, Toast .LENGTH_SHORT ).show()
129134 }
135+
136+ SettingsViewEffect .ShowRevertDialog -> {
137+ showRevertChangesDialog = true
138+ }
130139 }
131140 }
132141 }
133142
134143 SettingsScreenContent (
135- settings = state.value. settings,
144+ settings = state.settings,
136145 onSettingHeaderClicked = { appSetting ->
137146 viewModel.onEvent(SettingsViewEvent .SettingHeaderClicked (appSetting))
138147 },
139148 onValueChanged = { appSetting, newValue ->
140149 viewModel.onEvent(SettingsViewEvent .SettingValueChanged (appSetting, newValue))
141150 }
142151 )
152+
153+ if (showRevertChangesDialog) {
154+ RevertChangesDialog (onDismissRequest = { showRevertChangesDialog = false })
155+ }
143156}
144157
145158@Composable
@@ -152,15 +165,15 @@ private fun SettingsScreenContent(
152165 val columns = if (isLandscape()) 2 else 1
153166 val containerColor = MaterialTheme .colorScheme.surfaceContainer
154167
155- LazyVerticalGrid (
156- columns = GridCells .Fixed (columns),
168+ LazyVerticalStaggeredGrid (
169+ columns = StaggeredGridCells .Fixed (columns),
157170 modifier = Modifier .fillMaxSize(),
158171 contentPadding = PaddingValues (16 .dp),
159- verticalArrangement = Arrangement .spacedBy( 16 .dp) ,
172+ verticalItemSpacing = 16 .dp,
160173 horizontalArrangement = Arrangement .spacedBy(16 .dp)
161174 ) {
162175 groupedSettings.forEach { (category, settingsGroup) ->
163- item(span = { GridItemSpan (columns) }) {
176+ item {
164177 Column (
165178 modifier = Modifier
166179 .fillMaxWidth()
@@ -187,7 +200,7 @@ private fun SettingsScreenContent(
187200 }
188201 }
189202
190- item(span = { GridItemSpan (columns) }) {
203+ item {
191204 Box (
192205 modifier = Modifier
193206 .clip(RoundedCornerShape (24 .dp))
@@ -216,7 +229,7 @@ private fun SettingsScreenContent(
216229 }
217230 }
218231
219- item(span = { GridItemSpan (columns) } ) {
232+ item(span = StaggeredGridItemSpan . FullLine ) {
220233 Text (
221234 text = " Developed with ❤️ by Lennoard Silva\n Android enthusiast 🤖" ,
222235 style = MaterialTheme .typography.bodySmall,
@@ -297,6 +310,31 @@ private fun SettingsGroupItem(
297310 }
298311}
299312
313+
314+ @Composable
315+ fun RevertChangesDialog (onDismissRequest : () -> Unit ) {
316+ AlertDialog (
317+ onDismissRequest = onDismissRequest,
318+ confirmButton = {
319+ TextButton (onClick = onDismissRequest) {
320+ Text (text = stringResource(android.R .string.ok))
321+ }
322+ },
323+ icon = {
324+ Icon (
325+ painter = painterResource(R .drawable.ic_restore_settings),
326+ contentDescription = null
327+ )
328+ },
329+ title = {
330+ Text (text = stringResource(DataR .string.prefs_startup_revert_changes))
331+ },
332+ text = {
333+ Text (text = stringResource(DataR .string.prefs_startup_revert_changes_message))
334+ }
335+ )
336+ }
337+
300338@Composable
301339@PreviewLightDark
302340@Preview(device = " spec:parent=pixel_5,orientation=landscape" )
0 commit comments