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

Last change on this file since ba6bc7c 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: 25.1 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            Toast.makeText(this, "No se pudo iniciar el sistema de archivos. ¿Está la SDCARD montada?", Toast.LENGTH_LONG).show();
525            return false;
526        }
527    }
528   
529    /**
530     * Crea directorio utilizando la variable tmpDir
531     * @return boolean
532     */
533    private boolean makedirs(String dir) 
534    {
535        //File tempdir = new File(extractedDirFiles);
536        File tempdir = new File(dir);
537        if (!tempdir.exists())
538            tempdir.mkdirs();
539        return (tempdir.isDirectory());
540    }
541   
542   
543    public void launchEncryptionCertificatesActivity() {
544        Intent intent = new Intent(this, EncryptionCertificatesActivity.class);
545                startActivity(intent);
546    }
547   
548   
549   
550   
551   
552    /**
553     * Carga un certificado desde un archivo en el directorio de certificados
554     * para cifrado
555     * @return void
556     */
557    public void loadCertificate(String fileToLoad){
558
559       
560        // chequear disponibilidad de directorio de certificados
561            if (!checkCertificatesDirectoryAvailability()){
562                //Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: directorio no disponible", Toast.LENGTH_SHORT).show();
563               
564                finish();
565                // lanzar el activity EncryptionCertificatesActivity
566                launchEncryptionCertificatesActivity();
567                return;
568            }
569           
570   
571            // cargar el archivo y verificar que es un certificado bien formado             
572            try {
573                        X509Certificate recipientCertificate = SignedDoc.readCertificate(new File(fileToLoad));
574                       
575                        boolean [] keyUsage = recipientCertificate.getKeyUsage();
576                       
577                        //Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: cerrificado leido", Toast.LENGTH_SHORT).show();
578                       
579                        if (keyUsage == null){
580                                //Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: keyUsage == null", Toast.LENGTH_SHORT).show();
581
582                                showDialog("Error:", "El certificado seleccionado no tiene la extensión \"Cifrado de Clave \" (KeyEncipherment) para cifrado. " +
583                                        "Seleccione otro certificado.");
584                        return;
585                        }
586                       
587                        if ( keyUsage[2] ){
588                                //Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: CERTIFICADO SI TIENE KeyEncipherment", Toast.LENGTH_SHORT).show();
589                               
590                               
591                                // TODO verificar que el certificado no exista
592                                if (compareCertificate(recipientCertificate)){
593                                       
594                                        //Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: El certificado ya existe en el repositorio", Toast.LENGTH_SHORT).show();
595                                       
596                                        showDialog("Información:", "El certificado ya existe en el repositorio. Se cancela la operación.");
597                                       
598                                        return;
599                                }
600                               
601                                // copiar el certificado al directorio de certificados
602                                File f = new File(fileToLoad);
603                                FsUtils.copyTo(f, certificatesDir);
604
605                                showDialog("Información:", "El certificado se cargó exitosamente.");
606                       
607                        return;                                 
608                               
609                        }else{
610
611                                showDialog("Error:", "El certificado seleccionado no tiene la extensión \"Cifrado de Clave \" (KeyEncipherment) para cifrado. " +
612                                                "Seleccione otro certificado.");
613                               
614                        return;
615                        }
616
617
618                } catch (DigiDocException e1) {
619                        e1.printStackTrace();
620                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: "+ e1.getMessage(), Toast.LENGTH_SHORT).show();
621                       
622                        showDialog("Error:", e1.getMessage());                 
623                       
624                return;
625                       
626                       
627                } catch (IOException e) {
628                       
629                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: ERROR no se pudo corpiar el certificado al directorio de certificados", 
630                                        Toast.LENGTH_SHORT).show();
631                       
632                        showDialog("Error:", e.getMessage());
633                                       
634                return;
635                       
636                }
637    }
638   
639    /**
640     * Compara el certificado pasado como argumento con los certificados existentes en
641     * el directorio de certificados. 
642     *
643     * @return verdadero si ya existe el certificado en el directorio
644     */
645    public boolean compareCertificate(X509Certificate obj){
646       
647        // obtener lista de archivos del directorio de certificados
648       
649        File certificateDirectory = new File(certificatesDir);
650       
651        File[] ls = certificateDirectory.listFiles();
652        if (ls != null) {
653            for (File f : ls) { //recorre todos los archivos contenidos en el directorio
654               
655                if (FsUtils.isHiddenOrNotReadable(f)) { // Si son ocultos no hace nada
656                    continue;
657                }
658               
659                // iterar por cada archivo y verificar si certificado es igual a obj
660               
661                X509Certificate certificateRead;
662                                try {
663                                        certificateRead = SignedDoc.readCertificate(f);
664                                        if (obj.equals(certificateRead)){
665                                return true;
666                        }
667                                } catch (DigiDocException e) {
668                                        e.printStackTrace();
669                                        Toast.makeText(getApplicationContext(), "CertificateToLoadActivity: "+ e.getMessage(), Toast.LENGTH_SHORT).show();
670                                       
671                                        showDialog("Error:", e.getMessage());
672                                }
673                               
674           
675            }
676            return false;
677        }
678       
679        return false;
680    }
681   
682    /**
683     * Crea un dialogo con el titulo y mensaje como argumentos y lo despliega 
684     *
685     * @return void
686     */
687    public void showDialog(String title, String msg) {
688       
689        // 1. Instantiate an AlertDialog.Builder with its constructor
690                AlertDialog.Builder builder = new AlertDialog.Builder(CertificateToLoadActivity.this);
691
692                // 2. Chain together various setter methods to set the dialog characteristics
693                builder.setMessage(msg)
694                .setTitle(title);
695
696                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
697            public void onClick(DialogInterface dialog, int id) {
698                // User clicked OK button                                               
699                //Toast.makeText(getApplicationContext(), "User clicked OK button", Toast.LENGTH_LONG).show();
700                finish();                               
701               
702                // lanzar el activity EncryptionCertificatesActivity
703                launchEncryptionCertificatesActivity();
704            }
705                });
706               
707                // 3. Get the AlertDialog from create()                         
708                AlertDialog dialog = builder.create();
709                dialog.show(); 
710       
711    }
712   
713}
714
Note: See TracBrowser for help on using the repository browser.