From 6baebfe140a1be02c7b39d0109e35ef5e861882d Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 8 May 2026 15:35:40 -0400 Subject: [PATCH] Fix PictureInPictureUiState not found crashes. --- .../webrtc/v2/WebRtcCallActivity.kt | 33 ++++++++++++------- .../ui/restore/RemoteRestoreActivity.kt | 12 ++++--- .../securesms/QuickstartRestoreActivity.kt | 12 ++++--- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/WebRtcCallActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/WebRtcCallActivity.kt index 2c8617cd7d..3389fb630f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/WebRtcCallActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/WebRtcCallActivity.kt @@ -122,6 +122,7 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re private var answeredFromNotification: Boolean = false private var ephemeralStateDisposable = Disposable.empty() private val callPermissionsDialogController = CallPermissionsDialogController() + private val eventBusSubscriber = EventBusSubscriber() override fun attachBaseContext(newBase: Context) { delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES @@ -240,8 +241,8 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re initializeScreenshotSecurity() - if (!EventBus.getDefault().isRegistered(this)) { - EventBus.getDefault().register(this) + if (!EventBus.getDefault().isRegistered(eventBusSubscriber)) { + EventBus.getDefault().register(eventBusSubscriber) } val rtcViewModel = EventBus.getDefault().getStickyEvent(WebRtcViewModel::class.java) @@ -285,7 +286,7 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re disableIncomingRingingVanity() if (!isInPipMode() || isFinishing) { - EventBus.getDefault().unregister(this) + EventBus.getDefault().unregister(eventBusSubscriber) } if (!callPermissionsDialogController.isAskingForPermission && !viewModel.isCallStarting && !isChangingConfigurations) { @@ -307,7 +308,7 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re ephemeralStateDisposable.dispose() if (!isInPipMode() || isFinishing) { - EventBus.getDefault().unregister(this) + EventBus.getDefault().unregister(eventBusSubscriber) requestNewSizesThrottle.clear() } @@ -329,7 +330,7 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re Log.d(TAG, "onDestroy") super.onDestroy() windowInfoTrackerCallbackAdapter.removeWindowLayoutInfoListener(windowLayoutInfoConsumer) - EventBus.getDefault().unregister(this) + EventBus.getDefault().unregister(eventBusSubscriber) } @SuppressLint("MissingSuperCall") @@ -387,13 +388,11 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re AppDependencies.signalCallManager.resendMediaKeys() } - @Subscribe(threadMode = ThreadMode.MAIN) - fun onRecaptchaRequiredEvent(recaptchaRequiredEvent: RecaptchaRequiredEvent) { + private fun onRecaptchaRequiredEvent(recaptchaRequiredEvent: RecaptchaRequiredEvent) { RecaptchaProofBottomSheetFragment.show(supportFragmentManager) } - @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - fun onEventMainThread(event: WebRtcViewModel) { + private fun onEventMainThread(event: WebRtcViewModel) { Log.i(TAG, "Got message from service: ${event.describeDifference(previousEvent)}") val previousCallState: WebRtcViewModel.State? = previousEvent?.state @@ -582,8 +581,8 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re if (info.isInPictureInPictureMode) { callScreen.maybeDismissAudioPicker() - if (!EventBus.getDefault().isRegistered(this)) { - EventBus.getDefault().register(this) + if (!EventBus.getDefault().isRegistered(eventBusSubscriber)) { + EventBus.getDefault().register(eventBusSubscriber) } } viewModel.setIsLandscapeEnabled(info.isInPictureInPictureMode) @@ -1410,4 +1409,16 @@ class WebRtcCallActivity : BaseActivity(), SafetyNumberChangeDialog.Callback, Re PendingParticipantsBottomSheet().show(supportFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) } } + + private inner class EventBusSubscriber { + @Subscribe(threadMode = ThreadMode.MAIN) + fun onRecaptchaRequiredEvent(recaptchaRequiredEvent: RecaptchaRequiredEvent) { + this@WebRtcCallActivity.onRecaptchaRequiredEvent(recaptchaRequiredEvent) + } + + @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) + fun onEventMainThread(event: WebRtcViewModel) { + this@WebRtcCallActivity.onEventMainThread(event) + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/RemoteRestoreActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/RemoteRestoreActivity.kt index 26eb85126d..d4bd0475ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/RemoteRestoreActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/RemoteRestoreActivity.kt @@ -113,6 +113,8 @@ class RemoteRestoreActivity : BaseActivity() { private lateinit var wakeLock: RemoteRestoreWakeLock + private val eventBusSubscriber = EventBusSubscriber() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -235,12 +237,14 @@ class RemoteRestoreActivity : BaseActivity() { } } - EventBus.getDefault().registerForLifecycle(subscriber = this, lifecycleOwner = this) + EventBus.getDefault().registerForLifecycle(subscriber = eventBusSubscriber, lifecycleOwner = this) } - @Subscribe(threadMode = ThreadMode.MAIN) - fun onEvent(restoreEvent: RestoreV2Event) { - viewModel.updateRestoreProgress(restoreEvent) + private inner class EventBusSubscriber { + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(restoreEvent: RestoreV2Event) { + viewModel.updateRestoreProgress(restoreEvent) + } } private fun showUnregisteredDialog() { diff --git a/app/src/quickstart/java/org/thoughtcrime/securesms/QuickstartRestoreActivity.kt b/app/src/quickstart/java/org/thoughtcrime/securesms/QuickstartRestoreActivity.kt index 149f8a0699..37e2b359a1 100644 --- a/app/src/quickstart/java/org/thoughtcrime/securesms/QuickstartRestoreActivity.kt +++ b/app/src/quickstart/java/org/thoughtcrime/securesms/QuickstartRestoreActivity.kt @@ -75,6 +75,8 @@ class QuickstartRestoreActivity : BaseActivity() { private var restoreStatus by mutableStateOf("Restoring data...") + private val eventBusSubscriber = EventBusSubscriber() + private val manageStorageLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (hasStorageAccess()) { startRestore() @@ -110,7 +112,7 @@ class QuickstartRestoreActivity : BaseActivity() { } } - org.greenrobot.eventbus.EventBus.getDefault().registerForLifecycle(subscriber = this, lifecycleOwner = this) + org.greenrobot.eventbus.EventBus.getDefault().registerForLifecycle(subscriber = eventBusSubscriber, lifecycleOwner = this) if (hasStorageAccess()) { startRestore() @@ -195,8 +197,10 @@ class QuickstartRestoreActivity : BaseActivity() { } } - @Subscribe(threadMode = ThreadMode.MAIN) - fun onEvent(restoreEvent: RestoreV2Event) { - restoreStatus = "${restoreEvent.type}: ${restoreEvent.count} / ${restoreEvent.estimatedTotalCount}" + private inner class EventBusSubscriber { + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(restoreEvent: RestoreV2Event) { + restoreStatus = "${restoreEvent.type}: ${restoreEvent.count} / ${restoreEvent.estimatedTotalCount}" + } } }