package com.rapidftr.view.fields; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.provider.MediaStore; import android.util.AttributeSet; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.GridView; import android.widget.ImageView; import android.widget.Toast; import com.rapidftr.R; import com.rapidftr.RapidFtrApplication; import com.rapidftr.activity.RapidFtrActivity; import com.rapidftr.activity.ViewPhotoActivity; import com.rapidftr.adapter.ImageAdapter; import com.rapidftr.task.EncryptImageAsyncTask; import com.rapidftr.utils.PhotoCaptureHelper; import org.json.JSONArray; import org.json.JSONException; import java.util.UUID; import static com.rapidftr.activity.BaseChildActivity.CLOSE_ACTIVITY; public class PhotoUploadBox extends BaseView implements RapidFtrActivity.ResultListener { public static final int CAPTURE_IMAGE_REQUEST = 100; public static final int SHOW_FULL_IMAGE_REQUEST = 200; public static final String PHOTO_KEYS = "photo_keys"; public static final String CURRENT_PHOTO_KEY = "current_photo_key"; protected PhotoCaptureHelper photoCaptureHelper; private boolean enabled; public PhotoUploadBox(Context context) { super(context); photoCaptureHelper = new PhotoCaptureHelper(((RapidFtrActivity) context).getContext()); } public PhotoUploadBox(Context context, AttributeSet attrs) { super(context, attrs); photoCaptureHelper = new PhotoCaptureHelper(((RapidFtrActivity) context).getContext()); } @Override protected void initialize() throws JSONException { super.initialize(); RapidFtrActivity activity = (RapidFtrActivity) getContext(); activity.addResultListener(CAPTURE_IMAGE_REQUEST, this); activity.addResultListener(CLOSE_ACTIVITY, this); activity.addResultListener(SHOW_FULL_IMAGE_REQUEST, this); repaint(); } private void toggleVisibility() { if (enabled) { getImageContainer().setVisibility(View.VISIBLE); getImageContainer().setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onImageClick(); } }); } else { getImageContainer().setVisibility(View.GONE); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CAPTURE_IMAGE_REQUEST: if (resultCode == Activity.RESULT_OK) saveCapture(); break; case CLOSE_ACTIVITY: deleteCapture(); break; case SHOW_FULL_IMAGE_REQUEST: if (data != null && data.getStringExtra("file_name") != null) { model.put(CURRENT_PHOTO_KEY, data.getStringExtra("file_name")); } break; } } @Override public void setEnabled(boolean isEnabled) { this.enabled = isEnabled; toggleVisibility(); } protected void deleteCapture() { if (!model.optBoolean("saved", false)) { // TODO: Delete taken image } } public View getImageContainer() { return findViewById(R.id.thumbnail); } public void onImageClick() { if (enabled) { startCapture(); } } protected void showFullPhoto(String fileName) { Activity context = (Activity) getContext(); try { if (fileName == null) { Toast.makeText(RapidFtrApplication.getApplicationInstance(), R.string.photo_not_captured, Toast.LENGTH_LONG).show(); } else { Intent intent = new Intent(context, ViewPhotoActivity.class); intent.putExtra("file_name", fileName); intent.putExtra("enabled", enabled); context.startActivityForResult(intent, SHOW_FULL_IMAGE_REQUEST); } } catch (Exception e) { Toast.makeText(RapidFtrApplication.getApplicationInstance(), R.string.photo_view_error, Toast.LENGTH_LONG).show(); } } public void startCapture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoCaptureHelper.getTempCaptureFile())); RapidFtrActivity context = (RapidFtrActivity) getContext(); photoCaptureHelper.setCaptureTime(); context.startActivityForResult(intent, CAPTURE_IMAGE_REQUEST); } public void saveCapture() { try { Bitmap bitmap = photoCaptureHelper.getCapture(); if(bitmap != null){ int rotationDegree = photoCaptureHelper.getPictureRotation(); photoCaptureHelper.deleteCaptures(); String fileName = createCaptureFileName(); new EncryptImageAsyncTask(getContext(), photoCaptureHelper, bitmap, fileName, this, rotationDegree).execute(); addPhotoToPhotoKeys(fileName); addCurrentPhotoKeyIfNotPresent(fileName); } } catch (Exception e) { Toast.makeText(RapidFtrApplication.getApplicationInstance(), R.string.photo_capture_error, Toast.LENGTH_LONG).show(); } } private void addCurrentPhotoKeyIfNotPresent(String fileName) { if (model.optString(CURRENT_PHOTO_KEY).equals("")) { model.put(CURRENT_PHOTO_KEY, fileName); } } private void addPhotoToPhotoKeys(String fileName) throws JSONException { if (model.optJSONArray(PHOTO_KEYS) == null) { JSONArray photo_keys = new JSONArray(); photo_keys.put(fileName); model.put(PHOTO_KEYS, photo_keys); } else { model.getJSONArray(PHOTO_KEYS).put(fileName); } } protected String createCaptureFileName() { return UUID.randomUUID().toString(); } protected ImageView getImageView() { return new ImageView(getContext()); } public void repaint() throws JSONException { GridView photoGridView = getGalleryView(); final JSONArray photoKeys = model.optJSONArray(PHOTO_KEYS); addImageClickListener(photoGridView, photoKeys); if (photoKeys != null) { setGridAttributes(photoGridView, photoKeys); photoGridView.setAdapter(new ImageAdapter(getContext(), model, photoCaptureHelper, enabled)); } } protected void setGridAttributes(GridView photoGridView, JSONArray photoKeys) { LayoutParams layoutParams = (LayoutParams) photoGridView.getLayoutParams(); layoutParams.height = measureRealHeightForGridView(photoGridView, photoKeys.length()); } private int measureRealHeightForGridView(GridView gridView, int imagesCount){ WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); final int screenWidth = windowManager.getDefaultDisplay().getWidth(); final double screenDensity = getResources().getDisplayMetrics().density; final int horizontalSpacing = (int) (2 * screenDensity + 0.5f); final int verticalSpacing = (int) (2 * screenDensity + 0.5f); final int columnWidth = (int) (90 * screenDensity + 0.5f); final int columnsCount = (screenWidth - gridView.getVerticalScrollbarWidth()) / (columnWidth + horizontalSpacing); final int rowsCount = imagesCount / columnsCount + (imagesCount % columnsCount == 0 ? 0 : 1); return columnWidth * rowsCount + verticalSpacing * (rowsCount - 1); } private void addImageClickListener(GridView photoGridView, final JSONArray photoKeys) { photoGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (photoKeys != null) { try { showFullPhoto(photoKeys.get(position).toString()); } catch (JSONException e) { throw new RuntimeException(e); } } } }); } protected GridView getGalleryView() { return (GridView) findViewById(R.id.photo_grid_view); } }