package no.ntnu.item.csv; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Stack; import no.ntnu.item.csv.guiutils.BrowseList; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; public class LocalBrowseActivity extends ListActivity { public static Stack<String> location = new Stack<String>(); // Keeps track // of the // current // directory. public static List<String> files = new ArrayList<String>(); // Static list // containing // all files in // the current // directory. public final FilenameFilter filter = new FilenameFilter() { // File filter // to disable // browsing of // hidden files. @Override public boolean accept(File dir, String name) { File f = new File(dir, name); return f.exists() && f.canRead() && !f.isHidden(); } }; public static final String STORAGE_INTERNAL = "Internal Storage"; public static final String STORAGE_EXTERNAL = "External Storage"; public String eState; // State of external device. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); startLocalBrowsing(); } // Mount and display storage devices before browsing locally. public void startLocalBrowsing() { location.clear(); files.clear(); files.add(STORAGE_INTERNAL); // Mounting external storage. eState = Environment.getExternalStorageState(); if (eState.equals(Environment.MEDIA_MOUNTED)) files.add(STORAGE_EXTERNAL); BrowseList bl = new BrowseList(files); SimpleAdapter sa = new SimpleAdapter(this, bl.getList(), R.layout.filelist, new String[] { "ICON", "TEXT" }, new int[] { R.id.browse_icon, R.id.browse_text }); setListAdapter(sa); ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { File clicked; switch (position) { case 1: clicked = Environment.getExternalStorageDirectory(); break; default: clicked = new File("/"); break; } location.push(clicked.getAbsolutePath()); doBrowse(clicked); } }); } private void doBrowse(File file) { files.clear(); // Open "file" if it is a directory. if (file.isDirectory()) { // Sort list files.add(".."); File[] tmp = file.listFiles(filter); List<String> filesInDir = new ArrayList<String>(); List<String> dirs = new ArrayList<String>(); for (int i = 0; i < tmp.length; i++) { File f = tmp[i]; if (f.isFile()) { filesInDir.add(f.getName()); } else if (f.isDirectory()) { dirs.add(f.getName()); } } Collections.sort(filesInDir, String.CASE_INSENSITIVE_ORDER); Collections.sort(dirs, String.CASE_INSENSITIVE_ORDER); files.addAll(dirs); files.addAll(filesInDir); BrowseList bl = new BrowseList(getCurrentDirectory(), files); SimpleAdapter sa = new SimpleAdapter(this, bl.getList(), R.layout.filelist, new String[] { "ICON", "TEXT" }, new int[] { R.id.browse_icon, R.id.browse_text }); setListAdapter(sa); ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Check direction of browsing, to correctly update the // location stack. if (files.get(position).equals("..")) location.pop(); else location.push(files.get(position)); // If browsing out of storage device, return to show storage // devices. if (location.size() == 0) { startLocalBrowsing(); } else { doBrowse(new File(getCurrentDirectory())); } } }); // Upload file if it is not a directory. } else { Intent intent = new Intent(); intent.putExtra("FILEPATH", file.getAbsolutePath()); setResult(RESULT_OK, intent); location.clear(); finish(); } } // Obtain the current directory path. public String getCurrentDirectory() { String path = ""; for (Iterator<String> iterator = location.iterator(); iterator .hasNext();) { String type = iterator.next(); path += type + "/"; } return path; } }