source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/FileToShareActivity.java @ 8379cd8

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

Agregado encabezado de licencia a archivos fuentes.

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