/*
* Copyright (c) 2014. The Trustees of Indiana University.
*
* This version of the code is licensed under the MPL 2.0 Open Source license with additional
* healthcare disclaimer. If the user is an entity intending to commercialize any application
* that uses this code in a for-profit venture, please contact the copyright holder.
*/
package com.muzima.utils.audio;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.muzima.R;
import com.muzima.utils.MediaUtils;
import java.io.File;
import static com.muzima.utils.Constants.APP_AUDIO_DIR;
public class AudioIntent extends Activity {
private final static String TAG = "AudioIntent";
public static final String KEY_AUDIO_PATH = "audioPath";
public static final String KEY_AUDIO_CAPTION = "audioCaption";
public static final String KEY_SECTION_NAME = "sectionName";
private final int AUDIO_CAPTURE = 1;
private final int AUDIO_CHOOSE = 2;
private String AUDIO_FOLDER;
private boolean isNewAudio;
private TextView mNoAudioMessage;
private ImageView mAudioThumbnail;
private EditText mAudioCaption;
private View mAudioPreview;
private View mAudioAcceptContainer;
private View mAudioRecordContainer;
private String mSectionName;
private String mBinaryName;
private String mBinaryDescription;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio);
Intent i = getIntent();
String audioPath = i.getStringExtra(KEY_AUDIO_PATH);
mBinaryDescription = i.getStringExtra(KEY_AUDIO_CAPTION);
mSectionName = i.getStringExtra(KEY_SECTION_NAME);
// we are not using formUuid in the media path anymore
AUDIO_FOLDER = APP_AUDIO_DIR;
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_AUDIO_PATH))
mBinaryName = savedInstanceState.getString(KEY_AUDIO_PATH);
} else {
if (audioPath != null) {
File audio = new File(audioPath);
if (audio.exists())
mBinaryName = audio.getName();
}
}
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_AUDIO_PATH))
mBinaryName = savedInstanceState.getString(KEY_AUDIO_PATH);
if (savedInstanceState.containsKey(KEY_AUDIO_CAPTION))
mBinaryDescription = savedInstanceState.getString(KEY_AUDIO_CAPTION);
if (savedInstanceState.containsKey(KEY_SECTION_NAME))
mSectionName = savedInstanceState.getString(KEY_SECTION_NAME);
} else {
if (audioPath != null) {
File audio = new File(audioPath);
if (audio.exists()) {
mBinaryName = audio.getName();
isNewAudio = false;
}
}
}
mNoAudioMessage = (TextView) findViewById(R.id.noAudioMessage);
mAudioPreview = (View) findViewById(R.id.audioPreview);
mAudioCaption = (EditText) findViewById(R.id.audioCaption);
mAudioThumbnail = (ImageView) findViewById(R.id.audioThumbnail);
mAudioAcceptContainer = (View) findViewById(R.id.audioAcceptContainer);
mAudioRecordContainer = (View) findViewById(R.id.audioRecordContainer);
refreshAudioView();
}
public void acceptAudio(View view) {
String caption = mAudioCaption.getText().toString();
if (caption == null || caption.length() < 1){
Toast.makeText(getApplicationContext(),getString(R.string.hint_audio_caption), Toast.LENGTH_SHORT).show();
return;
}
String audioUri = AUDIO_FOLDER + File.separator + mBinaryName;
if (mBinaryName != null) {
Intent i = new Intent();
i.putExtra(KEY_SECTION_NAME, mSectionName);
i.putExtra(KEY_AUDIO_PATH, audioUri);
i.putExtra(KEY_AUDIO_CAPTION, caption);
setResult(RESULT_OK, i);
}
finish();
}
public void rejectAudio(View view) {
if (isNewAudio)
deleteMedia();
mBinaryName=null;
refreshAudioView();
}
public void recordAudio(View view) {
isNewAudio = true;
Intent i = new Intent(Audio.Media.RECORD_SOUND_ACTION);
i.putExtra(MediaStore.EXTRA_OUTPUT,
Audio.Media.EXTERNAL_CONTENT_URI.toString());
try {
startActivityForResult(i, AUDIO_CAPTURE);
} catch (ActivityNotFoundException e) {
Toast.makeText(this,getString(R.string.error_audio_record_activity_find), Toast.LENGTH_SHORT).show();
}
}
public void chooseAudio(View view) {
isNewAudio = false;
Intent i;
i = new Intent(Intent.ACTION_GET_CONTENT, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
i.addCategory(Intent.CATEGORY_OPENABLE);
try {
i.setType("audio/*");
startActivityForResult(i,AUDIO_CHOOSE);
} catch (ActivityNotFoundException e) {
Log.d(TAG,e.getMessage(), e);
Toast.makeText(this,getString(R.string.error_audio_chose_activity_find), Toast.LENGTH_SHORT).show();
}
}
public void playAudio(View view) {
Intent i = new Intent("android.intent.action.VIEW");
File f = new File(AUDIO_FOLDER + File.separator + mBinaryName);
i.setDataAndType(Uri.fromFile(f), "audio/*");
try {
startActivity(i);
} catch (ActivityNotFoundException e) {
Toast.makeText(AudioIntent.this,getString(R.string.error_audio_play_activity_find), Toast.LENGTH_SHORT).show();
}
}
private void refreshAudioView() {
if (mBinaryName != null) {
// show preview with thumbnail view
mAudioPreview.setVisibility(View.VISIBLE);
// show accept view
mAudioAcceptContainer.setVisibility(View.VISIBLE);
// show caption view
mAudioCaption.setVisibility(View.VISIBLE);
//hide record view
mAudioRecordContainer.setVisibility(View.GONE);
//hide no message view
mNoAudioMessage.setVisibility(View.GONE);
if (mBinaryDescription != null)
mAudioCaption.setText(mBinaryDescription);
} else {
mAudioThumbnail.setImageBitmap(null);
// hide preview with thumbnail view
mAudioPreview.setVisibility(View.GONE);
// hide accept view
mAudioAcceptContainer.setVisibility(View.GONE);
// hide caption view
mAudioCaption.setVisibility(View.GONE);
//show record view
mAudioRecordContainer.setVisibility(View.VISIBLE);
//show no message view
mNoAudioMessage.setVisibility(View.VISIBLE);
}
}
private void deleteMedia() {
//delete from media provider
int del = MediaUtils.deleteAudioFileFromMediaProvider(this, AUDIO_FOLDER + File.separator + mBinaryName);
Log.i(TAG, "Deleted " + del + " rows from media content provider");
}
public void saveAudio(String audioPath) {
if (mBinaryName != null)
deleteMedia();
String extension = audioPath.substring(audioPath.lastIndexOf("."));
String destAudioPath = AUDIO_FOLDER + File.separator + System.currentTimeMillis() + extension;
File source = new File(audioPath);
File newAudio = new File(destAudioPath);
if (MediaUtils.folderExists(AUDIO_FOLDER))
MediaUtils.copyFile(source, newAudio);
if (newAudio.exists())
mBinaryName = newAudio.getName();
else
Log.e(TAG, "Inserting Audio file FAILED");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (intent != null) {
boolean openDocument = false;
if (requestCode == AUDIO_CHOOSE)
openDocument = true;
// get the file path and create a copy in the instance folder
String audioPath = getPathFromUri((Uri) intent.getData(), openDocument);
saveAudio(audioPath);
refreshAudioView();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_SECTION_NAME, mSectionName);
outState.putString(KEY_AUDIO_PATH, mBinaryName);
outState.putString(KEY_AUDIO_CAPTION, mBinaryDescription);
}
private String getPathFromUri(Uri uri, boolean isOpenDocument) {
if (uri.toString().startsWith("file"))
return uri.toString().substring(6);
else {
String[] audioProjection = {Audio.Media.DATA };
String audioSelection = null;
Cursor c = null;
try {
if (isOpenDocument) {
String id = uri.getLastPathSegment().split(":")[1];
audioSelection = Audio.Media._ID + "=" + id;
uri = getUri();
}
c = getContentResolver().query(uri, audioProjection, audioSelection, null, null);
int column_index = c.getColumnIndexOrThrow(Audio.Media.DATA);
String audioPath = null;
if (c.getCount() > 0) {
c.moveToFirst();
audioPath = c.getString(column_index);
}
return audioPath;
} finally {
if (c != null)
c.close();
}
}
}
// Get the Uri of Internal/External Storage for Media
private Uri getUri() {
String state = Environment.getExternalStorageState();
if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
return MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
}