package ve.gob.cenditel.tibisaymovil; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import ve.gob.cenditel.tibisaymovil.R; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.Window; import android.webkit.MimeTypeMap; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RadioButton; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; public class FileToSignHandwrittenSignatureActivity extends Activity implements OnItemClickListener, OnClickListener { private File cwd; private File selected; private FileBrowserView viewHolder; private FileListAdapter listAdapter; private String filterMImeType = "application/pdf"; @Override protected void onCreate(Bundle savedInstanceState) { //Estilando la barra de titulo final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); super.onCreate(savedInstanceState); this.viewHolder = new FileBrowserView(); if (savedInstanceState != null) { if(savedInstanceState.getString("selected") != null) this.selected = new File(savedInstanceState.getString("selected")); if (this.selected != null) { FileToSignHandwrittenSignatureActivity.this.updateButton (FileToSignHandwrittenSignatureActivity.this.viewHolder.accept,true); } this.cwd = new File(savedInstanceState.getString("cwd")); this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter(this.cwd.getAbsolutePath(), filterMImeType)); } else { this.selected = null; this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter()); } boolean enabled = false; if (this.selected != null) enabled = this.viewHolder.accept.isEnabled(); FileToSignHandwrittenSignatureActivity.this.updateButton (FileToSignHandwrittenSignatureActivity.this.viewHolder.accept,enabled); //Estilando Barra de titulo if(customTitleSupported) getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar); } /** * Provides the data to be shown in the file browser ListView. * * @author José M. Prieto (jmprieto@emergya.com) */ private class FileListAdapter extends BaseAdapter { private final ArrayList directories; private final ArrayList files; private FileListAdapter() { this("/",filterMImeType); } private FileListAdapter(String location) { this(location, ""); } private FileListAdapter(String location, String filterMimeType) { directories = new ArrayList(); files = new ArrayList(); //Obtiene etiqueta que se colocará antes del path que visualizará el usuario String toPathText = FileToSignHandwrittenSignatureActivity.this.getString(R.string.pathstring)+": "; //Coloca el texto de la etiqueta en la vista FileToSignHandwrittenSignatureActivity.this.viewHolder.pathString.setText(toPathText); //Coloca el texto con el path actual FileToSignHandwrittenSignatureActivity.this.viewHolder.path.setText(location); //Crea un objeto file cwd con la ubicacion dada en location FileToSignHandwrittenSignatureActivity.this.cwd = new File(location); //Obtiene el directorio padre del objeto file cwd File parent = FileToSignHandwrittenSignatureActivity.this.cwd.getParentFile(); //Si tiene un padre, lo agrega en la posición cero de la lista de directorios if (parent != null) { directories.add(0, parent); } //Crea un arreglo con las lista de archivos contenidos en el directorio cwd File[] ls = FileToSignHandwrittenSignatureActivity.this.cwd.listFiles(); if (ls != null) { for (File f : ls) { //recorre todos los archivos contenidos en el directorio if (FsUtils.isHiddenOrNotReadable(f)) { // Si son ocultos no hace nada continue; } // Si son directorios los agrega a la lista de directorios a partir de la posición 1 // En la posición 0 se encuentra el directorio padre if (f.isDirectory()) { directories.add(f); } else // De lo contrario lo agrega a la lista de archivos { //Valida tipo de archivo a mostrar Uri selectedUri = Uri.fromFile(f); String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString()); String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension); // Toast.makeText(FileToSignHandwrittenSignatureActivity.this, // "FileExtension: " + fileExtension + "\n" + // "MimeType: " + mimeType, // Toast.LENGTH_LONG).show(); //Filtra por mimeType if(filterMimeType.isEmpty() || filterMimeType == mimeType) files.add(f); } } } Collections.sort(directories); // Ordena los directorios alfabeticamente Collections.sort(files); // Ordena los archivos alfabeticamente } /** * Retorna cantidad total de elementos que se listarán en el directorio. */ @Override public int getCount() { return directories.size() + files.size(); } /** * Dada una posición en el listado del directorio, retorna un archivo o directorio * según corresponda. */ @Override public File getItem(int position) { if (position < directories.size()) { return directories.get(position); } else { return files.get(position - directories.size()); } } /** * Retorna un código hash para el archivo, permite comparar si dos archivos son los mismos */ @Override public long getItemId(int position) { return getItem(position).hashCode(); } /** * Crea la visualización de cada item del fileBrowser */ @Override public View getView(int position, View convertView, ViewGroup parent) { //Crea la vista de cada fila del filebrowser a partir del layout if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(FileToSignHandwrittenSignatureActivity.this); convertView = inflater.inflate(R.layout.file_to_sign_handwritten_signature_item, parent, false); } // Se enlaza a cada componente del layout ImageView image = (ImageView) convertView.findViewById(R.id.type_image); TextView fileName = (TextView) convertView.findViewById(R.id.filename_text); TextView modified = (TextView) convertView.findViewById(R.id.filename_modified); // Se obtiene el archivo ubicado en position File file = getItem(position); //RadioButton RadioButton radio = (RadioButton) convertView.findViewById(R.id.file_radio); radio.setFocusable(false); // Se asignan los iconos según el tipo de archivo y se oculta el radio en los directorios if (file.isDirectory()) { image.setImageResource(R.drawable.ic_carpeta); radio.setVisibility(View.INVISIBLE); radio.setChecked(false); } else { image.setImageResource(R.drawable.ic_archivo); radio.setVisibility(View.VISIBLE); if (FileToSignHandwrittenSignatureActivity.this.selected == null || FileToSignHandwrittenSignatureActivity.this.selected.hashCode() != file.hashCode()){ radio.setChecked(false); } else{ radio.setChecked(true); } } // Si es el directorio que hace referencia al padre le coloca como nombre ".." if (file.isDirectory() && position == 0 && ! "/".equals(FileToSignHandwrittenSignatureActivity.this.cwd.getAbsolutePath())) { fileName.setText(".."); } else { fileName.setText(file.getName()); } //Datos de modificación del archivo SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date date = new Date(file.lastModified()); String dateString = FileToSignHandwrittenSignatureActivity.this.getString(R.string.modified)+": "; if (file.lastModified()>0) modified.setText(dateString+sdf.format(date)); else modified.setText(dateString+"-"); return convertView; } /** * Controla la selección de cada item del fileBrowser */ public void select(ListView parent, int position) { File item = getItem(position); //Si es un directorio el seleccionado se hace un llamado del fileBrowser del directorio if (item.isDirectory()) { parent.setAdapter(FileToSignHandwrittenSignatureActivity.this.listAdapter = new FileListAdapter(item.getAbsolutePath(), filterMImeType)); } else { // Si es un archivo //Se agrega el archivo a la lista de seleccionados si no se encuentra en la misma if (FileToSignHandwrittenSignatureActivity.this.selected == null || FileToSignHandwrittenSignatureActivity.this.selected.hashCode() != item.hashCode()){ FileToSignHandwrittenSignatureActivity.this.selected = item; FileToSignHandwrittenSignatureActivity.this.updateButton(FileToSignHandwrittenSignatureActivity.this.viewHolder.accept,true); } else{ // De lo contrario se elimina de la lista de seleccionados FileToSignHandwrittenSignatureActivity.this.selected = null; FileToSignHandwrittenSignatureActivity.this.updateButton(FileToSignHandwrittenSignatureActivity.this.viewHolder.accept,false); } notifyDataSetChanged(); } } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("intent", this.getIntent()); outState.putString("cwd", this.cwd.getAbsolutePath()); if(this.selected != null) outState.putString("selected", this.selected.getAbsolutePath()); } private void updateButton(View v, boolean bool) { try{ v.setEnabled(bool); if (v instanceof TextView){ Drawable icon = ((TextView)v).getCompoundDrawables()[1]; if (icon!=null) if (bool) icon.setAlpha(255); else icon.setAlpha(127); } if (v instanceof ImageView){ ImageView result = (ImageView) v; if (bool) result.setAlpha(255); else result.setAlpha(127); } }catch(NullPointerException e){} } private void updateButton(LinearLayout layout, boolean bool) { try{ layout.setEnabled(bool); for (int i=0; i parent, View view, int position, long id) { if (parent.getId() == R.id.file_list) { // user selects a file this.listAdapter.select((ListView) parent, position); } else { // user de-selects a file //this.listAdapter.addIfSameDirectory(selectedAdapter.doUnselect((ListView) parent, position)); } //this.viewHolder.numSelected.setText(Integer.toString(this.selected.size())); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_clear_zone: this.selected = null; this.listAdapter.notifyDataSetChanged(); //this.viewHolder.numSelected.setText(""+this.selected.size()); this.updateButton(this.viewHolder.accept, false); break; case R.id.button_accept_zone: //Crear dialogo de opciones para firmar final AlertDialog image_dialog = selectImageOptionsDialog(); image_dialog.show(); break; } } //Crea dialogo de opciones para seleccion de imagen de firma public AlertDialog selectImageOptionsDialog() { 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) }; ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.select_dialog_item, option); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.seleccione_opcion_firmar_man_img)); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: // Capturar imágen Intent intent = new Intent(FileToSignHandwrittenSignatureActivity.this, CaptureImgHandwrittenSignatureActivity.class); intent.putExtra("FILE_TO_SIGN", FileToSignHandwrittenSignatureActivity.this.selected.getAbsolutePath()); Log.i("DEBUG", FileToSignHandwrittenSignatureActivity.this.selected.getAbsolutePath()); startActivity(intent); break; case 1: // Buscar en archivos Intent intent1 = new Intent(FileToSignHandwrittenSignatureActivity.this, SelectImgHandwrittenSignatureActivity.class); intent1.putExtra("FILE_TO_SIGN", FileToSignHandwrittenSignatureActivity.this.selected.getAbsolutePath()); startActivity(intent1); break; case 2: // Usar predeterminada break; default: break; } } }); return builder.create(); } }