package com.jasonette.seed.Action;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import com.commonsware.cwac.cam2.AbstractCameraActivity;
import com.commonsware.cwac.cam2.CameraActivity;
import com.commonsware.cwac.cam2.VideoRecorderActivity;
import com.commonsware.cwac.cam2.ZoomStyle;
import com.jasonette.seed.Helper.JasonHelper;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JasonMediaAction {
/**********************************
*
* Play
*
**********************************/
public void play(final JSONObject action, JSONObject data, final JSONObject event, final Context context) {
try {
if(action.has("options")){
Intent intent = new Intent(Intent.ACTION_VIEW);
if(action.getJSONObject("options").has("url")){
intent.setDataAndType(Uri.parse(action.getJSONObject("options").getString("url")), "video/mp4");
}
if(action.getJSONObject("options").has("muted")){
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);
} else {
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
}
}
JSONObject callback = new JSONObject();
callback.put("class", "JasonMediaAction");
callback.put("method", "finishplay");
JasonHelper.dispatchIntent(action, data, event, context, intent, callback);
}
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
// Util for play
public void finishplay(Intent intent, final JSONObject options) {
try {
JSONObject action = options.getJSONObject("action");
JSONObject event = options.getJSONObject("event");
Context context = (Context) options.get("context");
// revert mute
if(action.getJSONObject("options").has("muted")){
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE, 0);
} else {
am.setStreamMute(AudioManager.STREAM_MUSIC, false);
}
}
JasonHelper.next("success", action, new JSONObject(), event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
/**********************************
*
* Picker + Camera
*
**********************************/
public void picker(final JSONObject action, JSONObject data, final JSONObject event, final Context context) {
// Image picker intent
try {
String type = "image";
if(action.has("options")){
if(action.getJSONObject("options").has("type")){
type = action.getJSONObject("options").getString("type");
}
}
Intent intent;
if(type.equalsIgnoreCase("video")){
// video
intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
} else {
// image
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
// dispatchIntent method
// 1. triggers an external Intent
// 2. attaches a callback with all the payload so that we can pick it up where we left off when the intent returns
// the callback needs to specify the class name and the method name we wish to trigger after the intent returns
JSONObject callback = new JSONObject();
callback.put("class", "JasonMediaAction");
callback.put("method", "process");
JasonHelper.dispatchIntent(action, data, event, context, intent, callback);
} catch (SecurityException e){
JasonHelper.permission_exception("$media.picker", context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
public void camera(final JSONObject action, JSONObject data, final JSONObject event, final Context context) {
// Image picker intent
try {
AbstractCameraActivity.Quality q = AbstractCameraActivity.Quality.LOW;
String type = "photo";
Boolean edit = false;
if(action.has("options")) {
JSONObject options = action.getJSONObject("options");
// type
if (options.has("type")) {
type = options.getString("type");
}
// quality
if(type.equalsIgnoreCase("video")) {
// video
// high by default
q = AbstractCameraActivity.Quality.HIGH;
} else {
// photo
// high by default
q = AbstractCameraActivity.Quality.HIGH;
}
if (options.has("quality")) {
String quality = options.getString("quality");
if (quality.equalsIgnoreCase("low")) {
q = AbstractCameraActivity.Quality.LOW;
} else if (quality.equalsIgnoreCase("medium")) {
q = AbstractCameraActivity.Quality.HIGH;
}
}
// edit
if (options.has("edit")) {
edit = true;
}
}
Intent intent;
if(type.equalsIgnoreCase("video")) {
// video
VideoRecorderActivity.IntentBuilder builder =new VideoRecorderActivity.IntentBuilder(context)
.to(createFile("video", context))
.zoomStyle(ZoomStyle.SEEKBAR)
.updateMediaStore()
.quality(q);
intent = builder.build();
} else {
// photo
CameraActivity.IntentBuilder builder = new CameraActivity.IntentBuilder(context)
.to(createFile("image", context))
.zoomStyle(ZoomStyle.SEEKBAR)
.updateMediaStore()
.quality(q);
if(!edit){
builder.skipConfirm();
}
intent = builder.build();
}
// dispatchIntent method
// 1. triggers an external Intent
// 2. attaches a callback with all the payload so that we can pick it up where we left off when the intent returns
// the callback needs to specify the class name and the method name we wish to trigger after the intent returns
JSONObject callback = new JSONObject();
callback.put("class", "JasonMediaAction");
callback.put("method", "process");
JasonHelper.dispatchIntent(action, data, event, context, intent, callback);
} catch (SecurityException e){
JasonHelper.permission_exception("$media.camera", context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
// util
public void process(Intent intent, final JSONObject options) {
try {
JSONObject action = options.getJSONObject("action");
JSONObject data = options.getJSONObject("data");
JSONObject event = options.getJSONObject("event");
Context context = (Context)options.get("context");
Uri uri = intent.getData();
// handling image
String type = "image";
if(action.has("options")) {
if (action.getJSONObject("options").has("type")) {
type = action.getJSONObject("options").getString("type");
}
}
if(type.equalsIgnoreCase("video")){
// video
try {
JSONObject ret = new JSONObject();
ret.put("file_url", uri.toString());
ret.put("content_type", "video/mp4");
JasonHelper.next("success", action, ret, event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
} else {
// image
InputStream stream = context.getContentResolver().openInputStream(uri);
byte[] byteArray = JasonHelper.readBytes(stream);
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
String data_uri = "data:image/jpeg;base64," + encoded;
try {
JSONObject ret = new JSONObject();
ret.put("data", encoded);
ret.put("data_uri", data_uri);
ret.put("content_type", "image/jpeg");
JasonHelper.next("success", action, ret, event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
private File createFile(String type, Context context) throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String fileName = "" + timeStamp + "_";
File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File f;
if(type.equalsIgnoreCase("image")) {
f = File.createTempFile( fileName, ".jpg", storageDir );
} else if(type.equalsIgnoreCase("video")){
f = File.createTempFile( fileName, ".mp4", storageDir );
} else {
f = File.createTempFile( fileName, ".txt", storageDir );
}
return f;
}
}