1- package pseudoankit.droid.tasky
1+ package pseudoankit.droid.tasky.launcher
22
33import android.Manifest
44import android.content.Intent
5- import android.os.Build
65import android.os.Bundle
76import android.view.WindowManager
87import androidx.activity.ComponentActivity
@@ -12,29 +11,24 @@ import androidx.compose.foundation.layout.fillMaxSize
1211import androidx.compose.material3.Surface
1312import androidx.compose.runtime.Composable
1413import androidx.compose.runtime.LaunchedEffect
15- import androidx.compose.runtime.collectAsState
16- import androidx.compose.runtime.getValue
1714import androidx.compose.ui.Modifier
1815import androidx.compose.ui.platform.LocalContext
1916import androidx.core.splashscreen.SplashScreen
2017import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
2118import androidx.navigation.NavHostController
22- import com.example.permission_manager.taskyStatus
2319import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
2420import com.google.accompanist.permissions.rememberPermissionState
2521import com.ramcosta.composedestinations.DestinationsNavHost
2622import com.ramcosta.composedestinations.animations.rememberAnimatedNavHostEngine
2723import com.ramcosta.composedestinations.navigation.dependency
28- import kotlinx.coroutines.flow.firstOrNull
29- import kotlinx.coroutines.runBlocking
30- import org.koin.android.ext.android.inject
24+ import kotlinx.coroutines.flow.collectLatest
25+ import org.koin.androidx.viewmodel.ext.android.getViewModel
26+ import org.orbitmvi.orbit.compose.collectAsState
3127import pseudoankit.droid.core.deeplink.TaskyDeeplink
32- import pseudoankit.droid.core.logger.logInfo
3328import pseudoankit.droid.coreui.deeplink.navigateViaDeepLink
3429import pseudoankit.droid.coreui.util.extension.clearStack
35- import pseudoankit.droid.navigation.navgraph.mainNavGraph
36- import pseudoankit.droid.navigation.navigator.CoreFeatureNavigator
37- import pseudoankit.droid.preferencesmanager.PreferenceRepository
30+ import pseudoankit.droid.tasky.navigation.navgraph.mainNavGraph
31+ import pseudoankit.droid.tasky.navigation.navigator.CoreFeatureNavigator
3832import pseudoankit.droid.tasky.util.hide
3933import pseudoankit.droid.tasky.util.show
4034import pseudoankit.droid.unify.token.UnifyColors
@@ -44,14 +38,14 @@ import pseudoankit.droid.unify.utils.enableTestTagAsResourceId
4438@OptIn(ExperimentalAnimationApi ::class , ExperimentalMaterialNavigationApi ::class )
4539internal class MainActivity : ComponentActivity () {
4640
47- private val preferenceRepository: PreferenceRepository by inject()
4841 private var navController: NavHostController ? = null
4942 private val splashScreen: SplashScreen by lazy { installSplashScreen() }
5043
5144 override fun onCreate (savedInstanceState : Bundle ? ) {
5245 splashScreen.show()
5346 super .onCreate(savedInstanceState)
5447
48+ MainActivityModule .loadModules()
5549 window.setSoftInputMode(WindowManager .LayoutParams .SOFT_INPUT_ADJUST_RESIZE );
5650
5751 setContent {
@@ -60,26 +54,30 @@ internal class MainActivity : ComponentActivity() {
6054 modifier = Modifier .fillMaxSize(),
6155 color = UnifyColors .White
6256 ) {
63- InitializeNavigation ()
64- HandlePermissions ()
65- ObserveLoginStatus ()
57+ val viewModel = getViewModel<MainActivityViewModel >()
58+ val state = viewModel.collectAsState().value
59+
60+ InitializeNavigation (
61+ isUserLoggedIn = state.isUserLoggedIn
62+ )
63+ viewModel.HandleSideEffect ()
6664 HideSplashScreenAfterNavigation ()
6765 }
6866 }
6967 }
7068 }
7169
7270 @Composable
73- private fun InitializeNavigation () {
71+ private fun InitializeNavigation (
72+ isUserLoggedIn : Boolean
73+ ) {
7474 val context = LocalContext .current
7575
7676 val engine = rememberAnimatedNavHostEngine()
7777 navController = engine.rememberNavController()
7878
79- val isUserLoggedIn = runBlocking { preferenceRepository.isLoggedIn().firstOrNull() }
80-
8179 DestinationsNavHost (
82- navGraph = mainNavGraph(isUserLoggedIn = isUserLoggedIn ? : true ),
80+ navGraph = mainNavGraph(isUserLoggedIn = isUserLoggedIn),
8381 navController = navController!! ,
8482 engine = engine,
8583 dependenciesContainerBuilder = {
@@ -89,31 +87,6 @@ internal class MainActivity : ComponentActivity() {
8987 )
9088 }
9189
92- @Composable
93- private fun ObserveLoginStatus () {
94- val isLoggedIn by preferenceRepository.isLoggedIn().collectAsState(initial = true )
95-
96- if (isLoggedIn.not ()) {
97- navController?.apply {
98- clearStack()
99- navigateViaDeepLink(TaskyDeeplink .login)
100- }
101- }
102- }
103-
104- @Composable
105- private fun HandlePermissions () {
106- if (Build .VERSION .SDK_INT < Build .VERSION_CODES .TIRAMISU ) return
107-
108- val launcher = rememberPermissionState(permission = Manifest .permission.POST_NOTIFICATIONS )
109-
110- logInfo(" Notification Permission Status" , launcher.taskyStatus.name)
111-
112- LaunchedEffect (key1 = Unit ) {
113- launcher.launchPermissionRequest()
114- }
115- }
116-
11790 override fun onNewIntent (intent : Intent ? ) {
11891 super .onNewIntent(intent)
11992 navController?.navigateViaDeepLink(intent?.data.toString())
@@ -127,4 +100,26 @@ internal class MainActivity : ComponentActivity() {
127100 }
128101 }
129102 }
103+
104+ @Composable
105+ private fun MainActivityViewModel.HandleSideEffect () {
106+ val launcher = rememberPermissionState(permission = Manifest .permission.POST_NOTIFICATIONS )
107+
108+ LaunchedEffect (Unit ) {
109+ container.sideEffectFlow.collectLatest { effect ->
110+ when (effect) {
111+ MainActivityViewModel .SideEffect .ClearBackStackAndNavigateToLogin -> {
112+ navController?.apply {
113+ clearStack()
114+ navigateViaDeepLink(TaskyDeeplink .login)
115+ }
116+ }
117+
118+ MainActivityViewModel .SideEffect .LaunchNotificationPermissionRequest -> {
119+ launcher.launchPermissionRequest()
120+ }
121+ }
122+ }
123+ }
124+ }
130125}
0 commit comments