From 3055338ea888770790b59b633a5db66bcf37a697 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 10 Feb 2022 08:50:32 -0300 Subject: [PATCH] Show offline fragment before scanning mailbox QR code --- .../briar/android/AndroidComponent.java | 3 ++ .../android/mailbox/MailboxActivity.java | 11 +++++- .../briar/android/mailbox/MailboxState.java | 12 +++++- .../android/mailbox/MailboxViewModel.java | 39 +++++++++++++------ .../android/mailbox/OfflineFragment.java | 12 +++++- .../mailbox/SetupDownloadFragment.java | 25 +++++++++--- 6 files changed, 81 insertions(+), 21 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java index 15506f6bb..e5b3d55dc 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java @@ -46,6 +46,7 @@ import org.briarproject.briar.android.logging.CachingLogHandler; import org.briarproject.briar.android.login.SignInReminderReceiver; import org.briarproject.briar.android.mailbox.MailboxScanFragment; import org.briarproject.briar.android.mailbox.OfflineFragment; +import org.briarproject.briar.android.mailbox.SetupDownloadFragment; import org.briarproject.briar.android.removabledrive.ChooserFragment; import org.briarproject.briar.android.removabledrive.ReceiveFragment; import org.briarproject.briar.android.removabledrive.SendFragment; @@ -242,6 +243,8 @@ public interface AndroidComponent void inject(BluetoothIntroFragment bluetoothIntroFragment); + void inject(SetupDownloadFragment setupDownloadFragment); + void inject(MailboxScanFragment mailboxScanFragment); void inject(OfflineFragment offlineFragment); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxActivity.java index 4c70b9819..9570f4740 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxActivity.java @@ -50,9 +50,11 @@ public class MailboxActivity extends BriarActivity { progressBar.setVisibility(VISIBLE); } - viewModel.getState().observe(this, state -> { + viewModel.getState().observeEvent(this, state -> { if (state instanceof MailboxState.NotSetup) { onNotSetup(); + } else if (state instanceof MailboxState.ScanningQrCode) { + onScanningQrCode(); } else if (state instanceof MailboxState.SettingUp) { onCodeScanned(); } else if (state instanceof MailboxState.QrCodeWrong) { @@ -79,7 +81,7 @@ public class MailboxActivity extends BriarActivity { @Override public void onBackPressed() { if (viewModel.getState() - .getValue() instanceof MailboxState.SettingUp) { + .getLastValue() instanceof MailboxState.SettingUp) { // don't go back in flow if we are already setting up mailbox supportFinishAfterTransition(); } else { @@ -95,6 +97,11 @@ public class MailboxActivity extends BriarActivity { .commit(); } + private void onScanningQrCode() { + showFragment(getSupportFragmentManager(), new MailboxScanFragment(), + MailboxScanFragment.TAG); + } + private void onCodeScanned() { showFragment(getSupportFragmentManager(), new MailboxConnectingFragment(), diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxState.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxState.java index 65de4d166..caa6400e1 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxState.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxState.java @@ -3,11 +3,16 @@ package org.briarproject.briar.android.mailbox; import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxStatus; +import androidx.annotation.Nullable; + class MailboxState { static class NotSetup extends MailboxState { } + static class ScanningQrCode extends MailboxState { + } + static class SettingUp extends MailboxState { } @@ -15,11 +20,16 @@ class MailboxState { } static class OfflineInSetup extends MailboxState { + @Nullable final MailboxProperties mailboxProperties; - OfflineInSetup(MailboxProperties mailboxProperties) { + OfflineInSetup(@Nullable MailboxProperties mailboxProperties) { this.mailboxProperties = mailboxProperties; } + + OfflineInSetup() { + this(null); + } } static class IsSetup extends MailboxState { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java index 7381a220c..1c199aa59 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java @@ -22,6 +22,8 @@ import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.briar.android.mailbox.MailboxState.NotSetup; import org.briarproject.briar.android.qrcode.QrCodeDecoder; import org.briarproject.briar.android.viewmodel.DbViewModel; +import org.briarproject.briar.android.viewmodel.LiveEvent; +import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import java.nio.charset.Charset; import java.util.Arrays; @@ -31,8 +33,6 @@ import java.util.logging.Logger; import javax.inject.Inject; import androidx.annotation.UiThread; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; import static java.util.Objects.requireNonNull; import static java.util.logging.Level.WARNING; @@ -55,7 +55,8 @@ class MailboxViewModel extends DbViewModel private final PluginManager pluginManager; private final MailboxSettingsManager mailboxSettingsManager; - private final MutableLiveData state = new MutableLiveData<>(); + private final MutableLiveEvent state = + new MutableLiveEvent<>(); @Inject MailboxViewModel( @@ -81,15 +82,24 @@ class MailboxViewModel extends DbViewModel runOnDbThread(true, txn -> { MailboxProperties props = mailboxSettingsManager.getOwnMailboxProperties(txn); - if (props == null) state.postValue(new NotSetup()); + if (props == null) state.postEvent(new NotSetup()); else { MailboxStatus mailboxStatus = mailboxSettingsManager.getOwnMailboxStatus(txn); - state.postValue(new MailboxState.IsSetup(mailboxStatus)); + state.postEvent(new MailboxState.IsSetup(mailboxStatus)); } }, this::handleException); } + @UiThread + void onScanButtonClicked() { + if (isTorActive()) { + state.setEvent(new MailboxState.ScanningQrCode()); + } else { + state.setEvent(new MailboxState.OfflineInSetup()); + } + } + @Override @IoExecutor public void onQrCodeDecoded(Result result) { @@ -98,12 +108,13 @@ class MailboxViewModel extends DbViewModel try { properties = decodeQrCode(result.getText()); } catch (FormatException e) { - state.postValue(new MailboxState.QrCodeWrong()); + state.postEvent(new MailboxState.QrCodeWrong()); return; } onMailboxPropertiesReceived(properties); } + @IoExecutor // TODO move this into core #2168 private MailboxProperties decodeQrCode(String payload) throws FormatException { @@ -133,9 +144,9 @@ class MailboxViewModel extends DbViewModel private void onMailboxPropertiesReceived(MailboxProperties properties) { if (isTorActive()) { // TODO pass props to core #2168 - state.postValue(new MailboxState.SettingUp()); + state.postEvent(new MailboxState.SettingUp()); } else { - state.postValue(new MailboxState.OfflineInSetup(properties)); + state.postEvent(new MailboxState.OfflineInSetup(properties)); } } @@ -148,8 +159,13 @@ class MailboxViewModel extends DbViewModel @UiThread void tryAgainWhenOffline() { MailboxState.OfflineInSetup offline = - (MailboxState.OfflineInSetup) requireNonNull(state.getValue()); - onMailboxPropertiesReceived(offline.mailboxProperties); + (MailboxState.OfflineInSetup) requireNonNull( + state.getLastValue()); + if (offline.mailboxProperties == null) { + onScanButtonClicked(); + } else { + onMailboxPropertiesReceived(offline.mailboxProperties); + } } @UiThread @@ -158,8 +174,7 @@ class MailboxViewModel extends DbViewModel } @UiThread - LiveData getState() { + LiveEvent getState() { return state; } - } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/OfflineFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/OfflineFragment.java index 0e99b6a93..426852f43 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/OfflineFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/OfflineFragment.java @@ -26,6 +26,7 @@ import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.ViewModelProvider; import static android.view.View.FOCUS_DOWN; +import static java.util.Objects.requireNonNull; import static org.briarproject.briar.android.AppModule.getAndroidComponent; @MethodsNotNullByDefault @@ -94,7 +95,16 @@ public class OfflineFragment extends Fragment { } private void onBackButtonPressed() { - requireActivity().supportFinishAfterTransition(); + MailboxState state = viewModel.getState().getLastValue(); + MailboxState.OfflineInSetup offline = + (MailboxState.OfflineInSetup) requireNonNull(state); + if (offline.mailboxProperties == null) { + // not yet scanned, go back to previous fragment + requireActivity().getSupportFragmentManager().popBackStack(); + } else { + // we had scanned already, so go back to beginning + requireActivity().supportFinishAfterTransition(); + } } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/SetupDownloadFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/SetupDownloadFragment.java index b1683b885..2ca7484f5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/SetupDownloadFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/SetupDownloadFragment.java @@ -14,16 +14,19 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.briar.R; +import javax.inject.Inject; + import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.ViewModelProvider; import static android.content.Intent.ACTION_SEND; import static android.content.Intent.EXTRA_TEXT; import static android.widget.Toast.LENGTH_LONG; -import static org.briarproject.briar.android.util.UiUtils.showFragment; +import static org.briarproject.briar.android.AppModule.getAndroidComponent; @MethodsNotNullByDefault @ParametersNotNullByDefault @@ -31,6 +34,11 @@ public class SetupDownloadFragment extends Fragment { static final String TAG = SetupDownloadFragment.class.getName(); + @Inject + ViewModelProvider.Factory viewModelFactory; + + private MailboxViewModel viewModel; + private CameraPermissionManager permissionManager; private final ActivityResultLauncher permissionLauncher = @@ -41,6 +49,15 @@ public class SetupDownloadFragment extends Fragment { } }); + @Override + public void onAttach(Context context) { + super.onAttach(context); + FragmentActivity activity = requireActivity(); + getAndroidComponent(activity).inject(this); + viewModel = new ViewModelProvider(activity, viewModelFactory) + .get(MailboxViewModel.class); + } + @Nullable @Override public View onCreateView(LayoutInflater inflater, @@ -95,9 +112,7 @@ public class SetupDownloadFragment extends Fragment { } private void scanCode() { - FragmentManager fm = getParentFragmentManager(); - Fragment f = new MailboxScanFragment(); - showFragment(fm, f, MailboxScanFragment.TAG); + viewModel.onScanButtonClicked(); } }