source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/CertificateToLoadActivity.java @ 37c4d43

Last change on this file since 37c4d43 was d5ab40f, checked in by Antonio Araujo Brett <aaraujo@…>, 11 years ago

Implementada la verificación de certificados duplicados al momento de agregar certificados de destinatarios para cifrar archivos. Creada Actividad CertificateToLoadActivity? para cargar certificado y realizar la verificación.

  • Property mode set to 100644
File size: 25.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.X509Certificate;
10import java.text.SimpleDateFormat;
11import java.util.ArrayList;
12import java.util.Collections;
13import java.util.Date;
14
15import ee.sk.digidoc.DigiDocException;
16import ee.sk.digidoc.SignedDoc;
17
18import ve.gob.cenditel.tibisaymovil.R;
19import android.app.Activity;
20import android.app.AlertDialog;
21import android.content.DialogInterface;
22import android.content.Intent;
23import android.graphics.drawable.Drawable;
24import android.net.Uri;
25import android.os.Bundle;
26import android.os.Environment;
27import android.util.Log;
28import android.view.LayoutInflater;
29import android.view.View;
30import android.view.ViewGroup;
31import android.view.View.OnClickListener;
32import android.view.Window;
33import android.webkit.MimeTypeMap;
34import android.widget.AdapterView;
35import android.widget.ArrayAdapter;
36import android.widget.BaseAdapter;
37import android.widget.ImageView;
38import android.widget.LinearLayout;
39import android.widget.ListView;
40import android.widget.RadioButton;
41import android.widget.TextView;
42import android.widget.AdapterView.OnItemClickListener;
43import android.widget.Toast;
44
45public class CertificateToLoadActivity extends Activity implements OnItemClickListener, OnClickListener {
46
47        private File cwd;
48    private File selected;
49    private FileBrowserView viewHolder;
50    private FileListAdapter listAdapter;
51    private String filterMImeType = "application/pdf";
52   
53    // cadena que mantiene la ruta del archivo a compartir
54    private String fileToLoad = null;
55
56   
57    //ruta del directorio que almancena los certificados de destinatarios
58    String certificatesDir;
59   
60        @Override
61        protected void onCreate(Bundle savedInstanceState) {
62                //Estilando la barra de titulo
63                final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
64
65                super.onCreate(savedInstanceState);
66               
67                this.viewHolder = new FileBrowserView();       
68
69        if (savedInstanceState != null) {
70                if(savedInstanceState.getString("selected") != null)
71                        this.selected = new File(savedInstanceState.getString("selected"));
72
73            if (this.selected != null) {
74               
75                CertificateToLoadActivity.this.updateButton
76                (CertificateToLoadActivity.this.viewHolder.accept,true);
77
78            }
79           
80            this.cwd = new File(savedInstanceState.getString("cwd"));
81            this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter(this.cwd.getAbsolutePath(), filterMImeType));
82           
83        } else {
84            this.selected = null;
85            this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter());
86        }
87       
88       
89        boolean enabled = false;
90        if (this.selected != null)
91                enabled = this.viewHolder.accept.isEnabled();
92       
93        CertificateToLoadActivity.this.updateButton
94        (CertificateToLoadActivity.this.viewHolder.accept,enabled);
95       
96        //Estilando Barra de titulo
97                if(customTitleSupported)
98                        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
99               
100            // asignar ruta de certificados de destinatarios
101                certificatesDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
102                getResources().getString(R.string.app_name) + "/" +
103                getResources().getString(R.string.certificates_dir) + "/";
104                //Toast.makeText(getApplicationContext(), "certificatesDir: "+ certificatesDir, Toast.LENGTH_SHORT).show();
105
106        }
107
108       
109    /**
110     * Provides the data to be shown in the file browser ListView.
111     *
112     * @author José M. Prieto (jmprieto@emergya.com)
113     */
114    private class FileListAdapter extends BaseAdapter {
115
116        private final ArrayList<File> directories;
117        private final ArrayList<File> files;
118
119        private FileListAdapter() {
120            this("/",filterMImeType);
121        }
122
123        private FileListAdapter(String location) {
124            this(location, "");
125        }
126       
127        private FileListAdapter(String location, String filterMimeType) {
128               
129            directories = new ArrayList<File>();
130            files = new ArrayList<File>();
131           
132            //Obtiene etiqueta que se colocará antes del path que visualizará el usuario
133                String toPathText = CertificateToLoadActivity.this.getString(R.string.pathstring)+":   ";
134                //Coloca el texto de la etiqueta en la vista
135                CertificateToLoadActivity.this.viewHolder.pathString.setText(toPathText);
136                //Coloca el texto con el path actual
137                CertificateToLoadActivity.this.viewHolder.path.setText(location);
138                //Crea un objeto file cwd con la ubicacion dada en location
139            CertificateToLoadActivity.this.cwd = new File(location);
140            //Obtiene el directorio padre del objeto file cwd
141            File parent = CertificateToLoadActivity.this.cwd.getParentFile();
142            //Si tiene un padre, lo agrega en la posición cero de la lista de directorios 
143           
144            if (parent != null) {
145                directories.add(0, parent);
146            }
147           
148            //Crea un arreglo con las lista de archivos contenidos en el directorio cwd
149            File[] ls = CertificateToLoadActivity.this.cwd.listFiles();
150            if (ls != null) {
151                for (File f : ls) { //recorre todos los archivos contenidos en el directorio
152                       
153                    if (FsUtils.isHiddenOrNotReadable(f)) { // Si son ocultos no hace nada
154                        continue;
155                    }
156                  // Si son directorios los agrega a la lista de directorios a partir de la posición 1
157                  // En la posición 0 se encuentra el directorio padre 
158                    if (f.isDirectory()) {
159                        directories.add(f);
160                    } else // De lo contrario lo agrega a la lista de archivos
161                        {
162                        //Valida tipo de archivo a mostrar
163                        Uri selectedUri = Uri.fromFile(f);
164                        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString());
165                        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
166                         
167//                          Toast.makeText(CertificateToLoadActivity.this,
168//                          "FileExtension: " + fileExtension + "\n" +
169//                          "MimeType: " + mimeType,
170//                          Toast.LENGTH_LONG).show();
171                       
172                                                 
173                        //Filtra por mimeType: se consideran los .pem .crt .cer
174                        if(filterMimeType.isEmpty() || /*filterMimeType == mimeType*/ fileExtension.equals("pem")
175                                        || fileExtension.equals("crt") || fileExtension.equals("cer"))                       
176                            files.add(f);
177                               
178                    }
179                }
180            }
181
182            Collections.sort(directories); // Ordena los directorios alfabeticamente
183            Collections.sort(files); // Ordena los archivos alfabeticamente
184        }
185       
186        /**
187         * Retorna cantidad total de elementos que se listarán en el directorio.
188         */
189        @Override 
190        public int getCount() {
191               
192            return directories.size() + files.size();
193           
194        }
195
196        /**
197         * Dada una posición en el listado del directorio, retorna un archivo o directorio
198         * según corresponda.
199         */
200        @Override
201        public File getItem(int position) {
202
203            if (position < directories.size()) {
204                return directories.get(position);
205            } else {
206                return files.get(position - directories.size());
207            }
208        }
209
210        /**
211         * Retorna un código hash para el archivo, permite comparar si dos archivos son los mismos
212         */
213        @Override
214        public long getItemId(int position) {
215
216            return getItem(position).hashCode();
217        }
218       
219        /**
220         * Crea la visualización de cada item del fileBrowser
221         */
222        @Override
223        public View getView(int position, View convertView, ViewGroup parent) {
224
225                //Crea la vista de cada fila del filebrowser a partir del layout
226            if (convertView == null) {
227                LayoutInflater inflater = LayoutInflater.from(CertificateToLoadActivity.this);
228                convertView = inflater.inflate(R.layout.file_to_verify_bdoc_signature_item, parent, false); 
229            }
230           
231            // Se enlaza a cada componente del layout
232            ImageView image = (ImageView) convertView.findViewById(R.id.type_image);
233            TextView fileName = (TextView) convertView.findViewById(R.id.filename_text);
234            TextView modified = (TextView) convertView.findViewById(R.id.filename_modified);
235           
236            // Se obtiene el archivo ubicado en position
237                File file = getItem(position);
238               
239                //RadioButton
240            RadioButton radio = (RadioButton) convertView.findViewById(R.id.file_radio);
241            radio.setFocusable(false);
242           
243            // Se asignan los iconos según el tipo de archivo y se oculta el radio en los directorios
244            if (file.isDirectory()) {
245                image.setImageResource(R.drawable.ic_carpeta);
246                radio.setVisibility(View.INVISIBLE);
247                radio.setChecked(false);
248            } else {
249                image.setImageResource(R.drawable.ic_archivo);
250                radio.setVisibility(View.VISIBLE);
251               
252                if (CertificateToLoadActivity.this.selected == null ||
253                        CertificateToLoadActivity.this.selected.hashCode() != file.hashCode()){
254                                radio.setChecked(false);
255                } else{
256                        radio.setChecked(true);
257                }         
258            }
259
260            // Si es el directorio que hace referencia al padre le coloca como nombre ".."
261            if (file.isDirectory() && position == 0 && ! "/".equals(CertificateToLoadActivity.this.cwd.getAbsolutePath())) {
262                fileName.setText("..");
263            } else {
264                fileName.setText(file.getName());
265            }
266 
267           
268            //Datos de modificación del archivo
269            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
270            Date date = new Date(file.lastModified());
271           
272            String dateString = CertificateToLoadActivity.this.getString(R.string.modified)+": ";
273            if (file.lastModified()>0)
274                modified.setText(dateString+sdf.format(date));
275            else
276                modified.setText(dateString+"-");
277           
278            return convertView;
279        }
280       
281        /**
282         * Controla la selección de cada item del fileBrowser
283         */
284        public void select(ListView parent, int position) {
285
286            File item = getItem(position);
287            //Si es un directorio el seleccionado se hace un llamado del fileBrowser del directorio
288            if (item.isDirectory()) {
289                parent.setAdapter(CertificateToLoadActivity.this.listAdapter = new FileListAdapter(item.getAbsolutePath(), filterMImeType));
290            } else { // Si es un archivo
291               
292                        //Se agrega el archivo a la lista de seleccionados si no se encuentra en la misma               
293                if (CertificateToLoadActivity.this.selected == null || 
294                        CertificateToLoadActivity.this.selected.hashCode() != item.hashCode()){
295                       
296                        CertificateToLoadActivity.this.selected = item;
297                       
298                        CertificateToLoadActivity.this.updateButton(CertificateToLoadActivity.this.viewHolder.accept,true);             
299                                               
300                }
301                else{ // De lo contrario se elimina de la lista de seleccionados
302                       
303                        CertificateToLoadActivity.this.selected = null;                         
304                        CertificateToLoadActivity.this.updateButton(CertificateToLoadActivity.this.viewHolder.accept,false);
305                                       
306                }
307                notifyDataSetChanged();
308           }
309        }       
310    }   
311
312
313   
314   
315    @Override
316    protected void onSaveInstanceState(Bundle outState) {
317        super.onSaveInstanceState(outState);
318
319        outState.putParcelable("intent", this.getIntent());
320        outState.putString("cwd", this.cwd.getAbsolutePath());
321        if(this.selected != null)
322                outState.putString("selected", this.selected.getAbsolutePath());
323       
324        }
325   
326    private void updateButton(View v, boolean bool) {
327        try{
328
329                v.setEnabled(bool);
330                if (v instanceof TextView){
331                        Drawable icon = ((TextView)v).getCompoundDrawables()[1];
332                        if (icon!=null)
333                        if (bool)
334                                icon.setAlpha(255);
335                        else
336                                icon.setAlpha(127);     
337                }
338                if (v instanceof ImageView){
339                        ImageView result = (ImageView) v;
340                        if (bool)
341                                result.setAlpha(255);
342                        else
343                                result.setAlpha(127);   
344                }
345       
346        }catch(NullPointerException e){}
347                       
348        }
349   
350    private void updateButton(LinearLayout layout, boolean bool) {
351        try{
352        layout.setEnabled(bool);
353        for (int i=0; i<layout.getChildCount();i++){
354                this.updateButton(layout.getChildAt(i), bool);
355        }
356        }catch(NullPointerException e){}
357                       
358        }
359
360       
361       
362        /**
363     * Holds references to view objects.
364     *
365     * @author José M. Prieto (jmprieto@emergya.com)
366     */
367    private class FileBrowserView {
368
369        public ListView fileList;
370        public TextView path;
371        public LinearLayout accept;
372                public LinearLayout clear;
373        public TextView pathString;
374
375        public FileBrowserView() {
376
377            setContentView(R.layout.activity_certificate_to_load);
378            this.path = (TextView) findViewById(R.id.path);
379            this.pathString = (TextView) findViewById(R.id.pathstring);
380
381            this.fileList = (ListView) findViewById(R.id.file_list);
382            this.fileList.setOnItemClickListener(CertificateToLoadActivity.this);
383            this.fileList.setItemsCanFocus(true);
384         
385           
386            this.clear = (LinearLayout) findViewById(R.id.button_clear_zone);
387            this.clear.setOnClickListener(CertificateToLoadActivity.this);
388           
389            this.accept = (LinearLayout) findViewById(R.id.button_accept_zone);
390            this.accept.setOnClickListener(CertificateToLoadActivity.this);
391
392        }
393    }
394   
395        @Override
396    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
397       
398       
399        if (parent.getId() == R.id.file_list) { // user selects a file
400            this.listAdapter.select((ListView) parent, position);
401           
402        } else { // user de-selects a file
403            //this.listAdapter.addIfSameDirectory(selectedAdapter.doUnselect((ListView) parent, position));
404               
405        }
406        //this.viewHolder.numSelected.setText(Integer.toString(this.selected.size()));
407    }
408
409    @Override
410    public void onClick(View v) {
411
412        switch (v.getId()) {
413
414       
415        case R.id.button_clear_zone:
416               
417                this.selected = null;
418                this.listAdapter.notifyDataSetChanged();
419
420                //this.viewHolder.numSelected.setText(""+this.selected.size());
421            this.updateButton(this.viewHolder.accept, false);
422                break;         
423       
424
425       
426            case R.id.button_accept_zone:
427               
428                // lanzar intent para compartir el archivo seleccionado
429                fileToLoad = CertificateToLoadActivity.this.selected.getAbsolutePath();
430               
431                Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: "+fileToLoad, Toast.LENGTH_SHORT).show();
432               
433                loadCertificate(fileToLoad);
434
435                break;         
436   
437        }
438    } // fin de onClick
439   
440       
441       
442       
443        /**
444     * Chequea la disponibilidad del directorio de /TibisayMovil/CertificatesToEncrypt
445     * @return boolean
446     */
447    private boolean checkCertificatesDirectoryAvailability() {
448        // verificar acceso al directorio /mnt/sdcard/TibisayMovil/CertificatesToEncrypt
449            boolean mExternalStorageAvailable = false;
450            boolean mExternalStorageWriteable = false;
451            String state = Environment.getExternalStorageState();
452           
453                AlertDialog.Builder builder = new AlertDialog.Builder(CertificateToLoadActivity.this);
454               
455           
456            if (Environment.MEDIA_MOUNTED.equals(state)) {
457                // We can read and write the media
458                mExternalStorageAvailable = mExternalStorageWriteable = true;
459                Toast.makeText(getApplicationContext(), "We can read and write the media", Toast.LENGTH_SHORT).show();
460               
461                // Crear directorio CertificatesToEncrypt donde se almacenan los certificados de
462                // destinatarios para cifrado
463                /*
464                        String certificatesDir = Environment.getExternalStorageDirectory() + "/" +
465                        getResources().getString(R.string.app_name) + "/" +
466                        getResources().getString(R.string.certificates_dir) + "/";
467                        */                     
468                        if (prepareDirectory(certificatesDir)){                         
469                                return true;
470                        }else{
471                                builder.setMessage("No existe el directorio "+certificatesDir+" para almacenar certificados.").setTitle("Error:");
472               
473                        }
474                       
475            } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
476                // We can only read the media
477                mExternalStorageAvailable = true;
478                mExternalStorageWriteable = false;
479                Toast.makeText(getApplicationContext(), "We can only read the media", Toast.LENGTH_SHORT).show();
480               
481                builder.setMessage("Directorio "+certificatesDir+ " montado de solo lectura. No se pueden almancenar certificados.").setTitle("Error:");
482       
483               
484            } else {
485                // Something else is wrong. It may be one of many other states, but all we need
486                //  to know is we can neither read nor write
487                mExternalStorageAvailable = mExternalStorageWriteable = false;
488                Toast.makeText(getApplicationContext(), "we can neither read nor write", Toast.LENGTH_SHORT).show();
489               
490                builder.setMessage("Directorio "+certificatesDir+ " no está disponible. No se pueden almancenar certificados.").setTitle("Error:");                     
491       
492            }
493           
494           
495        builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
496                public void onClick(DialogInterface dialog, int id) {
497               // User cancelled the dialog
498                        CertificateToLoadActivity.this.finish();
499            }
500        });
501            AlertDialog dialog = builder.create();
502            dialog.show();
503            return false;
504    } // fin de checkCertificatesDirectoryAvailability
505   
506    /**
507     * Prepara directorio
508     * @return boolean
509     */
510    boolean prepareDirectory(String dir) 
511    {
512        try
513        {
514            if (makedirs(dir)) 
515            {
516                return true;
517            } else {
518                return false;
519            }
520        } catch (Exception e) 
521        {
522            e.printStackTrace();
523            Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show();
524            return false;
525        }
526    }
527   
528    /**
529     * Crea directorio utilizando la variable tmpDir
530     * @return boolean
531     */
532    private boolean makedirs(String dir) 
533    {
534        //File tempdir = new File(extractedDirFiles);
535        File tempdir = new File(dir);
536        if (!tempdir.exists())
537            tempdir.mkdirs();
538        return (tempdir.isDirectory());
539    }
540   
541   
542    public void launchEncryptionCertificatesActivity() {
543        Intent intent = new Intent(this, EncryptionCertificatesActivity.class);
544                startActivity(intent);
545    }
546   
547   
548   
549   
550   
551    /**
552     * Carga un certificado desde un archivo en el directorio de certificados
553     * para cifrado
554     * @return void
555     */
556    public void loadCertificate(String fileToLoad){
557
558       
559        // chequear disponibilidad de directorio de certificados
560            if (!checkCertificatesDirectoryAvailability()){
561                Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: directorio no disponible", Toast.LENGTH_SHORT).show();
562               
563                finish();
564                // lanzar el activity EncryptionCertificatesActivity
565                launchEncryptionCertificatesActivity();
566                return;
567            }
568           
569   
570            // cargar el archivo y verificar que es un certificado bien formado             
571            try {
572                        X509Certificate recipientCertificate = SignedDoc.readCertificate(new File(fileToLoad));
573                       
574                        boolean [] keyUsage = recipientCertificate.getKeyUsage();
575                       
576                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: cerrificado leido", Toast.LENGTH_SHORT).show();
577                       
578                        if (keyUsage == null){
579                                Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: keyUsage == null", Toast.LENGTH_SHORT).show();
580
581                                showDialog("Error:", "El certificado seleccionado no tiene la extensión \"Cifrado de Clave \" (KeyEncipherment) para cifrado. " +
582                                        "Seleccione otro certificado.");
583                        return;
584                        }
585                       
586                        if ( keyUsage[2] ){
587                                Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: CERTIFICADO SI TIENE KeyEncipherment", Toast.LENGTH_SHORT).show();
588                               
589                               
590                                // TODO verificar que el certificado no exista
591                                if (compareCertificate(recipientCertificate)){
592                                       
593                                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: El certificado ya existe en el repositorio", Toast.LENGTH_SHORT).show();
594                                       
595                                        showDialog("Información:", "El certificado ya existe en el repositorio. Se cancela la operación.");
596                                       
597                                        return;
598                                }
599                               
600                                // copiar el certificado al directorio de certificados
601                                File f = new File(fileToLoad);
602                                FsUtils.copyTo(f, certificatesDir);
603
604                                showDialog("Información:", "El certificado se cargó exitosamente.");
605                       
606                        return;                                 
607                               
608                        }else{
609
610                                showDialog("Error:", "El certificado seleccionado no tiene la extensión \"Cifrado de Clave \" (KeyEncipherment) para cifrado. " +
611                                                "Seleccione otro certificado.");
612                               
613                        return;
614                        }
615
616
617                } catch (DigiDocException e1) {
618                        e1.printStackTrace();
619                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: "+ e1.getMessage(), Toast.LENGTH_SHORT).show();
620                       
621                        showDialog("Error:", e1.getMessage());                 
622                       
623                return;
624                       
625                       
626                } catch (IOException e) {
627                       
628                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: ERROR no se pudo corpiar el certificado al directorio de certificados", 
629                                        Toast.LENGTH_SHORT).show();
630                       
631                        showDialog("Error:", e.getMessage());
632                                       
633                return;
634                       
635                }
636    }
637   
638    /**
639     * Compara el certificado pasado como argumento con los certificados existentes en
640     * el directorio de certificados. 
641     *
642     * @return verdadero si ya existe el certificado en el directorio
643     */
644    public boolean compareCertificate(X509Certificate obj){
645       
646        // obtener lista de archivos del directorio de certificados
647       
648        File certificateDirectory = new File(certificatesDir);
649       
650        File[] ls = certificateDirectory.listFiles();
651        if (ls != null) {
652            for (File f : ls) { //recorre todos los archivos contenidos en el directorio
653               
654                if (FsUtils.isHiddenOrNotReadable(f)) { // Si son ocultos no hace nada
655                    continue;
656                }
657               
658                // iterar por cada archivo y verificar si certificado es igual a obj
659               
660                X509Certificate certificateRead;
661                                try {
662                                        certificateRead = SignedDoc.readCertificate(f);
663                                        if (obj.equals(certificateRead)){
664                                return true;
665                        }
666                                } catch (DigiDocException e) {
667                                        e.printStackTrace();
668                                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: "+ e.getMessage(), Toast.LENGTH_SHORT).show();
669                                       
670                                        showDialog("Error:", e.getMessage());
671                                }
672                               
673           
674            }
675            return false;
676        }
677       
678        return false;
679    }
680   
681    /**
682     * Crea un dialogo con el titulo y mensaje como argumentos y lo despliega 
683     *
684     * @return void
685     */
686    public void showDialog(String title, String msg) {
687       
688        // 1. Instantiate an AlertDialog.Builder with its constructor
689                AlertDialog.Builder builder = new AlertDialog.Builder(CertificateToLoadActivity.this);
690
691                // 2. Chain together various setter methods to set the dialog characteristics
692                builder.setMessage(msg)
693                .setTitle(title);
694
695                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
696            public void onClick(DialogInterface dialog, int id) {
697                // User clicked OK button                                               
698                Toast.makeText(getApplicationContext(), "User clicked OK button", Toast.LENGTH_LONG).show();
699                finish();                               
700               
701                // lanzar el activity EncryptionCertificatesActivity
702                launchEncryptionCertificatesActivity();
703            }
704                });
705               
706                // 3. Get the AlertDialog from create()                         
707                AlertDialog dialog = builder.create();
708                dialog.show(); 
709       
710    }
711   
712}
713
Note: See TracBrowser for help on using the repository browser.