Remove manual initial state and oldTask state argument

The latter is now handled via a LiveEvent
This commit is contained in:
Torsten Grote
2021-06-21 11:41:16 -03:00
parent f457a5e831
commit d174757ef0
4 changed files with 39 additions and 34 deletions

View File

@@ -72,6 +72,8 @@ public class ReceiveFragment extends Fragment {
button.setOnClickListener(view -> button.setOnClickListener(view ->
launcher.launch("*/*") launcher.launch("*/*")
); );
viewModel.getOldTaskResumedEvent()
.observeEvent(getViewLifecycleOwner(), this::onOldTaskResumed);
viewModel.getState() viewModel.getState()
.observe(getViewLifecycleOwner(), this::onStateChanged); .observe(getViewLifecycleOwner(), this::onStateChanged);
return v; return v;
@@ -83,6 +85,13 @@ public class ReceiveFragment extends Fragment {
requireActivity().setTitle(R.string.removable_drive_title_receive); requireActivity().setTitle(R.string.removable_drive_title_receive);
} }
private void onOldTaskResumed(boolean resumed) {
if (resumed) {
Toast.makeText(requireContext(),
R.string.removable_drive_ongoing, LENGTH_LONG).show();
}
}
private void onStateChanged(TransferDataState state) { private void onStateChanged(TransferDataState state) {
if (state instanceof TransferDataState.NoDataToSend) { if (state instanceof TransferDataState.NoDataToSend) {
throw new IllegalStateException(); throw new IllegalStateException();
@@ -90,10 +99,6 @@ public class ReceiveFragment extends Fragment {
button.setEnabled(true); 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) {
Toast.makeText(requireContext(),
R.string.removable_drive_ongoing, LENGTH_LONG).show();
}
progressBar.setVisibility(VISIBLE); progressBar.setVisibility(VISIBLE);
} }
} }

View File

@@ -43,9 +43,10 @@ class RemovableDriveViewModel extends DbViewModel {
private final RemovableDriveManager manager; private final RemovableDriveManager manager;
private final MutableLiveEvent<Action> action = new MutableLiveEvent<>(); private final MutableLiveEvent<Action> action = new MutableLiveEvent<>();
private final MutableLiveEvent<Boolean> oldTaskResumed =
new MutableLiveEvent<>();
private final MutableLiveData<TransferDataState> state = private final MutableLiveData<TransferDataState> state =
new MutableLiveData<>(); new MutableLiveData<>();
private final State initialState = new State(0, 0, false, false);
@Nullable @Nullable
private ContactId contactId = null; private ContactId contactId = null;
@Nullable @Nullable
@@ -102,10 +103,11 @@ class RemovableDriveViewModel extends DbViewModel {
} }
}); });
} else { } else {
// observe old task and start with initial state // observe old task
taskObserver = s -> observeTask(s, true); taskObserver =
taskObserver.accept(initialState); s -> state.setValue(new TransferDataState.TaskAvailable(s));
task.addObserver(taskObserver); task.addObserver(taskObserver);
oldTaskResumed.setEvent(true);
} }
} }
@@ -118,18 +120,14 @@ class RemovableDriveViewModel extends DbViewModel {
if (task == null) { if (task == null) {
state.setValue(new TransferDataState.Ready()); state.setValue(new TransferDataState.Ready());
} else { } else {
// observe old task and start with initial state // observe old task
taskObserver = s -> observeTask(s, true); taskObserver =
taskObserver.accept(initialState); s -> state.setValue(new TransferDataState.TaskAvailable(s));
task.addObserver(taskObserver); task.addObserver(taskObserver);
oldTaskResumed.setEvent(true);
} }
} }
@UiThread
private void observeTask(RemovableDriveTask.State s, boolean isOldTask) {
state.setValue(new TransferDataState.TaskAvailable(s, isOldTask));
}
String getFileName() { String getFileName() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", US); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", US);
return sdf.format(new Date()) + ".zip"; return sdf.format(new Date()) + ".zip";
@@ -144,8 +142,9 @@ class RemovableDriveViewModel extends DbViewModel {
if (task != null) throw new IllegalStateException(); if (task != null) throw new IllegalStateException();
// from now on, we are not re-usable // from now on, we are not re-usable
taskObserver = s -> observeTask(s, false); // (because gets a state update right away on the UiThread)
taskObserver.accept(initialState); taskObserver =
s -> state.setValue(new TransferDataState.TaskAvailable(s));
// start the writer task for this contact and observe it // start the writer task for this contact and observe it
TransportProperties p = new TransportProperties(); TransportProperties p = new TransportProperties();
@@ -164,8 +163,9 @@ class RemovableDriveViewModel extends DbViewModel {
if (task != null) throw new IllegalStateException(); if (task != null) throw new IllegalStateException();
// from now on, we are not re-usable // from now on, we are not re-usable
taskObserver = s -> observeTask(s, false); // (because gets a state update right away on the UiThread)
taskObserver.accept(initialState); taskObserver =
s -> state.setValue(new TransferDataState.TaskAvailable(s));
TransportProperties p = new TransportProperties(); TransportProperties p = new TransportProperties();
p.put(PROP_URI, uri.toString()); p.put(PROP_URI, uri.toString());
@@ -177,6 +177,10 @@ class RemovableDriveViewModel extends DbViewModel {
return action; return action;
} }
LiveEvent<Boolean> getOldTaskResumedEvent() {
return oldTaskResumed;
}
LiveData<TransferDataState> getState() { LiveData<TransferDataState> getState() {
return state; return state;
} }

View File

@@ -47,7 +47,6 @@ 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) {
@@ -72,6 +71,8 @@ public class SendFragment extends Fragment {
launcher.launch(viewModel.getFileName()) launcher.launch(viewModel.getFileName())
); );
viewModel.getOldTaskResumedEvent()
.observeEvent(getViewLifecycleOwner(), this::onOldTaskResumed);
viewModel.getState() viewModel.getState()
.observe(getViewLifecycleOwner(), this::onStateChanged); .observe(getViewLifecycleOwner(), this::onStateChanged);
@@ -84,6 +85,13 @@ public class SendFragment extends Fragment {
requireActivity().setTitle(R.string.removable_drive_title_send); requireActivity().setTitle(R.string.removable_drive_title_send);
} }
private void onOldTaskResumed(boolean resumed) {
if (resumed) {
Toast.makeText(requireContext(),
R.string.removable_drive_ongoing, LENGTH_LONG).show();
}
}
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);
@@ -92,12 +100,6 @@ public class SendFragment extends Fragment {
button.setEnabled(true); button.setEnabled(true);
} else if (state instanceof TransferDataState.TaskAvailable) { } else if (state instanceof TransferDataState.TaskAvailable) {
button.setEnabled(false); button.setEnabled(false);
if (!hasShownOldTaskToast &&
((TransferDataState.TaskAvailable) state).isOldTask) {
Toast.makeText(requireContext(),
R.string.removable_drive_ongoing, LENGTH_LONG).show();
hasShownOldTaskToast = true;
}
RemovableDriveTask.State s = RemovableDriveTask.State s =
((TransferDataState.TaskAvailable) state).state; ((TransferDataState.TaskAvailable) state).state;
if (s.getTotal() > 0L && progressBar.getVisibility() != VISIBLE) { if (s.getTotal() > 0L && progressBar.getVisibility() != VISIBLE) {

View File

@@ -24,15 +24,9 @@ abstract class TransferDataState {
*/ */
static class TaskAvailable extends TransferDataState { static class TaskAvailable extends TransferDataState {
final RemovableDriveTask.State state; final RemovableDriveTask.State state;
/**
* This is an old task that is still ongoing. The user needs to wait for
* it to complete before starting a new task.
*/
final boolean isOldTask;
TaskAvailable(RemovableDriveTask.State state, boolean isOldTask) { TaskAvailable(RemovableDriveTask.State state) {
this.state = state; this.state = state;
this.isOldTask = isOldTask;
} }
} }