use of org.odk.collect.android.widgets.QuestionWidget in project collect by opendatakit.
the class ODKView method recycleDrawables.
/**
* http://code.google.com/p/android/issues/detail?id=8488
*/
public void recycleDrawables() {
this.destroyDrawingCache();
view.destroyDrawingCache();
for (QuestionWidget q : widgets) {
q.recycleDrawables();
}
}
use of org.odk.collect.android.widgets.QuestionWidget in project collect by opendatakit.
the class ODKView method setBinaryData.
/**
* Called when another activity returns information to answer this question.
*/
public void setBinaryData(Object answer) {
boolean set = false;
for (QuestionWidget q : widgets) {
if (q instanceof BinaryWidget) {
BinaryWidget binaryWidget = (BinaryWidget) q;
if (binaryWidget.isWaitingForData()) {
try {
binaryWidget.setBinaryData(answer);
binaryWidget.cancelWaitingForData();
} catch (Exception e) {
Timber.e(e);
ToastUtils.showLongToast(getContext().getString(R.string.error_attaching_binary_file, e.getMessage()));
}
set = true;
break;
}
}
}
if (!set) {
Timber.w("Attempting to return data to a widget or set of widgets not looking for data");
}
}
use of org.odk.collect.android.widgets.QuestionWidget in project collect by opendatakit.
the class ODKView method getAnswers.
/**
* @return a HashMap of answers entered by the user for this set of widgets
*/
public HashMap<FormIndex, IAnswerData> getAnswers() {
HashMap<FormIndex, IAnswerData> answers = new LinkedHashMap<>();
for (QuestionWidget q : widgets) {
/*
* The FormEntryPrompt has the FormIndex, which is where the answer gets stored. The
* QuestionWidget has the answer the user has entered.
*/
FormEntryPrompt p = q.getFormEntryPrompt();
answers.put(p.getIndex(), q.getAnswer());
}
return answers;
}
use of org.odk.collect.android.widgets.QuestionWidget in project collect by opendatakit.
the class FormEntryActivity method createView.
/**
* Creates a view given the View type and an event
*
* @param advancingPage -- true if this results from advancing through the form
* @return newly created View
*/
private View createView(int event, boolean advancingPage) {
FormController formController = getFormController();
setTitle(formController.getFormTitle());
formController.getTimerLogger().logTimerEvent(TimerLogger.EventTypes.FEC, event, formController.getFormIndex().getReference(), advancingPage, true);
switch(event) {
case FormEntryController.EVENT_BEGINNING_OF_FORM:
return createViewForFormBeginning(event, true, formController);
case FormEntryController.EVENT_END_OF_FORM:
View endView = View.inflate(this, R.layout.form_entry_end, null);
((TextView) endView.findViewById(R.id.description)).setText(getString(R.string.save_enter_data_description, formController.getFormTitle()));
// checkbox for if finished or ready to send
final CheckBox instanceComplete = endView.findViewById(R.id.mark_finished);
instanceComplete.setChecked(InstancesDaoHelper.isInstanceComplete(true));
if (!(boolean) AdminSharedPreferences.getInstance().get(AdminKeys.KEY_MARK_AS_FINALIZED)) {
instanceComplete.setVisibility(View.GONE);
}
// edittext to change the displayed name of the instance
final EditText saveAs = endView.findViewById(R.id.save_name);
// disallow carriage returns in the name
InputFilter returnFilter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (Character.getType((source.charAt(i))) == Character.CONTROL) {
return "";
}
}
return null;
}
};
saveAs.setFilters(new InputFilter[] { returnFilter });
if (formController.getSubmissionMetadata().instanceName == null) {
// no meta/instanceName field in the form -- see if we have a
// name for this instance from a previous save attempt...
String uriMimeType = null;
Uri instanceUri = getIntent().getData();
if (instanceUri != null) {
uriMimeType = getContentResolver().getType(instanceUri);
}
if (saveName == null && uriMimeType != null && uriMimeType.equals(InstanceColumns.CONTENT_ITEM_TYPE)) {
Cursor instance = null;
try {
instance = getContentResolver().query(instanceUri, null, null, null, null);
if (instance != null && instance.getCount() == 1) {
instance.moveToFirst();
saveName = instance.getString(instance.getColumnIndex(InstanceColumns.DISPLAY_NAME));
}
} finally {
if (instance != null) {
instance.close();
}
}
}
if (saveName == null) {
// last resort, default to the form title
saveName = formController.getFormTitle();
}
// present the prompt to allow user to name the form
TextView sa = endView.findViewById(R.id.save_form_as);
sa.setVisibility(View.VISIBLE);
saveAs.setText(saveName);
saveAs.setEnabled(true);
saveAs.setVisibility(View.VISIBLE);
saveAs.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
saveName = String.valueOf(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
});
} else {
// if instanceName is defined in form, this is the name -- no
// revisions
// display only the name, not the prompt, and disable edits
saveName = formController.getSubmissionMetadata().instanceName;
TextView sa = endView.findViewById(R.id.save_form_as);
sa.setVisibility(View.GONE);
saveAs.setText(saveName);
saveAs.setEnabled(false);
saveAs.setVisibility(View.VISIBLE);
}
// override the visibility settings based upon admin preferences
if (!(boolean) AdminSharedPreferences.getInstance().get(AdminKeys.KEY_SAVE_AS)) {
saveAs.setVisibility(View.GONE);
TextView sa = endView.findViewById(R.id.save_form_as);
sa.setVisibility(View.GONE);
}
// Create 'save' button
endView.findViewById(R.id.save_exit_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Collect.getInstance().getActivityLogger().logInstanceAction(this, "createView.saveAndExit", instanceComplete.isChecked() ? "saveAsComplete" : "saveIncomplete");
// Form is marked as 'saved' here.
if (saveAs.getText().length() < 1) {
ToastUtils.showShortToast(R.string.save_as_error);
} else {
saveDataToDisk(EXIT, instanceComplete.isChecked(), saveAs.getText().toString());
}
}
});
if (showNavigationButtons) {
backButton.setEnabled(allowMovingBackwards);
nextButton.setEnabled(false);
}
return endView;
case FormEntryController.EVENT_QUESTION:
case FormEntryController.EVENT_GROUP:
case FormEntryController.EVENT_REPEAT:
releaseOdkView();
// should only be a group here if the event_group is a field-list
try {
FormEntryPrompt[] prompts = formController.getQuestionPrompts();
FormEntryCaption[] groups = formController.getGroupsForCurrentIndex();
odkView = new ODKView(this, prompts, groups, advancingPage);
Timber.i("Created view for group %s %s", (groups.length > 0 ? groups[groups.length - 1].getLongText() : "[top]"), (prompts.length > 0 ? prompts[0].getQuestionText() : "[no question]"));
} catch (RuntimeException e) {
Timber.e(e);
// this is badness to avoid a crash.
try {
event = formController.stepToNextScreenEvent();
createErrorDialog(e.getMessage(), DO_NOT_EXIT);
} catch (JavaRosaException e1) {
Timber.d(e1);
createErrorDialog(e.getMessage() + "\n\n" + e1.getCause().getMessage(), DO_NOT_EXIT);
}
return createView(event, advancingPage);
}
// Makes a "clear answer" menu pop up on long-click
for (QuestionWidget qw : odkView.getWidgets()) {
if (!qw.getFormEntryPrompt().isReadOnly()) {
// we want to enable paste option after long click on the EditText
if (qw instanceof StringWidget) {
for (int i = 0; i < qw.getChildCount(); i++) {
if (!(qw.getChildAt(i) instanceof EditText)) {
registerForContextMenu(qw.getChildAt(i));
}
}
} else {
registerForContextMenu(qw);
}
}
}
if (showNavigationButtons) {
backButton.setEnabled(!formController.isCurrentQuestionFirstInForm() && allowMovingBackwards);
nextButton.setEnabled(true);
}
return odkView;
case FormEntryController.EVENT_PROMPT_NEW_REPEAT:
createRepeatDialog();
return new EmptyView(this);
default:
Timber.e("Attempted to create a view that does not exist.");
// this is badness to avoid a crash.
try {
event = formController.stepToNextScreenEvent();
createErrorDialog(getString(R.string.survey_internal_error), EXIT);
} catch (JavaRosaException e) {
Timber.d(e);
createErrorDialog(e.getCause().getMessage(), EXIT);
}
return createView(event, advancingPage);
}
}
use of org.odk.collect.android.widgets.QuestionWidget in project collect by opendatakit.
the class FormEntryActivity method onContextItemSelected.
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == DELETE_REPEAT) {
Collect.getInstance().getActivityLogger().logInstanceAction(this, "onContextItemSelected", "createDeleteRepeatConfirmDialog");
createDeleteRepeatConfirmDialog();
} else {
/*
* We don't have the right view here, so we store the View's ID as the
* item ID and loop through the possible views to find the one the user
* clicked on.
*/
boolean shouldClearDialogBeShown;
for (QuestionWidget qw : getCurrentViewIfODKView().getWidgets()) {
shouldClearDialogBeShown = false;
if (qw instanceof StringWidget) {
for (int i = 0; i < qw.getChildCount(); i++) {
if (item.getItemId() == qw.getChildAt(i).getId()) {
shouldClearDialogBeShown = true;
break;
}
}
} else if (item.getItemId() == qw.getId()) {
shouldClearDialogBeShown = true;
}
if (shouldClearDialogBeShown) {
Collect.getInstance().getActivityLogger().logInstanceAction(this, "onContextItemSelected", "createClearDialog", qw.getFormEntryPrompt().getIndex());
createClearDialog(qw);
break;
}
}
}
return super.onContextItemSelected(item);
}
Aggregations