/* Tibisay Movil Copyright (C) 2013 Antonio Araujo (aaraujo@cenditel.gob.ve), Jose Ruiz (jruiz@cenditel.gob.ve), Fundacion Centro Nacional de Desarrollo e Investigacion en Tecnologias Libres - CENDITEL. La Fundación CENDITEL concede permiso para usar, copiar, distribuir y/o modificar este programa, reconociendo el derecho que la humanidad posee al libre acceso al conocimiento, bajo los términos de la licencia de software GPL versión 2.0 de la Free Software Foundation. Este programa se distribuye con la esperanza de que sea util, pero SIN NINGUNA GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o ADECUACION A UN PROPOSITO PARTICULAR. Para mayor información sobre los términos de la licencia ver el archivo llamado "gpl-2.0.txt" en ingles. */ package ve.gob.cenditel.tibisaymovil; import java.io.File; import java.io.FileOutputStream; import java.util.Calendar; import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore.Images; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.Toast; public class CaptureImgHandwrittenSignatureActivity extends Activity{ LinearLayout mContent; signature mSignature; LinearLayout mClear, mGetSign, mCancel; public static String tempDir; public int count = 1; public String current = null; private Bitmap mBitmap; View mView; File mypath; private Canvas canvas; private String uniqueId; private String fileToSign; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Capturando archivo que será firmado fileToSign = getIntent().getExtras().getString("FILE_TO_SIGN"); //Estilando la barra de titulo final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.activity_capture_img_handwritten_signature); //Estilando Barra de titulo if(customTitleSupported) getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar); tempDir = Environment.getExternalStorageDirectory() + "/" + getResources().getString(R.string.app_name) + "/" + getResources().getString(R.string.external_dir) + "/"; /* * Crea si es necesario, un directorio en el cual la aplicación * puede colocar sus propios archivos de datos personalizados */ ContextWrapper cw = new ContextWrapper(getApplicationContext()); File directory = cw.getDir(getResources().getString(R.string.external_dir), Context.MODE_PRIVATE); File directory2 = cw.getDir(getResources().getString(R.string.external_dir_files), Context.MODE_PRIVATE); prepareDirectory(); // Obtiene identificador unico para el nombre del archivo uniqueId = getTodaysDate() + "_" + getCurrentTime(); current = uniqueId + ".png"; //Ruta completa para crear el archivo mypath= new File(tempDir,current); // Obtiene referencia a los recursos del layout mContent = (LinearLayout) findViewById(R.id.linearLayout); mClear = (LinearLayout)findViewById(R.id.button_clear_zone); mGetSign = (LinearLayout)findViewById(R.id.button_accept_zone); mCancel = (LinearLayout)findViewById(R.id.button_cancel_zone); mSignature = new signature(this, null); mContent.addView(mSignature, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); mGetSign.setEnabled(false); mView = mContent; mClear.setOnClickListener(new OnClickListener() { public void onClick(View v) { mSignature.clear(); mGetSign.setEnabled(false); } }); mGetSign.setOnClickListener(new OnClickListener() { public void onClick(View v) { boolean error = captureSignature(); if(!error){ mView.setDrawingCacheEnabled(true); mSignature.save(mView); Intent intent = new Intent(CaptureImgHandwrittenSignatureActivity.this, SelectSignUbicationHandwrittenSignatureActivity.class); intent.putExtra("STATUS", "done"); intent.putExtra("IMAGE_CAPTURED", mypath.getAbsolutePath()); intent.putExtra("FILE_TO_SIGN", fileToSign); startActivity(intent); Log.i("DEBUG", "saliendo"); // setResult(RESULT_OK,intent); // finish(); } } }); mCancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { finish(); } }); } @Override protected void onDestroy() { super.onDestroy(); } private boolean captureSignature() { boolean error = false; //String errorMessage = ""; /* // por ahora no nos interesa mostrar la caja de texto if(yourName.getText().toString().equalsIgnoreCase("")){ errorMessage = errorMessage + "Por favor introduzca su nombre\n"; error = true; } if(error){ Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); toast.setGravity(Gravity.TOP, 105, 50); toast.show(); } */ return error; } private String getTodaysDate() { final Calendar c = Calendar.getInstance(); int todaysDate = (c.get(Calendar.YEAR) * 10000) + ((c.get(Calendar.MONTH) + 1) * 100) + (c.get(Calendar.DAY_OF_MONTH)); return(String.valueOf(todaysDate)); } private String getCurrentTime() { final Calendar c = Calendar.getInstance(); int currentTime = (c.get(Calendar.HOUR_OF_DAY) * 10000) + (c.get(Calendar.MINUTE) * 100) + (c.get(Calendar.SECOND)); return(String.valueOf(currentTime)); } /** * Prepara directorio * @return boolean */ private boolean prepareDirectory() { try { if (makedirs()) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show(); return false; } } /** * Crea directorio utilizando la variable tmpDir * @return boolean */ private boolean makedirs() { File tempdir = new File(tempDir); if (!tempdir.exists()) tempdir.mkdirs(); if (tempdir.isDirectory()) { File[] files = tempdir.listFiles(); for (File file : files) { if (!file.delete()) { System.out.println("Failed to delete " + file); } } } return (tempdir.isDirectory()); } public class signature extends View { private static final float STROKE_WIDTH = 5f; private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2; private Paint paint = new Paint(); private Path path = new Path(); private float lastTouchX; private float lastTouchY; private final RectF dirtyRect = new RectF(); public signature(Context context, AttributeSet attrs) { super(context, attrs); paint.setAntiAlias(true); paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeWidth(STROKE_WIDTH); } public void save(View v) { if(mBitmap == null) { mBitmap = Bitmap.createBitmap (mContent.getWidth(), mContent.getHeight(), Bitmap.Config.ARGB_8888); } canvas = new Canvas(mBitmap); try { //Log.v("*****yourName:", yourName.getText().toString()); FileOutputStream mFileOutStream = new FileOutputStream(mypath); v.draw(canvas); mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream); mFileOutStream.flush(); mFileOutStream.close(); // String url = Images.Media.insertImage(getContentResolver(), mBitmap, "title", null); // Toast.makeText(CaptureImgHandwrittenSignatureActivity.this, // getString(R.string.firma_guardada) + " " + mypath, Toast.LENGTH_SHORT).show(); //In case you want to delete the file //boolean deleted = mypath.delete(); //Log.v("log_tag","deleted: " + mypath.toString() + deleted); //If you want to convert the image to string use base64 converter } catch(Exception e) { Log.v("log_tag", e.toString()); } } public void clear() { path.reset(); invalidate(); } @Override protected void onDraw(Canvas canvas) { canvas.drawPath(path, paint); // canvas.drawCircle(lastTouchX, lastTouchX, HALF_STROKE_WIDTH, paint); } @Override public boolean onTouchEvent(MotionEvent event) { float eventX = event.getX(); float eventY = event.getY(); mGetSign.setEnabled(true); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(eventX, eventY); lastTouchX = eventX; lastTouchY = eventY; return true; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: resetDirtyRect(eventX, eventY); int historySize = event.getHistorySize(); for (int i = 0; i < historySize; i++) { float historicalX = event.getHistoricalX(i); float historicalY = event.getHistoricalY(i); expandDirtyRect(historicalX, historicalY); path.lineTo(historicalX, historicalY); } path.lineTo(eventX, eventY); break; default: Log.i("DRAW:","Ignored touch event: " + event.toString()); return false; } invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH), (int) (dirtyRect.top - HALF_STROKE_WIDTH), (int) (dirtyRect.right + HALF_STROKE_WIDTH), (int) (dirtyRect.bottom + HALF_STROKE_WIDTH)); lastTouchX = eventX; lastTouchY = eventY; return true; } private void debug(String string){ } private void expandDirtyRect(float historicalX, float historicalY) { if (historicalX < dirtyRect.left) { dirtyRect.left = historicalX; } else if (historicalX > dirtyRect.right) { dirtyRect.right = historicalX; } if (historicalY < dirtyRect.top) { dirtyRect.top = historicalY; } else if (historicalY > dirtyRect.bottom) { dirtyRect.bottom = historicalY; } } private void resetDirtyRect(float eventX, float eventY) { dirtyRect.left = Math.min(lastTouchX, eventX); dirtyRect.right = Math.max(lastTouchX, eventX); dirtyRect.top = Math.min(lastTouchY, eventY); dirtyRect.bottom = Math.max(lastTouchY, eventY); } } }