/*
* 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.imaging;
import android.content.ActivityNotFoundException;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.muzima.R;
import com.muzima.utils.MediaUtils;
import com.muzima.view.BaseActivity;
import java.io.File;
import static com.muzima.utils.Constants.APP_IMAGE_DIR;
import static com.muzima.utils.Constants.TMP_FILE_PATH;
public class ImagingIntent extends BaseActivity {
private final static String TAG = "ImagingIntent";
public static final int IMAGE_CAPTURE = 1;
public static final int IMAGE_CHOOSE = 2;
public static final String KEY_IMAGE_PATH = "imagePath";
public static final String KEY_IMAGE_CAPTION = "imageCaption";
public static final String KEY_SECTION_NAME = "sectionName";
private String IMAGE_FOLDER;
private ImageView mImagePreview;
private EditText mImageCaption;
// private View mCaptionContainer;
private View mImageAcceptContainer;
private View mImageCaptureContainer;
private String mSectionName;
private String mBinaryName;
private String mBinaryDescription;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_imaging);
Intent i = getIntent();
String imagePath = i.getStringExtra(KEY_IMAGE_PATH);
mBinaryDescription = i.getStringExtra(KEY_IMAGE_CAPTION);
mSectionName = i.getStringExtra(KEY_SECTION_NAME);
// we are not using formUuid in the media path anymore
IMAGE_FOLDER = APP_IMAGE_DIR;
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_IMAGE_PATH))
mBinaryName = savedInstanceState.getString(KEY_IMAGE_PATH);
if (savedInstanceState.containsKey(KEY_IMAGE_CAPTION))
mBinaryDescription = savedInstanceState.getString(KEY_IMAGE_CAPTION);
if (savedInstanceState.containsKey(KEY_SECTION_NAME))
mSectionName = savedInstanceState.getString(KEY_SECTION_NAME);
} else {
if (imagePath != null) {
File image = new File(imagePath);
if (image.exists())
mBinaryName = image.getName();
}
}
mImagePreview = (ImageView) findViewById(R.id.imagePreview);
mImageCaption = (EditText) findViewById(R.id.imageCaption);
mImageAcceptContainer = findViewById(R.id.imageAcceptContainer);
mImageCaptureContainer = findViewById(R.id.imageCaptureContainer);
refreshImageView();
}
public void acceptImage(View view) {
String caption = mImageCaption.getText().toString();
if (caption == null || caption.length() < 1){
Toast.makeText(getApplicationContext(),getString(R.string.hint_image_caption_prompt), Toast.LENGTH_SHORT).show();
return;
}
String imageUri = IMAGE_FOLDER + File.separator + mBinaryName;
if (mBinaryName != null) {
Intent i = new Intent();
i.putExtra(KEY_SECTION_NAME, mSectionName);
i.putExtra(KEY_IMAGE_PATH, imageUri);
i.putExtra(KEY_IMAGE_CAPTION, caption);
setResult(RESULT_OK, i);
}
finish();
}
public void rejectImage(View view) {
mBinaryName=null;
mImagePreview.setImageResource(R.drawable.user_pic);
mImagePreview.getLayoutParams().height = (int) (150);
mImagePreview.getLayoutParams().width = (int) (120);
refreshImageView();
}
public void captureImage(View view) {
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(TMP_FILE_PATH)));
try {
startActivityForResult(i,IMAGE_CAPTURE);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(),getString(R.string.error_image_capture_activity_unavailable), Toast.LENGTH_SHORT).show();
}
}
public void chooseImage(View view) {
Intent i;
i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
try {
i.setType("image/*");
startActivityForResult(i, IMAGE_CHOOSE);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(),getString(R.string.error_image_chose_activity_unavailable), Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_SECTION_NAME, mSectionName);
outState.putString(KEY_IMAGE_PATH, mBinaryName);
outState.putString(KEY_IMAGE_CAPTION, mBinaryDescription);
}
private void refreshImageView() {
// Only add the imageView if the user has taken a picture
if (mBinaryName != null) {
mImagePreview.setAdjustViewBounds(true);
resizeImageView();
Display display =
((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
File f = new File(IMAGE_FOLDER + File.separator + mBinaryName);
if (f.exists()) {
Bitmap bmp = MediaUtils.getBitmapScaledToDisplay(f, screenHeight, screenWidth);
mImagePreview.setImageBitmap(bmp);
} else {
mImagePreview.setImageBitmap(null);
}
mImagePreview.setPadding(10, 10, 10, 10);
mImagePreview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("android.intent.action.VIEW");
String[] projection = {"_id"};
Cursor c = getApplicationContext().getContentResolver()
.query(Images.Media.EXTERNAL_CONTENT_URI,
projection, "_data='" + IMAGE_FOLDER + File.separator + mBinaryName + "'", null, null);
if (c.getCount() > 0) {
c.moveToFirst();
String id = c.getString(c.getColumnIndex("_id"));
Log.i(TAG, "setting view path to: " + Uri.withAppendedPath(
Images.Media.EXTERNAL_CONTENT_URI, id));
i.setDataAndType(Uri.withAppendedPath(
Images.Media.EXTERNAL_CONTENT_URI, id), "image/*");
try {
ImagingIntent.this.startActivity(i);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(),getString(R.string.error_image_view_activity_unavailable), Toast.LENGTH_SHORT).show();
}
}
c.close();
}
});
// show accept view
mImageAcceptContainer.setVisibility(View.VISIBLE);
// show caption view
mImageCaption.setVisibility(View.VISIBLE);
//hide capture view
mImageCaptureContainer.setVisibility(View.GONE);
if (mBinaryDescription != null)
mImageCaption.setText(mBinaryDescription);
} else {
//no image do allot here
// show accept view
mImageAcceptContainer.setVisibility(View.GONE);
// show caption view
mImageCaption.setVisibility(View.GONE);
//hide capture view
mImageCaptureContainer.setVisibility(View.VISIBLE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == RESULT_CANCELED) {
// request was canceled, so do nothing
return;
}
ContentValues values;
Uri imageURI;
String destImagePath = IMAGE_FOLDER + File.separator + System.currentTimeMillis();
switch (requestCode) {
case IMAGE_CAPTURE:
File tmpCapturedImage = new File(TMP_FILE_PATH);
File capturedImage = new File(destImagePath);
if (MediaUtils.folderExists(IMAGE_FOLDER)) {
if (!tmpCapturedImage.renameTo(capturedImage))
Log.e(TAG, "Failed to rename " + tmpCapturedImage.getAbsolutePath());
else {
Log.i(TAG, "renamed " + tmpCapturedImage.getAbsolutePath() + " to " + capturedImage.getAbsolutePath());
mBinaryName = capturedImage.getName();
refreshImageView();
}
}
break;
case IMAGE_CHOOSE:
String sourceImagePath = null;
Uri selectedImage = intent.getData();
if (selectedImage.toString().startsWith("file"))
sourceImagePath = selectedImage.toString().substring(6);
else {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(selectedImage, projection, null, null, null);
startManagingCursor(cursor);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
sourceImagePath = cursor.getString(column_index);
}
// Copy file to sdcard
File source = new File(sourceImagePath);
File chosenImage = new File(destImagePath);
if (MediaUtils.folderExists(IMAGE_FOLDER))
MediaUtils.copyFile(source, chosenImage);
if (chosenImage.exists()) {
mBinaryName = chosenImage.getName();
refreshImageView();
} else {
Log.e(TAG, "NO IMAGE EXISTS at: " + source.getAbsolutePath());
}
break;
}
}
private void resizeImageView() {
int width, height;
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
// Calculate image sizes
if (height > width) {
mImagePreview.getLayoutParams().height = (int) (width * 0.7);
mImagePreview.getLayoutParams().width = (int) (width * 0.7);
} else {
mImagePreview.getLayoutParams().height = (int) (height * 0.58);
mImagePreview.getLayoutParams().width = (int) (height * 0.58);
}
}
}