@@ -6,9 +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
1111import 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
1218import com.tapadoo.debugmenu.module.DebugMenuModule
1319
1420/* *
@@ -26,12 +32,7 @@ object DebugMenuAttacher {
2632 ) {
2733 application.registerActivityLifecycleCallbacks(object : Application .ActivityLifecycleCallbacks {
2834 override fun onActivityCreated (activity : Activity , savedInstanceState : android.os.Bundle ? ) {
29- try {
30- // When attaching to an app that uses an Activity as a splash screen, it can crash
31- DebugMenuAttacher .attach(activity, modules, showFab, enableShake)
32- } catch (e: Exception ) {
33-
34- }
35+ DebugMenuAttacher .attach(activity, modules, showFab, enableShake)
3536 }
3637
3738 override fun onActivityStarted (activity : Activity ) {}
@@ -43,7 +44,6 @@ object DebugMenuAttacher {
4344 })
4445 }
4546
46-
4747 @OptIn(androidx.compose.material3.ExperimentalMaterial3Api ::class )
4848 @JvmStatic
4949 fun attach (
@@ -53,12 +53,29 @@ object DebugMenuAttacher {
5353 enableShake : Boolean = false,
5454 ) = runCatching {
5555 val decor = activity.window?.decorView as ? ViewGroup ? : return @runCatching
56- if (decor.findViewTreeLifecycleOwner() == null ) return @runCatching
5756
5857 // Avoid duplicates
5958 val existing = decor.findViewWithTag<FrameLayout >(TAG )
6059 if (existing != null ) return @runCatching
6160
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+
6279 val container = FrameLayout (activity).apply {
6380 layoutParams = FrameLayout .LayoutParams (
6481 ViewGroup .LayoutParams .MATCH_PARENT ,
0 commit comments