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

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

*- Agregada actividad FileToShareActivity? para compartir archivos a través de otras aplicaciones. Se pueden compartir archivos firmados, archivos BDOC descargados de servidores y archivos extraídos de BDOC.

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