package org.witness.informacam.app.utils; import info.guardianproject.odkparser.Constants.RecorderState; import info.guardianproject.odkparser.utils.QD; import info.guardianproject.odkparser.widgets.ODKSeekBar; import info.guardianproject.odkparser.widgets.ODKSeekBar.OnMediaRecorderStopListener; import org.witness.informacam.InformaCam; import org.witness.informacam.app.utils.Constants.App; import org.witness.informacam.app.utils.Constants.App.Editor.Forms; import org.witness.informacam.models.forms.IForm; import org.witness.informacam.utils.Constants.App.Storage; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Handler; import android.util.Log; public class AudioNoteHelper implements OnCompletionListener, OnMediaRecorderStopListener { public ODKSeekBar progress; int state = RecorderState.IS_IDLE; Handler h = new Handler(); public IForm form; InformaCam informaCam = InformaCam.getInstance(); private long mRecordingStartTime; public AudioNoteHelper(Activity a, IForm form) { this.form = form; progress = new ODKSeekBar(a); initData(); } private void updateClock(int time) { Log.d(App.Home.LOG, "counter: " + time); onUpdateClock(time); } private void initData() { progress.init(new java.io.File(Storage.EXTERNAL_DIR, "tmprecord_" + System.currentTimeMillis() + ".3gp"), this); QD qd = form.getQuestionDefByTitleId(Forms.FreeAudio.PROMPT); if (qd.hasInitialValue) { progress.setRawAudioData(qd.initialValue.getBytes()); updateClock(progress.mp.getDuration()); } this.form.associate(progress, Forms.FreeAudio.PROMPT); } public void toggle() { switch (state) { case RecorderState.IS_IDLE: if (progress.rawAudioData == null) { // record progress.record(); setState(RecorderState.IS_RECORDING); } else { if (state != RecorderState.IS_IDLE) { if (state == RecorderState.IS_RECORDING) { progress.stop(); } else if (state == RecorderState.IS_PLAYING) { progress.pause(); } setState(RecorderState.IS_IDLE); } progress.play(); setState(RecorderState.IS_PLAYING); } break; case RecorderState.IS_RECORDING: progress.stop(); setState(RecorderState.IS_IDLE); form.answer(Forms.FreeAudio.PROMPT); break; case RecorderState.IS_PLAYING: progress.pause(); setState(RecorderState.IS_IDLE); break; } } public void done() { if (state == RecorderState.IS_PLAYING) { progress.pause(); } else if (state == RecorderState.IS_RECORDING) { progress.stop(); } setState(RecorderState.IS_IDLE); form.answer(Forms.FreeAudio.PROMPT); } public void redo() { if (state == RecorderState.IS_PLAYING) { progress.pause(); } else if (state == RecorderState.IS_RECORDING) { progress.stop(); } form.getQuestionDefByTitleId(Forms.FreeAudio.PROMPT).clear(); progress.reInit(new java.io.File(Storage.EXTERNAL_DIR, "tmprecord_" + System.currentTimeMillis() + ".3gp"), this); } @Override public void onCompletion(MediaPlayer mp) { Log.d(App.Home.LOG, "FINISHED PLAYING MEDIA FILE"); progress.pause(); mp.seekTo(0); setState(RecorderState.IS_IDLE); } @Override public void onMediaRecorderStop() { Log.d(App.Home.LOG, "HERE I CALL ON MEDIA RECORDER STOP"); } private void setState(int newState) { state = newState; onStateChanged(); if (state == RecorderState.IS_RECORDING) { mRecordingStartTime = System.currentTimeMillis(); h.post(mUpdateRecordTimeRunnable); } else { h.removeCallbacks(mUpdateRecordTimeRunnable); } } Runnable mUpdateRecordTimeRunnable = new Runnable() { @Override public void run() { onUpdateClock((int) (System.currentTimeMillis() - mRecordingStartTime)); if (getState() == RecorderState.IS_RECORDING) h.postDelayed(mUpdateRecordTimeRunnable, 1000); } }; public int getState() { return state; } protected void onUpdateClock(int time) { } /** * Override this to handle state changes */ protected void onStateChanged() { } public void setCurrentPosition(int msec) { progress.setProgress(msec / 1000); progress.onProgressChanged(progress, progress.getProgress(), true); // Make sure callback is called as if from user! } }