Skip to content

Commit b4cedbc

Browse files
FernandoFernando
authored andcommitted
Fix :: Attaching when no ViewTree is found
1 parent 1fa779b commit b4cedbc

1 file changed

Lines changed: 27 additions & 10 deletions

File tree

debugMenu/src/main/java/com/tapadoo/debugmenu/DebugMenuAttacher.kt

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@ import android.view.ViewGroup
66
import android.widget.FrameLayout
77
import androidx.compose.ui.platform.ComposeView
88
import 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
1111
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
1218
import 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

Comments
 (0)