From c29aff21677ae3d43cac7016fd3e3ed2a025d36a Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Mon, 21 Mar 2016 22:22:57 +1100 Subject: [PATCH] Correctly unregister receiver in "connecting" swap view (Fixes #409) Previously the receiver was added but never removed. The result is that once a swap session is cancelled, the receiver still gets broadcasts. This is what was causing the bug in #409. It was trying to access the `Activity` once it had been closed, and another swap session started with a new activity. --- .../fdroid/fdroid/views/swap/SwapConnecting.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapConnecting.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapConnecting.java index a14c82021..387ffdceb 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapConnecting.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapConnecting.java @@ -61,13 +61,24 @@ public class SwapConnecting extends LinearLayout implements SwapWorkflowActivity } }); - // TODO: Unregister correctly, not just when being notified of completion or errors. LocalBroadcastManager.getInstance(getActivity()).registerReceiver( repoUpdateReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS)); LocalBroadcastManager.getInstance(getActivity()).registerReceiver( prepareSwapReceiver, new IntentFilter(SwapWorkflowActivity.PrepareSwapRepo.ACTION)); } + /** + * Remove relevant listeners/receivers/etc so that they do not receive and process events + * when this view is not in use. + */ + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(repoUpdateReceiver); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(prepareSwapReceiver); + } + private final BroadcastReceiver repoUpdateReceiver = new ConnectSwapReceiver(); private final BroadcastReceiver prepareSwapReceiver = new PrepareSwapReceiver();