forked from joreilly/Confetti
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainActivity.kt
More file actions
102 lines (90 loc) · 3.65 KB
/
MainActivity.kt
File metadata and controls
102 lines (90 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
@file:OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
package dev.johnoreilly.confetti
import android.net.Uri
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.lifecycleScope
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.childContext
import com.arkivanov.decompose.defaultComponentContext
import com.arkivanov.decompose.handleDeepLink
import dev.johnoreilly.confetti.account.SignInProcess
import dev.johnoreilly.confetti.decompose.DarkThemeConfig
import dev.johnoreilly.confetti.decompose.DefaultAppComponent
import dev.johnoreilly.confetti.decompose.ThemeBrand
import dev.johnoreilly.confetti.decompose.UserEditableSettings
import dev.johnoreilly.confetti.ui.App
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
class MainActivity : ComponentActivity() {
@OptIn(ExperimentalDecomposeApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
var userEditableSettings by mutableStateOf<UserEditableSettings?>(null)
val signInProcess: SignInProcess by inject()
val appComponent =
handleDeepLink { uri ->
val initialConferenceId = uri?.extractConferenceIdOrNull()
val rootComponentContext = defaultComponentContext(discardSavedState = initialConferenceId != null)
val appComponent = DefaultAppComponent(
componentContext = rootComponentContext.childContext("app"),
initialConferenceId = initialConferenceId,
onSignOut = {
lifecycleScope.launch {
signInProcess.signOut()
}
},
onSignIn = {
lifecycleScope.launch {
signInProcess.signIn(this@MainActivity)
}
}
)
appComponent
} ?: return
setContent {
App(component = appComponent)
}
}
/**
* From a deep link like `https://confetti-app.dev/conference/devfeststockholm2023` extracts `devfeststockholm2023`.
*/
private fun Uri.extractConferenceIdOrNull(): String? {
if (host != "confetti-app.dev") return null
val path = path ?: return null
if (path.firstOrNull() != '/') return null
val parts = path.substring(1).split('/')
if (parts[0] != "conference") return null
val conferenceId = parts.getOrNull(1) ?: return null
if (!conferenceId.all { it.isLetterOrDigit() }) return null
return conferenceId
}
}
@Composable
private fun shouldUseDarkTheme(
darkThemeConfig: DarkThemeConfig?,
): Boolean = when (darkThemeConfig) {
DarkThemeConfig.FOLLOW_SYSTEM, null -> isSystemInDarkTheme()
DarkThemeConfig.LIGHT -> false
DarkThemeConfig.DARK -> true
}
@Composable
private fun shouldUseAndroidTheme(
themeBrand: ThemeBrand?,
): Boolean = when (themeBrand) {
ThemeBrand.DEFAULT, null -> false
ThemeBrand.ANDROID -> true
}
@Composable
private fun shouldDisableDynamicTheming(
useDynamicColor: Boolean?
): Boolean = useDynamicColor?.not() ?: true