Skip to content

Commit 0611295

Browse files
authored
Merge pull request #154 from NordicSemiconductor/feature/force-update
Allowing reuploading images
2 parents 7ef161a + 8568044 commit 0611295

File tree

4 files changed

+97
-15
lines changed

4 files changed

+97
-15
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.runtime.mcumgr.sample.dialog;
2+
3+
import android.app.Dialog;
4+
import android.os.Bundle;
5+
6+
import androidx.annotation.NonNull;
7+
import androidx.annotation.Nullable;
8+
import androidx.annotation.StringRes;
9+
import androidx.appcompat.app.AlertDialog;
10+
import androidx.fragment.app.DialogFragment;
11+
12+
public class YesNoDialogFragment extends DialogFragment {
13+
private static final String ARG_REQUEST_ID = "requestId";
14+
private static final String ARG_TITLE_ID = "titleId";
15+
private static final String ARG_QUESTION_ID = "questionId";
16+
17+
public interface Listener {
18+
void onAnswer(final int requestId, final boolean yes);
19+
}
20+
21+
public static DialogFragment getInstance(final int requestId,
22+
@StringRes final int titleId, @StringRes final int questionId) {
23+
final DialogFragment fragment = new YesNoDialogFragment();
24+
25+
final Bundle args = new Bundle();
26+
args.putInt(ARG_REQUEST_ID, requestId);
27+
args.putInt(ARG_TITLE_ID, titleId);
28+
args.putInt(ARG_QUESTION_ID, questionId);
29+
fragment.setArguments(args);
30+
31+
return fragment;
32+
}
33+
34+
@NonNull
35+
@Override
36+
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
37+
final Bundle args = requireArguments();
38+
final int requestId = args.getInt(ARG_REQUEST_ID);
39+
40+
return new AlertDialog.Builder(requireContext())
41+
.setTitle(args.getInt(ARG_TITLE_ID))
42+
.setMessage(args.getInt(ARG_QUESTION_ID))
43+
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
44+
final Listener listener = (Listener) getParentFragment();
45+
if (listener != null)
46+
listener.onAnswer(requestId, true);
47+
})
48+
.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
49+
final Listener listener = (Listener) getParentFragment();
50+
if (listener != null)
51+
listener.onAnswer(requestId, false);
52+
})
53+
.create();
54+
}
55+
}

sample/src/main/java/io/runtime/mcumgr/sample/fragment/mcumgr/ImageUploadFragment.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,15 @@
3232
import io.runtime.mcumgr.sample.di.Injectable;
3333
import io.runtime.mcumgr.sample.dialog.HelpDialogFragment;
3434
import io.runtime.mcumgr.sample.dialog.SelectImageDialogFragment;
35+
import io.runtime.mcumgr.sample.dialog.YesNoDialogFragment;
3536
import io.runtime.mcumgr.sample.utils.StringUtils;
3637
import io.runtime.mcumgr.sample.viewmodel.mcumgr.ImageUploadViewModel;
3738
import io.runtime.mcumgr.sample.viewmodel.mcumgr.McuMgrViewModelFactory;
3839

39-
public class ImageUploadFragment extends FileBrowserFragment implements Injectable, SelectImageDialogFragment.OnImageSelectedListener {
40+
public class ImageUploadFragment extends FileBrowserFragment implements Injectable,
41+
SelectImageDialogFragment.OnImageSelectedListener, YesNoDialogFragment.Listener {
4042
private static final int REQUEST_UPLOAD = 0;
43+
private static final int REQUEST_OVERWRITE = 1;
4144

4245
@Inject
4346
McuMgrViewModelFactory viewModelFactory;
@@ -127,6 +130,12 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved
127130
binding.actionCancel.setVisibility(View.GONE);
128131
binding.actionPauseResume.setVisibility(View.GONE);
129132
});
133+
viewModel.getHashAlreadyFoundEvent().observe(getViewLifecycleOwner(), isActive -> {
134+
final DialogFragment dialog = YesNoDialogFragment
135+
.getInstance(REQUEST_OVERWRITE, R.string.image_overwrite_title,
136+
isActive ? R.string.image_overwrite_active_message : R.string.image_overwrite_message);
137+
dialog.show(getChildFragmentManager(), null);
138+
});
130139
viewModel.getBusyState().observe(getViewLifecycleOwner(), busy -> {
131140
binding.actionSelectFile.setEnabled(!busy);
132141
binding.actionUpload.setEnabled(isFileLoaded() && !busy);
@@ -208,7 +217,21 @@ protected void onFileLoadingFailed(final int error) {
208217
public void onImageSelected(final int requestId, final int image) {
209218
final byte[] data = getFileContent();
210219
if (data != null) {
211-
viewModel.upload(data, image);
220+
viewModel.upload(data, image, false);
221+
}
222+
}
223+
224+
@Override
225+
public void onAnswer(int requestId, boolean yes) {
226+
if (requestId == REQUEST_OVERWRITE) {
227+
final byte[] data = getFileContent();
228+
if (data != null) {
229+
if (yes) {
230+
viewModel.upload(data, 0, true);
231+
} else {
232+
viewModel.onUploadCanceled();
233+
}
234+
}
212235
}
213236
}
214237

sample/src/main/java/io/runtime/mcumgr/sample/viewmodel/mcumgr/ImageUploadViewModel.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public boolean canCancel() {
5656
private final MutableLiveData<Float> transferSpeedLiveData = new MutableLiveData<>();
5757
private final SingleLiveEvent<McuMgrException> errorLiveData = new SingleLiveEvent<>();
5858
private final SingleLiveEvent<Void> cancelledEvent = new SingleLiveEvent<>();
59+
private final SingleLiveEvent<Boolean> hashAlreadyFound = new SingleLiveEvent<>();
5960

6061
private long uploadStartTimestamp;
6162
private int initialBytes;
@@ -97,7 +98,12 @@ public LiveData<Void> getCancelledEvent() {
9798
return cancelledEvent;
9899
}
99100

100-
public void upload(@NonNull final byte[] data, final int image) {
101+
@NonNull
102+
public LiveData<Boolean> getHashAlreadyFoundEvent() {
103+
return hashAlreadyFound;
104+
}
105+
106+
public void upload(@NonNull final byte[] data, final int image, boolean force) {
101107
if (controller != null) {
102108
return;
103109
}
@@ -117,7 +123,6 @@ public void upload(@NonNull final byte[] data, final int image) {
117123
}
118124
final byte[] hash = tmpHash;
119125

120-
requestHighConnectionPriority();
121126
manager.list(new McuMgrCallback<>() {
122127
@Override
123128
public void onResponse(@NonNull final McuMgrImageStateResponse response) {
@@ -130,16 +135,13 @@ public void onResponse(@NonNull final McuMgrImageStateResponse response) {
130135
}
131136
}
132137
// If yes, no need to send again.
133-
if (theSameImage != null) {
134-
if (theSameImage.slot == 0) {
135-
errorLiveData.postValue(new McuMgrException("Firmware already active."));
136-
} else {
137-
// Firmware is identical to one on slot 1. No need to send anything.
138-
stateLiveData.postValue(State.COMPLETE);
139-
}
138+
if (!force && theSameImage != null) {
139+
hashAlreadyFound.postValue(theSameImage.active);
140140
postReady();
141141
return;
142142
}
143+
144+
requestHighConnectionPriority();
143145
// Otherwise, send the firmware. This may return NO MEMORY error if slot 1 is
144146
// filled with an image with pending or confirmed flags set.
145147
stateLiveData.postValue(State.UPLOADING);
@@ -229,16 +231,14 @@ public void onUploadCompleted() {
229231

230232
private void requestHighConnectionPriority() {
231233
final McuMgrTransport transporter = manager.getTransporter();
232-
if (transporter instanceof McuMgrBleTransport) {
233-
final McuMgrBleTransport bleTransporter = (McuMgrBleTransport) transporter;
234+
if (transporter instanceof McuMgrBleTransport bleTransporter) {
234235
bleTransporter.requestConnPriority(ConnectionPriorityRequest.CONNECTION_PRIORITY_HIGH);
235236
}
236237
}
237238

238239
private void setLoggingEnabled(final boolean enabled) {
239240
final McuMgrTransport transporter = manager.getTransporter();
240-
if (transporter instanceof McuMgrBleTransport) {
241-
final McuMgrBleTransport bleTransporter = (McuMgrBleTransport) transporter;
241+
if (transporter instanceof McuMgrBleTransport bleTransporter) {
242242
bleTransporter.setLoggingEnabled(enabled);
243243
}
244244
}

sample/src/main/res/values/strings_image_upload.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
<item>Image 3 (3)</item>
2424
</string-array>
2525

26+
<string name="image_overwrite_title">Overwrite?</string>
27+
<string name="image_overwrite_message">The selected image is already on the device. Do you want to send it again?</string>
28+
<string name="image_overwrite_active_message">The selected image is already active. Do you want to send it again?</string>
29+
2630
<string name="image_upload_status_ready">READY</string>
2731
<string name="image_upload_status_validating">VALIDATING…</string>
2832
<string name="image_upload_status_uploading">UPLOADING…</string>

0 commit comments

Comments
 (0)