package lab.prada.collage; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import com.androidquery.AQuery; import java.io.IOException; import java.util.ArrayList; import java.util.Random; import lab.prada.collage.component.BaseLabelView; import lab.prada.collage.component.BaseLabelView.OnLabelListener; import lab.prada.collage.component.ComponentFactory; import lab.prada.collage.component.PhotoView; import lab.prada.collage.component.PhotoView.OnPhotoListener; import lab.prada.collage.util.CameraImageHelper; import lab.prada.collage.util.GlassesDetector; import lab.prada.collage.util.StoreImageHelper; import lab.prada.collage.util.StoreImageHelper.onSaveListener; public class MainActivity extends Activity implements OnLabelListener, OnPhotoListener { private static final int SELECT_PHOTO = 0; private static final int ADD_NEW_TEXT = 1; private static final int MODIFY_TEXT = 2; private static final int MODIFY_PHOTO = 3; private AQuery aq; private ProgressDialog progressDialog; private ViewGroup allViews; private ViewGroup textPanel; private ViewGroup photoPanel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); aq = new AQuery(this); aq.find(R.id.btnSave).clicked(this, "clickSave"); aq.find(R.id.btnAddPic).clicked(this, "clickAddPic"); aq.find(R.id.btnAddText).clicked(this, "clickAddText"); aq.find(R.id.btnAddGlasses).clicked(this, "clickAddGlasses"); allViews = (ViewGroup) aq.find(R.id.frame).getView(); textPanel = (ViewGroup) aq.find(R.id.frame_texts).getView(); photoPanel = (ViewGroup) aq.find(R.id.frame_images).getView(); } private void showProgressDialog(boolean enable) { if (enable) { progressDialog = ProgressDialog.show(this, getResources() .getString(R.string.progress_title), getResources() .getString(R.string.progress_message), true); } else { if (progressDialog != null) { progressDialog.dismiss(); progressDialog = null; } } } public void clickSave(View button) { showProgressDialog(true); StoreImageHelper.save(getContentResolver(), allViews, new onSaveListener() { @Override public void onSaveSuccess() { showProgressDialog(false); } @Override public void onSaveFail() { showProgressDialog(false); } }); } public void clickAddPic(View button) { Intent intent = new Intent(this, MultipleImagePickerActivity.class); startActivityForResult(intent, SELECT_PHOTO); } public void clickAddGlasses(View button) { /* * showProgressDialog(true); new Thread(new Runnable() { * * @Override public void run() { */ cleanSticks(); GlassesDetector detector = new GlassesDetector(MainActivity.this, (ViewGroup) aq.find(R.id.frame_sticks).getView()); detector.detectFaces((ViewGroup) aq.find(R.id.frame_images).getView()); /* * showProgressDialog(false); } }).start(); */ } private void cleanSticks() { ((ViewGroup) aq.find(R.id.frame_sticks).getView()).removeAllViews(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == RESULT_OK) { switch (requestCode) { case SELECT_PHOTO: String[] paths = intent .getStringArrayExtra(MultipleImagePickerActivity.EXTRA_IMAGE_PICKER_IMAGE_PATH); ArrayList<PhotoView> photos = new ArrayList<PhotoView>(); if (paths.length > 0) { clearImages(); int gapX = photoPanel.getWidth() / Constants.SUPPORTED_FRAME_WIDTH; int gapY = photoPanel.getHeight() / Constants.SUPPORTED_FRAME_HEIGHT; int x, y; // ImageView iv; PhotoView iv; Random rand = new Random(); int[] x_pos = {1, 0, 2}; int[] y_pos = {2, 3, 1, 0}; for (int i = 0; i < paths.length; i++) { //x = (i % Constants.SUPPORTED_FRAME_WIDTH) * gapX; //y = (i / Constants.SUPPORTED_FRAME_WIDTH) * gapY; y = y_pos[i % 4] * gapY; x = x_pos[i % Constants.SUPPORTED_FRAME_WIDTH] * gapX; //iv = ComponentFactory.createImage(this, this); iv = ComponentFactory.create(ComponentFactory.COMPONENT_IMAGE, this); iv.setListener(this); try { // angle if (i%5 <= 2) { iv.setRotation(30*(i%5)); } else { iv.setRotation(360 - 30*(i%5 - 2)); } //size float a = 1 + (12 - (float)paths.length)/12; float b = 1 + (12 - (float)paths.length)/12; iv.setScaleX(a); iv.setScaleY(b); iv.setImageBitmap(CameraImageHelper .checkAndRotatePhoto(paths[i])); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( gapX, gapY); params.setMargins(x, y, 0, 0); iv.setLayoutParams(params); iv.set_pos(x, y); photos.add(iv); //photoPanel.addView(iv); } catch (IOException e) { e.printStackTrace(); } } int num = 0; while (num <= 4) { for (int i = 0; i < photos.size(); i++) { PhotoView temp = photos.get(i); if (temp.get_y_val() == num*gapY) { photoPanel.addView(temp); } } num = num + 1; } photoPanel.invalidate(); } break; case MODIFY_PHOTO: if (currentSelectedImage != null) { try { Bitmap bitmap = CameraImageHelper.checkAndRotatePhoto(getRealPathFromURI(intent.getData())); if(bitmap!=null){ currentSelectedImage.setImage(bitmap); } } catch (IOException e) { e.printStackTrace(); } currentSelectedImage = null; } break; case ADD_NEW_TEXT: String text = intent .getStringExtra(TextEditorActivity.EXTRA_EDITOR_TEXT); if (text == null || text.trim() == null) return; int color = intent.getIntExtra( TextEditorActivity.EXTRA_EDITOR_COLOR, Color.BLACK); boolean hasStroke = intent.getBooleanExtra( TextEditorActivity.EXTRA_EDITOR_BORDER, false); addTextView(text, color, hasStroke); break; case MODIFY_TEXT: if (currentSelectedText != null) { String txt = intent .getStringExtra(TextEditorActivity.EXTRA_EDITOR_TEXT); if (txt == null || txt.trim() == null) return; currentSelectedText.setText(txt, intent.getIntExtra( TextEditorActivity.EXTRA_EDITOR_COLOR, Color.BLACK), intent.getBooleanExtra( TextEditorActivity.EXTRA_EDITOR_BORDER, false)); currentSelectedText = null; } break; } } } private String getRealPathFromURI(Uri contentURI) { Cursor cursor = getContentResolver().query(contentURI, null, null, null, null); if (cursor == null) { // Source is Dropbox or other similar local file path return contentURI.getPath(); } else { cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); return cursor.getString(idx); } } private void clearImages() { photoPanel.removeAllViews(); } @SuppressLint("NewApi") private void addTextView(String text, int color, boolean hasStroke) { //BaseLabelView tv = ComponentFactory.createText(this, this); BaseLabelView tv = ComponentFactory.create(ComponentFactory.COMPONENT_LABEL, this); tv.setListener(this); tv.setXY(textPanel.getWidth() / 2, textPanel.getHeight() / 2); tv.setText(text, color, hasStroke); textPanel.addView(tv.getView()); } public void clickAddText(View button) { Intent intent = new Intent(this, TextEditorActivity.class); startActivityForResult(intent, ADD_NEW_TEXT); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } private BaseLabelView currentSelectedText = null; private PhotoView currentSelectedImage = null; @Override public void onModifyLabel(BaseLabelView view, String text, int color, boolean hasStroke) { Intent intent = new Intent(this, TextEditorActivity.class); currentSelectedText = view; intent.putExtra(TextEditorActivity.EXTRA_EDITOR_TEXT, text); intent.putExtra(TextEditorActivity.EXTRA_EDITOR_COLOR, color); intent.putExtra(TextEditorActivity.EXTRA_EDITOR_BORDER, hasStroke); intent.putExtra(TextEditorActivity.EXTRA_EDITOR_TYPE, TextEditorActivity.TYPE_UPDATE); startActivityForResult(intent, MODIFY_TEXT); } @Override public void onBackPressed() { new AlertDialog.Builder(this) .setTitle(R.string.dialog_exit_title) .setMessage(R.string.dialog_exit_message) .setPositiveButton(R.string.dialog_exit_ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int arg1) { dialog.dismiss(); finish(); } }) .setNegativeButton(R.string.dialog_exit_cancel, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } @Override public void onModifyPhoto(PhotoView view) { currentSelectedImage = view; Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, MODIFY_PHOTO); } }