/* Tibisay Movil Copyright (C) 2013 Antonio Araujo (aaraujo@cenditel.gob.ve), Jose Ruiz (jruiz@cenditel.gob.ve), Fundacion Centro Nacional de Desarrollo e Investigacion en Tecnologias Libres - CENDITEL. La Fundación CENDITEL concede permiso para usar, copiar, distribuir y/o modificar este programa, reconociendo el derecho que la humanidad posee al libre acceso al conocimiento, bajo los términos de la licencia de software GPL versión 2.0 de la Free Software Foundation. Este programa se distribuye con la esperanza de que sea util, pero SIN NINGUNA GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o ADECUACION A UN PROPOSITO PARTICULAR. Para mayor información sobre los términos de la licencia ver el archivo llamado "gpl-2.0.txt" en ingles. */ package ve.gob.cenditel.tibisaymovil; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; /** * Activity to select a single PKCS12 file, browsing the file system. * * @author José M. Prieto (jmprieto@emergya.com) */ public class PKCS12FilePickerActivity extends Activity implements OnItemClickListener { private File cwd; private FileBrowserView viewHolder; private FileListAdapter listAdapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PKCS12FilePickerActivity.this.viewHolder = new FileBrowserView(); PKCS12FilePickerActivity.this.viewHolder.fileList.setAdapter( PKCS12FilePickerActivity.this.listAdapter = new FileListAdapter()); } @Override public void onItemClick(AdapterView parent, View view, int position, long id) { this.listAdapter.select((ListView) parent, position); } @Override public void onBackPressed() { if ("/".equals(this.cwd.getAbsolutePath())) { super.onBackPressed(); } else { this.viewHolder.fileList.setAdapter(this.listAdapter = new FileListAdapter(cwd.getParent())); } } @Override protected void onPause() { super.onPause(); // TODO Auto-generated method stub } @Override protected void onResume() { super.onResume(); // TODO Auto-generated method stub } /** * 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 List directories; private final List files; private FileListAdapter() { this(Environment.getExternalStorageDirectory().getAbsolutePath()); } private FileListAdapter(String location) { PKCS12FilePickerActivity.this.viewHolder.path.setText(location); directories = new ArrayList(); files = new ArrayList(); PKCS12FilePickerActivity.this.cwd = new File(location); File parent = PKCS12FilePickerActivity.this.cwd.getParentFile(); if (parent != null) { directories.add(0, parent); } File[] ls = PKCS12FilePickerActivity.this.cwd.listFiles(); if (ls != null) { for (File f : ls) { if (FsUtils.isHiddenOrNotReadable(f)) { continue; } if (f.isDirectory()) { directories.add(f); } else { String name = f.getName(); if (name.length() >= 4) { String extension = f.getName().substring(f.getName().length() - 4); if (extension.equalsIgnoreCase(".p12") || extension.equalsIgnoreCase(".pfx") || true) { files.add(f); } } } } } Collections.sort(directories); Collections.sort(files); } @Override public int getCount() { return directories.size() + files.size(); } @Override public File getItem(int position) { if (position < directories.size()) { return directories.get(position); } else { return files.get(position - directories.size()); } } @Override public long getItemId(int position) { return getItem(position).hashCode(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(PKCS12FilePickerActivity.this); //TODO: CANT USE THE SAME LAYOUT AS FILEBROWSER convertView = inflater.inflate(R.layout.cert_browser_item, parent, false); } ImageView image = (ImageView) convertView.findViewById(R.id.type_image); TextView fileName = (TextView) convertView.findViewById(R.id.filename_text); File file = getItem(position); if (file.isDirectory()) { //image.setImageResource(R.drawable.ico_carpeta); image.setImageResource(R.drawable.ic_carpeta); } else { //image.setImageResource(R.drawable.ico_archivo); image.setImageResource(R.drawable.ic_archivo); } if (file.isDirectory() && position == 0 && ! "/".equals(PKCS12FilePickerActivity.this.cwd.getAbsolutePath())) { fileName.setText(".."); } else { fileName.setText(file.getName()); } return convertView; } /** * Select a file. If the file is a directory, list files in that directory, else hide the file and add it to * the list of selected files. * * @param parent the ListView * @param position index of the file to remove */ public void select(ListView parent, int position) { final File item = getItem(position); if (item.isDirectory()) { parent.setAdapter(PKCS12FilePickerActivity.this.listAdapter = new FileListAdapter(item.getAbsolutePath())); } else { PKCS12FilePickerActivity.this.setResult(Activity.RESULT_OK, new Intent() {{ setData(Uri.fromFile(item)); }}); PKCS12FilePickerActivity.this.finish(); } } } /** * Holds references to view objects. * * @author José M. Prieto (jmprieto@emergya.com) */ private class FileBrowserView { public ListView fileList; public TextView path; public FileBrowserView() { setContentView(R.layout.single_file_browser); this.path = (TextView) findViewById(R.id.path); this.fileList = (ListView) findViewById(R.id.file_list); this.fileList.setOnItemClickListener(PKCS12FilePickerActivity.this); } } }