From 5e84e5b8b6e590e829ea61c1c60afbf340dfc1f1 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 9 Apr 2021 15:20:39 -0300 Subject: [PATCH] Stop listening to key agreement connections when leaving fragment Also don't liberate screen orientation when backing out of adding a contact nearby --- .../add/nearby/AddNearbyContactActivity.java | 3 ++- .../nearby/AddNearbyContactErrorFragment.java | 19 +++++++++++++++++++ .../add/nearby/AddNearbyContactFragment.java | 18 +++--------------- .../nearby/AddNearbyContactIntroFragment.java | 9 +++++++++ .../add/nearby/AddNearbyContactViewModel.java | 7 +++++-- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java index fcc80cef9..6dd6ca690 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java @@ -103,7 +103,8 @@ public class AddNearbyContactActivity extends BriarActivity @Override public void onBackPressed() { if (viewModel.getState().getValue() instanceof Failed) { - // re-create this activity when going back in failed state + // Re-create this activity when going back in failed state. + // This will also re-create the ViewModel, so we start fresh. Intent i = new Intent(this, AddNearbyContactActivity.class); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactErrorFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactErrorFragment.java index 15dc04848..9944f3663 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactErrorFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactErrorFragment.java @@ -15,8 +15,11 @@ import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.android.util.UiUtils; +import javax.inject.Inject; + import androidx.annotation.Nullable; import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.ViewModelProvider; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; import static android.view.View.GONE; @@ -30,6 +33,11 @@ public class AddNearbyContactErrorFragment extends BaseFragment { AddNearbyContactErrorFragment.class.getName(); private static final String ERROR_MSG = "errorMessage"; + @Inject + ViewModelProvider.Factory viewModelFactory; + + private AddNearbyContactViewModel viewModel; + public static AddNearbyContactErrorFragment newInstance(String errorMsg) { AddNearbyContactErrorFragment f = new AddNearbyContactErrorFragment(); Bundle args = new Bundle(); @@ -46,6 +54,8 @@ public class AddNearbyContactErrorFragment extends BaseFragment { @Override public void injectFragment(ActivityComponent component) { component.inject(this); + viewModel = new ViewModelProvider(requireActivity(), viewModelFactory) + .get(AddNearbyContactViewModel.class); } @Nullable @@ -81,6 +91,15 @@ public class AddNearbyContactErrorFragment extends BaseFragment { return v; } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + // We don't do this in AddNearbyContactFragment#onDestroy() + // because it gets called when creating AddNearbyContactFragment + // in landscape orientation to force portrait orientation. + viewModel.stopListening(); + } + private void triggerFeedback() { UiUtils.triggerFeedback(requireContext()); finish(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactFragment.java index cd1a23f40..fc3d43feb 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactFragment.java @@ -31,7 +31,6 @@ import androidx.annotation.UiThread; import androidx.lifecycle.ViewModelProvider; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; -import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; @@ -86,23 +85,19 @@ public class AddNearbyContactFragment extends BaseFragment public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); cameraView = view.findViewById(R.id.camera_view); + cameraView.setPreviewConsumer(viewModel.getQrCodeDecoder()); cameraOverlay = view.findViewById(R.id.camera_overlay); statusView = view.findViewById(R.id.status_container); status = view.findViewById(R.id.connect_status); qrCodeView = view.findViewById(R.id.qr_code_view); qrCodeView.setFullscreenListener(this); + requireActivity().setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR); + viewModel.getState().observe(getViewLifecycleOwner(), this::onAddContactStateChanged); } - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - requireActivity().setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR); - cameraView.setPreviewConsumer(viewModel.getQrCodeDecoder()); - } - @Override public void onStart() { super.onStart(); @@ -123,13 +118,6 @@ public class AddNearbyContactFragment extends BaseFragment } } - @Override - public void onDestroy() { - requireActivity() - .setRequestedOrientation(SCREEN_ORIENTATION_UNSPECIFIED); - super.onDestroy(); - } - @Override public void setFullscreen(boolean fullscreen) { LinearLayout.LayoutParams statusParams, qrCodeParams; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactIntroFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactIntroFragment.java index 08b61094a..eb5f3aede 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactIntroFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactIntroFragment.java @@ -78,6 +78,15 @@ public class AddNearbyContactIntroFragment extends BaseFragment { return v; } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + // We don't do this in AddNearbyContactFragment#onDestroy() + // because it gets called when creating AddNearbyContactFragment + // in landscape orientation to force portrait orientation. + viewModel.stopListening(); + } + @Override public void onStart() { super.onStart(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java index 769b5f49b..0f7c0e5bb 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java @@ -314,10 +314,13 @@ class AddNearbyContactViewModel extends AndroidViewModel } @UiThread - private void stopListening() { + void stopListening() { KeyAgreementTask oldTask = task; ioExecutor.execute(() -> { - if (oldTask != null) oldTask.stopListening(); + if (oldTask != null) { + oldTask.stopListening(); + task = null; + } }); }