Browse Source

fix: simplify ComposeView overlay without custom lifecycle owner

- Remove complex OverlayLifecycleOwner implementation
- Remove ViewTreeLifecycleOwner references (not available in this API level)
- Use basic ComposeView without explicit lifecycle management
- Let ComposeView handle its own lifecycle in overlay context

Some Android versions support ComposeView in overlay without explicit lifecycle.
If this still fails, we'll fall back to View-based FAB implementation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com)
feature/modern-capture-ui
Quildra 5 months ago
parent
commit
c091065933
  1. 48
      app/src/main/java/com/quillstudios/pokegoalshelper/ui/FloatingComposeOverlay.kt

48
app/src/main/java/com/quillstudios/pokegoalshelper/ui/FloatingComposeOverlay.kt

@ -7,14 +7,6 @@ import android.util.Log
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.ViewTreeLifecycleOwner
import androidx.savedstate.SavedStateRegistry
import androidx.savedstate.SavedStateRegistryController
import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.ViewTreeSavedStateRegistryOwner
import androidx.compose.animation.*
import androidx.compose.animation.core.*
import androidx.compose.foundation.gestures.detectDragGestures
@ -38,37 +30,6 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.quillstudios.pokegoalshelper.ui.theme.PokeGoalsHelperTheme
/**
* Simple lifecycle owner for ComposeView in overlay context
*/
class OverlayLifecycleOwner : LifecycleOwner, SavedStateRegistryOwner {
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
private val savedStateRegistryController = SavedStateRegistryController.create(this)
init {
savedStateRegistryController.performRestore(null)
lifecycleRegistry.currentState = Lifecycle.State.CREATED
}
fun onCreate() {
lifecycleRegistry.currentState = Lifecycle.State.CREATED
}
fun onStart() {
lifecycleRegistry.currentState = Lifecycle.State.STARTED
}
fun onResume() {
lifecycleRegistry.currentState = Lifecycle.State.RESUMED
}
fun onDestroy() {
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
override val lifecycle: Lifecycle = lifecycleRegistry
override val savedStateRegistry: SavedStateRegistry = savedStateRegistryController.savedStateRegistry
}
/**
* True floating overlay using WindowManager + ComposeView.
@ -88,7 +49,6 @@ class FloatingComposeOverlay(
private var windowManager: WindowManager? = null
private var overlayView: ComposeView? = null
private var isShowing = false
private val lifecycleOwner = OverlayLifecycleOwner()
// Mutable state for Compose
private var fabPosition = mutableStateOf(Offset.Zero)
@ -98,9 +58,6 @@ class FloatingComposeOverlay(
try {
windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
lifecycleOwner.onCreate()
lifecycleOwner.onStart()
lifecycleOwner.onResume()
createOverlayView()
isShowing = true
Log.d(TAG, "✅ Floating Compose overlay shown")
@ -113,7 +70,6 @@ class FloatingComposeOverlay(
if (!isShowing) return
try {
lifecycleOwner.onDestroy()
overlayView?.let { windowManager?.removeView(it) }
overlayView = null
windowManager = null
@ -126,10 +82,6 @@ class FloatingComposeOverlay(
private fun createOverlayView() {
overlayView = ComposeView(context).apply {
// Set lifecycle owner for ComposeView
ViewTreeLifecycleOwner.set(this, lifecycleOwner)
ViewTreeSavedStateRegistryOwner.set(this, lifecycleOwner)
setContent {
PokeGoalsHelperTheme {
FloatingFABContent(

Loading…
Cancel
Save