1
- package pseudoankit.droid.tasky
1
+ package pseudoankit.droid.tasky.launcher
2
2
3
3
import android.Manifest
4
4
import android.content.Intent
5
- import android.os.Build
6
5
import android.os.Bundle
7
6
import android.view.WindowManager
8
7
import androidx.activity.ComponentActivity
@@ -12,29 +11,24 @@ import androidx.compose.foundation.layout.fillMaxSize
12
11
import androidx.compose.material3.Surface
13
12
import androidx.compose.runtime.Composable
14
13
import androidx.compose.runtime.LaunchedEffect
15
- import androidx.compose.runtime.collectAsState
16
- import androidx.compose.runtime.getValue
17
14
import androidx.compose.ui.Modifier
18
15
import androidx.compose.ui.platform.LocalContext
19
16
import androidx.core.splashscreen.SplashScreen
20
17
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
21
18
import androidx.navigation.NavHostController
22
- import com.example.permission_manager.taskyStatus
23
19
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
24
20
import com.google.accompanist.permissions.rememberPermissionState
25
21
import com.ramcosta.composedestinations.DestinationsNavHost
26
22
import com.ramcosta.composedestinations.animations.rememberAnimatedNavHostEngine
27
23
import 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
31
27
import pseudoankit.droid.core.deeplink.TaskyDeeplink
32
- import pseudoankit.droid.core.logger.logInfo
33
28
import pseudoankit.droid.coreui.deeplink.navigateViaDeepLink
34
29
import 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
38
32
import pseudoankit.droid.tasky.util.hide
39
33
import pseudoankit.droid.tasky.util.show
40
34
import pseudoankit.droid.unify.token.UnifyColors
@@ -44,14 +38,14 @@ import pseudoankit.droid.unify.utils.enableTestTagAsResourceId
44
38
@OptIn(ExperimentalAnimationApi ::class , ExperimentalMaterialNavigationApi ::class )
45
39
internal class MainActivity : ComponentActivity () {
46
40
47
- private val preferenceRepository: PreferenceRepository by inject()
48
41
private var navController: NavHostController ? = null
49
42
private val splashScreen: SplashScreen by lazy { installSplashScreen() }
50
43
51
44
override fun onCreate (savedInstanceState : Bundle ? ) {
52
45
splashScreen.show()
53
46
super .onCreate(savedInstanceState)
54
47
48
+ MainActivityModule .loadModules()
55
49
window.setSoftInputMode(WindowManager .LayoutParams .SOFT_INPUT_ADJUST_RESIZE );
56
50
57
51
setContent {
@@ -60,26 +54,30 @@ internal class MainActivity : ComponentActivity() {
60
54
modifier = Modifier .fillMaxSize(),
61
55
color = UnifyColors .White
62
56
) {
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 ()
66
64
HideSplashScreenAfterNavigation ()
67
65
}
68
66
}
69
67
}
70
68
}
71
69
72
70
@Composable
73
- private fun InitializeNavigation () {
71
+ private fun InitializeNavigation (
72
+ isUserLoggedIn : Boolean
73
+ ) {
74
74
val context = LocalContext .current
75
75
76
76
val engine = rememberAnimatedNavHostEngine()
77
77
navController = engine.rememberNavController()
78
78
79
- val isUserLoggedIn = runBlocking { preferenceRepository.isLoggedIn().firstOrNull() }
80
-
81
79
DestinationsNavHost (
82
- navGraph = mainNavGraph(isUserLoggedIn = isUserLoggedIn ? : true ),
80
+ navGraph = mainNavGraph(isUserLoggedIn = isUserLoggedIn),
83
81
navController = navController!! ,
84
82
engine = engine,
85
83
dependenciesContainerBuilder = {
@@ -89,31 +87,6 @@ internal class MainActivity : ComponentActivity() {
89
87
)
90
88
}
91
89
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
-
117
90
override fun onNewIntent (intent : Intent ? ) {
118
91
super .onNewIntent(intent)
119
92
navController?.navigateViaDeepLink(intent?.data.toString())
@@ -127,4 +100,26 @@ internal class MainActivity : ComponentActivity() {
127
100
}
128
101
}
129
102
}
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
+ }
130
125
}
0 commit comments