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); } } }