From 8d4e8b8a7f81a27548797b1f1cc05c1ed27af297 Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Tue, 12 Jul 2022 16:56:42 +0530 Subject: [PATCH 1/8] update - Welcome Screen orientations handles --- .../screens/welcome/WelcomeScreen.kt | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index 1627f97..edbb2a4 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -1,5 +1,6 @@ package dev.baseio.discordjetpackcompose.ui.routes.onboarding.screens.welcome +import android.content.res.Configuration import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -10,6 +11,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults.buttonColors import androidx.compose.material.Icon @@ -18,6 +20,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight @@ -53,11 +56,14 @@ fun WelcomeScreen(composeNavigator: ComposeNavigator) { ) { Header() - Image( - painter = painterResource(id = R.drawable.welcomelogo), - contentDescription = null, - modifier = Modifier.padding(32.dp) - ) + + if (LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT) { + Image( + painter = painterResource(id = R.drawable.welcomelogo), + contentDescription = null, + modifier = Modifier.padding(32.dp) + ) + } CenteredTitleSubtitle( modifier = Modifier.padding(horizontal = 40.dp), @@ -68,12 +74,12 @@ fun WelcomeScreen(composeNavigator: ComposeNavigator) { Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { OnboardingScreensButton( - buttonTextProvider = {R.string.register}, + buttonTextProvider = { R.string.register }, onClick = { composeNavigator.navigate(DiscordScreen.Register.name) } ) Spacer(modifier = Modifier.size(2.dp)) OnboardingScreensButton( - buttonTextProvider = {R.string.login}, + buttonTextProvider = { R.string.login }, buttonBackgroundColor = onboarding_button_grey, onClick = { composeNavigator.navigate(DiscordScreen.Login.name) } ) @@ -92,7 +98,7 @@ private fun Header() { painter = painterResource(id = R.drawable.discord_welcome_header_light), contentDescription = "", modifier = Modifier - .fillMaxWidth(0.5f), + .width(200.dp), tint = DiscordColorProvider.colors.brand ) } From e6b2569f3ebcf6625edf460c32934175d1925b89 Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Thu, 14 Jul 2022 10:24:42 +0530 Subject: [PATCH 2/8] added - Network State Bar --- app/src/main/AndroidManifest.xml | 1 + .../discordjetpackcompose/MainActivity.kt | 7 +- .../dashboard/components/NetworkStateBar.kt | 252 ++++++++++++++++++ .../screens/welcome/WelcomeScreen.kt | 6 - 4 files changed, 255 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6e70d4c..7e812b6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" package="dev.baseio.discordjetpackcompose"> + + Bars(counter = counter, index = index) + } + Text(text = text, modifier = Modifier.padding(start = 4.dp)) + } +} + +@Composable +fun Bars( + counter: Int, + index: Int +) { + val colors by animateColorAsState( + targetValue = when (counter) { + index -> { + Color(0xFFA77C30) + } + (index - 1) -> { + Color(0xFF6E5A3F) + } + else -> { + Color(0xFF404047) + } + } + ) + Box( + modifier = Modifier + .width(6.dp) + .height( + when (index) { + 0 -> 8.dp + 1 -> 14.dp + 2 -> 20.dp + else -> 0.dp + } + ) + .padding(end = 2.dp) + .background(colors, shape = RoundedCornerShape(3.dp)) + ) +} + +@Composable +fun NoNetwork() { + Row(verticalAlignment = Alignment.Bottom) { + Bars(height = 8.dp, color = Color(0xFFEC4345)) + Bars(height = 14.dp, color = Color(0xFF36393F)) + Bars(height = 20.dp, color = Color(0xFF36393F)) + } +} + +@Composable +fun Bars( + height: Dp, + color: Color +) { + Box( + modifier = Modifier + .width(6.dp) + .height(height) + .padding(end = 2.dp) + .background(color, shape = RoundedCornerShape(3.dp)) + ) +} + + +sealed class ConnectionState { + object Unavailable : ConnectionState() + object Connecting : ConnectionState() + object AirplaneMode : ConnectionState() +} + +/** + * Network Utility to observe availability or unavailability of Internet connection + */ +@ExperimentalCoroutinesApi +fun Context.observeConnectivityAsFlow() = callbackFlow { + val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + val callback = networkCallback { connectionState -> trySend(connectionState) } + + val networkRequest = NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build() + + connectivityManager.registerNetworkCallback(networkRequest, callback) + + val currentState = getCurrentConnectivityState(connectivityManager) + trySend(currentState) + + awaitClose { + connectivityManager.unregisterNetworkCallback(callback) + } +} + +/** + * Network utility to get current state of internet connection + */ +val Context.currentConnectivityState: ConnectionState + get() { + val connectivityManager = + getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + return getCurrentConnectivityState(connectivityManager) + } + +private fun getCurrentConnectivityState( + connectivityManager: ConnectivityManager +): ConnectionState { + val connected = connectivityManager.allNetworks.any { network -> + connectivityManager.getNetworkCapabilities(network) + ?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + ?: false + } + + return if (connected) { + ConnectionState.Connecting + } else { + ConnectionState.Unavailable + } +} + +fun networkCallback(callback: (ConnectionState) -> Unit): ConnectivityManager.NetworkCallback { + return object : ConnectivityManager.NetworkCallback() { + override fun onAvailable(network: Network) { + callback(ConnectionState.Connecting) + } + + override fun onLost(network: Network) { + callback(ConnectionState.Unavailable) + } + } +} + +@ExperimentalCoroutinesApi +@Composable +fun connectivityState(): State { + val context = LocalContext.current + + return produceState(initialValue = context.currentConnectivityState) { + context.observeConnectivityAsFlow().collect { value = it } + } +} + diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index edbb2a4..173be04 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -12,18 +12,13 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material.Button -import androidx.compose.material.ButtonDefaults.buttonColors import androidx.compose.material.Icon -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.google.accompanist.insets.systemBarsPadding @@ -34,7 +29,6 @@ import dev.baseio.discordjetpackcompose.navigator.DiscordScreen import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.CenteredTitleSubtitle import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.OnboardingScreensButton import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider -import dev.baseio.discordjetpackcompose.ui.theme.onboarding_button_blue import dev.baseio.discordjetpackcompose.ui.theme.onboarding_button_grey @Composable From 67e1f4a402d5a5ad5cf1da8de57c17c1dfebf3b1 Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Thu, 14 Jul 2022 13:27:43 +0530 Subject: [PATCH 3/8] update - Network State Bar on top of DiscordAppBar --- .../ui/components/DiscordAppBar.kt | 12 ++++-- .../dashboard/components/NetworkStateBar.kt | 41 +++++++++++++++---- .../screens/welcome/WelcomeScreen.kt | 1 + 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt index 264c46d..119a1da 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt @@ -1,6 +1,8 @@ package dev.baseio.discordjetpackcompose.ui.components +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.AppBarDefaults import androidx.compose.material.TopAppBar import androidx.compose.material.contentColorFor @@ -9,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.Dp +import dev.baseio.discordjetpackcompose.ui.routes.dashboard.components.NetworkStateBar import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.DiscordSurface import dev.baseio.discordjetpackcompose.ui.theme.primarySurface @@ -28,8 +31,11 @@ fun DiscordAppBar( contentColor = contentColor, elevation = elevation ) { - TopAppBar( - title, modifier, navigationIcon, actions, backgroundColor, contentColor, elevation - ) + Column{ + NetworkStateBar() + TopAppBar( + title, modifier, navigationIcon, actions, backgroundColor, contentColor, elevation + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt index 38d11d3..56fef34 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt @@ -5,6 +5,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateColorAsState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -37,6 +38,10 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.delay import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch +import timber.log.Timber +import java.io.IOException +import java.net.InetSocketAddress +import java.net.Socket @Composable fun NetworkStateBar() { @@ -49,7 +54,7 @@ fun NetworkStateBar() { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth().padding(top = 4.dp) ) { ConnectingAnimation() Text( @@ -105,13 +110,23 @@ fun ConnectingAnimation( } }) - Row( - verticalAlignment = Alignment.Bottom - ) { - repeat(maxCounter) { index -> - Bars(counter = counter, index = index) + var isVisible = true + + LaunchedEffect(key1 = null, block = { + scope.launch { + delay(500) + isVisible = !isVisible + } + }) + AnimatedVisibility(visible = isVisible) { + Row( + verticalAlignment = Alignment.Bottom + ) { + repeat(maxCounter) { index -> + Bars(counter = counter, index = index) + } + Text(text = text, modifier = Modifier.padding(start = 4.dp)) } - Text(text = text, modifier = Modifier.padding(start = 4.dp)) } } @@ -228,6 +243,18 @@ private fun getCurrentConnectivityState( } } +fun execute(): Boolean { + return try { + val socket = Socket() + socket.connect(InetSocketAddress("8.8.8.8", 53), 1500) + socket.close() + true + } catch (e: IOException) { + Timber.e("No Internet Connection: $e") + false + } +} + fun networkCallback(callback: (ConnectionState) -> Unit): ConnectivityManager.NetworkCallback { return object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index 173be04..0189610 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -26,6 +26,7 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.baseio.discordjetpackcompose.R import dev.baseio.discordjetpackcompose.navigator.ComposeNavigator import dev.baseio.discordjetpackcompose.navigator.DiscordScreen +import dev.baseio.discordjetpackcompose.ui.routes.dashboard.components.NetworkStateBar import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.CenteredTitleSubtitle import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.OnboardingScreensButton import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider From dcb15313898c66fb721fc5c6dad172fcb88e6e67 Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Thu, 14 Jul 2022 19:55:49 +0530 Subject: [PATCH 4/8] update - Network State Bar --- .../discordjetpackcompose/MainActivity.kt | 18 +- .../ui/components/DiscordAppBar.kt | 37 ++-- .../dashboard/components/NetworkStateBar.kt | 205 ++++++++++-------- .../screens/welcome/WelcomeScreen.kt | 1 - app/src/main/res/drawable/ic_airplanemode.xml | 5 + app/src/main/res/values/strings.xml | 3 + 6 files changed, 150 insertions(+), 119 deletions(-) create mode 100644 app/src/main/res/drawable/ic_airplanemode.xml diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt index 44692bd..09838c8 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt @@ -3,6 +3,7 @@ package dev.baseio.discordjetpackcompose import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column import androidx.compose.runtime.LaunchedEffect import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat @@ -12,6 +13,7 @@ import com.google.accompanist.insets.ProvideWindowInsets import dagger.hilt.android.AndroidEntryPoint import dev.baseio.discordjetpackcompose.navigator.ComposeNavigator import dev.baseio.discordjetpackcompose.navigator.DiscordRoute +import dev.baseio.discordjetpackcompose.ui.routes.dashboard.components.NetworkStateBar import dev.baseio.discordjetpackcompose.ui.routes.dashboard.dashboardRoute import dev.baseio.discordjetpackcompose.ui.routes.onboarding.onBoardingRoute import dev.baseio.discordjetpackcompose.ui.theme.DiscordJetpackComposeTheme @@ -36,12 +38,16 @@ class MainActivity : ComponentActivity() { } DiscordJetpackComposeTheme { ProvideWindowInsets(windowInsetsAnimationsEnabled = true) { - NavHost( - navController = navController, - startDestination = DiscordRoute.OnBoarding.name, - ) { - onBoardingRoute(composeNavigator) - dashboardRoute(composeNavigator) + Column { + //Network Bar taking up space but not visible + NetworkStateBar() + NavHost( + navController = navController, + startDestination = DiscordRoute.OnBoarding.name, + ) { + onBoardingRoute(composeNavigator) + dashboardRoute(composeNavigator) + } } } } diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt index 119a1da..7764700 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/components/DiscordAppBar.kt @@ -1,41 +1,34 @@ package dev.baseio.discordjetpackcompose.ui.components -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.AppBarDefaults import androidx.compose.material.TopAppBar import androidx.compose.material.contentColorFor -import androidx.compose.material.primarySurface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.Dp -import dev.baseio.discordjetpackcompose.ui.routes.dashboard.components.NetworkStateBar import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.DiscordSurface import dev.baseio.discordjetpackcompose.ui.theme.primarySurface @Composable fun DiscordAppBar( - modifier: Modifier = Modifier, - title: @Composable () -> Unit = {}, - navigationIcon: @Composable (() -> Unit)? = null, - actions: @Composable RowScope.() -> Unit = {}, - backgroundColor: Color = DiscordColorProvider.colors.primarySurface, - contentColor: Color = contentColorFor(backgroundColor), - elevation: Dp = AppBarDefaults.TopAppBarElevation, + modifier: Modifier = Modifier, + title: @Composable () -> Unit = {}, + navigationIcon: @Composable (() -> Unit)? = null, + actions: @Composable RowScope.() -> Unit = {}, + backgroundColor: Color = DiscordColorProvider.colors.primarySurface, + contentColor: Color = contentColorFor(backgroundColor), + elevation: Dp = AppBarDefaults.TopAppBarElevation, ) { - DiscordSurface( - color = backgroundColor, - contentColor = contentColor, - elevation = elevation - ) { - Column{ - NetworkStateBar() - TopAppBar( - title, modifier, navigationIcon, actions, backgroundColor, contentColor, elevation - ) + DiscordSurface( + color = backgroundColor, + contentColor = contentColor, + elevation = elevation + ) { + TopAppBar( + title, modifier, navigationIcon, actions, backgroundColor, contentColor, elevation + ) } - } } \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt index 56fef34..477cb51 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt @@ -5,6 +5,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest +import android.provider.Settings import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateColorAsState import androidx.compose.foundation.background @@ -16,6 +17,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -28,62 +30,58 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import dev.baseio.discordjetpackcompose.ui.theme.white +import dev.baseio.discordjetpackcompose.R +import dev.baseio.discordjetpackcompose.ui.theme.Typography import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.delay import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch -import timber.log.Timber -import java.io.IOException -import java.net.InetSocketAddress -import java.net.Socket @Composable fun NetworkStateBar() { + val connection by connectivityState() + val airplane by isAirplaneMode() - val isConnected = connection === ConnectionState.Connecting - val isAirplaneMode = connection === ConnectionState.AirplaneMode + val isConnected by remember(key1 = connection) { + mutableStateOf(connection == ConnectionState.Available) + } - if (isConnected) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth().padding(top = 4.dp) - ) { - ConnectingAnimation() - Text( - text = "Connecting...", - color = white, - modifier = Modifier.padding(start = 4.dp) - ) - } - } else if (isAirplaneMode) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth() - ) { + val isAirplaneModeOn by remember(key1 = airplane) { + mutableStateOf(airplane == ConnectionState.AirplaneModeOn) + } + + + Row( + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 4.dp) + ) { + //Logic Needs to be fixed. Not updating always + if (isConnected) { ConnectingAnimation() - Text(text = "Airplane mode active.", color = white) - } - } else { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth() - ) { - NoNetwork() - Text( - text = "Network connectivity limited or unavailable.", - color = white, - modifier = Modifier.padding(start = 4.dp) - ) + } else { + if (!isAirplaneModeOn) { + NoNetwork() + NetworkStateText { R.string.no_internet_status } + } else { + Icon( + painter = painterResource(id = R.drawable.ic_airplanemode), + contentDescription = null, + modifier = Modifier.rotate(90f) + ) + NetworkStateText { R.string.airplane_mode_is_active } + } } } } @@ -91,8 +89,7 @@ fun NetworkStateBar() { @Composable fun ConnectingAnimation( - speed: Double = 0.5, - text: String = "" + speed: Double = 0.5 ) { val maxCounter = 3 var counter by remember { @@ -110,14 +107,20 @@ fun ConnectingAnimation( } }) - var isVisible = true + var isVisible by remember { + mutableStateOf(true) + } - LaunchedEffect(key1 = null, block = { - scope.launch { - delay(500) - isVisible = !isVisible + LaunchedEffect( + key1 = null, + block = { + scope.launch { + delay(3000) + isVisible = !isVisible + } } - }) + ) + AnimatedVisibility(visible = isVisible) { Row( verticalAlignment = Alignment.Bottom @@ -125,11 +128,20 @@ fun ConnectingAnimation( repeat(maxCounter) { index -> Bars(counter = counter, index = index) } - Text(text = text, modifier = Modifier.padding(start = 4.dp)) + NetworkStateText { R.string.connecting } } } } +@Composable +fun NetworkStateText(textProvider: () -> Int) { + Text( + text = stringResource(id = textProvider()), + style = Typography.caption, + modifier = Modifier.padding(start = 4.dp) + ) +} + @Composable fun Bars( counter: Int, @@ -154,8 +166,8 @@ fun Bars( .height( when (index) { 0 -> 8.dp - 1 -> 14.dp - 2 -> 20.dp + 1 -> 12.dp + 2 -> 16.dp else -> 0.dp } ) @@ -167,14 +179,14 @@ fun Bars( @Composable fun NoNetwork() { Row(verticalAlignment = Alignment.Bottom) { - Bars(height = 8.dp, color = Color(0xFFEC4345)) - Bars(height = 14.dp, color = Color(0xFF36393F)) - Bars(height = 20.dp, color = Color(0xFF36393F)) + NonAnimatedBar(height = 8.dp, color = Color(0xFFEC4345)) + NonAnimatedBar(height = 12.dp, color = Color(0xFF36393F)) + NonAnimatedBar(height = 16.dp, color = Color(0xFF36393F)) } } @Composable -fun Bars( +fun NonAnimatedBar( height: Dp, color: Color ) { @@ -189,33 +201,12 @@ fun Bars( sealed class ConnectionState { + object Available : ConnectionState() object Unavailable : ConnectionState() - object Connecting : ConnectionState() - object AirplaneMode : ConnectionState() + object AirplaneModeOn : ConnectionState() + object AirplaneModeOff : ConnectionState() } -/** - * Network Utility to observe availability or unavailability of Internet connection - */ -@ExperimentalCoroutinesApi -fun Context.observeConnectivityAsFlow() = callbackFlow { - val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - - val callback = networkCallback { connectionState -> trySend(connectionState) } - - val networkRequest = NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build() - - connectivityManager.registerNetworkCallback(networkRequest, callback) - - val currentState = getCurrentConnectivityState(connectivityManager) - trySend(currentState) - - awaitClose { - connectivityManager.unregisterNetworkCallback(callback) - } -} /** * Network utility to get current state of internet connection @@ -227,6 +218,7 @@ val Context.currentConnectivityState: ConnectionState return getCurrentConnectivityState(connectivityManager) } + private fun getCurrentConnectivityState( connectivityManager: ConnectivityManager ): ConnectionState { @@ -236,29 +228,42 @@ private fun getCurrentConnectivityState( ?: false } + return if (connected) { - ConnectionState.Connecting + ConnectionState.Available } else { ConnectionState.Unavailable } } -fun execute(): Boolean { - return try { - val socket = Socket() - socket.connect(InetSocketAddress("8.8.8.8", 53), 1500) - socket.close() - true - } catch (e: IOException) { - Timber.e("No Internet Connection: $e") - false +/** + * Network Utility to observe availability or unavailability of Internet connection + */ +@ExperimentalCoroutinesApi +fun Context.observeConnectivityAsFlow() = callbackFlow { + val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + val callback = networkCallback { connectionState -> trySend(connectionState) } + + val networkRequest = NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build() + + connectivityManager.registerNetworkCallback(networkRequest, callback) + + val currentState = getCurrentConnectivityState(connectivityManager) + trySend(currentState) + + awaitClose { + connectivityManager.unregisterNetworkCallback(callback) } } + fun networkCallback(callback: (ConnectionState) -> Unit): ConnectivityManager.NetworkCallback { return object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { - callback(ConnectionState.Connecting) + callback(ConnectionState.Available) } override fun onLost(network: Network) { @@ -277,3 +282,23 @@ fun connectivityState(): State { } } + +@Composable +fun isAirplaneMode(): State { + val context = LocalContext.current + val mode = Settings.System.getInt( + context.contentResolver, + Settings.Global.AIRPLANE_MODE_ON, 0 + ) != 0 + + return remember { + mutableStateOf( + if (mode) { + ConnectionState.AirplaneModeOn + } else { + ConnectionState.AirplaneModeOff + } + ) + } +} + diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index 0189610..173be04 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -26,7 +26,6 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.baseio.discordjetpackcompose.R import dev.baseio.discordjetpackcompose.navigator.ComposeNavigator import dev.baseio.discordjetpackcompose.navigator.DiscordScreen -import dev.baseio.discordjetpackcompose.ui.routes.dashboard.components.NetworkStateBar import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.CenteredTitleSubtitle import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.OnboardingScreensButton import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider diff --git a/app/src/main/res/drawable/ic_airplanemode.xml b/app/src/main/res/drawable/ic_airplanemode.xml new file mode 100644 index 0000000..484a470 --- /dev/null +++ b/app/src/main/res/drawable/ic_airplanemode.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7db68a6..e8fc701 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -68,4 +68,7 @@ Use anywhere with nitro %s EMOJIS NO EMOJI + Connecting… + Network connectivity limited or unavailable. + Airplane mode is active. \ No newline at end of file From b32a8a83bf06d361aebd4f214f63f53dd7033b1e Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Wed, 20 Jul 2022 15:50:07 +0530 Subject: [PATCH 5/8] update - Network State Bar now showing --- .../discordjetpackcompose/MainActivity.kt | 17 +++++++++-- .../dashboard/components/NetworkStateBar.kt | 30 +++++++++++-------- .../screens/register/RegisterScreen.kt | 2 -- .../screens/welcome/WelcomeScreen.kt | 4 +-- 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt index 7b91bc6..71d8f8d 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/MainActivity.kt @@ -3,18 +3,24 @@ package dev.baseio.discordjetpackcompose import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier import androidx.core.view.WindowCompat import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.google.accompanist.insets.ProvideWindowInsets +import com.google.accompanist.insets.statusBarsPadding import dagger.hilt.android.AndroidEntryPoint import dev.baseio.discordjetpackcompose.navigator.ComposeNavigator import dev.baseio.discordjetpackcompose.navigator.DiscordRoute import dev.baseio.discordjetpackcompose.ui.routes.dashboard.components.NetworkStateBar import dev.baseio.discordjetpackcompose.ui.routes.dashboard.dashboardRoute import dev.baseio.discordjetpackcompose.ui.routes.onboarding.onBoardingRoute +import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.DiscordJetpackComposeTheme import javax.inject.Inject @@ -39,9 +45,14 @@ class MainActivity : ComponentActivity() { } DiscordJetpackComposeTheme { ProvideWindowInsets(windowInsetsAnimationsEnabled = true) { - Column { - //Network Bar taking up space but not visible - NetworkStateBar() + Column( + modifier = Modifier.background(DiscordColorProvider.colors.background) + ) { + NetworkStateBar( + modifier = Modifier + .align(CenterHorizontally) + .statusBarsPadding() + ) NavHost( navController = navController, startDestination = DiscordRoute.OnBoarding.name, diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt index 477cb51..7c78540 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import dev.baseio.discordjetpackcompose.R +import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.Typography import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose @@ -46,7 +47,9 @@ import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch @Composable -fun NetworkStateBar() { +fun NetworkStateBar( + modifier: Modifier = Modifier +) { val connection by connectivityState() val airplane by isAirplaneMode() @@ -63,24 +66,25 @@ fun NetworkStateBar() { Row( verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.Center, - modifier = Modifier + modifier = modifier .fillMaxWidth() .padding(top = 4.dp) ) { //Logic Needs to be fixed. Not updating always - if (isConnected) { - ConnectingAnimation() + if (isAirplaneModeOn) { + Icon( + painter = painterResource(id = R.drawable.ic_airplanemode), + contentDescription = null, + modifier = Modifier.rotate(90f), + tint = DiscordColorProvider.colors.textPrimary + ) + NetworkStateText { R.string.airplane_mode_is_active } } else { - if (!isAirplaneModeOn) { + if (isConnected) { + ConnectingAnimation() + } else { NoNetwork() NetworkStateText { R.string.no_internet_status } - } else { - Icon( - painter = painterResource(id = R.drawable.ic_airplanemode), - contentDescription = null, - modifier = Modifier.rotate(90f) - ) - NetworkStateText { R.string.airplane_mode_is_active } } } } @@ -137,7 +141,7 @@ fun ConnectingAnimation( fun NetworkStateText(textProvider: () -> Int) { Text( text = stringResource(id = textProvider()), - style = Typography.caption, + style = Typography.caption.copy(color = DiscordColorProvider.colors.textPrimary), modifier = Modifier.padding(start = 4.dp) ) } diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/register/RegisterScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/register/RegisterScreen.kt index 0d794e4..bcb5e93 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/register/RegisterScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/register/RegisterScreen.kt @@ -32,7 +32,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel -import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.baseio.discordjetpackcompose.R import dev.baseio.discordjetpackcompose.entities.CountryEntity @@ -70,7 +69,6 @@ fun RegisterScreen( val onSelectionChange = { type: RegistrationType -> selectedOption = type } DiscordScaffold( - modifier = Modifier.statusBarsPadding(), navigator = composeNavigator, scaffoldState = scaffoldState ) { diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index 173be04..91864d9 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer 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.layout.size import androidx.compose.foundation.layout.width @@ -44,7 +45,6 @@ fun WelcomeScreen(composeNavigator: ComposeNavigator) { Column( Modifier .fillMaxSize() - .systemBarsPadding() .background(DiscordColorProvider.colors.background), verticalArrangement = Arrangement.SpaceAround ) { @@ -55,7 +55,7 @@ fun WelcomeScreen(composeNavigator: ComposeNavigator) { Image( painter = painterResource(id = R.drawable.welcomelogo), contentDescription = null, - modifier = Modifier.padding(32.dp) + modifier = Modifier.height((LocalConfiguration.current.screenHeightDp / 2.5).dp) ) } From 630ffcfbae35c2fdb57b3a983c993c4c5c480d5e Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Wed, 20 Jul 2022 16:08:22 +0530 Subject: [PATCH 6/8] update - welcome screen alignment --- .../ui/routes/onboarding/screens/welcome/WelcomeScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index 91864d9..18872f4 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -46,7 +46,8 @@ fun WelcomeScreen(composeNavigator: ComposeNavigator) { Modifier .fillMaxSize() .background(DiscordColorProvider.colors.background), - verticalArrangement = Arrangement.SpaceAround + verticalArrangement = Arrangement.SpaceAround, + horizontalAlignment = Alignment.CenterHorizontally ) { Header() From 17e8bedf9f04c22abf3e6697a09a533fdf98d913 Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Fri, 29 Jul 2022 12:08:14 +0530 Subject: [PATCH 7/8] update - network bar fixed --- .../dashboard/components/NetworkStateBar.kt | 83 ++++++++++--------- .../screens/welcome/WelcomeScreen.kt | 1 - 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt index 7c78540..f59866c 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt @@ -1,11 +1,13 @@ package dev.baseio.discordjetpackcompose.ui.routes.dashboard.components +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest -import android.provider.Settings import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateColorAsState import androidx.compose.foundation.background @@ -20,6 +22,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State import androidx.compose.runtime.getValue @@ -46,22 +49,44 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch +@Composable +fun AirplaneModeBroadcastReceiver( + airplaneModeState: (isAirplaneModeOn: Boolean?) -> Unit +) { + val context = LocalContext.current + + DisposableEffect(context) { + val broadcast = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + val state: Boolean = intent?.getBooleanExtra("state", false) ?: return + airplaneModeState(state) + } + } + context.registerReceiver(broadcast, IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)) + onDispose { + context.unregisterReceiver(broadcast) + } + } +} + + @Composable fun NetworkStateBar( - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val connection by connectivityState() - val airplane by isAirplaneMode() - val isConnected by remember(key1 = connection) { mutableStateOf(connection == ConnectionState.Available) } - val isAirplaneModeOn by remember(key1 = airplane) { - mutableStateOf(airplane == ConnectionState.AirplaneModeOn) + val isAirplaneModeOn = remember { + mutableStateOf(false) } + AirplaneModeBroadcastReceiver{ + isAirplaneModeOn.value = it ?: false + } Row( verticalAlignment = Alignment.Bottom, @@ -70,8 +95,7 @@ fun NetworkStateBar( .fillMaxWidth() .padding(top = 4.dp) ) { - //Logic Needs to be fixed. Not updating always - if (isAirplaneModeOn) { + if (isAirplaneModeOn.value) { Icon( painter = painterResource(id = R.drawable.ic_airplanemode), contentDescription = null, @@ -79,18 +103,22 @@ fun NetworkStateBar( tint = DiscordColorProvider.colors.textPrimary ) NetworkStateText { R.string.airplane_mode_is_active } + } else if (isConnected) { + ConnectingAnimation() } else { - if (isConnected) { - ConnectingAnimation() - } else { - NoNetwork() - NetworkStateText { R.string.no_internet_status } - } + NoNetwork() + NetworkStateText { R.string.no_internet_status } } } } +sealed class ConnectionState { + object Available : ConnectionState() + object Unavailable : ConnectionState() +} + + @Composable fun ConnectingAnimation( speed: Double = 0.5 @@ -204,14 +232,6 @@ fun NonAnimatedBar( } -sealed class ConnectionState { - object Available : ConnectionState() - object Unavailable : ConnectionState() - object AirplaneModeOn : ConnectionState() - object AirplaneModeOff : ConnectionState() -} - - /** * Network utility to get current state of internet connection */ @@ -287,22 +307,3 @@ fun connectivityState(): State { } -@Composable -fun isAirplaneMode(): State { - val context = LocalContext.current - val mode = Settings.System.getInt( - context.contentResolver, - Settings.Global.AIRPLANE_MODE_ON, 0 - ) != 0 - - return remember { - mutableStateOf( - if (mode) { - ConnectionState.AirplaneModeOn - } else { - ConnectionState.AirplaneModeOff - } - ) - } -} - diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt index 18872f4..5bcddae 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/screens/welcome/WelcomeScreen.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.google.accompanist.insets.systemBarsPadding import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.baseio.discordjetpackcompose.R import dev.baseio.discordjetpackcompose.navigator.ComposeNavigator From b676cf711d26cc42b848aa5f180d509adebb7d27 Mon Sep 17 00:00:00 2001 From: Yugesh Jain Date: Fri, 29 Jul 2022 15:15:13 +0530 Subject: [PATCH 8/8] update - color fixed --- .../dashboard/components/NetworkStateBar.kt | 22 ++++------ .../dashboard/createServer/CreateServer.kt | 19 ++++---- .../createServer/CreateServerCard.kt | 4 +- .../routes/dashboard/friends/FriendsScreen.kt | 2 +- .../main/chatscreen/ChannelMemberScreen.kt | 2 +- .../onboarding/commonui/DiscordDialog.kt | 15 +++---- .../discordjetpackcompose/ui/theme/Color.kt | 44 +------------------ 7 files changed, 31 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt index f59866c..43d46a1 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/components/NetworkStateBar.kt @@ -24,6 +24,7 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -50,16 +51,16 @@ import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch @Composable -fun AirplaneModeBroadcastReceiver( - airplaneModeState: (isAirplaneModeOn: Boolean?) -> Unit -) { +fun rememberAirplaneModeState(): Boolean { val context = LocalContext.current - + val airplaneMode = remember { + mutableStateOf(false) + } DisposableEffect(context) { val broadcast = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { val state: Boolean = intent?.getBooleanExtra("state", false) ?: return - airplaneModeState(state) + airplaneMode.value = state } } context.registerReceiver(broadcast, IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)) @@ -67,6 +68,7 @@ fun AirplaneModeBroadcastReceiver( context.unregisterReceiver(broadcast) } } + return airplaneMode.value } @@ -80,14 +82,6 @@ fun NetworkStateBar( mutableStateOf(connection == ConnectionState.Available) } - val isAirplaneModeOn = remember { - mutableStateOf(false) - } - - AirplaneModeBroadcastReceiver{ - isAirplaneModeOn.value = it ?: false - } - Row( verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.Center, @@ -95,7 +89,7 @@ fun NetworkStateBar( .fillMaxWidth() .padding(top = 4.dp) ) { - if (isAirplaneModeOn.value) { + if (rememberAirplaneModeState()) { Icon( painter = painterResource(id = R.drawable.ic_airplanemode), contentDescription = null, diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServer.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServer.kt index 3df211b..04dee26 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServer.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServer.kt @@ -26,25 +26,28 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.google.accompanist.insets.statusBarsPadding import dev.baseio.discordjetpackcompose.R import dev.baseio.discordjetpackcompose.navigator.ComposeNavigator import dev.baseio.discordjetpackcompose.navigator.DiscordScreen import dev.baseio.discordjetpackcompose.ui.components.DiscordAppBar import dev.baseio.discordjetpackcompose.ui.components.DiscordScaffold import dev.baseio.discordjetpackcompose.ui.routes.onboarding.commonui.CenteredTitleSubtitle +import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.Typography -import dev.baseio.discordjetpackcompose.ui.theme.create_server_card_bottom_button_bg -import dev.baseio.discordjetpackcompose.ui.theme.create_server_screen +import dev.baseio.discordjetpackcompose.ui.theme.contentColorFor +import dev.baseio.discordjetpackcompose.ui.theme.onboarding_button_grey import dev.baseio.discordjetpackcompose.ui.theme.white @Composable fun CreateServer( composeNavigator: ComposeNavigator ) { + val backgroundColor = DiscordColorProvider.colors.background + val serverCardBackgroundColor = DiscordColorProvider.colors.surface + val contentColor = DiscordColorProvider.colors.contentColorFor(backgroundColor) + val scaffoldState = rememberScaffoldState() DiscordScaffold( - modifier = Modifier.statusBarsPadding(), scaffoldState = scaffoldState, topAppBar = { DiscordAppBar( @@ -57,7 +60,7 @@ fun CreateServer( ) } }, - backgroundColor = create_server_screen, + backgroundColor = backgroundColor, elevation = 0.dp ) } @@ -66,7 +69,7 @@ fun CreateServer( modifier = Modifier .fillMaxSize() .padding(paddingValues) - .background(color = create_server_screen), + .background(color = backgroundColor), horizontalAlignment = Alignment.CenterHorizontally ) { CenteredTitleSubtitle( @@ -77,7 +80,7 @@ fun CreateServer( LazyColumn( modifier = Modifier .fillMaxHeight(0.8f) - .background(color = create_server_screen) + .background(color = backgroundColor) ) { items(1) { CreateServerCard( @@ -130,7 +133,7 @@ fun HaveAnInviteBottomCard( .padding(horizontal = 16.dp) .padding(bottom = 16.dp), shape = RoundedCornerShape(6.dp), - colors = ButtonDefaults.buttonColors(backgroundColor = create_server_card_bottom_button_bg) + colors = ButtonDefaults.buttonColors(backgroundColor = onboarding_button_grey) ) { Text( text = stringResource(R.string.have_an_invite_already), diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServerCard.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServerCard.kt index 053e201..6767080 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServerCard.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/createServer/CreateServerCard.kt @@ -32,8 +32,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import dev.baseio.discordjetpackcompose.R +import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.Typography -import dev.baseio.discordjetpackcompose.ui.theme.create_server_card_bg @OptIn(ExperimentalMaterialApi::class) @Composable @@ -47,7 +47,7 @@ fun CreateServerCard( modifier = Modifier .padding(horizontal = 16.dp, vertical = 6.dp), onClick = { onClick() }, - color = create_server_card_bg + color = DiscordColorProvider.colors.surface ) { Row( modifier = Modifier diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/friends/FriendsScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/friends/FriendsScreen.kt index 63cccd3..761ef93 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/friends/FriendsScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/friends/FriendsScreen.kt @@ -74,7 +74,7 @@ fun FriendsScreen( ) ) }, - backgroundColor = create_server_screen, + backgroundColor = DiscordColorProvider.colors.background, actions = { Icon( painter = painterResource(id = R.drawable.ic_chat_bubble), diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/main/chatscreen/ChannelMemberScreen.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/main/chatscreen/ChannelMemberScreen.kt index 63c592c..6e18ddb 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/main/chatscreen/ChannelMemberScreen.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/dashboard/main/chatscreen/ChannelMemberScreen.kt @@ -68,7 +68,7 @@ fun ChannelMemberScreen( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(create_server_screen) + .background(DiscordColorProvider.colors.background) ) ChannelMemberActions() InviteMembers(onInviteButtonClicked) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/commonui/DiscordDialog.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/commonui/DiscordDialog.kt index c94a4e5..3dad03e 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/commonui/DiscordDialog.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/routes/onboarding/commonui/DiscordDialog.kt @@ -26,12 +26,11 @@ import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import dev.baseio.discordjetpackcompose.R +import dev.baseio.discordjetpackcompose.ui.theme.DiscordColorProvider import dev.baseio.discordjetpackcompose.ui.theme.DiscordDialogTypography import dev.baseio.discordjetpackcompose.ui.theme.DiscordJetpackComposeTheme -import dev.baseio.discordjetpackcompose.ui.theme.discord_dialog_bg -import dev.baseio.discordjetpackcompose.ui.theme.discord_dialog_button_bg -import dev.baseio.discordjetpackcompose.ui.theme.discord_dialog_button_row_bg -import dev.baseio.discordjetpackcompose.ui.theme.discord_dialog_cancel_button_text +import dev.baseio.discordjetpackcompose.ui.theme.dialog_text_grey +import dev.baseio.discordjetpackcompose.ui.theme.onboarding_button_blue import dev.baseio.discordjetpackcompose.ui.theme.white @Composable @@ -39,12 +38,12 @@ fun DiscordDialog( modifier: Modifier = Modifier, show: Boolean, shape: Shape = RectangleShape, - backgroundColor: Color = discord_dialog_bg, + backgroundColor: Color = DiscordColorProvider.colors.background, titleTextProvider: () -> Int, subTitleTextProvider: () -> Int, properties: DialogProperties = DialogProperties(), onDismissRequest: () -> Unit, - buttonRowBackgroundColor: Color = discord_dialog_button_row_bg, + buttonRowBackgroundColor: Color = DiscordColorProvider.colors.surface, confirmActionButtonTextProvider: () -> Int, onClickCancelButton: () -> Unit, onClickConfirmActionButton: () -> Unit @@ -147,7 +146,7 @@ fun DialogNegativeAction( style = TextStyle( fontWeight = FontWeight.Black, fontSize = 14.sp, - color = discord_dialog_cancel_button_text + color = dialog_text_grey ) ) } @@ -161,7 +160,7 @@ fun DialogPositiveAction( Button( onClick = { onClickConfirmActionButton() }, elevation = ButtonDefaults.elevation(2.dp), - colors = ButtonDefaults.buttonColors(backgroundColor = discord_dialog_button_bg), + colors = ButtonDefaults.buttonColors(backgroundColor = onboarding_button_blue), modifier = Modifier .padding(end = 10.dp) .padding(vertical = 6.dp) diff --git a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/theme/Color.kt b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/theme/Color.kt index 4a0f227..eeedec7 100644 --- a/app/src/main/java/dev/baseio/discordjetpackcompose/ui/theme/Color.kt +++ b/app/src/main/java/dev/baseio/discordjetpackcompose/ui/theme/Color.kt @@ -764,49 +764,7 @@ val xbox = Color(0xFF107c10) val xbox_500 = Color(0xFF107c10) val youtube = Color(0xFFcb2120) val youtube_500 = Color(0xFFcb2120) - -val create_server_screen - @Composable get() = if (isSystemInDarkTheme()) { - Color(0xFF373840) - } else { - Color(0xFFFEFFFE) - } - -val create_server_card_bg - @Composable get() = if (isSystemInDarkTheme()) { - Color(0xFF2B2B2E) - } else { - Color(0xFFEBEDEF) - } - -val create_server_card_bottom_button_bg - @Composable get() = if (isSystemInDarkTheme()) { - Color(0xFF4E535D) - } else { - Color(0xFF747F8C) - } - - -val discord_dialog_bg - @Composable get() = if (isSystemInDarkTheme()) { - Color(0xFF36393E) - } else { - Color(0xFFFEFFFE) - } - -val discord_dialog_button_row_bg - @Composable get() = if (isSystemInDarkTheme()) { - Color(0xFF303037) - } else { - Color(0xFFF9F8F9) - } -val discord_dialog_cancel_button_text - @Composable get() = if (isSystemInDarkTheme()) { - Color(0xFFA7A8AA) - } else { - Color(0xFF4F5761) - } -val discord_dialog_button_bg = Color(0xFF5864F1) +val dialog_text_grey = Color(0xFFA7A8AA) val discord_icon_button @Composable get() = if (isSystemInDarkTheme()) {