mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 13:49:53 +01:00
Check if there is data to send and show a message if not
This commit is contained in:
@@ -60,8 +60,9 @@ public class ChooserFragment extends Fragment {
|
|||||||
public void onStart() {
|
public void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
requireActivity().setTitle(R.string.removable_drive_menu_title);
|
requireActivity().setTitle(R.string.removable_drive_menu_title);
|
||||||
if (viewModel.getState().getValue() != null) {
|
TransferDataState state = viewModel.getState().getValue();
|
||||||
// we can't come back here now to start another action
|
if (state instanceof TransferDataState.TaskAvailable) {
|
||||||
|
// we can't come back here now to start another task
|
||||||
// as we only support one per ViewModel instance
|
// as we only support one per ViewModel instance
|
||||||
requireActivity().supportFinishAfterTransition();
|
requireActivity().supportFinishAfterTransition();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ public class ReceiveFragment extends Fragment {
|
|||||||
if (state instanceof TransferDataState.NoDataToSend) {
|
if (state instanceof TransferDataState.NoDataToSend) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
} else if (state instanceof TransferDataState.Ready) {
|
} else if (state instanceof TransferDataState.Ready) {
|
||||||
button.setVisibility(VISIBLE);
|
button.setEnabled(true);
|
||||||
} else if (state instanceof TransferDataState.TaskAvailable) {
|
} else if (state instanceof TransferDataState.TaskAvailable) {
|
||||||
button.setEnabled(false);
|
button.setEnabled(false);
|
||||||
if (((TransferDataState.TaskAvailable) state).isOldTask) {
|
if (((TransferDataState.TaskAvailable) state).isOldTask) {
|
||||||
|
|||||||
@@ -5,37 +5,38 @@ import android.net.Uri;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.Consumer;
|
import org.briarproject.bramble.api.Consumer;
|
||||||
import org.briarproject.bramble.api.contact.ContactId;
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.bramble.api.db.TransactionManager;
|
||||||
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.file.RemovableDriveManager;
|
import org.briarproject.bramble.api.plugin.file.RemovableDriveManager;
|
||||||
import org.briarproject.bramble.api.plugin.file.RemovableDriveTask;
|
import org.briarproject.bramble.api.plugin.file.RemovableDriveTask;
|
||||||
import org.briarproject.bramble.api.plugin.file.RemovableDriveTask.State;
|
import org.briarproject.bramble.api.plugin.file.RemovableDriveTask.State;
|
||||||
import org.briarproject.bramble.api.properties.TransportProperties;
|
import org.briarproject.bramble.api.properties.TransportProperties;
|
||||||
|
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||||
|
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
||||||
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
||||||
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
|
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.logging.Logger;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.lifecycle.AndroidViewModel;
|
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
import static java.util.Locale.US;
|
import static java.util.Locale.US;
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.bramble.api.plugin.file.RemovableDriveConstants.PROP_URI;
|
import static org.briarproject.bramble.api.plugin.file.RemovableDriveConstants.PROP_URI;
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
class RemovableDriveViewModel extends AndroidViewModel {
|
class RemovableDriveViewModel extends DbViewModel {
|
||||||
|
|
||||||
private static final Logger LOG =
|
|
||||||
getLogger(RemovableDriveViewModel.class.getName());
|
|
||||||
|
|
||||||
enum Action {SEND, RECEIVE}
|
enum Action {SEND, RECEIVE}
|
||||||
|
|
||||||
@@ -53,9 +54,14 @@ class RemovableDriveViewModel extends AndroidViewModel {
|
|||||||
private Consumer<State> taskObserver = null;
|
private Consumer<State> taskObserver = null;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
RemovableDriveViewModel(Application app,
|
RemovableDriveViewModel(
|
||||||
|
Application app,
|
||||||
|
@DatabaseExecutor Executor dbExecutor,
|
||||||
|
LifecycleManager lifecycleManager,
|
||||||
|
TransactionManager db,
|
||||||
|
AndroidExecutor androidExecutor,
|
||||||
RemovableDriveManager removableDriveManager) {
|
RemovableDriveManager removableDriveManager) {
|
||||||
super(app);
|
super(app, dbExecutor, lifecycleManager, db, androidExecutor);
|
||||||
this.manager = removableDriveManager;
|
this.manager = removableDriveManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,9 +88,19 @@ class RemovableDriveViewModel extends AndroidViewModel {
|
|||||||
// check if there is already a send/write task
|
// check if there is already a send/write task
|
||||||
task = manager.getCurrentWriterTask();
|
task = manager.getCurrentWriterTask();
|
||||||
if (task == null) {
|
if (task == null) {
|
||||||
// TODO check if there is data to export now
|
// check if there's even something to send
|
||||||
// and only allow to continue if there is.
|
ContactId c = requireNonNull(contactId);
|
||||||
state.setValue(new TransferDataState.Ready());
|
runOnDbThread(() -> {
|
||||||
|
try {
|
||||||
|
if (manager.isWriterTaskNeeded(c)) {
|
||||||
|
state.postValue(new TransferDataState.Ready());
|
||||||
|
} else {
|
||||||
|
state.postValue(new TransferDataState.NoDataToSend());
|
||||||
|
}
|
||||||
|
} catch (DbException e) {
|
||||||
|
handleException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
// observe old task and start with initial state
|
// observe old task and start with initial state
|
||||||
taskObserver = s -> observeTask(s, true);
|
taskObserver = s -> observeTask(s, true);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import androidx.fragment.app.Fragment;
|
|||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
import static android.view.View.GONE;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
import static android.widget.Toast.LENGTH_LONG;
|
import static android.widget.Toast.LENGTH_LONG;
|
||||||
import static org.briarproject.briar.android.AppModule.getAndroidComponent;
|
import static org.briarproject.briar.android.AppModule.getAndroidComponent;
|
||||||
@@ -47,6 +47,7 @@ public class SendFragment extends Fragment {
|
|||||||
TextView introTextView;
|
TextView introTextView;
|
||||||
Button button;
|
Button button;
|
||||||
ProgressBar progressBar;
|
ProgressBar progressBar;
|
||||||
|
boolean hasShownOldTaskToast = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Context context) {
|
public void onAttach(Context context) {
|
||||||
@@ -86,14 +87,16 @@ public class SendFragment extends Fragment {
|
|||||||
private void onStateChanged(TransferDataState state) {
|
private void onStateChanged(TransferDataState state) {
|
||||||
if (state instanceof TransferDataState.NoDataToSend) {
|
if (state instanceof TransferDataState.NoDataToSend) {
|
||||||
introTextView.setText(R.string.removable_drive_send_no_data);
|
introTextView.setText(R.string.removable_drive_send_no_data);
|
||||||
button.setVisibility(GONE);
|
button.setEnabled(false);
|
||||||
} else if (state instanceof TransferDataState.Ready) {
|
} else if (state instanceof TransferDataState.Ready) {
|
||||||
button.setVisibility(VISIBLE);
|
button.setEnabled(true);
|
||||||
} else if (state instanceof TransferDataState.TaskAvailable) {
|
} else if (state instanceof TransferDataState.TaskAvailable) {
|
||||||
button.setEnabled(false);
|
button.setEnabled(false);
|
||||||
if (((TransferDataState.TaskAvailable) state).isOldTask) {
|
if (!hasShownOldTaskToast &&
|
||||||
|
((TransferDataState.TaskAvailable) state).isOldTask) {
|
||||||
Toast.makeText(requireContext(),
|
Toast.makeText(requireContext(),
|
||||||
R.string.removable_drive_ongoing, LENGTH_LONG).show();
|
R.string.removable_drive_ongoing, LENGTH_LONG).show();
|
||||||
|
hasShownOldTaskToast = true;
|
||||||
}
|
}
|
||||||
RemovableDriveTask.State s =
|
RemovableDriveTask.State s =
|
||||||
((TransferDataState.TaskAvailable) state).state;
|
((TransferDataState.TaskAvailable) state).state;
|
||||||
@@ -102,7 +105,11 @@ public class SendFragment extends Fragment {
|
|||||||
// FIXME if we ever export more than 2 GB, this won't work
|
// FIXME if we ever export more than 2 GB, this won't work
|
||||||
progressBar.setMax((int) s.getTotal());
|
progressBar.setMax((int) s.getTotal());
|
||||||
}
|
}
|
||||||
progressBar.setProgress((int) s.getDone());
|
if (SDK_INT >= 24) {
|
||||||
|
progressBar.setProgress((int) s.getDone(), true);
|
||||||
|
} else {
|
||||||
|
progressBar.setProgress((int) s.getDone());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import java.util.logging.Logger;
|
|||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
import androidx.annotation.AnyThread;
|
import androidx.annotation.AnyThread;
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.UiThread;
|
import androidx.annotation.UiThread;
|
||||||
import androidx.arch.core.util.Function;
|
import androidx.arch.core.util.Function;
|
||||||
@@ -50,7 +49,7 @@ public abstract class DbViewModel extends AndroidViewModel {
|
|||||||
protected final AndroidExecutor androidExecutor;
|
protected final AndroidExecutor androidExecutor;
|
||||||
|
|
||||||
public DbViewModel(
|
public DbViewModel(
|
||||||
@NonNull Application application,
|
Application application,
|
||||||
@DatabaseExecutor Executor dbExecutor,
|
@DatabaseExecutor Executor dbExecutor,
|
||||||
LifecycleManager lifecycleManager,
|
LifecycleManager lifecycleManager,
|
||||||
TransactionManager db,
|
TransactionManager db,
|
||||||
|
|||||||
@@ -95,11 +95,10 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="16dp"
|
android:layout_margin="16dp"
|
||||||
|
android:enabled="false"
|
||||||
android:text="@string/removable_drive_receive_button"
|
android:text="@string/removable_drive_receive_button"
|
||||||
android:visibility="gone"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent" />
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -98,11 +98,10 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="16dp"
|
android:layout_margin="16dp"
|
||||||
|
android:enabled="false"
|
||||||
android:text="@string/removable_drive_send_button"
|
android:text="@string/removable_drive_send_button"
|
||||||
android:visibility="gone"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent" />
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
Reference in New Issue
Block a user