package co.touchlab.ir.library; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.*; import co.touchlab.ir.*; import java.io.*; /** * Created with IntelliJ IDEA. * User: touchlab * Date: 11/9/12 * Time: 5:23 PM * To change this template use File | Settings | File Templates. */ public class ReportIssueActivity extends Activity { protected IssueReport issueReport = null; public static final boolean CANNED_SHOULD_SHOW_SCREENSHOT = true; public static final boolean CANNED_SHOULD_SHOW_RECORD_AUDIO = true; private boolean hasRecorded = false; private ProgressBar audioProgress; private Button audioControlBtn; private final AudioRecorder ar = new AudioRecorder(); @Override public void onCreate(Bundle savedInstanceState) { UserActionLog.activityCreated(this.getClass().getSimpleName()); super.onCreate(savedInstanceState); setContentView(R.layout.report_issue); if (getIntent() != null && getIntent().hasExtra(RobotDownActivity.ISSUE_REPORT)) { issueReport = (IssueReport) getIntent().getSerializableExtra(RobotDownActivity.ISSUE_REPORT); } initControls(); } @Override protected void onResume() { IssueReportHelper.logActivityResumed(this); super.onResume(); } @Override protected void onDestroy() { super.onDestroy(); if (audioControlBtn.getText().toString().equalsIgnoreCase("Stop") && ar != null){ ar.stopRecording(); ar.discard(this); } } protected void initControls() { //pull out the fields for the dialog..... final EditText input = (EditText) findViewById(R.id.issue_text); final CheckBox includeScreenshot = (CheckBox) findViewById(R.id.includeScreenshot); if (!CANNED_SHOULD_SHOW_SCREENSHOT) includeScreenshot.setVisibility(View.GONE); final CheckBox includeAudioclip = (CheckBox) findViewById(R.id.includeAudioclip); if (!CANNED_SHOULD_SHOW_RECORD_AUDIO) includeAudioclip.setVisibility(View.GONE); final LinearLayout audioPanel = (LinearLayout) findViewById(R.id.audioPanel); this.audioControlBtn = (Button) findViewById(R.id.audioControlBtn); final Button audioControlBtn = this.audioControlBtn; this.audioProgress = (ProgressBar) findViewById(R.id.audioProgress); this.audioProgress.setHorizontalScrollBarEnabled(true); //wire controls to the audio action button.... audioControlBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (audioControlBtn.getText().toString().equalsIgnoreCase("Record") || audioControlBtn.getText().toString().equalsIgnoreCase("Re-Record")) { if(hasRecorded){ rerecordBtnPressed(ReportIssueActivity.this); } else{ ar.startRecording(ReportIssueActivity.this); restarttimebar(); audioControlBtn.setText("Stop"); } } else if (audioControlBtn.getText().toString().equalsIgnoreCase("Stop")) { hasRecorded = true; progressOn = false; ar.stopRecording(); audioControlBtn.setText("Re-Record"); } } }); //toggles visibility of audio panel, triggers dialog to discard audio message, resets panel to start state includeAudioclip.setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b){ stoptimebar(); audioPanel.setVisibility(View.VISIBLE); } else{ if(hasRecorded || progressOn){ deselctAudioClip(ReportIssueActivity.this,audioPanel,includeAudioclip); }else audioPanel.setVisibility(View.GONE); } } }); findViewById(R.id.send_report).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MemLog.ua(this.getClass().getSimpleName(), "ReportIssueActivity send clicked"); //sendReport(); String message = input.getText().toString(); if (includeScreenshot.isChecked()) IssueReporter.saveScreenshot(ReportIssueActivity.this, "test_image", true, true); if (includeAudioclip.isChecked()) { if (audioControlBtn.getText().toString().equalsIgnoreCase("Stop") && ar != null) ar.stopRecording(); File af = new File(ReportIssueActivity.this.getFilesDir(), AUDIO_FILE_NAME); if (af.exists() && af.length() > 0) { try { IssueReporter.saveFile(ReportIssueActivity.this, new FileInputStream(af), AUDIO_FILE_NAME, "3gp", false); } catch (FileNotFoundException e) { } } } IssueReporter.sendIssueReport(ReportIssueActivity.this, true, message, null ,(IssueParam[]) null); finish(); } }); } private void rerecordBtnPressed(final Activity activity) { AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle("Discard Message?"); alert.setMessage("Discard Previously Recorded Message?"); alert.setPositiveButton("Discard", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { ar.startRecording(activity); restarttimebar(); audioControlBtn.setText("Stop"); hasRecorded = false; } }); alert.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }); alert.create().show(); } private void deselctAudioClip(final Activity activity, final LinearLayout audioPanel, final CheckBox includeAudioclip) { AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle("Discard Message?"); alert.setMessage("Discard Previously Recorded Message?"); alert.setPositiveButton("Discard", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { ar.stopRecording(); ar.discard(activity); audioControlBtn.setText("Record"); hasRecorded = false; stoptimebar(); audioPanel.setVisibility(View.GONE); } }); alert.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); includeAudioclip.setChecked(true); } }); alert.create().show(); } public static void callMe(final Activity context) { new Thread() { @Override public void run() { final IssueReport issueReport = IssueReportHelper.prepareReportIssueManual(context, null); context.runOnUiThread(new Runnable() { @Override public void run() { callMe(context, issueReport); } }); } }.start(); } public static void callMe(Context context, IssueReport issueReport) { Intent intent = new Intent(context, ReportIssueActivity.class); intent.putExtra(RobotDownActivity.ISSUE_REPORT, issueReport); context.startActivity(intent); } private class AudioRecorder { private MediaRecorder mr = null; public void startRecording(Context context) { if (mr != null) stopRecording(); File af = new File(context.getFilesDir(), AUDIO_FILE_NAME); if (af.exists()) af.delete(); FileOutputStream fs = null; try { fs = context.openFileOutput(AUDIO_FILE_NAME, 0); } catch (FileNotFoundException e) { if (fs == null) return; } mr = new MediaRecorder(); mr.setAudioSource(MediaRecorder.AudioSource.MIC); mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mr.setOutputFile(fs.getFD()); } catch (IOException e) { } try { mr.prepare(); } catch (IOException e) { } mr.start(); } public void stopRecording() { if (mr != null) { mr.stop(); mr.release(); mr = null; } } public void discard(Context context){ File af = new File(context.getFilesDir(), AUDIO_FILE_NAME); if(af.exists()) af.delete(); } } public static String AUDIO_FILE_NAME = "audio_message.3gp"; private boolean progressOn = false; public void restarttimebar() { progressOn = true; stoptimebar(); for (int i = 1; i < (4 * 30); i++) { Message msg = timebarhandler.obtainMessage(0, i, 0); timebarhandler.sendMessageDelayed(msg, i * 250); } } public void stoptimebar() { timebarhandler.removeMessages(0); Message msg = timebarhandler.obtainMessage(0, 0, 0); timebarhandler.sendMessage(msg); } Handler timebarhandler = new Handler() { @Override public void handleMessage(Message msg) { if (!progressOn) { if(msg.arg1 == 0 && !hasRecorded) audioProgress.setProgress(0); return; } if (msg.arg1 == 0) { audioProgress.setProgress(0); } if (msg.arg1 > 0) { audioProgress.setProgress((int) ((float) msg.arg1 * .9)); } if (msg.arg1 == 119) { ar.stopRecording(); audioControlBtn.setText("Record"); } } }; }