package org.odk.collect.android.widgets; import org.javarosa.core.model.data.IAnswerData; import org.javarosa.form.api.FormEntryPrompt; import com.radicaldynamic.groupinform.application.Collect; import org.odk.collect.android.preferences.PreferencesActivity; import org.odk.collect.android.views.MediaLayout; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Typeface; import android.preference.PreferenceManager; import android.util.TypedValue; import android.view.Gravity; import android.widget.LinearLayout; import android.widget.TextView; public abstract class QuestionWidget extends LinearLayout { @SuppressWarnings("unused") private final static String t = "QuestionWidget"; private LinearLayout.LayoutParams mLayout; protected FormEntryPrompt mPrompt; protected final int mQuestionFontsize; protected final int mAnswerFontsize; private TextView mQuestionText; private TextView mHelpText; public QuestionWidget(Context context, FormEntryPrompt p) { super(context); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(Collect.getInstance()); String question_font = settings.getString(PreferencesActivity.KEY_FONT_SIZE, Collect.DEFAULT_FONTSIZE); mQuestionFontsize = new Integer(question_font).intValue(); mAnswerFontsize = mQuestionFontsize + 2; mPrompt = p; setOrientation(LinearLayout.VERTICAL); setGravity(Gravity.TOP); setPadding(0, 7, 0, 0); mLayout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); mLayout.setMargins(10, 0, 10, 0); addQuestionText(p); addHelpText(p); } public FormEntryPrompt getPrompt() { return mPrompt; } // Abstract methods public abstract IAnswerData getAnswer(); public abstract void clearAnswer(); public abstract void setFocus(Context context); public abstract void setOnLongClickListener(OnLongClickListener l); /** * Add a Views containing the question text, audio (if applicable), and image (if applicable). * To satisfy the RelativeLayout constraints, we add the audio first if it exists, then the * TextView to fit the rest of the space, then the image if applicable. */ protected void addQuestionText(FormEntryPrompt p) { String imageURI = p.getImageText(); String audioURI = p.getAudioText(); String videoURI = p.getSpecialFormQuestionText("video"); // shown when image is clicked String bigImageURI = p.getSpecialFormQuestionText("big-image"); // Add the text view. Textview always exists, regardless of whether there's text. mQuestionText = new TextView(getContext()); mQuestionText.setText(p.getLongText()); mQuestionText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mQuestionFontsize); mQuestionText.setTypeface(null, Typeface.BOLD); mQuestionText.setPadding(0, 0, 0, 7); mQuestionText.setId(38475483); // assign random id // Wrap to the size of the parent view mQuestionText.setHorizontallyScrolling(false); if (p.getLongText() == null) { mQuestionText.setVisibility(GONE); } // Create the layout for audio, image, text MediaLayout mediaLayout = new MediaLayout(getContext()); mediaLayout.setAVT(mQuestionText, audioURI, imageURI, videoURI, bigImageURI); addView(mediaLayout, mLayout); } /** * Add a TextView containing the help text. */ private void addHelpText(FormEntryPrompt p) { String s = p.getHelpText(); if (s != null && !s.equals("")) { mHelpText = new TextView(getContext()); mHelpText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mQuestionFontsize - 3); mHelpText.setPadding(0, -5, 0, 7); // wrap to the widget of view mHelpText.setHorizontallyScrolling(false); mHelpText.setText(s); mHelpText.setTypeface(null, Typeface.ITALIC); addView(mHelpText, mLayout); } } /** * Every subclassed widget should override this, adding any views they may contain, and calling * super.cancelLongPress() */ public void cancelLongPress() { super.cancelLongPress(); if (mQuestionText != null) { mQuestionText.cancelLongPress(); } if (mHelpText != null) { mHelpText.cancelLongPress(); } } }