/*
* 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.video;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Video;
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_VIDEO_DIR;
public class VideoIntent extends Activity {
private final static String TAG = "VideoIntent";
public static final String KEY_VIDEO_PATH = "videoPath";
public static final String KEY_VIDEO_CAPTION = "videoCaption";
public static final String KEY_SECTION_NAME = "sectionName";
private final int VIDEO_RECORD = 1;
private final int VIDEO_CHOOSE = 2;
private String VIDEO_FOLDER;
private boolean isNewVideo;
private TextView mNoVideoMessage;
private ImageView mVideoThumbnail;
private EditText mVideoCaption;
private View mVideoPreview;
private View mVideoAcceptContainer;
private View mVideoRecordContainer;
private String mSectionName;
private String mBinaryName;
private String mBinaryDescription;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
Intent i = getIntent();
String videoPath = i.getStringExtra(KEY_VIDEO_PATH);
mBinaryDescription = i.getStringExtra(KEY_VIDEO_CAPTION);
mSectionName = i.getStringExtra(KEY_SECTION_NAME);
// we are not using formUuid in the media path anymore
VIDEO_FOLDER = APP_VIDEO_DIR;
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_VIDEO_PATH))
mBinaryName = savedInstanceState.getString(KEY_VIDEO_PATH);
} else {
if (videoPath != null) {
File video = new File(videoPath);
if (video.exists())
mBinaryName = video.getName();
}
}
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_VIDEO_PATH))
mBinaryName = savedInstanceState.getString(KEY_VIDEO_PATH);
if (savedInstanceState.containsKey(KEY_VIDEO_CAPTION))
mBinaryDescription = savedInstanceState.getString(KEY_VIDEO_CAPTION);
if (savedInstanceState.containsKey(KEY_SECTION_NAME))
mSectionName = savedInstanceState.getString(KEY_SECTION_NAME);
} else {
if (videoPath != null) {
File video = new File(videoPath);
if (video.exists()) {
mBinaryName = video.getName();
isNewVideo = false;
}
}
}
mNoVideoMessage = (TextView) findViewById(R.id.noVideoMessage);
mVideoPreview = (View) findViewById(R.id.videoPreview);
mVideoCaption = (EditText) findViewById(R.id.videoCaption);
mVideoThumbnail = (ImageView) findViewById(R.id.videoThumbnail);
mVideoAcceptContainer = (View) findViewById(R.id.videoAcceptContainer);
mVideoRecordContainer = (View) findViewById(R.id.videoRecordContainer);
refreshVideoView();
}
public void acceptVideo(View view) {
String caption = mVideoCaption.getText().toString();
if (caption == null || caption.length() < 1){
Toast.makeText(getApplicationContext(),getString(R.string.hint_video_caption_prompt), Toast.LENGTH_SHORT).show();
return;
}
String videoUri = VIDEO_FOLDER + File.separator + mBinaryName;
if (mBinaryName != null) {
Intent i = new Intent();
i.putExtra(KEY_SECTION_NAME, mSectionName);
i.putExtra(KEY_VIDEO_PATH, videoUri);
i.putExtra(KEY_VIDEO_CAPTION, caption);
setResult(RESULT_OK, i);
}
finish();
}
public void rejectVideo(View view) {
if (isNewVideo)
deleteVideo();
mBinaryName=null;
refreshVideoView();
}
public void recordVideo(View view) {
isNewVideo = true;
Intent i = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, Video.Media.EXTERNAL_CONTENT_URI.toString());
try {
startActivityForResult(i, VIDEO_RECORD);
} catch (ActivityNotFoundException e) {
Toast.makeText(this,getString(R.string.info_video_record_activity_unavailable), Toast.LENGTH_SHORT).show();
}
}
public void chooseVideo(View view) {
isNewVideo = false;
Intent i;
i = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
try {
i.setType("video/*");
startActivityForResult(i,VIDEO_CHOOSE);
} catch (ActivityNotFoundException e) {
Toast.makeText(this,getString(R.string.info_video_chose_activity_unavailable), Toast.LENGTH_SHORT).show();
}
}
public void playVideo(View view) {
Intent i = new Intent("android.intent.action.VIEW");
File f = new File(VIDEO_FOLDER + File.separator + mBinaryName);
i.setDataAndType(Uri.fromFile(f), "video/*");
try {
startActivity(i);
} catch (ActivityNotFoundException e) {
Toast.makeText(VideoIntent.this,getString(R.string.info_video_play_activity_unavailable), Toast.LENGTH_SHORT).show();
}
}
private void refreshVideoView() {
if (mBinaryName != null) {
File f = new File(VIDEO_FOLDER + File.separator + mBinaryName);
Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(f.getAbsolutePath(), Video.Thumbnails.MICRO_KIND);
mVideoThumbnail.setImageBitmap(thumbnail);
// show preview with thumbnail view
mVideoPreview.setVisibility(View.VISIBLE);
// show accept view
mVideoAcceptContainer.setVisibility(View.VISIBLE);
// show caption view
mVideoCaption.setVisibility(View.VISIBLE);
//hide record view
mVideoRecordContainer.setVisibility(View.GONE);
//hide no message view
mNoVideoMessage.setVisibility(View.GONE);
if (mBinaryDescription != null)
mVideoCaption.setText(mBinaryDescription);
} else {
mVideoThumbnail.setImageBitmap(null);
// hide preview with thumbnail view
mVideoPreview.setVisibility(View.GONE);
// hide accept view
mVideoAcceptContainer.setVisibility(View.GONE);
// hide caption view
mVideoCaption.setVisibility(View.GONE);
//show record view
mVideoRecordContainer.setVisibility(View.VISIBLE);
//show no message view
mNoVideoMessage.setVisibility(View.VISIBLE);
}
}
private void deleteVideo() {
//delete from media provider
int del = MediaUtils.deleteVideoFileFromMediaProvider(this, VIDEO_FOLDER + File.separator + mBinaryName);
Log.i(TAG, "Deleted " + del + " rows from media content provider");
}
private String getPathFromUri(Uri uri) {
if (uri.toString().startsWith("file"))
return uri.toString().substring(6);
else {
String[] videoProjection = { Video.Media.DATA };
Cursor c = null;
try {
c = getContentResolver().query(uri,
videoProjection, null, null, null);
int column_index = c.getColumnIndexOrThrow(Video.Media.DATA);
String videoPath = null;
if (c.getCount() > 0) {
c.moveToFirst();
videoPath = c.getString(column_index);
}
return videoPath;
} finally {
if (c != null)
c.close();
}
}
}
public void saveVideo(Object videoUri) {
// you are replacing an answer. remove the media.
if (mBinaryName != null)
deleteVideo();
// get the file path and create a copy in the instance folder
String videoPath = getPathFromUri((Uri) videoUri);
String extension = videoPath.substring(videoPath.lastIndexOf("."));
String destVideoPath = VIDEO_FOLDER + File.separator + System.currentTimeMillis() + extension;
File source = new File(videoPath);
File newVideo = new File(destVideoPath);
if (MediaUtils.folderExists(VIDEO_FOLDER))
MediaUtils.copyFile(source, newVideo);
if (newVideo.exists())
mBinaryName = newVideo.getName();
else
Log.e(TAG, "Inserting Video file FAILED");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (intent != null) {
Uri videoUri = intent.getData();
saveVideo(videoUri);
refreshVideoView();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_SECTION_NAME, mSectionName);
outState.putString(KEY_VIDEO_PATH, mBinaryName);
outState.putString(KEY_VIDEO_CAPTION, mBinaryDescription);
}
}