@@ -17,11 +17,11 @@ import android.widget.Toast
1717import androidx.activity.compose.rememberLauncherForActivityResult
1818import androidx.activity.result.contract.ActivityResultContracts
1919import androidx.compose.animation.core.*
20- import androidx.compose.foundation.ExperimentalFoundationApi
2120import androidx.compose.foundation.layout.*
2221import androidx.compose.foundation.lazy.LazyColumn
2322import androidx.compose.foundation.lazy.itemsIndexed
2423import androidx.compose.material.icons.Icons
24+ import androidx.compose.material.icons.filled.FilterList
2525import androidx.compose.material.icons.filled.Sync
2626import androidx.compose.material3.*
2727import androidx.compose.runtime.*
@@ -49,9 +49,12 @@ import com.st.ui.theme.LocalDimensions
4949import com.st.ui.theme.Grey6
5050import androidx.compose.material3.FloatingActionButton
5151import androidx.compose.material3.Scaffold
52+ import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
5253import androidx.compose.ui.unit.IntOffset
5354import androidx.navigation.NavOptions
5455import androidx.navigation.navOptions
56+ import com.st.ui.composables.BlueMSPullToRefreshBox
57+ import com.st.ui.theme.PrimaryBlue
5558import com.st.ui.theme.SecondaryBlue
5659
5760@Composable
@@ -122,13 +125,18 @@ fun DeviceListScreen(
122125
123126 val navOptions: NavOptions = navOptions {
124127 anim {
125- enter = com.st.ui.R .anim.slide_in_from_left
128+ // enter = com.st.ui.R.anim.slide_in_from_left
129+ enter = com.st.ui.R .anim.fade_in
126130 exit = com.st.ui.R .anim.fade_out
127131 popEnter = com.st.ui.R .anim.fade_in
128- popExit = com.st.ui.R .anim.slide_out_to_left
132+ // popExit = com.st.ui.R.anim.slide_out_to_left
133+ popExit = com.st.ui.R .anim.fade_out
129134 }
130135 }
131- navController.navigate(directions = HomeFragmentDirections .actionHomeFragmentToCatalog(), navOptions = navOptions)
136+ navController.navigate(
137+ directions = HomeFragmentDirections .actionHomeFragmentToCatalog(),
138+ navOptions = navOptions
139+ )
132140
133141// navController.navigate(
134142// HomeFragmentDirections.actionHomeFragmentToCatalog()
@@ -502,24 +510,21 @@ fun DeviceList(
502510
503511 Scaffold (
504512 modifier = modifier,
505- // floatingActionButtonPosition = FabPosition.End,
506- // floatingActionButton = {
507- // DeviceScanFAB(
508- // isLoading = isLoading,
509- // onStartScan = onStartScan
510- // )
511- // },
512- bottomBar = {
513- MainBottomBar (
513+ contentWindowInsets = WindowInsets .statusBars,
514+ floatingActionButtonPosition = FabPosition .End ,
514515 floatingActionButton = {
515- DeviceScanFAB (
516- isLoading = isLoading,
517- onStartScan = onStartScan
518- )
519- },
520- openCatalog = goToCatalog,
521- openFilter = { openFilterDialog = true }
522- )
516+ FloatingActionButton (
517+ modifier = Modifier .padding(
518+ bottom = WindowInsets .navigationBars.asPaddingValues().calculateBottomPadding()
519+ ),
520+ containerColor = SecondaryBlue ,
521+ onClick = { openFilterDialog = true }) {
522+ Icon (
523+ tint = PrimaryBlue ,
524+ imageVector = Icons .Default .FilterList ,
525+ contentDescription = null
526+ )
527+ }
523528 },
524529 topBar = {
525530 MainTopBar (
@@ -538,7 +543,8 @@ fun DeviceList(
538543 readBetaCatalog = readBetaCatalog,
539544 readReleaseCatalog = readReleaseCatalog,
540545 switchVersionBetaRelease = switchVersionBetaRelease,
541- switchServerForced = switchServerForced
546+ switchServerForced = switchServerForced,
547+ goToCatalog = goToCatalog
542548 ) {
543549 pickFileLauncher.launch(
544550 arrayOf(
@@ -551,11 +557,15 @@ fun DeviceList(
551557 DeviceList (
552558 modifier = Modifier
553559 .fillMaxSize()
554- .padding(paddingValues = paddingValues),
560+ .consumeWindowInsets(paddingValues).padding(paddingValues),
561+ // .padding(paddingValues = paddingValues),
555562 filteredDevices = filteredDevices,
556563 pinnedDevices = pinnedDevices,
557564 onPinChange = onPinChange,
558565 goToCatalog = goToCatalog,
566+ isLoading = isLoading,
567+ isBetaRelease = isBetaRelease,
568+ onStartScan = onStartScan,
559569 onNodeSelected = onNodeSelected
560570 )
561571 }
@@ -570,20 +580,32 @@ fun DeviceList(
570580 }
571581}
572582
573- @OptIn(ExperimentalFoundationApi ::class )
583+ @OptIn(ExperimentalMaterial3Api ::class )
574584@Composable
575585fun DeviceList (
576586 modifier : Modifier = Modifier ,
577587 filteredDevices : List <Node >,
578588 pinnedDevices : List <String >,
579589 onPinChange : (String , Boolean ) -> Unit ,
580590 goToCatalog : () -> Unit = { /* * NOOP**/ },
591+ isLoading : Boolean = false,
592+ isBetaRelease : Boolean = false,
593+ onStartScan : () -> Unit = { /* * NOOP**/ },
581594 onNodeSelected : (Node ) -> Unit = { /* * NOOP**/ }
582595) {
596+
597+
598+ val pullRefreshState = rememberPullToRefreshState()
599+
583600 Column (
584601 modifier = modifier
585602 ) {
586- Box (modifier = Modifier ) {
603+ BlueMSPullToRefreshBox (
604+ state = pullRefreshState,
605+ isRefreshing = isLoading,
606+ onRefresh = onStartScan,
607+ isBetaRelease = isBetaRelease
608+ ) {
587609 LazyColumn (
588610 modifier = Modifier .fillMaxSize(),
589611 contentPadding = PaddingValues (all = LocalDimensions .current.paddingNormal),
@@ -633,10 +655,18 @@ fun DeviceList(
633655 )
634656 }
635657 }
658+
659+ item {
660+ Spacer (
661+ Modifier .windowInsetsBottomHeight(
662+ WindowInsets .systemBars
663+ )
664+ )
665+ }
666+ }
636667 }
637668 }
638669 }
639- }
640670
641671private const val DEGREES = 360f
642672private const val DURATION_MILLIS = 1500
@@ -646,7 +676,7 @@ fun DeviceScanFAB(
646676 isLoading : Boolean ,
647677 onStartScan : () -> Unit
648678) {
649- var currentRotation by remember { mutableStateOf (value = 0f ) }
679+ var currentRotation by remember { mutableFloatStateOf (value = 0f ) }
650680 val rotation = remember { Animatable (currentRotation) }
651681
652682 LaunchedEffect (key1 = isLoading) {
0 commit comments