package org.commcare.android.view; import java.io.File; import org.commcare.dalvik.R; import org.commcare.suite.model.DisplayUnit; import org.javarosa.core.model.condition.EvaluationContext; import org.javarosa.core.reference.InvalidReferenceException; import org.javarosa.core.reference.ReferenceManager; import org.javarosa.core.services.locale.Localizer; import org.odk.collect.android.views.media.AudioButton; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; /** * This layout for the GenericMenuFormAdapter allows you to load an image, audio, and text * to menus. * * @author wspride */ public class TextImageAudioView extends RelativeLayout { private static final String t = "AVTLayout"; private TextView mTextView; private AudioButton mAudioButton; private ImageView mImageView; private TextView mMissingImage; private final int iconDimension; private final int fontSize = 20; private EvaluationContext ec; public TextImageAudioView(Context c) { this(c, null); } public TextImageAudioView(Context c, EvaluationContext ec) { super(c); mTextView = null; mAudioButton = null; mImageView = null; mMissingImage = null; this.ec = ec; this.iconDimension = (int) getResources().getDimension(R.dimen.menu_icon_size); } public void setDisplay(DisplayUnit display) { setAVT(Localizer.processArguments(display.getText().evaluate(ec), new String[] {""}).trim(), display.getAudioURI(), display.getImageURI()); } //accepts a string to display and URI links to the audio and image, builds the proper TextImageAudio view public void setAVT(String displayText, String audioURI, String imageURI) { this.removeAllViews(); LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); mTextView = (TextView)inflater.inflate(R.layout.entity_item_text, null); mTextView.setText(displayText); // Layout configurations for our elements in the relative layout RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); RelativeLayout.LayoutParams audioParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(iconDimension,iconDimension); String audioFilename = ""; if(audioURI != null && !audioURI.equals("")) { try { audioFilename = ReferenceManager._().DeriveReference(audioURI).getLocalURI(); } catch (InvalidReferenceException e) { Log.e(t, "Invalid reference exception"); e.printStackTrace(); } } File audioFile = new File(audioFilename); // First set up the audio button if (audioFilename != "" && audioFile.exists()) { // An audio file is specified mAudioButton = new AudioButton(getContext(), audioURI, true); mAudioButton.setId(3245345); // random ID to be used by the relative layout. // Set not focusable so that list onclick will work mAudioButton.setFocusable(false); mAudioButton.setFocusableInTouchMode(false); audioParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); audioParams.addRule(CENTER_VERTICAL); addView(mAudioButton, audioParams); } Bitmap b = ViewUtil.inflateDisplayImage(getContext(), imageURI); if(b != null) { mImageView = new ImageView(getContext()); mImageView.setPadding(10, 10, 10, 10); mImageView.setAdjustViewBounds(true); mImageView.setImageBitmap(b); mImageView.setId(23422634); imageParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); audioParams.addRule(CENTER_VERTICAL); addView(mImageView, imageParams); } textParams.addRule(RelativeLayout.CENTER_VERTICAL); textParams.addRule(RelativeLayout.CENTER_HORIZONTAL); if(imageURI != null && !imageURI.equals("") && mImageView != null){ textParams.addRule(RelativeLayout.RIGHT_OF,mImageView.getId()); } else{ textParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); } if(mAudioButton != null) { textParams.addRule(RelativeLayout.LEFT_OF, mAudioButton.getId()); } addView(mTextView, textParams); } /** * This adds a divider at the bottom of this layout. Used to separate fields in lists. * * @param v */ public void addDivider(ImageView v) { RelativeLayout.LayoutParams dividerParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); if (mImageView != null) { dividerParams.addRule(RelativeLayout.BELOW, mImageView.getId()); } else if (mMissingImage != null) { dividerParams.addRule(RelativeLayout.BELOW, mMissingImage.getId()); } else if (mAudioButton != null) { dividerParams.addRule(RelativeLayout.BELOW, mAudioButton.getId()); } else if (mTextView != null) { // No picture dividerParams.addRule(RelativeLayout.BELOW, mTextView.getId()); } else { Log.e(t, "Tried to add divider to uninitialized ATVWidget"); return; } addView(v, dividerParams); } /* * (non-Javadoc) * @see android.view.View#onWindowVisibilityChanged(int) */ @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); if (visibility != View.VISIBLE) { if (mAudioButton != null) { mAudioButton.endPlaying(); } } } }