Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
grzesiek2010 committed Apr 13, 2017
1 parent c6f6fbf commit 27ee57e
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@

import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
Expand All @@ -36,14 +38,22 @@
import org.odk.collect.android.provider.InstanceProviderAPI.InstanceColumns;
import org.odk.collect.android.tasks.InstanceSyncTask;
import org.odk.collect.android.utilities.ApplicationConstants;
import org.odk.collect.android.utilities.FileUtils;
import org.odk.collect.android.utilities.InstanceUtils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
* Responsible for displaying all the valid instances in the instance directory.
*
* @author Yaw Anokwa (yanokwa@gmail.com)
* @author Carl Hartung (carlhartung@gmail.com)
*/
public class InstanceChooserList extends InstanceListActivity implements DiskSyncListener {
public class InstanceChooserList extends InstanceListActivity implements DiskSyncListener, AdapterView.OnItemLongClickListener {
private static final String INSTANCE_LIST_ACTIVITY_SORTING_ORDER = "instanceListActivitySortingOrder";
private static final String VIEW_SENT_FORM_SORTING_ORDER = "ViewSentFormSortingOrder";

Expand Down Expand Up @@ -78,6 +88,7 @@ public void onCreate(Bundle savedInstanceState) {
getString(R.string.sort_by_date_asc), getString(R.string.sort_by_date_desc),
getString(R.string.sort_by_status_asc), getString(R.string.sort_by_status_desc)
};
getListView().setOnItemLongClickListener(this);
} else {
setTitle(getString(R.string.view_sent_forms));
mSortingOptions = new String[]{
Expand Down Expand Up @@ -112,40 +123,19 @@ protected void onListItemClick(ListView listView, View view, int position, long
instanceUri.toString());

if (view.findViewById(R.id.visible_off).getVisibility() != View.VISIBLE) {
String action = getIntent().getAction();
if (Intent.ACTION_PICK.equals(action)) {
// caller is waiting on a picked form
setResult(RESULT_OK, new Intent().setData(instanceUri));
} else {
// the form can be edited if it is incomplete or if, when it was
// marked as complete, it was determined that it could be edited
// later.
String status = c.getString(c.getColumnIndex(InstanceColumns.STATUS));
String strCanEditWhenComplete =
c.getString(c.getColumnIndex(InstanceColumns.CAN_EDIT_WHEN_COMPLETE));

boolean canEdit = status.equals(InstanceProviderAPI.STATUS_INCOMPLETE)
|| Boolean.parseBoolean(strCanEditWhenComplete);
if (!canEdit) {
createErrorDialog(getString(R.string.cannot_edit_completed_form),
DO_NOT_EXIT);
return;
}
// caller wants to view/edit a form, so launch formentryactivity
Intent parentIntent = this.getIntent();
Intent intent = new Intent(Intent.ACTION_EDIT, instanceUri);
String formMode = parentIntent.getStringExtra(ApplicationConstants.BundleKeys.FORM_MODE);
if (formMode == null || ApplicationConstants.FormModes.EDIT_SAVED.equalsIgnoreCase(formMode)) {
intent.putExtra(ApplicationConstants.BundleKeys.FORM_MODE, ApplicationConstants.FormModes.EDIT_SAVED);
} else {
intent.putExtra(ApplicationConstants.BundleKeys.FORM_MODE, ApplicationConstants.FormModes.VIEW_SENT);
}
startActivity(intent);
}
finish();
String status = c.getString(c.getColumnIndex(InstanceColumns.STATUS));
String strCanEditWhenComplete =
c.getString(c.getColumnIndex(InstanceColumns.CAN_EDIT_WHEN_COMPLETE));
openForm(instanceUri, status, strCanEditWhenComplete);
}
}

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showDuplicateFormDialog(position);
return true;
}

@Override
protected void onResume() {
if (instanceSyncTask != null) {
Expand Down Expand Up @@ -247,5 +237,96 @@ public void onClick(DialogInterface dialog, int i) {
mAlertDialog.show();
}

private void showDuplicateFormDialog(final int position) {
mAlertDialog = new AlertDialog.Builder(this).create();
mAlertDialog.setTitle(getString(R.string.duplicate_form_dialog_title));
mAlertDialog.setMessage(getString(R.string.duplicate_form_dialog_message));
DialogInterface.OnClickListener dialogYesNoListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
switch (i) {
case DialogInterface.BUTTON_POSITIVE:
duplicateForm(position);
break;
}
}
};
mAlertDialog.setCancelable(false);
mAlertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.duplicate), dialogYesNoListener);
mAlertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), dialogYesNoListener);
mAlertDialog.show();
}

private void duplicateForm(int position) {
Cursor cursor = (Cursor) getListAdapter().getItem(position);

ContentValues duplicatedValues = new ContentValues();
InstancesDao instancesDao = new InstancesDao();
ContentValues originalValues = instancesDao
.getValuesFromInstanceObject(instancesDao.getInstancesFromCursor(cursor).get(position));

duplicatedValues.put(InstanceColumns.DISPLAY_NAME, originalValues.getAsString(InstanceColumns.DISPLAY_NAME));
duplicatedValues.put(InstanceColumns.SUBMISSION_URI, originalValues.getAsString(InstanceColumns.SUBMISSION_URI));
duplicatedValues.put(InstanceColumns.CAN_EDIT_WHEN_COMPLETE, originalValues.getAsString(InstanceColumns.CAN_EDIT_WHEN_COMPLETE));
duplicatedValues.put(InstanceColumns.JR_FORM_ID, originalValues.getAsString(InstanceColumns.JR_FORM_ID));
duplicatedValues.put(InstanceColumns.JR_VERSION, originalValues.getAsString(InstanceColumns.JR_VERSION));
duplicatedValues.put(InstanceColumns.STATUS, InstanceProviderAPI.STATUS_INCOMPLETE);
duplicatedValues.put(InstanceColumns.LAST_STATUS_CHANGE_DATE, System.currentTimeMillis());

String displaySubtext = InstanceUtils.getDisplaySubtext(InstanceChooserList.this, InstanceProviderAPI.STATUS_INCOMPLETE, new Date());
duplicatedValues.put(InstanceColumns.DISPLAY_SUBTEXT, displaySubtext);

String originalInstanceDirPath = originalValues.getAsString(InstanceColumns.INSTANCE_FILE_PATH).substring(0, originalValues.getAsString(InstanceColumns.INSTANCE_FILE_PATH).lastIndexOf("/"));
String originalInstanceFileName = originalValues.getAsString(InstanceColumns.INSTANCE_FILE_PATH).substring(originalValues.getAsString(InstanceColumns.INSTANCE_FILE_PATH).lastIndexOf("/") + 1);
String instanceName = originalInstanceFileName.substring(0, originalInstanceFileName.indexOf("_"));
String time = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.ENGLISH).format(Calendar.getInstance().getTime());
String duplicatedInstanceDirPath = Collect.INSTANCES_PATH + File.separator + instanceName + "_" + time;

FileUtils.createFolder(duplicatedInstanceDirPath);
copyMediaFiles(originalInstanceDirPath, duplicatedInstanceDirPath);

String duplicatedInstanceFilePath = duplicatedInstanceDirPath + File.separator + instanceName + "_" + time + ".xml";
duplicatedValues.put(InstanceColumns.INSTANCE_FILE_PATH, duplicatedInstanceFilePath);

Uri duplicatedFormUri = instancesDao.saveInstance(duplicatedValues);
FileUtils.copyFile(new File(originalValues.getAsString(InstanceColumns.INSTANCE_FILE_PATH)), new File(duplicatedInstanceFilePath));
openForm(duplicatedFormUri, duplicatedValues.getAsString(InstanceColumns.STATUS), duplicatedValues.getAsString(InstanceColumns.CAN_EDIT_WHEN_COMPLETE));
}

private void copyMediaFiles(String originalDir, String duplicatedDir) {
File file = new File(originalDir);
for (final File mediaFile : file.listFiles()) {
if (!mediaFile.isDirectory() && !mediaFile.getName().endsWith(".xml")) {
FileUtils.copyFile(mediaFile, new File(duplicatedDir + File.separator + mediaFile.getName()));
}
}
}

private void openForm(Uri instanceUri, String status, String strCanEditWhenComplete) {
String action = getIntent().getAction();
if (Intent.ACTION_PICK.equals(action)) {
// caller is waiting on a picked form
setResult(RESULT_OK, new Intent().setData(instanceUri));
} else {
boolean canEdit = status.equals(InstanceProviderAPI.STATUS_INCOMPLETE)
|| Boolean.parseBoolean(strCanEditWhenComplete);
if (!canEdit) {
createErrorDialog(getString(R.string.cannot_edit_completed_form),
DO_NOT_EXIT);
return;
}
// caller wants to view/edit a form, so launch formentryactivity
Intent parentIntent = this.getIntent();
Intent intent = new Intent(Intent.ACTION_EDIT, instanceUri);
String formMode = parentIntent.getStringExtra(ApplicationConstants.BundleKeys.FORM_MODE);
if (formMode == null || ApplicationConstants.FormModes.EDIT_SAVED.equalsIgnoreCase(formMode)) {
intent.putExtra(ApplicationConstants.BundleKeys.FORM_MODE, ApplicationConstants.FormModes.EDIT_SAVED);
} else {
intent.putExtra(ApplicationConstants.BundleKeys.FORM_MODE, ApplicationConstants.FormModes.VIEW_SENT);
}
startActivity(intent);
}
finish();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,9 @@ public void deleteInstancesFromIDs(List<String> ids){

public List<Instance> getInstancesFromCursor(Cursor cursor) {
List<Instance> instances = new ArrayList<>();
if (cursor != null) {
if (cursor != null && cursor.moveToFirst()) {
try {
while (cursor.moveToNext()) {
do {
int displayNameColumnIndex = cursor.getColumnIndex(InstanceProviderAPI.InstanceColumns.DISPLAY_NAME);
int submissionUriColumnIndex = cursor.getColumnIndex(InstanceProviderAPI.InstanceColumns.SUBMISSION_URI);
int canEditWhenCompleteIndex = cursor.getColumnIndex(InstanceProviderAPI.InstanceColumns.CAN_EDIT_WHEN_COMPLETE);
Expand All @@ -304,7 +304,7 @@ public List<Instance> getInstancesFromCursor(Cursor cursor) {
.build();

instances.add(instance);
}
} while (cursor.moveToNext());
} finally {
cursor.close();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,15 @@
import android.text.TextUtils;
import android.util.Log;

import org.odk.collect.android.R;
import org.odk.collect.android.application.Collect;
import org.odk.collect.android.database.ODKSQLiteOpenHelper;
import org.odk.collect.android.provider.InstanceProviderAPI.InstanceColumns;
import org.odk.collect.android.utilities.InstanceUtils;
import org.odk.collect.android.utilities.MediaUtils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;

/**
*
Expand Down Expand Up @@ -208,7 +206,7 @@ public Uri insert(Uri uri, ContentValues initialValues) {

if (!values.containsKey(InstanceColumns.DISPLAY_SUBTEXT)) {
Date today = new Date();
String text = getDisplaySubtext(InstanceProviderAPI.STATUS_INCOMPLETE, today);
String text = InstanceUtils.getDisplaySubtext(getContext(), InstanceProviderAPI.STATUS_INCOMPLETE, today);
values.put(InstanceColumns.DISPLAY_SUBTEXT, text);
}

Expand All @@ -229,29 +227,6 @@ public Uri insert(Uri uri, ContentValues initialValues) {
throw new SQLException("Failed to insert row into " + uri);
}

private String getDisplaySubtext(String state, Date date) {
if (state == null) {
return new SimpleDateFormat(getContext().getString(R.string.added_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_INCOMPLETE.equalsIgnoreCase(state)) {
return new SimpleDateFormat(getContext().getString(R.string.saved_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_COMPLETE.equalsIgnoreCase(state)) {
return new SimpleDateFormat(getContext().getString(R.string.finalized_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_SUBMITTED.equalsIgnoreCase(state)) {
return new SimpleDateFormat(getContext().getString(R.string.sent_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_SUBMISSION_FAILED.equalsIgnoreCase(state)) {
return new SimpleDateFormat(
getContext().getString(R.string.sending_failed_on_date_at_time),
Locale.getDefault()).format(date);
} else {
return new SimpleDateFormat(getContext().getString(R.string.added_on_date_at_time),
Locale.getDefault()).format(date);
}
}

private void deleteAllFilesInDirectory(File directory) {
if (directory.exists()) {
// do not delete the directory if it might be an
Expand Down Expand Up @@ -384,7 +359,7 @@ public int update(Uri uri, ContentValues values, String where, String[] whereArg

if (!values.containsKey(InstanceColumns.DISPLAY_SUBTEXT)) {
Date today = new Date();
String text = getDisplaySubtext(status, today);
String text = InstanceUtils.getDisplaySubtext(getContext(), status, today);
values.put(InstanceColumns.DISPLAY_SUBTEXT, text);
}
}
Expand All @@ -400,7 +375,7 @@ public int update(Uri uri, ContentValues values, String where, String[] whereArg

if (!values.containsKey(InstanceColumns.DISPLAY_SUBTEXT)) {
Date today = new Date();
String text = getDisplaySubtext(status, today);
String text = InstanceUtils.getDisplaySubtext(getContext(), status, today);
values.put(InstanceColumns.DISPLAY_SUBTEXT, text);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.odk.collect.android.utilities;

import android.content.Context;

import org.odk.collect.android.R;
import org.odk.collect.android.provider.InstanceProviderAPI;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class InstanceUtils {

public static String getDisplaySubtext(Context context, String state, Date date) {
if (state == null) {
return new SimpleDateFormat(context.getString(R.string.added_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_INCOMPLETE.equalsIgnoreCase(state)) {
return new SimpleDateFormat(context.getString(R.string.saved_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_COMPLETE.equalsIgnoreCase(state)) {
return new SimpleDateFormat(context.getString(R.string.finalized_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_SUBMITTED.equalsIgnoreCase(state)) {
return new SimpleDateFormat(context.getString(R.string.sent_on_date_at_time),
Locale.getDefault()).format(date);
} else if (InstanceProviderAPI.STATUS_SUBMISSION_FAILED.equalsIgnoreCase(state)) {
return new SimpleDateFormat(
context.getString(R.string.sending_failed_on_date_at_time),
Locale.getDefault()).format(date);
} else {
return new SimpleDateFormat(context.getString(R.string.added_on_date_at_time),
Locale.getDefault()).format(date);
}
}
}
3 changes: 3 additions & 0 deletions collect_app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -499,4 +499,7 @@
<string name="device_id">Device ID</string>
<string name="subscriber_id">Subscriber ID</string>
<string name="sim_serial_id">SIM serial number</string>
<string name="duplicate">Duplicate</string>
<string name="duplicate_form_dialog_title">Duplicate form</string>
<string name="duplicate_form_dialog_message">Do you want to duplicate this form?</string>
</resources>

0 comments on commit 27ee57e

Please sign in to comment.