Android Open Source - timestatistic File Dialog






From Project

Back to project page timestatistic.

License

The source code is released under:

GNU General Public License

If you think the Android project timestatistic listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package maximsblog.blogspot.com.timestatistic;
//ww  w .ja  v a2  s.co  m
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;


import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

/**
 * Activity para escolha de arquivos/diretorios.
 * 
 * @author android
 * 
 */
public class FileDialog extends ListActivity {

  /**
   * Chave de um item da lista de paths.
   */
  private static final String ITEM_KEY = "key";

  /**
   * Imagem de um item da lista de paths (diretorio ou arquivo).
   */
  private static final String ITEM_IMAGE = "image";

  /**
   * Diretorio raiz.
   */
  private static final String ROOT = "/";

  /**
   * Parametro de entrada da Activity: path inicial. Padrao: ROOT.
   */
  public static final String START_PATH = "START_PATH";

  /**
   * Parametro de entrada da Activity: filtro de formatos de arquivos. Padrao:
   * null.
   */
  public static final String FORMAT_FILTER = "FORMAT_FILTER";

  /**
   * Parametro de saida da Activity: path escolhido. Padrao: null.
   */
  public static final String RESULT_PATH = "RESULT_PATH";

  /**
   * Parametro de entrada da Activity: tipo de selecao: pode criar novos paths
   * ou nao. Padrao: nao permite.
   * 
   * @see {@link SelectionMode}
   */
  public static final String SELECTION_MODE = "SELECTION_MODE";

  /**
   * Parametro de entrada da Activity: se e permitido escolher diretorios.
   * Padrao: falso.
   */
  public static final String CAN_SELECT_DIR = "CAN_SELECT_DIR";

  private List<String> path = null;
  private TextView myPath;
  private ArrayList<HashMap<String, Object>> mList;

  //private Button selectButton;

  //private LinearLayout layoutSelect;
  private InputMethodManager inputManager;
  private String parentPath;
  private String currentPath = ROOT;

  private int selectionMode = SelectionMode.MODE_CREATE;

  private String[] formatFilter = null;

  private boolean canSelectDir = false;

  private File selectedFile;
  private HashMap<String, Integer> lastPositions = new HashMap<String, Integer>();

  private Button selectButton;

  /**
   * Called when the activity is first created. Configura todos os parametros
   * de entrada e das VIEWS..
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setResult(RESULT_CANCELED, getIntent());

    setContentView(R.layout.file_dialog_main);
    myPath = (TextView) findViewById(R.id.path);

    inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

    selectButton = (Button) findViewById(R.id.fdButtonSelect);
    selectButton.setVisibility(View.GONE);
    selectButton.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
        if (selectedFile != null) {
          getIntent().putExtra(RESULT_PATH, selectedFile.getPath());
          setResult(RESULT_OK, getIntent());
          finish();
        }
      }
    });

    

    selectionMode = getIntent().getIntExtra(SELECTION_MODE, SelectionMode.MODE_CREATE);

    formatFilter = getIntent().getStringArrayExtra(FORMAT_FILTER);

    canSelectDir = getIntent().getBooleanExtra(CAN_SELECT_DIR, false);

  //  layoutSelect = (LinearLayout) findViewById(R.id.fdLinearLayoutSelect);

    

    String startPath = getIntent().getStringExtra(START_PATH);
    startPath = startPath != null ? startPath : ROOT;
    if (canSelectDir) {
      File file = new File(startPath);
      selectedFile = file;
      selectButton.setVisibility(View.VISIBLE);
    }
    getDir(startPath);
    
    
  }

  private void getDir(String dirPath) {

    boolean useAutoSelection = dirPath.length() < currentPath.length();

    Integer position = lastPositions.get(parentPath);

    getDirImpl(dirPath);

    if (position != null && useAutoSelection) {
      getListView().setSelection(position);
    }

  }

  /**
   * Monta a estrutura de arquivos e diretorios filhos do diretorio fornecido.
   * 
   * @param dirPath
   *            Diretorio pai.
   */
  private void getDirImpl(final String dirPath) {

    currentPath = dirPath;

    final List<String> item = new ArrayList<String>();
    path = new ArrayList<String>();
    mList = new ArrayList<HashMap<String, Object>>();

    File f = new File(currentPath);
    File[] files = f.listFiles();
    if (files == null) {
      currentPath = ROOT;
      f = new File(currentPath);
      files = f.listFiles();
    }
    myPath.setText(getText(R.string.location) + ": " + currentPath);

    if (!currentPath.equals(ROOT)) {

      item.add(ROOT);
      addItem(ROOT, R.drawable.ic_folder_dark);
      path.add(ROOT);

      item.add("../");
      addItem("../", R.drawable.ic_folder_dark);
      path.add(f.getParent());
      parentPath = f.getParent();

    }

    TreeMap<String, String> dirsMap = new TreeMap<String, String>();
    TreeMap<String, String> dirsPathMap = new TreeMap<String, String>();
    TreeMap<String, String> filesMap = new TreeMap<String, String>();
    TreeMap<String, String> filesPathMap = new TreeMap<String, String>();
    for (File file : files) {
      if(file.getName().startsWith("."))
        continue;
      if (file.isDirectory()) {
        String dirName = file.getName();
        dirsMap.put(dirName, dirName);
        dirsPathMap.put(dirName, file.getPath());
      } else {
        final String fileName = file.getName();
        final String fileNameLwr = fileName.toLowerCase();
        // se ha um filtro de formatos, utiliza-o
        if (formatFilter != null) {
          boolean contains = false;
          for (int i = 0; i < formatFilter.length; i++) {
            final String formatLwr = formatFilter[i].toLowerCase();
            if (fileNameLwr.endsWith(formatLwr)) {
              contains = true;
              break;
            }
          }
          if (contains) {
            filesMap.put(fileName, fileName);
            filesPathMap.put(fileName, file.getPath());
          }
          // senao, adiciona todos os arquivos
        } else {
          filesMap.put(fileName, fileName);
          filesPathMap.put(fileName, file.getPath());
        }
      }
    }
    item.addAll(dirsMap.tailMap("").values());
    item.addAll(filesMap.tailMap("").values());
    path.addAll(dirsPathMap.tailMap("").values());
    path.addAll(filesPathMap.tailMap("").values());

    SimpleAdapter fileList = new SimpleAdapter(this, mList, R.layout.file_dialog_row, new String[] {
        ITEM_KEY, ITEM_IMAGE }, new int[] { R.id.fdrowtext, R.id.fdrowimage });

    for (String dir : dirsMap.tailMap("").values()) {
      addItem(dir, R.drawable.ic_folder_dark);
    }

    for (String file : filesMap.tailMap("").values()) {
        addItem(file, R.drawable.ic_file_dark);
    }

    fileList.notifyDataSetChanged();

    setListAdapter(fileList);

  }

  private void addItem(String fileName, int imageId) {
    HashMap<String, Object> item = new HashMap<String, Object>();
    item.put(ITEM_KEY, fileName);
    item.put(ITEM_IMAGE, imageId);
    mList.add(item);
  }

  /**
   * Quando clica no item da lista, deve-se: 1) Se for diretorio, abre seus
   * arquivos filhos; 2) Se puder escolher diretorio, define-o como sendo o
   * path escolhido. 3) Se for arquivo, define-o como path escolhido. 4) Ativa
   * botao de selecao.
   */
  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {

    File file = new File(path.get(position));

    setSelectVisible(v);

    if (file.isDirectory()) {
      //selectButton.setEnabled(false);
      if (file.canRead()) {
        lastPositions.put(currentPath, position);
        getDir(path.get(position));
        if (canSelectDir) {
          selectedFile = file;
          v.setSelected(true);
          //selectButton.setEnabled(true);
        }
      } else {
        new AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher)
            .setTitle("[" + file.getName() + "] " + getText(R.string.cant_read_folder))
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {

              @Override
              public void onClick(DialogInterface dialog, int which) {

              }
            }).show();
      }
    } else {
      selectedFile = file;
      v.setSelected(true);
      getIntent().putExtra(RESULT_PATH, selectedFile.getPath());
      setResult(RESULT_OK, getIntent());
      finish();
      //selectButton.setEnabled(true);
    }
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
      //selectButton.setEnabled(false);

      
        if (!currentPath.equals(ROOT)) {
          getDir(parentPath);
        } else {
          return super.onKeyDown(keyCode, event);
        }
      

      return true;
    } else {
      return super.onKeyDown(keyCode, event);
    }
  }

  /**
   * Define se o botao de CREATE e visivel.
   * 
   * @param v
   */
  private void setCreateVisible(View v) {
    
  //  layoutSelect.setVisibility(View.GONE);

    inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
    //selectButton.setEnabled(false);
  }

  /**
   * Define se o botao de SELECT e visivel.
   * 
   * @param v
   */
  private void setSelectVisible(View v) {
    
  //  layoutSelect.setVisibility(View.VISIBLE);

    inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
  //  selectButton.setEnabled(false);
  }
}




Java Source Code List

maximsblog.blogspot.com.timestatistic.AboutActivity.java
maximsblog.blogspot.com.timestatistic.AboutFragment.java
maximsblog.blogspot.com.timestatistic.AlarmManagerBroadcastReceiver.java
maximsblog.blogspot.com.timestatistic.AreYouSureResetAllDialogFragment.java
maximsblog.blogspot.com.timestatistic.AreYouSureResetAllDialog.java
maximsblog.blogspot.com.timestatistic.BootUpReceiver.java
maximsblog.blogspot.com.timestatistic.CalendarSetupDialogFragment.java
maximsblog.blogspot.com.timestatistic.ColorPickerDialogFragment.java
maximsblog.blogspot.com.timestatistic.ColorPickerDialog.java
maximsblog.blogspot.com.timestatistic.CounterEditorDialogFragment.java
maximsblog.blogspot.com.timestatistic.CountersCursorAdapter.java
maximsblog.blogspot.com.timestatistic.CountersFragment.java
maximsblog.blogspot.com.timestatistic.CountersPeriodSetupDialogFragment.java
maximsblog.blogspot.com.timestatistic.CustomDateTimePicker.java
maximsblog.blogspot.com.timestatistic.DiagramFragment.java
maximsblog.blogspot.com.timestatistic.DiaryCursorAdapter.java
maximsblog.blogspot.com.timestatistic.DiaryEditorDialogFragment.java
maximsblog.blogspot.com.timestatistic.DiaryFragment.java
maximsblog.blogspot.com.timestatistic.ExportImportBackupActivity.java
maximsblog.blogspot.com.timestatistic.ExportToCSVActivity.java
maximsblog.blogspot.com.timestatistic.ExportToCSVService.java
maximsblog.blogspot.com.timestatistic.ExportToGoogleCalendarActivity.java
maximsblog.blogspot.com.timestatistic.ExportToGoogleCalendarService.java
maximsblog.blogspot.com.timestatistic.FileDialog.java
maximsblog.blogspot.com.timestatistic.FilterDateOption.java
maximsblog.blogspot.com.timestatistic.FilterDateSetDialogFragment.java
maximsblog.blogspot.com.timestatistic.FilterDialogFragment.java
maximsblog.blogspot.com.timestatistic.GdriveUpload.java
maximsblog.blogspot.com.timestatistic.HelpActivity.java
maximsblog.blogspot.com.timestatistic.HistoryFragment.java
maximsblog.blogspot.com.timestatistic.ICustomDateTimeListener.java
maximsblog.blogspot.com.timestatistic.IRecordDialog.java
maximsblog.blogspot.com.timestatistic.IdateChange.java
maximsblog.blogspot.com.timestatistic.Item.java
maximsblog.blogspot.com.timestatistic.MainActivity.java
maximsblog.blogspot.com.timestatistic.OpenHelper.java
maximsblog.blogspot.com.timestatistic.PeriodAnalyseActivity.java
maximsblog.blogspot.com.timestatistic.PeriodAnalyseFragment.java
maximsblog.blogspot.com.timestatistic.PeriodData.java
maximsblog.blogspot.com.timestatistic.PeriodSetupDialogFragment.java
maximsblog.blogspot.com.timestatistic.RecordsDbHelper.java
maximsblog.blogspot.com.timestatistic.SelectionMode.java
maximsblog.blogspot.com.timestatistic.SettingsActivity.java
maximsblog.blogspot.com.timestatistic.SplitRecordDialogFragment.java
maximsblog.blogspot.com.timestatistic.TimeRecordsFragment.java
maximsblog.blogspot.com.timestatistic.TimesCursorAdapter.java
maximsblog.blogspot.com.timestatistic.TopicActivity.java
maximsblog.blogspot.com.timestatistic.UnionRecordDialogFragment.java
maximsblog.blogspot.com.timestatistic.XYMultipleSeriesDatasetLoader.java
maximsblog.blogspot.com.timestatistic.app.java