Add a minimal MailboxStatusFragment

This commit is contained in:
Torsten Grote
2022-02-18 10:54:58 -03:00
parent 5e8d5c96fc
commit a567301e49
5 changed files with 148 additions and 8 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.mailbox.ErrorFragment;
import org.briarproject.briar.android.mailbox.MailboxScanFragment;
import org.briarproject.briar.android.mailbox.MailboxStatusFragment;
import org.briarproject.briar.android.mailbox.OfflineFragment;
import org.briarproject.briar.android.mailbox.SetupDownloadFragment;
import org.briarproject.briar.android.removabledrive.ChooserFragment;
@@ -251,4 +252,6 @@ public interface AndroidComponent
void inject(OfflineFragment offlineFragment);
void inject(ErrorFragment errorFragment);
void inject(MailboxStatusFragment mailboxStatusFragment);
}

View File

@@ -3,10 +3,8 @@ package org.briarproject.briar.android.mailbox;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ProgressBar;
import android.widget.Toast;
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxStatus;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
@@ -23,7 +21,6 @@ import androidx.lifecycle.ViewModelProvider;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_LONG;
import static org.briarproject.briar.android.util.UiUtils.showFragment;
@MethodsNotNullByDefault
@@ -66,7 +63,7 @@ public class MailboxActivity extends BriarActivity {
} else if (state instanceof MailboxState.OfflineWhenPairing) {
onOffline();
} else if (state instanceof MailboxState.IsPaired) {
onIsPaired(((MailboxState.IsPaired) state).mailboxStatus);
onIsPaired();
} else {
throw new AssertionError("Unknown state: " + state);
}
@@ -167,10 +164,10 @@ public class MailboxActivity extends BriarActivity {
OfflineFragment.TAG);
}
private void onIsPaired(MailboxStatus mailboxStatus) {
private void onIsPaired() {
progressBar.setVisibility(INVISIBLE);
// TODO
Toast.makeText(this, "NOT IMPLEMENTED", LENGTH_LONG).show();
showFragment(getSupportFragmentManager(), new MailboxStatusFragment(),
MailboxStatusFragment.TAG, false);
}
private void repopulateBackStack() {

View File

@@ -0,0 +1,85 @@
package org.briarproject.briar.android.mailbox;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
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.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider;
import static java.util.Objects.requireNonNull;
import static org.briarproject.briar.android.AppModule.getAndroidComponent;
import static org.briarproject.briar.android.util.UiUtils.formatDate;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class MailboxStatusFragment extends Fragment {
static final String TAG = MailboxStatusFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private MailboxViewModel viewModel;
@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,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_mailbox_status,
container, false);
}
@Override
public void onViewCreated(View v, @Nullable Bundle savedInstanceState) {
super.onViewCreated(v, savedInstanceState);
MailboxState.IsPaired state =
(MailboxState.IsPaired) viewModel.getState().getLastValue();
requireNonNull(state); // TODO check assumption
TextView statusInfoView = v.findViewById(R.id.statusInfoView);
long lastSuccess = state.mailboxStatus.getTimeOfLastSuccess();
String lastConnectionText;
if (lastSuccess < 0) {
lastConnectionText = getString(R.string.pref_lock_timeout_never);
} else {
lastConnectionText = formatDate(requireContext(), lastSuccess);
}
String statusInfoText = getString(
R.string.mailbox_status_connected_info, lastConnectionText);
statusInfoView.setText(statusInfoText);
// TODO
// * react to status changes
// * detect problems and show them
// * update connection time periodically like conversation timestamps
// * add "Check connection" button
// * add "Unlink" button with confirmation dialog
}
@Override
public void onStart() {
super.onStart();
requireActivity().setTitle(R.string.mailbox_status_title);
}
}

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".android.mailbox.MailboxActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/statusTitleView"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
app:srcCompat="@drawable/ic_check_circle_outline"
app:tint="@color/briar_brand_green"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/statusTitleView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:text="@string/mailbox_status_connected_title"
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@+id/imageView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView"
app:layout_constraintTop_toTopOf="@+id/imageView" />
<TextView
android:id="@+id/statusInfoView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/statusTitleView"
app:layout_constraintVertical_bias="0.0"
tools:text="@string/mailbox_status_connected_info" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -614,7 +614,7 @@
<!-- Mailbox -->
<string name="mailbox_settings_title">Mailbox</string>
<string name="mailbox_setup_title">Mailbox Setup</string>
<string name="mailbox_setup_title">Mailbox setup</string>
<string name="mailbox_setup_intro">A Mailbox enables your contacts to send you messages while you are offline. The Mailbox will receive your messages and store them until you come online.\n
\nYou can install the Briar Mailbox app on a spare device. Keep it connected to power and Wi-Fi so it\'s always online.</string>
<string name="mailbox_setup_download">First, install the Mailbox app on another device by searching for \"Briar Mailbox\" on Google Play or wherever you downloaded Briar.\n
@@ -637,6 +637,10 @@
<string name="tor_offline_title">Offline</string>
<string name="tor_offline_description">Ensure that this device is online and connections to the internet are allowed.\n\nAfterwards, wait for the globe icon in connection settings to turn green.</string>
<string name="tor_offline_button_check">Check connection settings</string>
<string name="mailbox_status_title">Mailbox status</string>
<string name="mailbox_status_connected_title">Mailbox is running</string>
<!-- Example for string substitution: Last connection: 3min ago-->
<string name="mailbox_status_connected_info">Last connection: %s</string>
<!-- Conversation Settings -->
<string name="disappearing_messages_title">Disappearing messages</string>