Skip to content

Commit

Permalink
Add sleep screen as per Scottish-Tech-Army#137
Browse files Browse the repository at this point in the history
Add full screen sleep. Hitting wake up now or swiping back comes out
of sleep.
  • Loading branch information
davecraig committed Feb 5, 2025
1 parent dd74314 commit 66bc388
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,7 @@ class MainActivity : AppCompatActivity() {
}
}

fun toggleServiceState(newServiceState: Boolean) {

fun setServiceState(newServiceState: Boolean) {
if(!newServiceState) {
soundscapeServiceConnection.stopService()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,8 @@ sealed class HomeRoutes(
route = "help_screen",
title = "HelpScreen",
)
data object Sleep : HomeRoutes(
route = "sleep_screen",
title = "SleepScreen",
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import org.scottishtecharmy.soundscape.screens.home.data.LocationDescription
import org.scottishtecharmy.soundscape.screens.home.home.HelpScreen
import org.scottishtecharmy.soundscape.screens.home.home.Home
import org.scottishtecharmy.soundscape.screens.home.home.SleepScreen
import org.scottishtecharmy.soundscape.screens.home.locationDetails.LocationDetailsScreen
import org.scottishtecharmy.soundscape.screens.home.locationDetails.generateLocationDetailsRoute
import org.scottishtecharmy.soundscape.screens.home.settings.Settings
Expand Down Expand Up @@ -194,5 +195,12 @@ fun HomeScreen(
modifier = Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
)
}
composable(HomeRoutes.Sleep.route) {
SleepScreen(
navController = navController,
modifier = Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
)
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@ package org.scottishtecharmy.soundscape.screens.home.home
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.LocationOff
import androidx.compose.material.icons.rounded.LocationOn
import androidx.compose.material.icons.rounded.Menu
import androidx.compose.material.icons.rounded.Snooze
import androidx.compose.material3.DrawerState
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.IconToggleButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalNavigationDrawer
import androidx.compose.material3.Scaffold
Expand All @@ -20,11 +18,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
Expand All @@ -41,11 +35,13 @@ import org.scottishtecharmy.soundscape.R
import org.scottishtecharmy.soundscape.components.MainSearchBar
import org.scottishtecharmy.soundscape.geoengine.StreetPreviewState
import org.scottishtecharmy.soundscape.screens.home.DrawerContent
import org.scottishtecharmy.soundscape.screens.home.HomeRoutes
import org.scottishtecharmy.soundscape.screens.home.data.LocationDescription
import org.scottishtecharmy.soundscape.screens.home.locationDetails.generateLocationDetailsRoute
import org.scottishtecharmy.soundscape.ui.theme.OnPrimary

@Preview(device = "spec:parent=pixel_5,orientation=landscape")
@Preview
@Preview(device = "spec:parent=pixel_5,orientation=landscape", showBackground = true)
@Preview(showBackground = true)
@Composable
fun HomePreview() {
Home(
Expand Down Expand Up @@ -118,7 +114,8 @@ fun Home(
topBar = {
HomeTopAppBar(
drawerState,
coroutineScope
coroutineScope,
onNavigate
)
},
bottomBar = {
Expand Down Expand Up @@ -177,7 +174,8 @@ fun Home(
@Composable
fun HomeTopAppBar(
drawerState: DrawerState,
coroutineScope: CoroutineScope
coroutineScope: CoroutineScope,
onNavigate: (String) -> Unit
) {
val context = LocalContext.current
TopAppBar(
Expand Down Expand Up @@ -206,20 +204,16 @@ fun HomeTopAppBar(
}
},
actions = {
var serviceRunning by remember { mutableStateOf(true) }
IconToggleButton(
checked = serviceRunning,
IconButton(
enabled = true,
onCheckedChange = { state ->
serviceRunning = state
(context as MainActivity).toggleServiceState(state)
onClick = {
(context as MainActivity).setServiceState(false)
onNavigate(HomeRoutes.Sleep.route)
},
) {
if (serviceRunning) {
Icon(Icons.Rounded.LocationOn, contentDescription = "Service running")
} else {
Icon(Icons.Rounded.LocationOff, contentDescription = "Service stopped")
}
Icon(Icons.Rounded.Snooze,
tint = OnPrimary,
contentDescription = stringResource(R.string.sleep_sleep))
}
},
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package org.scottishtecharmy.soundscape.screens.home.home

import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import org.scottishtecharmy.soundscape.MainActivity
import org.scottishtecharmy.soundscape.R
import org.scottishtecharmy.soundscape.screens.home.HomeRoutes
import org.scottishtecharmy.soundscape.ui.theme.Foreground2
import org.scottishtecharmy.soundscape.ui.theme.OnSurface
import org.scottishtecharmy.soundscape.ui.theme.PurpleGradientDark
import org.scottishtecharmy.soundscape.ui.theme.SoundscapeTheme

private fun exitSleep(context: MainActivity, navController: NavHostController) {
context.setServiceState(true)
navController.popBackStack(HomeRoutes.Home.route, false)
}

@Composable
fun SleepScreen(navController: NavHostController,
modifier: Modifier) {
val context = LocalContext.current as MainActivity

BackHandler(enabled = true) {
// If the user presses the back button come out of sleep
exitSleep(context, navController)
}

Column(
modifier = modifier.background(PurpleGradientDark).fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceBetween
) {
Row {
Text(
text = stringResource(R.string.sleep_sleeping),
style = MaterialTheme.typography.titleLarge,
color = Foreground2,
modifier = modifier.padding(40.dp)
)
}
Row {
Text(
text = stringResource(R.string.sleep_sleeping_message),
style = MaterialTheme.typography.bodyMedium,
color = OnSurface,
modifier = modifier.padding(40.dp)
)
}
Row {
Button(
onClick = {
exitSleep(context, navController)
},
modifier = modifier.fillMaxWidth().height(200.dp),
shape = RoundedCornerShape(2.dp),
) {
Text(
text = stringResource(R.string.sleep_wake_up_now),
textAlign = TextAlign.Start,
style = MaterialTheme.typography.titleMedium,
color = OnSurface,
)
}
}
}
}

@Preview(showBackground = true)
@Composable
fun SleepScreenPreview() {
SoundscapeTheme {
SleepScreen(
navController = rememberNavController(),
modifier = Modifier
)
}
}

0 comments on commit 66bc388

Please sign in to comment.