package org.commcare.views.widgets; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import org.commcare.activities.components.FormEntryConstants; import org.commcare.dalvik.R; import org.commcare.google.services.analytics.GoogleAnalyticsUtils; import org.commcare.logic.PendingCalloutInterface; import org.commcare.utils.StringUtils; import org.javarosa.core.model.data.IAnswerData; import org.javarosa.core.services.locale.Localization; import org.javarosa.form.api.FormEntryPrompt; /** * An alternative audio widget that records and plays audio natively without * callout to any external application. * * @author Saumya Jain (sjain@dimagi.com) */ public class CommCareAudioWidget extends AudioWidget implements RecordingFragment.RecordingCompletionListener { private final RecordingFragment recorder; private final FragmentManager fm; private LinearLayout layout; private ImageButton mPlayButton; private TextView recordingNameText; private final String questionIndexText; private MediaPlayer player; public CommCareAudioWidget(Context context, FormEntryPrompt prompt, PendingCalloutInterface pic) { super(context, prompt, pic); fm = ((FragmentActivity)getContext()).getSupportFragmentManager(); recorder = new RecordingFragment(); recorder.setListener(this); questionIndexText = prompt.getIndex().toString(); } @Override protected void initializeButtons() { LayoutInflater vi = LayoutInflater.from(getContext()); layout = (LinearLayout)vi.inflate(R.layout.audio_prototype, null); mPlayButton = (ImageButton)layout.findViewById(R.id.play_audio); ImageButton captureButton = (ImageButton)layout.findViewById(R.id.capture_button); ImageButton chooseButton = (ImageButton)layout.findViewById(R.id.choose_file); captureButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportRecordingPopupOpened(); captureAudio(mPrompt); } }); // launch audio filechooser intent on click chooseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportAudioFileChosen(); Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.setType("audio/*"); try { ((Activity)getContext()).startActivityForResult(i, FormEntryConstants.AUDIO_VIDEO_FETCH); recordingNameText.setTextColor(getResources().getColor(R.color.black)); pendingCalloutInterface.setPendingCalloutFormIndex(mPrompt.getIndex()); } catch (ActivityNotFoundException e) { Toast.makeText(getContext(), StringUtils.getStringSpannableRobust(getContext(), R.string.activity_not_found, "choose audio"), Toast.LENGTH_SHORT).show(); } } }); mPlayButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportAudioPlayed(); playAudio(); } }); } @Override public IAnswerData getAnswer() { if (player != null) { try { if (player.isPlaying()) { System.out.println("Playing"); player.pause(); } } catch (IllegalStateException e) { //Do nothing because player is not playing } player.release(); } return super.getAnswer(); } @Override public void setupLayout() { recordingNameText = (TextView)layout.findViewById(R.id.recording_text); recordingNameText.setText(Localization.get("recording.prompt")); addView(layout); } @Override protected void captureAudio(FormEntryPrompt prompt) { recorder.show(fm, "Recorder"); } @Override public void setBinaryData(Object binaryuri) { super.setBinaryData(binaryuri); if (recordedFileName != null) { recordingNameText.setText(recordedFileName); } } @Override public void onRecordingCompletion() { setBinaryData(recorder.getFileName()); mPlayButton.setEnabled(true); mPlayButton.setBackgroundResource(R.drawable.play); recordingNameText.setTextColor(getResources().getColor(R.color.black)); recordingNameText.setText(Localization.get("recording.custom")); } @Override public String getFileUniqueIdentifier() { return questionIndexText; } @Override protected void playAudio() { Uri filePath = Uri.parse(mInstanceFolder + mBinaryName); player = MediaPlayer.create(getContext(), filePath); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { resetAudioPlayer(); } }); player.start(); mPlayButton.setBackgroundResource(R.drawable.pause); mPlayButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportAudioPaused(); pauseAudioPlayer(); } }); } private void pauseAudioPlayer() { player.pause(); mPlayButton.setBackgroundResource(R.drawable.play); mPlayButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportAudioPlayed(); resumeAudioPlayer(); } }); } private void resumeAudioPlayer() { player.start(); mPlayButton.setBackgroundResource(R.drawable.pause); mPlayButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportAudioPaused(); pauseAudioPlayer(); } }); } private void resetAudioPlayer() { player.release(); mPlayButton.setBackgroundResource(R.drawable.play); mPlayButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { GoogleAnalyticsUtils.reportAudioPlayed(); playAudio(); } }); } @Override protected void togglePlayButton(boolean enabled) { if (enabled) { mPlayButton.setBackgroundResource(R.drawable.play); } else { mPlayButton.setBackgroundResource(R.drawable.play_disabled); } mPlayButton.setEnabled(enabled); } @Override protected void reloadFile() { super.reloadFile(); recordingNameText.setTextColor(getResources().getColor(R.color.black)); if (mBinaryName.contains(CUSTOM_TAG)) { recordingNameText.setText(Localization.get("recording.custom")); } else { recordingNameText.setText(mBinaryName); } } @Override public void setOnLongClickListener(OnLongClickListener l) { } @Override public void cancelLongPress() { } @Override public void unsetListeners() { } }