Poulastaa
10/11/2025, 7:23 PMPoulastaa
10/11/2025, 7:24 PM@AndroidEntryPoint
class MainActivity : ComponentActivity() {
private val viewmodel by viewModels<RootViewmodel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
setupSplashScreen()
val nav = rememberNavController()
TelecallerTheme {
val state by viewmodel.screen.collectAsStateWithLifecycle()
state?.let { screen ->
RootNavigation(nav, screen)
}
}
}
}
private fun setupSplashScreen() {
var keepSplashOpened = true
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewmodel.isLongInScreen.collectLatest {
it?.let {
keepSplashOpened = false
}
}
}
}
installSplashScreen().setKeepOnScreenCondition {
keepSplashOpened
}
}
}Poulastaa
10/11/2025, 7:24 PMclass Dimens(
val small1: Dp = 4.dp,
val small2: Dp = 6.dp,
val small3: Dp = 8.dp,
val medium1: Dp = 16.dp,
val medium2: Dp = 18.dp,
val medium3: Dp = 24.dp,
val large1: Dp = 32.dp,
val large2: Dp = 52.dp,
)
private val CompactDimens = Dimens(
small1 = 4.dp,
small2 = 6.dp,
small3 = 8.dp,
medium1 = 16.dp,
medium2 = 18.dp,
medium3 = 24.dp,
)
private val LocalAppDimens = compositionLocalOf {
CompactDimens
}
val MaterialTheme.dimens
@ReadOnlyComposable
@Composable
get() = LocalAppDimens.current
private val LightColorScheme = lightColorScheme(
primary = Purple40,
secondary = PurpleGrey40,
tertiary = Pink40
)
@Composable
fun TelecallerTheme(
darkTheme: Boolean = false,
content: @Composable () -> Unit,
) {
val context = LocalContext.current
val componentActivity = context as ComponentActivity
val activity = LocalActivity.current
val view = LocalView.current
DisposableEffect(darkTheme) {
componentActivity.enableEdgeToEdge(
statusBarStyle = if (darkTheme) SystemBarStyle.light(
scrim = Color.Transparent.toArgb(),
darkScrim = Color.Transparent.toArgb()
) else SystemBarStyle.dark(
scrim = Color.Transparent.toArgb()
),
navigationBarStyle = if (darkTheme) SystemBarStyle.light(
scrim = Color.Transparent.toArgb(),
darkScrim = Color.Transparent.toArgb()
) else SystemBarStyle.dark(
scrim = Color.Transparent.toArgb()
)
)
onDispose { }
}
if (activity != null) SideEffect {
val window = activity.window
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
window.isNavigationBarContrastEnforced = false
val windowsInsetsController = WindowCompat.getInsetsController(window, view)
windowsInsetsController.isAppearanceLightStatusBars = !darkTheme
windowsInsetsController.isAppearanceLightNavigationBars = !darkTheme
}
AppThem(content)
}
@Composable
fun AppThem(
content: @Composable () -> Unit,
) {
val dimens = remember { CompactDimens }
CompositionLocalProvider(value = LocalAppDimens provides dimens) {
MaterialTheme(
colorScheme = LightColorScheme,
typography = Typography,
shapes = Shapes(
extraSmall = RoundedCornerShape(4.dp),
small = RoundedCornerShape(8.dp),
medium = RoundedCornerShape(16.dp),
large = RoundedCornerShape(32.dp),
extraLarge = RoundedCornerShape(52.dp)
),
content = content
)
}
}Poulastaa
10/11/2025, 7:25 PM@HiltViewModel
class RootViewmodel @Inject constructor(
private val db: DatastoreRepository,
) : ViewModel() {
var screen = MutableStateFlow<Screens?>(null)
private set
private val _isLogin = MutableStateFlow<Boolean?>(null)
val isLongInScreen = _isLogin.asStateFlow()
init {
viewModelScope.launch {
isLongInScreen.collectLatest {
if (it == true) screen.update {
Screens.Home
} else screen.update {
Screens.Auth
}
}
}
viewModelScope.launch {
db.isLoggedIn().collectLatest {
_isLogin.value = it
}
}
}
}Poulastaa
10/11/2025, 7:27 PM