Show offline fragment before scanning mailbox QR code

This commit is contained in:
Torsten Grote
2022-02-10 08:50:32 -03:00
parent e4a7b1731a
commit 3055338ea8
6 changed files with 81 additions and 21 deletions

View File

@@ -46,6 +46,7 @@ import org.briarproject.briar.android.logging.CachingLogHandler;
import org.briarproject.briar.android.login.SignInReminderReceiver; import org.briarproject.briar.android.login.SignInReminderReceiver;
import org.briarproject.briar.android.mailbox.MailboxScanFragment; import org.briarproject.briar.android.mailbox.MailboxScanFragment;
import org.briarproject.briar.android.mailbox.OfflineFragment; 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.ChooserFragment;
import org.briarproject.briar.android.removabledrive.ReceiveFragment; import org.briarproject.briar.android.removabledrive.ReceiveFragment;
import org.briarproject.briar.android.removabledrive.SendFragment; import org.briarproject.briar.android.removabledrive.SendFragment;
@@ -242,6 +243,8 @@ public interface AndroidComponent
void inject(BluetoothIntroFragment bluetoothIntroFragment); void inject(BluetoothIntroFragment bluetoothIntroFragment);
void inject(SetupDownloadFragment setupDownloadFragment);
void inject(MailboxScanFragment mailboxScanFragment); void inject(MailboxScanFragment mailboxScanFragment);
void inject(OfflineFragment offlineFragment); void inject(OfflineFragment offlineFragment);

View File

@@ -50,9 +50,11 @@ public class MailboxActivity extends BriarActivity {
progressBar.setVisibility(VISIBLE); progressBar.setVisibility(VISIBLE);
} }
viewModel.getState().observe(this, state -> { viewModel.getState().observeEvent(this, state -> {
if (state instanceof MailboxState.NotSetup) { if (state instanceof MailboxState.NotSetup) {
onNotSetup(); onNotSetup();
} else if (state instanceof MailboxState.ScanningQrCode) {
onScanningQrCode();
} else if (state instanceof MailboxState.SettingUp) { } else if (state instanceof MailboxState.SettingUp) {
onCodeScanned(); onCodeScanned();
} else if (state instanceof MailboxState.QrCodeWrong) { } else if (state instanceof MailboxState.QrCodeWrong) {
@@ -79,7 +81,7 @@ public class MailboxActivity extends BriarActivity {
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (viewModel.getState() if (viewModel.getState()
.getValue() instanceof MailboxState.SettingUp) { .getLastValue() instanceof MailboxState.SettingUp) {
// don't go back in flow if we are already setting up mailbox // don't go back in flow if we are already setting up mailbox
supportFinishAfterTransition(); supportFinishAfterTransition();
} else { } else {
@@ -95,6 +97,11 @@ public class MailboxActivity extends BriarActivity {
.commit(); .commit();
} }
private void onScanningQrCode() {
showFragment(getSupportFragmentManager(), new MailboxScanFragment(),
MailboxScanFragment.TAG);
}
private void onCodeScanned() { private void onCodeScanned() {
showFragment(getSupportFragmentManager(), showFragment(getSupportFragmentManager(),
new MailboxConnectingFragment(), new MailboxConnectingFragment(),

View File

@@ -3,11 +3,16 @@ package org.briarproject.briar.android.mailbox;
import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.mailbox.MailboxStatus;
import androidx.annotation.Nullable;
class MailboxState { class MailboxState {
static class NotSetup extends MailboxState { static class NotSetup extends MailboxState {
} }
static class ScanningQrCode extends MailboxState {
}
static class SettingUp extends MailboxState { static class SettingUp extends MailboxState {
} }
@@ -15,11 +20,16 @@ class MailboxState {
} }
static class OfflineInSetup extends MailboxState { static class OfflineInSetup extends MailboxState {
@Nullable
final MailboxProperties mailboxProperties; final MailboxProperties mailboxProperties;
OfflineInSetup(MailboxProperties mailboxProperties) { OfflineInSetup(@Nullable MailboxProperties mailboxProperties) {
this.mailboxProperties = mailboxProperties; this.mailboxProperties = mailboxProperties;
} }
OfflineInSetup() {
this(null);
}
} }
static class IsSetup extends MailboxState { static class IsSetup extends MailboxState {

View File

@@ -22,6 +22,8 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.mailbox.MailboxState.NotSetup; import org.briarproject.briar.android.mailbox.MailboxState.NotSetup;
import org.briarproject.briar.android.qrcode.QrCodeDecoder; import org.briarproject.briar.android.qrcode.QrCodeDecoder;
import org.briarproject.briar.android.viewmodel.DbViewModel; 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.nio.charset.Charset;
import java.util.Arrays; import java.util.Arrays;
@@ -31,8 +33,6 @@ import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
@@ -55,7 +55,8 @@ class MailboxViewModel extends DbViewModel
private final PluginManager pluginManager; private final PluginManager pluginManager;
private final MailboxSettingsManager mailboxSettingsManager; private final MailboxSettingsManager mailboxSettingsManager;
private final MutableLiveData<MailboxState> state = new MutableLiveData<>(); private final MutableLiveEvent<MailboxState> state =
new MutableLiveEvent<>();
@Inject @Inject
MailboxViewModel( MailboxViewModel(
@@ -81,15 +82,24 @@ class MailboxViewModel extends DbViewModel
runOnDbThread(true, txn -> { runOnDbThread(true, txn -> {
MailboxProperties props = MailboxProperties props =
mailboxSettingsManager.getOwnMailboxProperties(txn); mailboxSettingsManager.getOwnMailboxProperties(txn);
if (props == null) state.postValue(new NotSetup()); if (props == null) state.postEvent(new NotSetup());
else { else {
MailboxStatus mailboxStatus = MailboxStatus mailboxStatus =
mailboxSettingsManager.getOwnMailboxStatus(txn); mailboxSettingsManager.getOwnMailboxStatus(txn);
state.postValue(new MailboxState.IsSetup(mailboxStatus)); state.postEvent(new MailboxState.IsSetup(mailboxStatus));
} }
}, this::handleException); }, this::handleException);
} }
@UiThread
void onScanButtonClicked() {
if (isTorActive()) {
state.setEvent(new MailboxState.ScanningQrCode());
} else {
state.setEvent(new MailboxState.OfflineInSetup());
}
}
@Override @Override
@IoExecutor @IoExecutor
public void onQrCodeDecoded(Result result) { public void onQrCodeDecoded(Result result) {
@@ -98,12 +108,13 @@ class MailboxViewModel extends DbViewModel
try { try {
properties = decodeQrCode(result.getText()); properties = decodeQrCode(result.getText());
} catch (FormatException e) { } catch (FormatException e) {
state.postValue(new MailboxState.QrCodeWrong()); state.postEvent(new MailboxState.QrCodeWrong());
return; return;
} }
onMailboxPropertiesReceived(properties); onMailboxPropertiesReceived(properties);
} }
@IoExecutor
// TODO move this into core #2168 // TODO move this into core #2168
private MailboxProperties decodeQrCode(String payload) private MailboxProperties decodeQrCode(String payload)
throws FormatException { throws FormatException {
@@ -133,9 +144,9 @@ class MailboxViewModel extends DbViewModel
private void onMailboxPropertiesReceived(MailboxProperties properties) { private void onMailboxPropertiesReceived(MailboxProperties properties) {
if (isTorActive()) { if (isTorActive()) {
// TODO pass props to core #2168 // TODO pass props to core #2168
state.postValue(new MailboxState.SettingUp()); state.postEvent(new MailboxState.SettingUp());
} else { } else {
state.postValue(new MailboxState.OfflineInSetup(properties)); state.postEvent(new MailboxState.OfflineInSetup(properties));
} }
} }
@@ -148,8 +159,13 @@ class MailboxViewModel extends DbViewModel
@UiThread @UiThread
void tryAgainWhenOffline() { void tryAgainWhenOffline() {
MailboxState.OfflineInSetup offline = MailboxState.OfflineInSetup offline =
(MailboxState.OfflineInSetup) requireNonNull(state.getValue()); (MailboxState.OfflineInSetup) requireNonNull(
onMailboxPropertiesReceived(offline.mailboxProperties); state.getLastValue());
if (offline.mailboxProperties == null) {
onScanButtonClicked();
} else {
onMailboxPropertiesReceived(offline.mailboxProperties);
}
} }
@UiThread @UiThread
@@ -158,8 +174,7 @@ class MailboxViewModel extends DbViewModel
} }
@UiThread @UiThread
LiveData<MailboxState> getState() { LiveEvent<MailboxState> getState() {
return state; return state;
} }
} }

View File

@@ -26,6 +26,7 @@ import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import static android.view.View.FOCUS_DOWN; import static android.view.View.FOCUS_DOWN;
import static java.util.Objects.requireNonNull;
import static org.briarproject.briar.android.AppModule.getAndroidComponent; import static org.briarproject.briar.android.AppModule.getAndroidComponent;
@MethodsNotNullByDefault @MethodsNotNullByDefault
@@ -94,7 +95,16 @@ public class OfflineFragment extends Fragment {
} }
private void onBackButtonPressed() { 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();
}
} }
} }

View File

@@ -14,16 +14,19 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import javax.inject.Inject;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions; import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; 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.ACTION_SEND;
import static android.content.Intent.EXTRA_TEXT; import static android.content.Intent.EXTRA_TEXT;
import static android.widget.Toast.LENGTH_LONG; 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 @MethodsNotNullByDefault
@ParametersNotNullByDefault @ParametersNotNullByDefault
@@ -31,6 +34,11 @@ public class SetupDownloadFragment extends Fragment {
static final String TAG = SetupDownloadFragment.class.getName(); static final String TAG = SetupDownloadFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private MailboxViewModel viewModel;
private CameraPermissionManager permissionManager; private CameraPermissionManager permissionManager;
private final ActivityResultLauncher<String[]> permissionLauncher = private final ActivityResultLauncher<String[]> 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 @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, public View onCreateView(LayoutInflater inflater,
@@ -95,9 +112,7 @@ public class SetupDownloadFragment extends Fragment {
} }
private void scanCode() { private void scanCode() {
FragmentManager fm = getParentFragmentManager(); viewModel.onScanButtonClicked();
Fragment f = new MailboxScanFragment();
showFragment(fm, f, MailboxScanFragment.TAG);
} }
} }