From c7a0428b96678fb32b4b6de3bd59b243b1d26c20 Mon Sep 17 00:00:00 2001 From: Ryan Moelter Date: Sun, 15 Oct 2023 11:30:20 -0700 Subject: [PATCH] [WIP] Start to proactively handle back --- .../compose/ActivityLifecycleComposeAdapter.kt | 11 +++++++++++ .../magellanx/compose/navigation/ComposeNavigator.kt | 5 +++++ .../magellanx/core/lifecycle/LifecycleAware.kt | 1 + 3 files changed, 17 insertions(+) diff --git a/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/ActivityLifecycleComposeAdapter.kt b/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/ActivityLifecycleComposeAdapter.kt index f1931816..c3b13044 100644 --- a/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/ActivityLifecycleComposeAdapter.kt +++ b/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/ActivityLifecycleComposeAdapter.kt @@ -2,6 +2,7 @@ package com.ryanmoelter.magellanx.compose import android.app.Activity import androidx.activity.ComponentActivity +import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.compose.runtime.Composable import androidx.lifecycle.DefaultLifecycleObserver @@ -55,6 +56,16 @@ public fun ComponentActivity.setContentNavigable(navigable: Navigable<@Composabl val lifecycleAdapter = ActivityLifecycleComposeAdapter(navigable, this) navigable.attachAndAddToStaticMap(lifecycleAdapter, lifecycle) setContent { navigable.Content() } + + onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(false) { + init { + isEnabled = navigable.willHandleBack { willHandleBack -> isEnabled = willHandleBack } + } + + override fun handleOnBackPressed() { + navigable.backPressed() + } + }) } private fun Navigable<@Composable () -> Unit>.attachAndAddToStaticMap( diff --git a/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/navigation/ComposeNavigator.kt b/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/navigation/ComposeNavigator.kt index 14db5c49..d92bcad1 100644 --- a/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/navigation/ComposeNavigator.kt +++ b/magellanx-compose/src/main/java/com/ryanmoelter/magellanx/compose/navigation/ComposeNavigator.kt @@ -68,6 +68,7 @@ public open class ComposeNavigator : AnimatedContent( targetState = currentNavigable, + label = "ComposeNavigator container", transitionSpec = currentTransitionSpec.getTransitionForDirection(currentDirection), ) { navigable -> DisposableEffect( @@ -203,6 +204,10 @@ public open class ComposeNavigator : override fun onBackPressed(): Boolean = currentNavigable?.backPressed() ?: false || goBack() + override fun willHandleBack(changeWillHandleBack: (Boolean) -> Unit): Boolean { + return super.willHandleBack(changeWillHandleBack) + } + public open fun atRoot(): Boolean = backStack.size <= 1 } diff --git a/magellanx-core/src/main/java/com/ryanmoelter/magellanx/core/lifecycle/LifecycleAware.kt b/magellanx-core/src/main/java/com/ryanmoelter/magellanx/core/lifecycle/LifecycleAware.kt index a88db89f..d9fd4ed7 100644 --- a/magellanx-core/src/main/java/com/ryanmoelter/magellanx/core/lifecycle/LifecycleAware.kt +++ b/magellanx-core/src/main/java/com/ryanmoelter/magellanx/core/lifecycle/LifecycleAware.kt @@ -8,4 +8,5 @@ public interface LifecycleAware { public fun hide() {} public fun destroy() {} public fun backPressed(): Boolean = false + public fun willHandleBack(changeWillHandleBack: (Boolean) -> Unit): Boolean = false }