mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-20 14:49:53 +01:00
Show offline fragment before scanning mailbox QR code
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user