Search in sources :

Example 1 with QuestionWidget

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();
    }
}
Also used : QuestionWidget(org.odk.collect.android.widgets.QuestionWidget)

Example 2 with QuestionWidget

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");
    }
}
Also used : QuestionWidget(org.odk.collect.android.widgets.QuestionWidget) ExternalParamsException(org.odk.collect.android.exception.ExternalParamsException) JavaRosaException(org.odk.collect.android.exception.JavaRosaException) ActivityNotFoundException(android.content.ActivityNotFoundException) BinaryWidget(org.odk.collect.android.widgets.interfaces.BinaryWidget)

Example 3 with QuestionWidget

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;
}
Also used : IAnswerData(org.javarosa.core.model.data.IAnswerData) FormEntryPrompt(org.javarosa.form.api.FormEntryPrompt) FormIndex(org.javarosa.core.model.FormIndex) QuestionWidget(org.odk.collect.android.widgets.QuestionWidget) LinkedHashMap(java.util.LinkedHashMap)

Example 4 with QuestionWidget

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);
    }
}
Also used : FormEntryPrompt(org.javarosa.form.api.FormEntryPrompt) ODKView(org.odk.collect.android.views.ODKView) FormEntryCaption(org.javarosa.form.api.FormEntryCaption) Cursor(android.database.Cursor) Uri(android.net.Uri) TextWatcher(android.text.TextWatcher) Editable(android.text.Editable) TextView(android.widget.TextView) StringWidget(org.odk.collect.android.widgets.StringWidget) QuestionWidget(org.odk.collect.android.widgets.QuestionWidget) FormController(org.odk.collect.android.logic.FormController) EditText(android.widget.EditText) InputFilter(android.text.InputFilter) ODKView(org.odk.collect.android.views.ODKView) View(android.view.View) AdapterView(android.widget.AdapterView) TextView(android.widget.TextView) ListView(android.widget.ListView) Spanned(android.text.Spanned) FailedConstraint(org.odk.collect.android.logic.FormController.FailedConstraint) CheckBox(android.widget.CheckBox) OnClickListener(android.view.View.OnClickListener) JavaRosaException(org.odk.collect.android.exception.JavaRosaException)

Example 5 with QuestionWidget

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);
}
Also used : StringWidget(org.odk.collect.android.widgets.StringWidget) QuestionWidget(org.odk.collect.android.widgets.QuestionWidget) FailedConstraint(org.odk.collect.android.logic.FormController.FailedConstraint)

Aggregations

QuestionWidget (org.odk.collect.android.widgets.QuestionWidget)8 FormEntryPrompt (org.javarosa.form.api.FormEntryPrompt)3 SuppressLint (android.annotation.SuppressLint)2 JavaRosaException (org.odk.collect.android.exception.JavaRosaException)2 FormController (org.odk.collect.android.logic.FormController)2 FailedConstraint (org.odk.collect.android.logic.FormController.FailedConstraint)2 StringWidget (org.odk.collect.android.widgets.StringWidget)2 BinaryWidget (org.odk.collect.android.widgets.interfaces.BinaryWidget)2 ActivityNotFoundException (android.content.ActivityNotFoundException)1 Cursor (android.database.Cursor)1 Uri (android.net.Uri)1 Editable (android.text.Editable)1 InputFilter (android.text.InputFilter)1 Spanned (android.text.Spanned)1 TextWatcher (android.text.TextWatcher)1 View (android.view.View)1 OnClickListener (android.view.View.OnClickListener)1 AdapterView (android.widget.AdapterView)1 CheckBox (android.widget.CheckBox)1 EditText (android.widget.EditText)1