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

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

*- Agregada opción para compartir archivos cifrados desde el menu de compartir archivos de la aplicación.

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