source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/FileToVerifySignatureActivity.java @ 42e7061

Last change on this file since 42e7061 was 5147e01, checked in by Antonio Araujo Brett <aaraujo@…>, 11 years ago

Agregados archivos y nuevas clases para implementar interfaz de funcionalidades de verificación de archivo BDOC firmado electrónicamente, extracción de un archivo de un contenedor BDOC, visualizar archivo extraido de contenedor BDOC.

  • Property mode set to 100644
File size: 16.7 KB
Line 
1package ve.gob.cenditel.tibisaymovil;
2
3import java.io.File;
4import java.text.SimpleDateFormat;
5import java.util.ArrayList;
6import java.util.Collections;
7import java.util.Date;
8
9import ve.gob.cenditel.tibisaymovil.R;
10import android.app.Activity;
11import android.app.AlertDialog;
12import android.content.DialogInterface;
13import android.content.Intent;
14import android.graphics.drawable.Drawable;
15import android.net.Uri;
16import android.os.Bundle;
17import android.util.Log;
18import android.view.LayoutInflater;
19import android.view.View;
20import android.view.ViewGroup;
21import android.view.View.OnClickListener;
22import android.view.Window;
23import android.webkit.MimeTypeMap;
24import android.widget.AdapterView;
25import android.widget.ArrayAdapter;
26import android.widget.BaseAdapter;
27import android.widget.ImageView;
28import android.widget.LinearLayout;
29import android.widget.ListView;
30import android.widget.RadioButton;
31import android.widget.TextView;
32import android.widget.AdapterView.OnItemClickListener;
33import android.widget.Toast;
34
35public class FileToVerifySignatureActivity extends Activity implements OnItemClickListener, OnClickListener {
36
37        private File cwd;
38    private File selected;
39    private FileBrowserView viewHolder;
40    private FileListAdapter listAdapter;
41    private String filterMImeType = "application/pdf";
42   
43
44        @Override
45        protected void onCreate(Bundle savedInstanceState) {
46                //Estilando la barra de titulo
47                final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
48
49                super.onCreate(savedInstanceState);
50               
51                this.viewHolder = new FileBrowserView();       
52
53        if (savedInstanceState != null) {
54                if(savedInstanceState.getString("selected") != null)
55                        this.selected = new File(savedInstanceState.getString("selected"));
56
57            if (this.selected != null) {
58               
59                FileToVerifySignatureActivity.this.updateButton
60                (FileToVerifySignatureActivity.this.viewHolder.accept,true);
61
62            }
63           
64            this.cwd = new File(savedInstanceState.getString("cwd"));
65            this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter(this.cwd.getAbsolutePath(), filterMImeType));
66           
67        } else {
68            this.selected = null;
69            this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter());
70        }
71       
72       
73        boolean enabled = false;
74        if (this.selected != null)
75                enabled = this.viewHolder.accept.isEnabled();
76       
77        FileToVerifySignatureActivity.this.updateButton
78        (FileToVerifySignatureActivity.this.viewHolder.accept,enabled);
79       
80        //Estilando Barra de titulo
81                if(customTitleSupported)
82                        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
83        }
84
85       
86    /**
87     * Provides the data to be shown in the file browser ListView.
88     *
89     * @author José M. Prieto (jmprieto@emergya.com)
90     */
91    private class FileListAdapter extends BaseAdapter {
92
93        private final ArrayList<File> directories;
94        private final ArrayList<File> files;
95
96        private FileListAdapter() {
97            this("/",filterMImeType);
98        }
99
100        private FileListAdapter(String location) {
101            this(location, "");
102        }
103       
104        private FileListAdapter(String location, String filterMimeType) {
105               
106            directories = new ArrayList<File>();
107            files = new ArrayList<File>();
108           
109            //Obtiene etiqueta que se colocará antes del path que visualizará el usuario
110                String toPathText = FileToVerifySignatureActivity.this.getString(R.string.pathstring)+":   ";
111                //Coloca el texto de la etiqueta en la vista
112                FileToVerifySignatureActivity.this.viewHolder.pathString.setText(toPathText);
113                //Coloca el texto con el path actual
114                FileToVerifySignatureActivity.this.viewHolder.path.setText(location);
115                //Crea un objeto file cwd con la ubicacion dada en location
116            FileToVerifySignatureActivity.this.cwd = new File(location);
117            //Obtiene el directorio padre del objeto file cwd
118            File parent = FileToVerifySignatureActivity.this.cwd.getParentFile();
119            //Si tiene un padre, lo agrega en la posición cero de la lista de directorios 
120           
121            if (parent != null) {
122                directories.add(0, parent);
123            }
124           
125            //Crea un arreglo con las lista de archivos contenidos en el directorio cwd
126            File[] ls = FileToVerifySignatureActivity.this.cwd.listFiles();
127            if (ls != null) {
128                for (File f : ls) { //recorre todos los archivos contenidos en el directorio
129                       
130                    if (FsUtils.isHiddenOrNotReadable(f)) { // Si son ocultos no hace nada
131                        continue;
132                    }
133                  // Si son directorios los agrega a la lista de directorios a partir de la posición 1
134                  // En la posición 0 se encuentra el directorio padre 
135                    if (f.isDirectory()) {
136                        directories.add(f);
137                    } else // De lo contrario lo agrega a la lista de archivos
138                        {
139                        //Valida tipo de archivo a mostrar
140                        Uri selectedUri = Uri.fromFile(f);
141                        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString());
142                        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
143                         
144//                          Toast.makeText(FileToVerifySignatureActivity.this,
145//                          "FileExtension: " + fileExtension + "\n" +
146//                          "MimeType: " + mimeType,
147//                          Toast.LENGTH_LONG).show();
148                       
149                                                 
150                        //Filtra por mimeType: se consideran los pdf y los bdoc
151                        if(filterMimeType.isEmpty() || filterMimeType == mimeType || fileExtension.equals("bdoc"))                       
152                            files.add(f);
153                               
154                    }
155                }
156            }
157
158            Collections.sort(directories); // Ordena los directorios alfabeticamente
159            Collections.sort(files); // Ordena los archivos alfabeticamente
160        }
161       
162        /**
163         * Retorna cantidad total de elementos que se listarán en el directorio.
164         */
165        @Override 
166        public int getCount() {
167               
168            return directories.size() + files.size();
169           
170        }
171
172        /**
173         * Dada una posición en el listado del directorio, retorna un archivo o directorio
174         * según corresponda.
175         */
176        @Override
177        public File getItem(int position) {
178
179            if (position < directories.size()) {
180                return directories.get(position);
181            } else {
182                return files.get(position - directories.size());
183            }
184        }
185
186        /**
187         * Retorna un código hash para el archivo, permite comparar si dos archivos son los mismos
188         */
189        @Override
190        public long getItemId(int position) {
191
192            return getItem(position).hashCode();
193        }
194       
195        /**
196         * Crea la visualización de cada item del fileBrowser
197         */
198        @Override
199        public View getView(int position, View convertView, ViewGroup parent) {
200
201                //Crea la vista de cada fila del filebrowser a partir del layout
202            if (convertView == null) {
203                LayoutInflater inflater = LayoutInflater.from(FileToVerifySignatureActivity.this);
204                convertView = inflater.inflate(R.layout.file_to_verify_bdoc_signature_item, parent, false); 
205            }
206           
207            // Se enlaza a cada componente del layout
208            ImageView image = (ImageView) convertView.findViewById(R.id.type_image);
209            TextView fileName = (TextView) convertView.findViewById(R.id.filename_text);
210            TextView modified = (TextView) convertView.findViewById(R.id.filename_modified);
211           
212            // Se obtiene el archivo ubicado en position
213                File file = getItem(position);
214               
215                //RadioButton
216            RadioButton radio = (RadioButton) convertView.findViewById(R.id.file_radio);
217            radio.setFocusable(false);
218           
219            // Se asignan los iconos según el tipo de archivo y se oculta el radio en los directorios
220            if (file.isDirectory()) {
221                image.setImageResource(R.drawable.ic_carpeta);
222                radio.setVisibility(View.INVISIBLE);
223                radio.setChecked(false);
224            } else {
225                image.setImageResource(R.drawable.ic_archivo);
226                radio.setVisibility(View.VISIBLE);
227               
228                if (FileToVerifySignatureActivity.this.selected == null ||
229                        FileToVerifySignatureActivity.this.selected.hashCode() != file.hashCode()){
230                                radio.setChecked(false);
231                } else{
232                        radio.setChecked(true);
233                }         
234            }
235
236            // Si es el directorio que hace referencia al padre le coloca como nombre ".."
237            if (file.isDirectory() && position == 0 && ! "/".equals(FileToVerifySignatureActivity.this.cwd.getAbsolutePath())) {
238                fileName.setText("..");
239            } else {
240                fileName.setText(file.getName());
241            }
242 
243           
244            //Datos de modificación del archivo
245            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
246            Date date = new Date(file.lastModified());
247           
248            String dateString = FileToVerifySignatureActivity.this.getString(R.string.modified)+": ";
249            if (file.lastModified()>0)
250                modified.setText(dateString+sdf.format(date));
251            else
252                modified.setText(dateString+"-");
253           
254            return convertView;
255        }
256       
257        /**
258         * Controla la selección de cada item del fileBrowser
259         */
260        public void select(ListView parent, int position) {
261
262            File item = getItem(position);
263            //Si es un directorio el seleccionado se hace un llamado del fileBrowser del directorio
264            if (item.isDirectory()) {
265                parent.setAdapter(FileToVerifySignatureActivity.this.listAdapter = new FileListAdapter(item.getAbsolutePath(), filterMImeType));
266            } else { // Si es un archivo
267               
268                        //Se agrega el archivo a la lista de seleccionados si no se encuentra en la misma               
269                if (FileToVerifySignatureActivity.this.selected == null || 
270                        FileToVerifySignatureActivity.this.selected.hashCode() != item.hashCode()){
271                       
272                        FileToVerifySignatureActivity.this.selected = item;
273                       
274                        FileToVerifySignatureActivity.this.updateButton(FileToVerifySignatureActivity.this.viewHolder.accept,true);             
275                                               
276                }
277                else{ // De lo contrario se elimina de la lista de seleccionados
278                       
279                        FileToVerifySignatureActivity.this.selected = null;                             
280                        FileToVerifySignatureActivity.this.updateButton(FileToVerifySignatureActivity.this.viewHolder.accept,false);
281                                       
282                }
283                notifyDataSetChanged();
284           }
285        }       
286    }   
287
288
289   
290   
291    @Override
292    protected void onSaveInstanceState(Bundle outState) {
293        super.onSaveInstanceState(outState);
294
295        outState.putParcelable("intent", this.getIntent());
296        outState.putString("cwd", this.cwd.getAbsolutePath());
297        if(this.selected != null)
298                outState.putString("selected", this.selected.getAbsolutePath());
299       
300        }
301   
302    private void updateButton(View v, boolean bool) {
303        try{
304
305                v.setEnabled(bool);
306                if (v instanceof TextView){
307                        Drawable icon = ((TextView)v).getCompoundDrawables()[1];
308                        if (icon!=null)
309                        if (bool)
310                                icon.setAlpha(255);
311                        else
312                                icon.setAlpha(127);     
313                }
314                if (v instanceof ImageView){
315                        ImageView result = (ImageView) v;
316                        if (bool)
317                                result.setAlpha(255);
318                        else
319                                result.setAlpha(127);   
320                }
321       
322        }catch(NullPointerException e){}
323                       
324        }
325   
326    private void updateButton(LinearLayout layout, boolean bool) {
327        try{
328        layout.setEnabled(bool);
329        for (int i=0; i<layout.getChildCount();i++){
330                this.updateButton(layout.getChildAt(i), bool);
331        }
332        }catch(NullPointerException e){}
333                       
334        }
335
336       
337       
338        /**
339     * Holds references to view objects.
340     *
341     * @author José M. Prieto (jmprieto@emergya.com)
342     */
343    private class FileBrowserView {
344
345        public ListView fileList;
346        public TextView path;
347        public LinearLayout accept;
348                public LinearLayout clear;
349        public TextView pathString;
350
351        public FileBrowserView() {
352
353            setContentView(R.layout.activity_file_to_verify_bdoc);
354            this.path = (TextView) findViewById(R.id.path);
355            this.pathString = (TextView) findViewById(R.id.pathstring);
356
357            this.fileList = (ListView) findViewById(R.id.file_list);
358            this.fileList.setOnItemClickListener(FileToVerifySignatureActivity.this);
359            this.fileList.setItemsCanFocus(true);
360         
361           
362            this.clear = (LinearLayout) findViewById(R.id.button_clear_zone);
363            this.clear.setOnClickListener(FileToVerifySignatureActivity.this);
364           
365            this.accept = (LinearLayout) findViewById(R.id.button_accept_zone);
366            this.accept.setOnClickListener(FileToVerifySignatureActivity.this);
367
368        }
369    }
370   
371        @Override
372    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
373       
374       
375        if (parent.getId() == R.id.file_list) { // user selects a file
376            this.listAdapter.select((ListView) parent, position);
377           
378        } else { // user de-selects a file
379            //this.listAdapter.addIfSameDirectory(selectedAdapter.doUnselect((ListView) parent, position));
380               
381        }
382        //this.viewHolder.numSelected.setText(Integer.toString(this.selected.size()));
383    }
384
385    @Override
386    public void onClick(View v) {
387
388        switch (v.getId()) {
389
390       
391        case R.id.button_clear_zone:
392               
393                this.selected = null;
394                this.listAdapter.notifyDataSetChanged();
395
396                //this.viewHolder.numSelected.setText(""+this.selected.size());
397            this.updateButton(this.viewHolder.accept, false);
398                break;         
399       
400
401       
402            case R.id.button_accept_zone:
403               
404                        //Crear dialogo de opciones para firmar
405                        //final AlertDialog image_dialog = selectImageOptionsDialog();
406                        //image_dialog.show();
407           
408                        Log.d("DEBUG***",  FileToVerifySignatureActivity.this.selected.getAbsolutePath());
409                       
410                        // lanzar activity para mostrar resultados de verificacion
411                        Intent intent = new Intent(this, BDOCVerifyResultActivity.class);
412                        intent.putExtra("fileToVerify", FileToVerifySignatureActivity.this.selected.getAbsolutePath());
413                       
414                        File f = new File(FileToVerifySignatureActivity.this.selected.getAbsolutePath());
415                        Uri selectedUri = Uri.fromFile(f);
416            String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString());
417            intent.putExtra("fileExtension", fileExtension);
418                        startActivity(intent);
419                                               
420                break;         
421       
422        }
423    }
424   
425       
426        //Crea dialogo de opciones para seleccion de imagen de firma
427        public AlertDialog selectImageOptionsDialog() {
428                final String[] option = new String[] {getString(R.string.firmar_man_capt_img), getString(R.string.firmar_man_exist_img), getString(R.string.firmar_man_prefer_img) };
429                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
430                        android.R.layout.select_dialog_item, option);
431                AlertDialog.Builder builder = new AlertDialog.Builder(this);
432               
433                builder.setTitle(getString(R.string.seleccione_opcion_firmar_man_img));
434                builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
435               
436                  public void onClick(DialogInterface dialog, int which) {
437                         
438                          switch (which) {
439                        case 0: // Capturar imágen
440                                Intent intent = new Intent(FileToVerifySignatureActivity.this, CaptureImgHandwrittenSignatureActivity.class);
441                    intent.putExtra("FILE_TO_SIGN", FileToVerifySignatureActivity.this.selected.getAbsolutePath());
442                    Log.i("DEBUG",  FileToVerifySignatureActivity.this.selected.getAbsolutePath());
443                    startActivity(intent);
444                               
445                                break;
446                        case 1: // Buscar en archivos
447                               
448                                break;
449                        case 2: // Usar predeterminada
450                               
451                                break;
452
453                        default:
454                                break;
455                        }
456                  }
457                 
458                });     
459               
460                return builder.create();
461        }
462}
463
Note: See TracBrowser for help on using the repository browser.