use of org.odk.collect.android.upload.InstanceServerUploader in project collect by opendatakit.
the class InstanceServerUploaderTask method doInBackground.
@Override
public Outcome doInBackground(Long... instanceIdsToUpload) {
Outcome outcome = new Outcome();
InstanceServerUploader uploader = new InstanceServerUploader(httpInterface, webCredentialsUtils, new HashMap<>(), settingsProvider.getUnprotectedSettings());
List<Instance> instancesToUpload = uploader.getInstancesFromIds(instanceIdsToUpload);
String deviceId = new PropertyManager().getSingularProperty(PropertyManager.PROPMGR_DEVICE_ID);
for (int i = 0; i < instancesToUpload.size(); i++) {
if (isCancelled()) {
return outcome;
}
Instance instance = instancesToUpload.get(i);
publishProgress(i + 1, instancesToUpload.size());
try {
String destinationUrl = uploader.getUrlToSubmitTo(instance, deviceId, completeDestinationUrl, null);
String customMessage = uploader.uploadOneSubmission(instance, destinationUrl);
outcome.messagesByInstanceId.put(instance.getDbId().toString(), customMessage != null ? customMessage : getLocalizedString(Collect.getInstance(), R.string.success));
analytics.logEvent(SUBMISSION, "HTTP", Collect.getFormIdentifierHash(instance.getFormId(), instance.getFormVersion()));
} catch (UploadAuthRequestedException e) {
outcome.authRequestingServer = e.getAuthRequestingServer();
// Don't add the instance that caused an auth request to the map because we want to
// retry. Items present in the map are considered already attempted and won't be
// retried.
} catch (UploadException e) {
outcome.messagesByInstanceId.put(instance.getDbId().toString(), e.getDisplayMessage());
}
}
return outcome;
}
use of org.odk.collect.android.upload.InstanceServerUploader in project collect by opendatakit.
the class InstanceSubmitter method submitInstances.
public Pair<Boolean, String> submitInstances(List<Instance> toUpload) throws SubmitException {
if (toUpload.isEmpty()) {
throw new SubmitException(Type.NOTHING_TO_SUBMIT);
}
String protocol = generalSettings.getString(ProjectKeys.KEY_PROTOCOL);
InstanceUploader uploader;
Map<String, String> resultMessagesByInstanceId = new HashMap<>();
String deviceId = null;
boolean anyFailure = false;
if (protocol.equals(ProjectKeys.PROTOCOL_GOOGLE_SHEETS)) {
if (permissionsProvider.isGetAccountsPermissionGranted()) {
String googleUsername = googleAccountsManager.getLastSelectedAccountIfValid();
if (googleUsername.isEmpty()) {
throw new SubmitException(Type.GOOGLE_ACCOUNT_NOT_SET);
}
googleAccountsManager.selectAccount(googleUsername);
uploader = new InstanceGoogleSheetsUploader(googleApiProvider.getDriveApi(googleUsername), googleApiProvider.getSheetsApi(googleUsername));
} else {
throw new SubmitException(Type.GOOGLE_ACCOUNT_NOT_PERMITTED);
}
} else {
OpenRosaHttpInterface httpInterface = Collect.getInstance().getComponent().openRosaHttpInterface();
uploader = new InstanceServerUploader(httpInterface, new WebCredentialsUtils(generalSettings), new HashMap<>(), generalSettings);
deviceId = new PropertyManager().getSingularProperty(PropertyManager.PROPMGR_DEVICE_ID);
}
for (Instance instance : toUpload) {
try {
String destinationUrl;
if (protocol.equals(ProjectKeys.PROTOCOL_GOOGLE_SHEETS)) {
destinationUrl = uploader.getUrlToSubmitTo(instance, null, null, generalSettings.getString(KEY_GOOGLE_SHEETS_URL));
if (!InstanceUploaderUtils.doesUrlRefersToGoogleSheetsFile(destinationUrl)) {
anyFailure = true;
resultMessagesByInstanceId.put(instance.getDbId().toString(), SPREADSHEET_UPLOADED_TO_GOOGLE_DRIVE);
continue;
}
} else {
destinationUrl = uploader.getUrlToSubmitTo(instance, deviceId, null, null);
}
String customMessage = uploader.uploadOneSubmission(instance, destinationUrl);
resultMessagesByInstanceId.put(instance.getDbId().toString(), customMessage != null ? customMessage : getLocalizedString(Collect.getInstance(), R.string.success));
// communicated to the user. Maybe successful delete should also be communicated?
if (InstanceUploaderUtils.shouldFormBeDeleted(formsRepository, instance.getFormId(), instance.getFormVersion(), generalSettings.getBoolean(ProjectKeys.KEY_DELETE_AFTER_SEND))) {
new InstanceDeleter(new InstancesRepositoryProvider(Collect.getInstance()).get(), new FormsRepositoryProvider(Collect.getInstance()).get()).delete(instance.getDbId());
}
String action = protocol.equals(ProjectKeys.PROTOCOL_GOOGLE_SHEETS) ? "HTTP-Sheets auto" : "HTTP auto";
String label = Collect.getFormIdentifierHash(instance.getFormId(), instance.getFormVersion());
analytics.logEvent(SUBMISSION, action, label);
} catch (UploadException e) {
Timber.d(e);
anyFailure = true;
resultMessagesByInstanceId.put(instance.getDbId().toString(), e.getDisplayMessage());
}
}
return new Pair<>(anyFailure, InstanceUploaderUtils.getUploadResultMessage(instancesRepository, Collect.getInstance(), resultMessagesByInstanceId));
}
Aggregations