Android Open Source - dttv-android File Browser Activity






From Project

Back to project page dttv-android.

License

The source code is released under:

GNU General Public License

If you think the Android project dttv-android 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 dttv.app;
//  ww w. ja  va  2s. c o  m
//Heavily based on code from
//https://github.com/mburman/Android-File-Explore
//  Version of Aug 13, 2011
//Also contributed:
//  Sugan Krishnan (https://github.com/rgksugan) - Jan 2013.
//

//Project type now is Android library: 
//  http://developer.android.com/guide/developing/projects/projects-eclipse.html#ReferencingLibraryProject

//General Java imports 
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import dttv.app.utils.Constant;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
//Android imports 
//Import of resources file for file browser

public class FileBrowserActivity extends Activity {
  // Intent Action Constants
  public static final String INTENT_ACTION_SELECT_DIR = "com.example.simpleplayer.SELECT_DIRECTORY_ACTION";
  public static final String INTENT_ACTION_SELECT_FILE = "com.example.simpleplayer.SELECT_FILE_ACTION";

  // Intent parameters names constants
  public static final String startDirectoryParameter = "com.example.simpleplayer.directoryPath";
  public static final String returnDirectoryParameter = "com.example.simpleplayer.directoryPathRet";
  public static final String returnFileParameter = "com.example.simpleplayer.filePathRet";
  public static final String showCannotReadParameter = "com.example.simpleplayer.showCannotRead";
  public static final String filterExtension = "com.example.simpleplayer.filterExtension";

  // Stores names of traversed directories
  ArrayList<String> pathDirsList = new ArrayList<String>();

  // Check if the first level of the directory structure is the one showing
  // private Boolean firstLvl = true;

  private final String LOGTAG = "F_PATH";

  private List<Item> fileList = new ArrayList<Item>();
  private File path = null;
  private String chosenFile;
  // private static final int DIALOG_LOAD_FILE = 1000;

  ArrayAdapter<Item> adapter;

  private boolean showHiddenFilesAndDirs = true;

  private boolean directoryShownIsEmpty = false;

  private String filterFileExtension = null;

  // Action constants
  private static int currentAction = -1;
  private static final int SELECT_DIRECTORY = 1;
  private static final int SELECT_FILE = 2;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // In case of
    // ua.com.vassiliev.androidfilebrowser.SELECT_DIRECTORY_ACTION
    // Expects com.mburman.fileexplore.directoryPath parameter to
    // point to the start folder.
    // If empty or null, will start from SDcard root.
    setContentView(R.layout.ua_com_vassiliev_filebrowser_layout);

    // Set action for this activity
    /*Intent thisInt = this.getIntent();
    currentAction = SELECT_DIRECTORY;// This would be a default action in
                      // case not set by intent
    if (thisInt.getAction().equalsIgnoreCase(INTENT_ACTION_SELECT_FILE)) {
      Log.d(LOGTAG, "SELECT ACTION - SELECT FILE");
      currentAction = SELECT_FILE;
    }

    showHiddenFilesAndDirs = thisInt.getBooleanExtra(
        showCannotReadParameter, true);

    filterFileExtension = thisInt.getStringExtra(filterExtension);*/
    path = new File("/");
    setInitialDirectory();

    parseDirectoryPath();
    loadFileList();
    this.createFileListAdapter();
    this.initializeButtons();
    this.initializeFileListView();
    updateCurrentDirectoryTextView();
    Log.d(LOGTAG, path.getAbsolutePath());
  }

  private void setInitialDirectory() {
    Intent thisInt = this.getIntent();
    String requestedStartDir = thisInt
        .getStringExtra(startDirectoryParameter);

    if (requestedStartDir != null && requestedStartDir.length() > 0) {// if(requestedStartDir!=null
      File tempFile = new File(requestedStartDir);
      if (tempFile.isDirectory())
        this.path = tempFile;
    }// if(requestedStartDir!=null

    if (this.path == null) {// No or invalid directory supplied in intent
                // parameter
      if (Environment.getExternalStorageDirectory().isDirectory()
          && Environment.getExternalStorageDirectory().canRead())
        path = Environment.getExternalStorageDirectory();
      else
        path = new File("/");
    }// if(this.path==null) {//No or invalid directory supplied in intent
      // parameter
  }// private void setInitialDirectory() {

  private void parseDirectoryPath() {
    pathDirsList.clear();
    String pathString = path.getAbsolutePath();
    String[] parts = pathString.split("/");
    int i = 0;
    while (i < parts.length) {
      pathDirsList.add(parts[i]);
      i++;
    }
  }

  private void initializeButtons() {
    Button upDirButton = (Button) this.findViewById(R.id.upDirectoryButton);
    upDirButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        Log.d(LOGTAG, "onclick for upDirButton");
        loadDirectoryUp();
        loadFileList();
        adapter.notifyDataSetChanged();
        updateCurrentDirectoryTextView();
      }
    });// upDirButton.setOnClickListener(

    Button selectFolderButton = (Button) this
        .findViewById(R.id.selectCurrentDirectoryButton);
    if (currentAction == SELECT_DIRECTORY) {
      selectFolderButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
          Log.d(LOGTAG, "onclick for selectFolderButton");
          returnDirectoryFinishActivity();
        }
      });
    } else {// if(currentAction == this.SELECT_DIRECTORY) {
      selectFolderButton.setVisibility(View.GONE);
    }// } else {//if(currentAction == this.SELECT_DIRECTORY) {
  }// private void initializeButtons() {

  private void loadDirectoryUp() {
    // present directory removed from list
    String s = pathDirsList.remove(pathDirsList.size() - 1);
    // path modified to exclude present directory
    path = new File(path.toString().substring(0,
        path.toString().lastIndexOf(s)));
    fileList.clear();
  }

  private void updateCurrentDirectoryTextView() {
    int i = 0;
    String curDirString = "";
    while (i < pathDirsList.size()) {
      curDirString += pathDirsList.get(i) + "/";
      i++;
    }
    if (pathDirsList.size() == 0) {
      ((Button) this.findViewById(R.id.upDirectoryButton))
          .setEnabled(false);
      curDirString = "/";
    } else
      ((Button) this.findViewById(R.id.upDirectoryButton))
          .setEnabled(true);
    long freeSpace = getFreeSpace(curDirString);
    String formattedSpaceString = formatBytes(freeSpace);
    if (freeSpace == 0) {
      Log.d(LOGTAG, "NO FREE SPACE");
      File currentDir = new File(curDirString);
      if(!currentDir.canWrite())
        formattedSpaceString = "NON Writable";
    }

    ((Button) this.findViewById(R.id.selectCurrentDirectoryButton))
        .setText("Select\n[" + formattedSpaceString
            + "]");

    ((TextView) this.findViewById(R.id.currentDirectoryTextView))
        .setText("Current directory: " + curDirString);
  }// END private void updateCurrentDirectoryTextView() {

  private void showToast(String message) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
  }

  private void initializeFileListView() {
    ListView lView = (ListView) this.findViewById(R.id.fileListView);
    lView.setBackgroundColor(Color.LTGRAY);
    LinearLayout.LayoutParams lParam = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    lParam.setMargins(15, 5, 15, 5);
    lView.setAdapter(this.adapter);
    lView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {
        chosenFile = fileList.get(position).file;
        File sel = new File(path + "/" + chosenFile);
        Log.d(LOGTAG, "Clicked:" + chosenFile);
        if (sel.isDirectory()) {
          if (sel.canRead()) {
            // Adds chosen directory to list
            pathDirsList.add(chosenFile);
            path = new File(sel + "");
            Log.d(LOGTAG, "Just reloading the list");
            loadFileList();
            adapter.notifyDataSetChanged();
            updateCurrentDirectoryTextView();
            Log.d(LOGTAG, path.getAbsolutePath());
          } else {// if(sel.canRead()) {
            showToast("Path does not exist or cannot be read");
          }// } else {//if(sel.canRead()) {
        }// if (sel.isDirectory()) {
          // File picked or an empty directory message clicked
        else {// if (sel.isDirectory()) {
          Log.d(LOGTAG, "item clicked");
          if (!directoryShownIsEmpty) {
            Log.d(LOGTAG, "File selected:" + chosenFile);
            //returnFileFinishActivity(sel.getAbsolutePath());
            startAudioPlayer(sel.getAbsolutePath());
          }
        }// else {//if (sel.isDirectory()) {
      }// public void onClick(DialogInterface dialog, int which) {
    });// lView.setOnClickListener(
  }// private void initializeFileListView() {
  
  private void startAudioPlayer(String uri){
    Intent retIntent = new Intent();
    retIntent.setClass(this, VideoPlayerActivity.class);
    retIntent.putExtra(Constant.FILE_MSG, uri);
    startActivity(retIntent);
  }

  private void returnDirectoryFinishActivity() {
    Intent retIntent = new Intent();
    retIntent.putExtra(returnDirectoryParameter, path.getAbsolutePath());
    this.setResult(RESULT_OK, retIntent);
    //this.finish();
  }// END private void returnDirectoryFinishActivity() {

  private void returnFileFinishActivity(String filePath) {
    Intent retIntent = new Intent();
    retIntent.putExtra(returnFileParameter, filePath);
    this.setResult(RESULT_OK, retIntent);
    this.finish();
  }// END private void returnDirectoryFinishActivity() {

  private void loadFileList() {
    try {
      path.mkdirs();
    } catch (SecurityException e) {
      Log.e(LOGTAG, "unable to write on the sd card ");
    }
    fileList.clear();
    
    if (path.exists() && path.canRead()) {
      FilenameFilter filter = new FilenameFilter() {
        public boolean accept(File dir, String filename) {
          File sel = new File(dir, filename);
          boolean showReadableFile = showHiddenFilesAndDirs
              || sel.canRead();
          // Filters based on whether the file is hidden or not
          if (currentAction == SELECT_DIRECTORY) {
            return (sel.isDirectory() && showReadableFile);
          }
          if (currentAction == SELECT_FILE) {

            // If it is a file check the extension if provided
            if (sel.isFile() && filterFileExtension != null) {
              return (showReadableFile && sel.getName().endsWith(
                  filterFileExtension));
            }
            return (showReadableFile);
          }
          return true;
        }
      };

      String[] fList = path.list(filter);
      this.directoryShownIsEmpty = false;
      for (int i = 0; i < fList.length; i++) {
        // Convert into file path
        File sel = new File(path, fList[i]);
        Log.d(LOGTAG,
            "File:" + fList[i] + " readable:"
                + (Boolean.valueOf(sel.canRead())).toString());
        int drawableID = R.drawable.file_icon;
        boolean canRead = sel.canRead();
        // Set drawables
        if (sel.isDirectory()) {
          if (canRead) {
            drawableID = R.drawable.folder_icon;
          } else {
            drawableID = R.drawable.folder_icon_light;
          }
        }
        fileList.add(i, new Item(fList[i], drawableID, canRead));
      }
      if (fileList.size() == 0) {
        this.directoryShownIsEmpty = true;
        fileList.add(0, new Item("Directory is empty", -1, true));
      } else {// sort non empty list
        Collections.sort(fileList, new ItemFileNameComparator());
      }
    } else {
      Log.e(LOGTAG, "path does not exist or cannot be read");
    }
  }

  private void createFileListAdapter() {
    adapter = new ArrayAdapter<Item>(this,
        android.R.layout.select_dialog_item, android.R.id.text1,
        fileList) {
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
        // creates view
        View view = super.getView(position, convertView, parent);
        TextView textView = (TextView) view
            .findViewById(android.R.id.text1);
        // put the image on the text view
        int drawableID = 0;
        if (fileList.get(position).icon != -1) {
          // If icon == -1, then directory is empty
          drawableID = fileList.get(position).icon;
        }
        textView.setCompoundDrawablesWithIntrinsicBounds(drawableID, 0,
            0, 0);

        textView.setEllipsize(null);

        // add margin between image and text (support various screen
        // densities)
        // int dp5 = (int) (5 *
        // getResources().getDisplayMetrics().density + 0.5f);
        int dp3 = (int) (3 * getResources().getDisplayMetrics().density + 0.5f);
        // TODO: change next line for empty directory, so text will be
        // centered
        textView.setCompoundDrawablePadding(dp3);
        textView.setBackgroundColor(Color.LTGRAY);
        return view;
      }// public View getView(int position, View convertView, ViewGroup
    };// adapter = new ArrayAdapter<Item>(this,
  }// private createFileListAdapter(){

  private class Item {
    public String file;
    public int icon;

    public Item(String file, Integer icon, boolean canRead) {
      this.file = file;
      this.icon = icon;
    }

    @Override
    public String toString() {
      return file;
    }
  }

  private class ItemFileNameComparator implements Comparator<Item> {
    public int compare(Item lhs, Item rhs) {
      return lhs.file.toLowerCase().compareTo(rhs.file.toLowerCase());
    }
  }

  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
      Log.d(LOGTAG, "ORIENTATION_LANDSCAPE");
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
      Log.d(LOGTAG, "ORIENTATION_PORTRAIT");
    }
    // Layout apparently changes itself, only have to provide good onMeasure
    // in custom components
    // TODO: check with keyboard
    // if(newConfig.keyboard == Configuration.KEYBOARDHIDDEN_YES)
  }// END public void onConfigurationChanged(Configuration newConfig) {

  public static long getFreeSpace(String path) {
    StatFs stat = new StatFs(path);
    long availSize = (long) stat.getAvailableBlocks()
        * (long) stat.getBlockSize();
    return availSize;
  }// END public static long getFreeSpace(String path) {

  public static String formatBytes(long bytes) {
    // TODO: add flag to which part is needed (e.g. GB, MB, KB or bytes)
    String retStr = "";
    // One binary gigabyte equals 1,073,741,824 bytes.
    if (bytes > 1073741824) {// Add GB
      long gbs = bytes / 1073741824;
      retStr += (new Long(gbs)).toString() + "GB ";
      bytes = bytes - (gbs * 1073741824);
    }
    // One MB - 1048576 bytes
    if (bytes > 1048576) {// Add GB
      long mbs = bytes / 1048576;
      retStr += (new Long(mbs)).toString() + "MB ";
      bytes = bytes - (mbs * 1048576);
    }
    if (bytes > 1024) {
      long kbs = bytes / 1024;
      retStr += (new Long(kbs)).toString() + "KB";
      bytes = bytes - (kbs * 1024);
    } else
      retStr += (new Long(bytes)).toString() + " bytes";
    return retStr;
  }// public static String formatBytes(long bytes){

}// END public class FileBrowserActivity extends Activity {





Java Source Code List

dttv.app.DtPlayer.java
dttv.app.FileBrowserActivity.java
dttv.app.FileShowActivity.java
dttv.app.IndexActivity.java
dttv.app.MainActivity.java
dttv.app.SettingActivity.java
dttv.app.VideoPlayerActivity.java
dttv.app.adapter.FileAdapter.java
dttv.app.compnent.Compnent.java
dttv.app.compnent.MethodPlayerCompnent.java
dttv.app.compnent.PopWindowCompnent.java
dttv.app.impl.ICallBack.java
dttv.app.impl.I_Async.java
dttv.app.impl.I_KeyIntercept.java
dttv.app.impl.I_OnMyKey.java
dttv.app.impl.I_PopWindow.java
dttv.app.model.Item.java
dttv.app.multithread.DataAsyncTask.java
dttv.app.utils.Constant.java
dttv.app.utils.ControlLightness.java
dttv.app.utils.FileUtil.java
dttv.app.utils.Log.java
dttv.app.utils.MultiMediaTypeUtil.java
dttv.app.utils.MusicUtils.java
dttv.app.utils.PlayerUtil.java
dttv.app.utils.SettingUtil.java
dttv.app.utils.TimesUtil.java
dttv.app.utils.VolumeUtil.java
dttv.app.view.SimpleDialog.java
dttv.app.widget.AudioUIFragment.java
dttv.app.widget.EffectWindow.java
dttv.app.widget.FilesUIFragment.java
dttv.app.widget.GlVideoView.java
dttv.app.widget.OnTouchMoveListener.java
dttv.app.widget.SlideTabsFragment.java
dttv.app.widget.VideoUIFragment.java