chore: it appears we unironically had an unused screen all this time
Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
parent
0eaa272054
commit
5d3ac27f54
|
|
@ -63,7 +63,6 @@ import chat.revolt.components.generic.HealthAlert
|
||||||
import chat.revolt.ndk.NativeLibraries
|
import chat.revolt.ndk.NativeLibraries
|
||||||
import chat.revolt.persistence.KVStorage
|
import chat.revolt.persistence.KVStorage
|
||||||
import chat.revolt.screens.DefaultDestinationScreen
|
import chat.revolt.screens.DefaultDestinationScreen
|
||||||
import chat.revolt.screens.SplashScreen
|
|
||||||
import chat.revolt.screens.about.AboutScreen
|
import chat.revolt.screens.about.AboutScreen
|
||||||
import chat.revolt.screens.about.AttributionScreen
|
import chat.revolt.screens.about.AttributionScreen
|
||||||
import chat.revolt.screens.chat.ChatRouterScreen
|
import chat.revolt.screens.chat.ChatRouterScreen
|
||||||
|
|
@ -73,6 +72,7 @@ import chat.revolt.screens.login.LoginGreetingScreen
|
||||||
import chat.revolt.screens.login.LoginScreen
|
import chat.revolt.screens.login.LoginScreen
|
||||||
import chat.revolt.screens.login.MfaScreen
|
import chat.revolt.screens.login.MfaScreen
|
||||||
import chat.revolt.screens.login2.InitScreen
|
import chat.revolt.screens.login2.InitScreen
|
||||||
|
import chat.revolt.screens.main.MainScreen
|
||||||
import chat.revolt.screens.register.OnboardingScreen
|
import chat.revolt.screens.register.OnboardingScreen
|
||||||
import chat.revolt.screens.register.RegisterDetailsScreen
|
import chat.revolt.screens.register.RegisterDetailsScreen
|
||||||
import chat.revolt.screens.register.RegisterGreetingScreen
|
import chat.revolt.screens.register.RegisterGreetingScreen
|
||||||
|
|
@ -492,7 +492,6 @@ fun AppEntrypoint(
|
||||||
onRetryConnection
|
onRetryConnection
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
composable("splash") { SplashScreen(navController) }
|
|
||||||
|
|
||||||
composable("login/greeting") { LoginGreetingScreen(navController) }
|
composable("login/greeting") { LoginGreetingScreen(navController) }
|
||||||
composable("login/login") { LoginScreen(navController) }
|
composable("login/login") { LoginScreen(navController) }
|
||||||
|
|
@ -527,6 +526,8 @@ fun AppEntrypoint(
|
||||||
|
|
||||||
composable("login2/init") { InitScreen(navController, windowSizeClass) }
|
composable("login2/init") { InitScreen(navController, windowSizeClass) }
|
||||||
|
|
||||||
|
// This is only used outside of Polar mode
|
||||||
|
// Otherwise you may be looking for "main" right below
|
||||||
composable("chat",
|
composable("chat",
|
||||||
enterTransition = {
|
enterTransition = {
|
||||||
slideIntoContainer(
|
slideIntoContainer(
|
||||||
|
|
@ -554,6 +555,24 @@ fun AppEntrypoint(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is only the main screen in Polar mode
|
||||||
|
// Otherwise you may be looking for "chat" right above
|
||||||
|
composable("main",
|
||||||
|
enterTransition = {
|
||||||
|
slideIntoContainer(
|
||||||
|
AnimatedContentTransitionScope.SlideDirection.Up,
|
||||||
|
animationSpec = tween(
|
||||||
|
400,
|
||||||
|
// cf. https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#cbea5c6e-7b0d-47a0-98c3-767080a38d95
|
||||||
|
easing = CubicBezierEasing(0.05f, 0.7f, 0.1f, 1f)
|
||||||
|
),
|
||||||
|
initialOffset = { it / 3 }
|
||||||
|
) + fadeIn(animationSpec = RevoltTweenFloat)
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
MainScreen(navController)
|
||||||
|
}
|
||||||
|
|
||||||
composable("create/group") { CreateGroupScreen(navController) }
|
composable("create/group") { CreateGroupScreen(navController) }
|
||||||
|
|
||||||
composable("discover") { DiscoverScreen(navController) }
|
composable("discover") { DiscoverScreen(navController) }
|
||||||
|
|
|
||||||
|
|
@ -1,187 +0,0 @@
|
||||||
package chat.revolt.screens
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Context
|
|
||||||
import android.net.ConnectivityManager
|
|
||||||
import android.net.NetworkCapabilities
|
|
||||||
import android.util.Log
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.compose.foundation.Image
|
|
||||||
import androidx.compose.foundation.background
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.height
|
|
||||||
import androidx.compose.material3.LocalContentColor
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
|
||||||
import androidx.compose.ui.layout.ContentScale
|
|
||||||
import androidx.compose.ui.res.painterResource
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.viewModelScope
|
|
||||||
import androidx.navigation.NavController
|
|
||||||
import chat.revolt.R
|
|
||||||
import chat.revolt.api.RevoltAPI
|
|
||||||
import chat.revolt.api.RevoltHttp
|
|
||||||
import chat.revolt.api.api
|
|
||||||
import chat.revolt.api.routes.onboard.needsOnboarding
|
|
||||||
import chat.revolt.components.screens.splash.DisconnectedScreen
|
|
||||||
import chat.revolt.persistence.KVStorage
|
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import io.ktor.client.request.get
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
@HiltViewModel
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
|
||||||
class SplashScreenViewModel @Inject constructor(
|
|
||||||
private val kvStorage: KVStorage,
|
|
||||||
@ApplicationContext private val context: Context
|
|
||||||
) : ViewModel() {
|
|
||||||
|
|
||||||
private var _navigateTo by mutableStateOf("")
|
|
||||||
val navigateTo: String
|
|
||||||
get() = _navigateTo
|
|
||||||
|
|
||||||
fun setNavigateTo(value: String) {
|
|
||||||
_navigateTo = value
|
|
||||||
}
|
|
||||||
|
|
||||||
private var _isConnected by mutableStateOf(false)
|
|
||||||
val isConnected: Boolean
|
|
||||||
get() = _isConnected
|
|
||||||
|
|
||||||
fun setIsConnected(value: Boolean) {
|
|
||||||
_isConnected = value
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun hasInternetConnection(): Boolean {
|
|
||||||
val connectivityManager =
|
|
||||||
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
|
||||||
|
|
||||||
val network = connectivityManager.activeNetwork ?: return false
|
|
||||||
val capabilities =
|
|
||||||
connectivityManager.getNetworkCapabilities(network) ?: return false
|
|
||||||
|
|
||||||
return when {
|
|
||||||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
|
|
||||||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
|
|
||||||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun canReachRevolt(): Boolean {
|
|
||||||
val res = RevoltHttp.get("/".api())
|
|
||||||
return res.status.value == 200
|
|
||||||
}
|
|
||||||
|
|
||||||
fun checkLoggedInState() {
|
|
||||||
Log.d("SplashScreenViewModel", "Checking logged in state")
|
|
||||||
viewModelScope.launch {
|
|
||||||
setIsConnected(hasInternetConnection())
|
|
||||||
|
|
||||||
if (!isConnected) return@launch
|
|
||||||
|
|
||||||
val token = kvStorage.get("sessionToken") ?: return@launch setNavigateTo("login")
|
|
||||||
val id = kvStorage.get("sessionId") ?: ""
|
|
||||||
|
|
||||||
val canReachRevolt = canReachRevolt()
|
|
||||||
val valid = RevoltAPI.checkSessionToken(token)
|
|
||||||
|
|
||||||
if (canReachRevolt && !valid) {
|
|
||||||
Toast.makeText(
|
|
||||||
context,
|
|
||||||
context.getString(R.string.token_invalid_toast),
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
kvStorage.remove("sessionToken")
|
|
||||||
kvStorage.remove("sessionId")
|
|
||||||
setNavigateTo("login")
|
|
||||||
} else {
|
|
||||||
val onboard = needsOnboarding()
|
|
||||||
if (onboard) {
|
|
||||||
setNavigateTo("onboarding")
|
|
||||||
return@launch
|
|
||||||
}
|
|
||||||
|
|
||||||
RevoltAPI.loginAs(token)
|
|
||||||
RevoltAPI.setSessionId(id)
|
|
||||||
setNavigateTo("home")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
checkLoggedInState()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun SplashScreen(navController: NavController, viewModel: SplashScreenViewModel = hiltViewModel()) {
|
|
||||||
if (!viewModel.isConnected) {
|
|
||||||
DisconnectedScreen(
|
|
||||||
onRetry = {
|
|
||||||
viewModel.checkLoggedInState()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
Column(
|
|
||||||
modifier = Modifier
|
|
||||||
.background(color = MaterialTheme.colorScheme.background)
|
|
||||||
.fillMaxSize(),
|
|
||||||
verticalArrangement = Arrangement.Center,
|
|
||||||
horizontalAlignment = Alignment.CenterHorizontally
|
|
||||||
) {
|
|
||||||
Image(
|
|
||||||
painter = painterResource(id = R.drawable.revolt_logo_wide),
|
|
||||||
colorFilter = ColorFilter.tint(LocalContentColor.current),
|
|
||||||
contentDescription = "Revolt Logo",
|
|
||||||
contentScale = ContentScale.Fit,
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.height(60.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchedEffect(viewModel.navigateTo) {
|
|
||||||
when (viewModel.navigateTo) {
|
|
||||||
"login" -> {
|
|
||||||
navController.navigate("login/greeting") {
|
|
||||||
popUpTo("splash") {
|
|
||||||
inclusive = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"onboarding" -> {
|
|
||||||
navController.navigate("register/onboarding") {
|
|
||||||
popUpTo("splash") {
|
|
||||||
inclusive = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"home" -> {
|
|
||||||
navController.navigate("chat") {
|
|
||||||
popUpTo("splash") {
|
|
||||||
inclusive = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue