Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Decompose for navigation #165

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ dependencies {
implementation(libs.firebase.analytics)
implementation(libs.firebase.crashlytics)

implementation(libs.hyperdrive.multiplatformx.api)
implementation(libs.decompose)

implementation(libs.bundles.androidx.compose)

Expand Down
69 changes: 30 additions & 39 deletions android/src/main/java/co/touchlab/droidcon/android/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
package co.touchlab.droidcon.android

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
// import androidx.compose.animation.Crossfade
// import androidx.compose.foundation.Image
// import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -19,33 +12,53 @@ import androidx.compose.ui.Modifier
// import androidx.compose.ui.Modifier
// import androidx.compose.ui.res.painterResource
// import androidx.compose.ui.unit.dp
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
import androidx.lifecycle.lifecycleScope
import co.touchlab.droidcon.android.ui.theme.Colors
import co.touchlab.droidcon.android.util.DefaultUrlHandler
import co.touchlab.droidcon.android.viewModel.MainViewModel
import co.touchlab.droidcon.application.service.NotificationSchedulingService
import co.touchlab.droidcon.domain.service.AnalyticsService
import co.touchlab.droidcon.domain.service.SyncService
import co.touchlab.droidcon.ui.uiModule
import co.touchlab.droidcon.ui.util.MainView
import co.touchlab.droidcon.viewmodel.ApplicationViewModel
import co.touchlab.droidcon.util.NavigationController
import co.touchlab.droidcon.util.UrlHandler
import co.touchlab.droidcon.viewmodel.ApplicationComponent
import com.arkivanov.decompose.ComponentContext
import com.arkivanov.decompose.defaultComponentContext
import com.google.accompanist.insets.ProvideWindowInsets
import kotlinx.coroutines.awaitCancellation
import org.brightify.hyperdrive.multiplatformx.LifecycleGraph
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.context.loadKoinModules
import org.koin.core.context.unloadKoinModules
import org.koin.dsl.module

class MainActivity: ComponentActivity(), KoinComponent {

private val modules =
module {
single<ComponentContext> { defaultComponentContext() }
single<UrlHandler> { DefaultUrlHandler(this@MainActivity) }
} + uiModule

init {
loadKoinModules(modules)
}

private val notificationSchedulingService: NotificationSchedulingService by inject()
private val syncService: SyncService by inject()
private val analyticsService: AnalyticsService by inject()
private val mainViewModel: MainViewModel by viewModels()

private val applicationViewModel: ApplicationViewModel by inject()

private val root = LifecycleGraph.Root(this)
private val applicationComponent: ApplicationComponent by inject()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -64,12 +77,10 @@ class MainActivity: ComponentActivity(), KoinComponent {

WindowCompat.setDecorFitsSystemWindows(window, false)

root.addChild(applicationViewModel.lifecycle)

setContent {
Box(modifier = Modifier.background(Colors.primary)) {
ProvideWindowInsets {
MainView(viewModel = applicationViewModel)
MainView(component = applicationComponent)
}
}

Expand Down Expand Up @@ -100,31 +111,11 @@ class MainActivity: ComponentActivity(), KoinComponent {

// }
}

lifecycleScope.launchWhenResumed {
val cancelAttach = root.attach(lifecycleScope)
try {
awaitCancellation()
} finally {
cancelAttach.cancel()
}
}
}

override fun onResume() {
super.onResume()
// mainViewModel.initializeFeedbackObserving()
applicationViewModel.onAppear()
}

override fun onDestroy() {
super.onDestroy()
root.removeChild(applicationViewModel.lifecycle)
}
unloadKoinModules(modules)

override fun onBackPressed() {
if (!NavigationController.root.handleBackPress()) {
super.onBackPressed()
}
super.onDestroy()
}
}
53 changes: 29 additions & 24 deletions android/src/main/java/co/touchlab/droidcon/android/MainApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import android.content.Context
import android.content.SharedPreferences
import co.touchlab.droidcon.Constants
import co.touchlab.droidcon.android.service.DateTimeFormatterViewService
import co.touchlab.droidcon.service.ParseUrlViewService
import co.touchlab.droidcon.android.service.impl.AndroidAnalyticsService
import co.touchlab.droidcon.android.service.impl.DefaultDateTimeFormatterViewService
import co.touchlab.droidcon.android.service.impl.DefaultParseUrlViewService
Expand All @@ -15,13 +14,15 @@ import co.touchlab.droidcon.application.service.NotificationSchedulingService
import co.touchlab.droidcon.domain.service.AnalyticsService
import co.touchlab.droidcon.domain.service.impl.ResourceReader
import co.touchlab.droidcon.initKoin
import co.touchlab.droidcon.ui.uiModule
import co.touchlab.droidcon.service.ParseUrlViewService
import co.touchlab.droidcon.util.ClasspathResourceReader
import co.touchlab.droidcon.util.DcDispatchers
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
import com.russhwolf.settings.AndroidSettings
import com.russhwolf.settings.ExperimentalSettingsApi
import com.russhwolf.settings.ObservableSettings
import kotlinx.coroutines.Dispatchers
import org.koin.dsl.module

@OptIn(ExperimentalSettingsApi::class)
Expand All @@ -30,33 +31,37 @@ class MainApp: Application() {
override fun onCreate() {
super.onCreate()
initKoin(
module {
single<Context> { this@MainApp }
single<Class<out Activity>> { MainActivity::class.java }
single<SharedPreferences> {
get<Context>().getSharedPreferences("DROIDCON_SETTINGS", Context.MODE_PRIVATE)
}
single<ObservableSettings> { AndroidSettings(delegate = get()) }
listOf(
module {
single<Context> { this@MainApp }
single<Class<out Activity>> { MainActivity::class.java }
single<SharedPreferences> {
get<Context>().getSharedPreferences("DROIDCON_SETTINGS", Context.MODE_PRIVATE)
}
single<ObservableSettings> { AndroidSettings(delegate = get()) }

single<ParseUrlViewService> {
DefaultParseUrlViewService()
}
single<ParseUrlViewService> {
DefaultParseUrlViewService()
}

single<DateTimeFormatterViewService> {
DefaultDateTimeFormatterViewService(conferenceTimeZone = Constants.conferenceTimeZone)
}
single<ResourceReader> {
ClasspathResourceReader()
}
single<DateTimeFormatterViewService> {
DefaultDateTimeFormatterViewService(conferenceTimeZone = Constants.conferenceTimeZone)
}
single<ResourceReader> {
ClasspathResourceReader()
}

single<NotificationSchedulingService.LocalizedStringFactory> {
NotificationLocalizedStringFactory(context = get())
}
single<NotificationSchedulingService.LocalizedStringFactory> {
NotificationLocalizedStringFactory(context = get())
}

single<AnalyticsService> {
AndroidAnalyticsService(firebaseAnalytics = Firebase.analytics)
}

single<AnalyticsService> {
AndroidAnalyticsService(firebaseAnalytics = Firebase.analytics)
single { DcDispatchers() }
}
} + uiModule
)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package co.touchlab.droidcon.android.util

import android.content.Context
import android.content.Intent
import android.net.Uri
import co.touchlab.droidcon.util.UrlHandler

class DefaultUrlHandler(
private val context: Context,
): UrlHandler {

override fun openUrl(url: String) {
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
}
}
Loading