diff --git a/CHANGELOG.md b/CHANGELOG.md index d445c3e6..5e5a5336 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## Next +- fix: Check keyboard status during snapshot instead of using WindowInsets listener ([#77](https://github.com/PostHog/posthog-android/pull/77)) + ## 3.1.0 - 2024-01-08 - chore: Add mutations support to Session Recording ([#72](https://github.com/PostHog/posthog-android/pull/72)) diff --git a/posthog-android/src/main/java/com/posthog/android/replay/PostHogReplayIntegration.kt b/posthog-android/src/main/java/com/posthog/android/replay/PostHogReplayIntegration.kt index bd4de33a..2662a5d1 100644 --- a/posthog-android/src/main/java/com/posthog/android/replay/PostHogReplayIntegration.kt +++ b/posthog-android/src/main/java/com/posthog/android/replay/PostHogReplayIntegration.kt @@ -111,34 +111,6 @@ public class PostHogReplayIntegration( } } - // keyboard events - var open = false - ViewCompat.setOnApplyWindowInsetsListener(view) { _, insets -> - val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) - if (open == imeVisible) { - return@setOnApplyWindowInsetsListener insets - } - open = imeVisible - - val payload = mutableMapOf() - if (imeVisible) { - val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom - payload["open"] = true - payload["height"] = imeHeight.densityValue(displayMetrics.density) - } else { - payload["open"] = false - } - - val event = RRCustomEvent( - tag = "keyboard", - payload = payload, - config.dateProvider.currentTimeMillis(), - ) - listOf(event).capture() - - insets - } - val status = ViewTreeSnapshotStatus(listener) decorViews[decorView] = status } @@ -159,6 +131,31 @@ public class PostHogReplayIntegration( } } + private fun detectKeyboardVisibility(view: View, visible: Boolean): Pair { + val insets = ViewCompat.getRootWindowInsets(view) ?: return Pair(visible, null) + val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) + if (visible == imeVisible) { + return Pair(visible, null) + } + + val payload = mutableMapOf() + if (imeVisible) { + val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom + payload["open"] = true + payload["height"] = imeHeight.densityValue(displayMetrics.density) + } else { + payload["open"] = false + } + + val event = RRCustomEvent( + tag = "keyboard", + payload = payload, + config.dateProvider.currentTimeMillis(), + ) + + return Pair(imeVisible, event) + } + private val onTouchEventListener = OnTouchEventListener { motionEvent -> if (!isSessionReplayEnabled) { return@OnTouchEventListener @@ -341,6 +338,13 @@ public class PostHogReplayIntegration( } } + // detect keyboard visibility + val (visible, event) = detectKeyboardVisibility(view, status.keyboardVisible) + status.keyboardVisible = visible + event?.let { + events.add(it) + } + if (events.isNotEmpty()) { events.capture() } diff --git a/posthog-android/src/main/java/com/posthog/android/replay/internal/ViewTreeSnapshotStatus.kt b/posthog-android/src/main/java/com/posthog/android/replay/internal/ViewTreeSnapshotStatus.kt index 925a3c15..96cf90d8 100644 --- a/posthog-android/src/main/java/com/posthog/android/replay/internal/ViewTreeSnapshotStatus.kt +++ b/posthog-android/src/main/java/com/posthog/android/replay/internal/ViewTreeSnapshotStatus.kt @@ -6,5 +6,6 @@ internal class ViewTreeSnapshotStatus( val listener: NextDrawListener, var sentFullSnapshot: Boolean = false, var sentMetaEvent: Boolean = false, + var keyboardVisible: Boolean = false, var lastSnapshot: RRWireframe? = null, )