source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/EncryptionCertificatesActivity.java @ 4c4873f

Last change on this file since 4c4873f was ba6bc7c, checked in by Antonio Araujo Brett <aaraujo@…>, 11 years ago

Deshabilitados mensajes de depuración en clases.

  • Property mode set to 100644
File size: 18.0 KB
Line 
1package ve.gob.cenditel.tibisaymovil;
2
3import java.io.BufferedInputStream;
4import java.io.File;
5import java.io.FileInputStream;
6import java.io.FileNotFoundException;
7import java.io.IOException;
8import java.io.InputStream;
9import java.security.cert.Certificate;
10import java.security.cert.CertificateException;
11import java.security.cert.CertificateFactory;
12import java.security.cert.X509Certificate;
13import java.util.ArrayList;
14import java.util.HashMap;
15
16
17
18import ee.sk.digidoc.DigiDocException;
19import ee.sk.digidoc.SignedDoc;
20
21
22
23import android.os.Bundle;
24import android.os.Environment;
25import android.annotation.SuppressLint;
26import android.app.Activity;
27import android.app.AlertDialog;
28import android.content.Context;
29import android.content.DialogInterface;
30import android.content.Intent;
31import android.util.Log;
32import android.view.LayoutInflater;
33import android.view.Menu;
34import android.view.View;
35import android.view.ViewGroup;
36import android.view.Window;
37import android.view.View.OnClickListener;
38import android.widget.AdapterView;
39import android.widget.BaseAdapter;
40import android.widget.ImageView;
41import android.widget.LinearLayout;
42import android.widget.ListView;
43import android.widget.RadioButton;
44import android.widget.TextView;
45import android.widget.Toast;
46import android.widget.AdapterView.OnItemClickListener;
47
48
49
50
51// activity para gestionar los certificados de destinatarios disponibles para cifrar
52// un archivo
53public class EncryptionCertificatesActivity extends Activity  {
54
55       
56        // layout del boton agregar certificado
57        private LinearLayout button_add;
58
59        // layout del boton eliminar certificado
60        private LinearLayout button_remove;
61   
62        // ListView que mantiene la lista de certificados
63    private ListView certificate_list;
64       
65    // ruta del directorio que almancena los certificados de destinatarios
66    String certificatesDir;
67   
68    // id de certificado seleccionado
69    int certificateSelectedIndex = -1;
70   
71    // lista de rutas absolutas de archivos de certificados
72    HashMap<String, String> certificatesPathHashMap = null;
73   
74   
75    // intent para relanzar al momento de eliminar un certificado
76    Intent starterIntent = null;
77   
78        @Override
79        protected void onCreate(Bundle savedInstanceState) {
80               
81               
82                //Estilando la barra de titulo
83                final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
84               
85                super.onCreate(savedInstanceState);
86                setContentView(R.layout.activity_encryption_certificates);
87               
88                //Estilando Barra de titulo
89                if(customTitleSupported)
90                        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
91       
92                button_remove = (LinearLayout) this.findViewById(R.id.button_remove_certificate_zone);
93        button_add = (LinearLayout) this.findViewById(R.id.button_add_certificate_zone);
94               
95        final TextView labelRemoveCertificate = (TextView) this.findViewById(R.id.label_certificate_to_remove);
96        labelRemoveCertificate.setVisibility(View.GONE);
97       
98        final LinearLayout layoutCertificateToRemove = (LinearLayout) this.findViewById(R.id.layout_certificate_to_remove); 
99        layoutCertificateToRemove.setVisibility(View.GONE);
100       
101        final TextView certificateToRemove = (TextView) this.findViewById(R.id.filename_text);
102       
103        starterIntent = getIntent();
104       
105            // lista de certificados
106            final ArrayList<RecipientCertificate> certificates = new ArrayList<RecipientCertificate>();
107
108            // asignar ruta de certificados de destinatarios
109                certificatesDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
110                getResources().getString(R.string.app_name) + "/" +
111                getResources().getString(R.string.certificates_dir) + "/";
112                //Toast.makeText(getApplicationContext(), "certificatesDir: "+ certificatesDir, Toast.LENGTH_SHORT).show();
113           
114            // chequear disponibilidad de directorio de certificados
115            if (!checkCertificatesDirectoryAvailability()){
116                return;
117            }
118           
119            // Leer el contenido del directorio de certificados
120            // Crea un arreglo con las lista de archivos contenidos en el directorio cwd
121        File f = new File(certificatesDir);
122            File[] ls = f.listFiles();
123                   
124        if (ls != null) {
125                //Toast.makeText(getApplicationContext(), "numero de archivos: " +Integer.toString(ls.length), Toast.LENGTH_SHORT).show();
126               
127                certificatesPathHashMap = new HashMap<String, String>();
128               
129                String recipient = null;
130                // iterar sobre todos los archivos de certificados
131                // en el KeyStore
132                for (File iFile : ls) {
133                       
134                        try {
135                                        X509Certificate recvCert = SignedDoc.readCertificate(new File(iFile.getAbsolutePath()));
136                                       
137                                        recipient = SignedDoc.getCommonName(recvCert.getSubjectDN().getName());
138                                        //Toast.makeText(getApplicationContext(), "Destinatario: "+ recipient,Toast.LENGTH_SHORT).show();
139                                       
140                                        certificates.add(new RecipientCertificate(recipient));
141                                       
142                                        certificatesPathHashMap.put(recipient, iFile.getAbsolutePath());
143                                       
144                                } catch (DigiDocException e) {                                 
145                                        Toast.makeText(getApplicationContext(), "DigiDocException: "+ e.getMessage(), Toast.LENGTH_SHORT).show();
146                                }
147                }// fin de la iteracion sobre iFile
148               
149                               
150        }
151                   
152       
153        // se crea el adaptador para mostrar los certificados de destinatarios
154                final RecipientCertificateAdapter certificateAdapter = new RecipientCertificateAdapter(EncryptionCertificatesActivity.this, certificates);
155                final ListView certificateListView = (ListView) findViewById(R.id.certificate_list);
156                certificateListView.setAdapter(certificateAdapter);
157                certificateListView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
158                        @Override
159                        public void onItemClick(AdapterView<?> parent, View view,
160                                        int position, long id) {
161                               
162                                Object o = certificateListView.getItemAtPosition(position);
163                                RecipientCertificate c = (RecipientCertificate) o;
164                               
165                                certificateSelectedIndex = position;                           
166                               
167                               
168                                labelRemoveCertificate.setVisibility(View.VISIBLE);
169                                layoutCertificateToRemove.setVisibility(View.VISIBLE);
170                               
171                                certificateToRemove.setText(c.getName());
172                                                               
173                                //Toast.makeText(getApplicationContext(), "click sobre certificado"+ c.getName(), Toast.LENGTH_SHORT).show();                           
174                       
175                        }                       
176                });
177
178       
179       
180       
181                // habilita el click sobre la acción para agregar un certificado nuevo
182        button_add.setOnClickListener(new OnClickListener() 
183        {       
184            public void onClick(View v) 
185            {
186               
187                //Intent oIntent = new Intent(BDOCVerifyResultActivity.this, TibisayMovilActivity.class);
188                        //oIntent.setAction(Intent.ACTION_VIEW);
189                        //oIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
190                        //startActivity(oIntent);
191                       
192                        //finish();
193                //Toast.makeText(getApplicationContext(), "Se debe agregar un certificado", Toast.LENGTH_SHORT).show();
194               
195                // llamar a función para cargar certificado
196                loadNewCertificate();
197               
198            }
199        });
200
201        // habilita el click sobre la acción eliminar el certificado seleccionado
202        button_remove.setOnClickListener(new OnClickListener() 
203        {       
204            public void onClick(View v) 
205            {
206                //shareIt();
207               
208                //Toast.makeText(getApplicationContext(), "eliminar un certificado", Toast.LENGTH_SHORT).show();
209               
210                if (certificateSelectedIndex == -1){
211                        // 1. Instantiate an AlertDialog.Builder with its constructor
212                        AlertDialog.Builder builder = new AlertDialog.Builder(EncryptionCertificatesActivity.this);
213
214                        // 2. Chain together various setter methods to set the dialog characteristics
215                        builder.setMessage("Debe seleccionar un certificado para eliminarlo.")
216                        .setTitle("Información:");
217
218                        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
219                        public void onClick(DialogInterface dialog, int id) {
220                            // User clicked OK button                                                   
221                                //Toast.makeText(getApplicationContext(), "User clicked OK button", Toast.LENGTH_LONG).show();                         
222                        }
223                                });
224                       
225                        // 3. Get the AlertDialog from create()                         
226                        AlertDialog dialog = builder.create();
227                        dialog.show();
228                }else{
229                        // 1. Instantiate an AlertDialog.Builder with its constructor
230                        AlertDialog.Builder builder = new AlertDialog.Builder(EncryptionCertificatesActivity.this);
231
232                        // 2. Chain together various setter methods to set the dialog characteristics
233                        builder.setMessage("¿Está seguro de eliminar el certificado?.")
234                        .setTitle("Información:");
235
236                        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
237                        @SuppressLint("NewApi")
238                                                public void onClick(DialogInterface dialog, int id) {
239                            // User clicked OK button                                                   
240                                //Toast.makeText(getApplicationContext(), "User clicked OK button", Toast.LENGTH_LONG).show();
241                               
242                                // funcion para eliminar el certificado
243                                // ...
244                                String pathToErase = certificatesPathHashMap.get(certificateToRemove.getText());
245                               
246                                File file = new File(pathToErase);
247                                boolean deleted = file.delete();
248                                                               
249                                //actualizar la lista de certificados en ListView
250                                certificateAdapter.notifyDataSetChanged();
251                               
252                                labelRemoveCertificate.setVisibility(View.GONE);
253                                        layoutCertificateToRemove.setVisibility(View.GONE);
254                               
255                                // la funcion recreate esta disponible a partir del api 11
256                                if (android.os.Build.VERSION.SDK_INT >= 11)
257                            {
258                                        EncryptionCertificatesActivity.this.recreate();
259                            }
260                            else
261                            {
262                                startActivity(starterIntent);
263                                finish();
264                            }
265                               
266                                //Toast.makeText(getApplicationContext(), "**archivo a borrar: "+pathToErase, Toast.LENGTH_LONG).show();
267                               
268                               
269                               
270                        }
271                                });
272                       
273                        builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
274                        public void onClick(DialogInterface dialog, int id) {
275                            // User cancelled the dialog
276                                //Toast.makeText(getApplicationContext(), "User clicked Cancel button", Toast.LENGTH_LONG).show();
277                               
278                                labelRemoveCertificate.setVisibility(View.GONE);
279                                        layoutCertificateToRemove.setVisibility(View.GONE);
280                        }
281                                });
282                        // 3. Get the AlertDialog from create()                         
283                        AlertDialog dialog = builder.create();
284                        dialog.show();
285                }
286            }
287        });
288               
289       
290               
291        } // fin de funcion onCreate()
292
293        @Override
294        public boolean onCreateOptionsMenu(Menu menu) {
295                // Inflate the menu; this adds items to the action bar if it is present.
296                getMenuInflater().inflate(R.menu.encryption_certificates, menu);
297                return true;
298        }
299
300       
301        /**
302     * Carga un nuevo certificado al lanzar CertificateToLoadActivity.
303     * @return void
304     */
305        public void loadNewCertificate() {
306                Intent intent = new Intent(this, CertificateToLoadActivity.class);
307                startActivity(intent);
308                finish(); 
309               
310        }
311       
312       
313        // clase que abstrae un certificado de destinatario
314        // se utiliza para mostrar en la interfaz grafica cada certificado
315        // de destinatario almancenado por la aplicacion
316        public class RecipientCertificate {
317                private String mName;
318               
319                public RecipientCertificate(String name){
320                        mName = name;
321                }
322               
323                public void setName(String name) {
324                        this.mName = name;
325                }
326               
327                public String getName() {
328                        return mName;
329                }       
330        } // fin de clase RecipientCertificate
331       
332        // clase que abstrae el adaptador para llenar el ListView de documentos que
333        // se encuentran dentro del contenedor BDOC
334        private class RecipientCertificateAdapter extends BaseAdapter {
335
336                private ArrayList<RecipientCertificate> mRecipientCertificateList;
337                private LayoutInflater lInflater;
338               
339                private RecipientCertificateAdapter(Context context, ArrayList<RecipientCertificate> certificates) {
340                        this.lInflater = LayoutInflater.from(context);
341                        this.mRecipientCertificateList = certificates;
342                       
343                }
344               
345               
346                @Override
347                public int getCount() {                 
348                        return mRecipientCertificateList.size();
349                }
350
351                @Override
352                public Object getItem(int position) {                   
353                        return mRecipientCertificateList.get(position);
354                }
355
356                @Override
357                public long getItemId(int position) {                   
358                        return position;
359                }
360
361                @Override
362                public View getView(int position, View convertView, ViewGroup parent) {
363                        ViewHolder container = null;
364                       
365                        if (convertView == null){
366                                container = new ViewHolder();
367                                convertView = lInflater.inflate(R.layout.recipient_certificate_info, null);
368                               
369                                container.filename_text = (TextView) convertView.findViewById(R.id.filename_text);
370                                //container.filename_modified = (TextView) convertView.findViewById(R.id.filename_modified);
371                                container.type_image = (ImageView) convertView.findViewById(R.id.type_image);
372                                convertView.setTag(container);
373                        }else{
374                                container = (ViewHolder) convertView.getTag();
375                        }
376                       
377                        RecipientCertificate certificate = (RecipientCertificate) getItem(position);
378                        container.filename_text.setText(certificate.getName());
379                        //container.filename_modified.setText(certificate.getName());
380                        container.type_image.setImageResource(R.drawable.ic_archivo);
381                       
382                        return convertView;
383                }
384       
385               
386                class ViewHolder{
387                      TextView filename_text;
388                      //TextView filename_modified;
389                      ImageView type_image;
390                   }
391               
392        } // fin de la clase RecipientCertificateAdapter
393       
394       
395       
396       
397        /**
398     * Prepara directorio
399     * @return boolean
400     */
401    boolean prepareDirectory(String dir) 
402    {
403        try
404        {
405            if (makedirs(dir)) 
406            {
407                return true;
408            } else {
409                return false;
410            }
411        } catch (Exception e) 
412        {
413            e.printStackTrace();
414            //Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show();
415            Toast.makeText(this, "No se pudo iniciar el sistema de archivos. ¿Está la SDCARD montada?", Toast.LENGTH_LONG).show();
416            return false;
417        }
418    }
419   
420    /**
421     * Crea directorio utilizando la variable tmpDir
422     * @return boolean
423     */
424    private boolean makedirs(String dir) 
425    {
426        //File tempdir = new File(extractedDirFiles);
427        File tempdir = new File(dir);
428        if (!tempdir.exists())
429            tempdir.mkdirs();
430        return (tempdir.isDirectory());
431    }
432       
433    /**
434     * Chequea la disponibilidad del directorio de /TibisayMovil/CertificatesToEncrypt
435     * @return boolean
436     */
437    private boolean checkCertificatesDirectoryAvailability() {
438        // verificar acceso al directorio /mnt/sdcard/TibisayMovil/CertificatesToEncrypt
439            boolean mExternalStorageAvailable = false;
440            boolean mExternalStorageWriteable = false;
441            String state = Environment.getExternalStorageState();
442           
443                AlertDialog.Builder builder = new AlertDialog.Builder(EncryptionCertificatesActivity.this);
444               
445           
446            if (Environment.MEDIA_MOUNTED.equals(state)) {
447                // We can read and write the media
448                mExternalStorageAvailable = mExternalStorageWriteable = true;
449                //Toast.makeText(getApplicationContext(), "We can read and write the media", Toast.LENGTH_SHORT).show();
450               
451                // Crear directorio CertificatesToEncrypt donde se almacenan los certificados de
452                // destinatarios para cifrado
453                        /*
454                String certificatesDir = Environment.getExternalStorageDirectory() + "/" +
455                        getResources().getString(R.string.app_name) + "/" +
456                        getResources().getString(R.string.certificates_dir) + "/";
457                        */                     
458                        if (prepareDirectory(certificatesDir)){                         
459                                return true;
460                        }else{
461                                builder.setMessage("No existe el directorio "+certificatesDir+" para almacenar certificados.").setTitle("Error:");
462               
463                        }
464                       
465            } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
466                // We can only read the media
467                mExternalStorageAvailable = true;
468                mExternalStorageWriteable = false;
469                //Toast.makeText(getApplicationContext(), "We can only read the media", Toast.LENGTH_SHORT).show();
470               
471                builder.setMessage("Directorio "+certificatesDir+ " montado de solo lectura. No se pueden almancenar certificados.").setTitle("Error:");
472       
473               
474            } else {
475                // Something else is wrong. It may be one of many other states, but all we need
476                //  to know is we can neither read nor write
477                mExternalStorageAvailable = mExternalStorageWriteable = false;
478                //Toast.makeText(getApplicationContext(), "we can neither read nor write", Toast.LENGTH_SHORT).show();
479               
480                builder.setMessage("Directorio "+certificatesDir+ " no está disponible. No se pueden almancenar certificados.").setTitle("Error:");                     
481       
482            }
483           
484           
485        builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
486                public void onClick(DialogInterface dialog, int id) {
487               // User cancelled the dialog
488               EncryptionCertificatesActivity.this.finish();
489            }
490        });
491            AlertDialog dialog = builder.create();
492            dialog.show();
493            return false;
494    }
495
496
497   
498       
499} // fin de la activity
Note: See TracBrowser for help on using the repository browser.