Android Open Source - advanced-tourist-map File Picker






From Project

Back to project page advanced-tourist-map.

License

The source code is released under:

GNU General Public License

If you think the Android project advanced-tourist-map 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

/*
 * Copyright 2010, 2011 mapsforge.org/*  ww  w . ja v  a2  s  .  co m*/
 *
 * This program is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.muxe.advancedtouristmap;

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.Comparator;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.GridView;

/**
 * A FilePicker displays the contents of directories. The user can navigate within the file
 * system and select a single file whose path is then returned to the calling activity. The
 * ordering of directory contents can be specified via {@link #setFileComparator(Comparator)}.
 * By default subfolders and files are grouped and each group is ordered alphabetically.
 * <p>
 * A {@link FileFilter} can be activated via {@link #setFileDisplayFilter(FileFilter)} to
 * restrict the displayed files and folders. By default all files and folders are visible.
 * <p>
 * Another <code>FileFilter</code> can be applied via {@link #setFileSelectFilter(FileFilter)}
 * to check if a selected file is valid before its path is returned. By default all files are
 * considered as valid and can be selected by the user.
 */
public class FilePicker extends Activity implements AdapterView.OnItemClickListener {
  private static final String DEFAULT_DIRECTORY = "/";
  private static final int DIALOG_FILE_INVALID = 0;
  private static final int DIALOG_FILE_SELECT = 1;
  private static Comparator<File> fileComparator = getDefaultFileComparator();
  private static FileFilter fileDisplayFilter;
  private static FileFilter fileSelectFilter;
  private static final String PREFERENCES_FILE = "FilePicker";

  /**
   * Sets the file comparator which is used to order the contents of all directories before
   * displaying them. If set to null, subfolders and files will not be ordered.
   * 
   * @param fileComparator
   *            the file comparator (may be null).
   */
  public static void setFileComparator(Comparator<File> fileComparator) {
    FilePicker.fileComparator = fileComparator;
  }

  /**
   * Sets the file display filter. This filter is used to determine which files and subfolders
   * of directories will be displayed. If set to null, all files and subfolders are shown.
   * 
   * @param fileDisplayFilter
   *            the file display filter (may be null).
   */
  public static void setFileDisplayFilter(FileFilter fileDisplayFilter) {
    FilePicker.fileDisplayFilter = fileDisplayFilter;
  }

  /**
   * Sets the file select filter. This filter is used when the user selects a file to
   * determine if it is valid. If set to null, all files are considered as valid.
   * 
   * @param fileSelectFilter
   *            the file selection filter (may be null).
   */
  public static void setFileSelectFilter(FileFilter fileSelectFilter) {
    FilePicker.fileSelectFilter = fileSelectFilter;
  }

  /**
   * Creates the default file comparator.
   * 
   * @return the default file comparator.
   */
  private static Comparator<File> getDefaultFileComparator() {
    // order all files by type and alphabetically by name
    return new Comparator<File>() {
      @Override
      public int compare(File file1, File file2) {
        if (file1.isDirectory() && !file2.isDirectory()) {
          return -1;
        } else if (!file1.isDirectory() && file2.isDirectory()) {
          return 1;
        } else {
          return file1.getName().compareToIgnoreCase(file2.getName());
        }
      }
    };
  }

  File currentDirectory;
  private FilePickerIconAdapter filePickerIconAdapter;
  private File[] files;
  private File[] filesWithParentFolder;
  private GridView gridView;
  private Button directoryButton;
  private File selectedFile;
  private boolean directoryMode;

  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    this.selectedFile = this.files[(int) id];
    if (this.selectedFile.isDirectory()) {
      this.currentDirectory = this.selectedFile;
      browseToCurrentDirectory();
    } else if (fileSelectFilter == null || fileSelectFilter.accept(this.selectedFile)) {
      setResult(RESULT_OK,
          new Intent().putExtra("selectedFile", this.selectedFile.getAbsolutePath()));
      finish();
    } else {
      showDialog(DIALOG_FILE_INVALID);
    }
  }

  /**
   * Browses to the current directory.
   */
  private void browseToCurrentDirectory() {
    setTitle(this.currentDirectory.getAbsolutePath());

    // read the subfolders and files from the current directory
    if (fileDisplayFilter == null) {
      this.files = this.currentDirectory.listFiles();
    } else {
      this.files = this.currentDirectory.listFiles(fileDisplayFilter);
    }

    if (this.files == null) {
      this.files = new File[0];
    } else {
      // order the subfolders and files
      Arrays.sort(this.files, fileComparator);
    }

    // if a parent directory exists, add it at the first position
    if (this.currentDirectory.getParentFile() != null) {
      this.filesWithParentFolder = new File[this.files.length + 1];
      this.filesWithParentFolder[0] = this.currentDirectory.getParentFile();
      System.arraycopy(this.files, 0, this.filesWithParentFolder, 1, this.files.length);
      this.files = this.filesWithParentFolder;
      this.filePickerIconAdapter.setFiles(this.files, true);
    } else {
      this.filePickerIconAdapter.setFiles(this.files, false);
    }
    this.filePickerIconAdapter.notifyDataSetChanged();
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file_picker);

    Intent startingIntent = getIntent();
    this.directoryMode = startingIntent.getBooleanExtra("directory", false);

    this.filePickerIconAdapter = new FilePickerIconAdapter(this);
    this.gridView = (GridView) findViewById(R.id.filePickerView);
    this.gridView.setOnItemClickListener(this);
    this.gridView.setAdapter(this.filePickerIconAdapter);
    this.directoryButton = (Button) findViewById(R.id.filePickerButton);
    if (this.directoryMode) {
      this.directoryButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          setResult(RESULT_OK, new Intent().putExtra("selectedFile",
              FilePicker.this.currentDirectory.getAbsolutePath()));
          Log.d("FilePicker", FilePicker.this.currentDirectory.getAbsolutePath());
          finish();
        }
      });
    } else {
      this.directoryButton.setVisibility(View.GONE);
    }

    if (savedInstanceState == null) {
      // first start of this instance
      showDialog(DIALOG_FILE_SELECT);
    }
  }

  @Override
  protected Dialog onCreateDialog(int id) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    switch (id) {
      case DIALOG_FILE_INVALID:
        builder.setIcon(android.R.drawable.ic_menu_info_details);
        builder.setTitle(R.string.error);
        builder.setMessage(R.string.file_invalid);
        builder.setPositiveButton(R.string.ok, null);
        return builder.create();
      case DIALOG_FILE_SELECT:
        builder.setMessage(R.string.file_select);
        builder.setPositiveButton(R.string.ok, null);
        return builder.create();
      default:
        // do dialog will be created
        return null;
    }
  }

  @Override
  protected void onPause() {
    super.onPause();
    // save the current directory
    Editor editor = getSharedPreferences(PREFERENCES_FILE, MODE_PRIVATE).edit();
    editor.clear();
    if (this.currentDirectory != null) {
      editor.putString("currentDirectory", this.currentDirectory.getAbsolutePath());
    }
    editor.commit();
  }

  @Override
  protected void onResume() {
    super.onResume();
    // check if the full screen mode should be activated
    if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("fullscreen", false)) {
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    } else {
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    }

    // restore the current directory
    SharedPreferences preferences = getSharedPreferences(PREFERENCES_FILE, MODE_PRIVATE);
    this.currentDirectory = new File(preferences.getString("currentDirectory",
        DEFAULT_DIRECTORY));
    if (!this.currentDirectory.exists() || !this.currentDirectory.canRead()) {
      this.currentDirectory = new File(DEFAULT_DIRECTORY);
    }
    browseToCurrentDirectory();
  }
}




Java Source Code List

org.mapsforge.geocoding.Unchecked.java
org.mapsforge.geocoding.widget.CityCompletionAdapter.java
org.mapsforge.geocoding.widget.PlaceCompletionAdapter.java
org.mapsforge.geocoding.widget.RoadCompletionAdapter.java
org.mapsforge.geocoding.widget.RoadListAdapter.java
org.mapsforge.geocoding.widget.SqliteCompletionAdapter.java
org.mapsforge.geocoding.widget.State.java
org.muxe.advancedtouristmap.AdvancedTouristMapApplication.java
org.muxe.advancedtouristmap.AdvancedTouristMap.java
org.muxe.advancedtouristmap.BaseActivity.java
org.muxe.advancedtouristmap.CacheSizePreference.java
org.muxe.advancedtouristmap.EditPreferences.java
org.muxe.advancedtouristmap.FilePickerIconAdapter.java
org.muxe.advancedtouristmap.FilePicker.java
org.muxe.advancedtouristmap.InfoView.java
org.muxe.advancedtouristmap.LocationPicker.java
org.muxe.advancedtouristmap.MoveSpeedPreference.java
org.muxe.advancedtouristmap.PositionInfo.java
org.muxe.advancedtouristmap.Search.java
org.muxe.advancedtouristmap.SeekBarPreference.java
org.muxe.advancedtouristmap.Utility.java
org.muxe.advancedtouristmap.overlay.GenericOverlayItem.java
org.muxe.advancedtouristmap.overlay.GenericOverlay.java
org.muxe.advancedtouristmap.overlay.PoiOverlayItem.java
org.muxe.advancedtouristmap.overlay.PositionOverlayItem.java
org.muxe.advancedtouristmap.overlay.WikiOverlayItem.java
org.muxe.advancedtouristmap.poi.PoiBrowserActivity.java
org.muxe.advancedtouristmap.poi.PoiOrCategory.java
org.muxe.advancedtouristmap.routing.AngleCalc.java
org.muxe.advancedtouristmap.routing.DecisionOverlay.java
org.muxe.advancedtouristmap.routing.DecisionPoint.java
org.muxe.advancedtouristmap.routing.RouteCalculator.java
org.muxe.advancedtouristmap.routing.RouteList.java
org.muxe.advancedtouristmap.routing.Route.java
org.muxe.advancedtouristmap.sourcefiles.AddressFile.java
org.muxe.advancedtouristmap.sourcefiles.FileManagerActivity.java
org.muxe.advancedtouristmap.sourcefiles.FileManager.java
org.muxe.advancedtouristmap.sourcefiles.MapBundle.java
org.muxe.advancedtouristmap.sourcefiles.MapFile.java
org.muxe.advancedtouristmap.sourcefiles.PoiFile.java
org.muxe.advancedtouristmap.sourcefiles.RoutingFile.java
org.muxe.advancedtouristmap.sourcefiles.SourceFile.java
org.muxe.advancedtouristmap.wikipedia.AbstractWikiArticle.java
org.muxe.advancedtouristmap.wikipedia.ArticleRetrieverFactory.java
org.muxe.advancedtouristmap.wikipedia.ArticleRetriever.java
org.muxe.advancedtouristmap.wikipedia.GeonamesRetriever.java
org.muxe.advancedtouristmap.wikipedia.OnlineWikiArticle.java
org.muxe.advancedtouristmap.wikipedia.WikiArticleInterface.java
org.muxe.advancedtouristmap.wikipedia.WikilocationRetriever.java