Search in sources :

Example 1 with StringWidget

use of org.odk.collect.android.widgets.StringWidget 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 2 with StringWidget

use of org.odk.collect.android.widgets.StringWidget 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

FailedConstraint (org.odk.collect.android.logic.FormController.FailedConstraint)2 QuestionWidget (org.odk.collect.android.widgets.QuestionWidget)2 StringWidget (org.odk.collect.android.widgets.StringWidget)2 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 ListView (android.widget.ListView)1 TextView (android.widget.TextView)1 FormEntryCaption (org.javarosa.form.api.FormEntryCaption)1 FormEntryPrompt (org.javarosa.form.api.FormEntryPrompt)1 JavaRosaException (org.odk.collect.android.exception.JavaRosaException)1 FormController (org.odk.collect.android.logic.FormController)1