@@ -6,8 +6,15 @@ import android.view.ViewGroup
66import android.widget.FrameLayout
77import androidx.compose.ui.platform.ComposeView
88import androidx.core.view.ViewCompat
9- import androidx.datastore.core.DataStore
10- import androidx.datastore.preferences.core.Preferences
9+ import androidx.lifecycle.LifecycleOwner
10+ import androidx.lifecycle.ViewModelStoreOwner
11+ import androidx.lifecycle.findViewTreeLifecycleOwner
12+ import androidx.lifecycle.findViewTreeViewModelStoreOwner
13+ import androidx.lifecycle.setViewTreeLifecycleOwner
14+ import androidx.lifecycle.setViewTreeViewModelStoreOwner
15+ import androidx.savedstate.SavedStateRegistryOwner
16+ import androidx.savedstate.findViewTreeSavedStateRegistryOwner
17+ import androidx.savedstate.setViewTreeSavedStateRegistryOwner
1118import com.tapadoo.debugmenu.module.DebugMenuModule
1219
1320/* *
@@ -25,12 +32,7 @@ object DebugMenuAttacher {
2532 ) {
2633 application.registerActivityLifecycleCallbacks(object : Application .ActivityLifecycleCallbacks {
2734 override fun onActivityCreated (activity : Activity , savedInstanceState : android.os.Bundle ? ) {
28- try {
29- // When attaching to an app that uses an Activity as a splash screen, it can crash
30- DebugMenuAttacher .attach(activity, modules, showFab, enableShake)
31- } catch (e: Exception ) {
32-
33- }
35+ DebugMenuAttacher .attach(activity, modules, showFab, enableShake)
3436 }
3537
3638 override fun onActivityStarted (activity : Activity ) {}
@@ -42,7 +44,6 @@ object DebugMenuAttacher {
4244 })
4345 }
4446
45-
4647 @OptIn(androidx.compose.material3.ExperimentalMaterial3Api ::class )
4748 @JvmStatic
4849 fun attach (
@@ -52,10 +53,29 @@ object DebugMenuAttacher {
5253 enableShake : Boolean = false,
5354 ) = runCatching {
5455 val decor = activity.window?.decorView as ? ViewGroup ? : return @runCatching
56+
5557 // Avoid duplicates
5658 val existing = decor.findViewWithTag<FrameLayout >(TAG )
5759 if (existing != null ) return @runCatching
5860
61+ // Ensure ViewTree owners are set for Compose.
62+ // Some activities like Splash Screens might not call setContentView(), so these are missing.
63+ if (decor.findViewTreeLifecycleOwner() == null ) {
64+ (activity as ? LifecycleOwner )?.let {
65+ decor.setViewTreeLifecycleOwner(it)
66+ }
67+ }
68+ if (decor.findViewTreeViewModelStoreOwner() == null ) {
69+ (activity as ? ViewModelStoreOwner )?.let {
70+ decor.setViewTreeViewModelStoreOwner(it)
71+ }
72+ }
73+ if (decor.findViewTreeSavedStateRegistryOwner() == null ) {
74+ (activity as ? SavedStateRegistryOwner )?.let {
75+ decor.setViewTreeSavedStateRegistryOwner(it)
76+ }
77+ }
78+
5979 val container = FrameLayout (activity).apply {
6080 layoutParams = FrameLayout .LayoutParams (
6181 ViewGroup .LayoutParams .MATCH_PARENT ,
0 commit comments