source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/FileToSignHandwrittenSignatureActivity.java @ 288126d

Last change on this file since 288126d was 288126d, checked in by Jose Ruiz <joseruiz@…>, 11 years ago

Manejo de repositorio de certificados y firma con pkcs7

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