Skip to content
This repository was archived by the owner on Mar 30, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,29 @@ A more robust example can be found in the aFileChooserExample folder.

__Note__ The `FileUtils` class provides a helper method to construct an `ACTION_GET_CONTENT` Intent (`FileUtils.createGetContentIntent()`). It also contains a method to convert a `Uri` into a `File` (`FileUtils.getFile(Uri)`).

###Filtering by file extension

Provide an extra `EXTRA_FILTER_INCLUDE_EXTENSIONS` which is an `ArrayList<String>` containing all the extensions that must be included. Note that the extentions must begin with a dot character. The behavior of this extra is specified as follows:

- If this extra is specified, then **only** files with the supplied extensions will be shown. All other files will be hidden.
- If this extra is not specified, or it is an empty `ArrayList`, then no filtering is performed.

Example:

```
private static final ArrayList<String> INCLUDE_EXTENSIONS_LIST = new ArrayList<String>();
static{
INCLUDE_EXTENSIONS_LIST.add(".apk");
INCLUDE_EXTENSIONS_LIST.add(".bin");
}
//...
//...
Intent intent = new Intent(this, FileChooserActivity.class);
intent.putStringArrayListExtra(FileChooserActivity.EXTRA_FILTER_INCLUDE_EXTENSIONS, INCLUDE_EXTENSIONS_LIST);
//Use this intent in startActivityForResult()

```

## Credits

Developed by Paul Burke (iPaulPro) - [paulburke.co](http://paulburke.co/)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.ipaulpro.afilechooser;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.content.BroadcastReceiver;
import android.content.Context;
Expand All @@ -35,6 +36,8 @@
import android.widget.Toast;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
* Main Activity that handles the FileListFragments
Expand All @@ -48,6 +51,9 @@ public class FileChooserActivity extends FragmentActivity implements
OnBackStackChangedListener {

public static final String PATH = "path";
public static final String EXTRA_FILTER_INCLUDE_EXTENSIONS =
"com.ipaulpro.afilechooser.EXTRA_FILTER_INCLUDE_EXTENSIONS";
private ArrayList<String> mFilterIncludeExtensions = new ArrayList<String>();
public static final String EXTERNAL_BASE_PATH = Environment
.getExternalStorageDirectory().getAbsolutePath();

Expand All @@ -69,6 +75,11 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.chooser);

Intent intent = getIntent();
if(intent != null){
mFilterIncludeExtensions = intent.getStringArrayListExtra(EXTRA_FILTER_INCLUDE_EXTENSIONS);
}

mFragmentManager = getSupportFragmentManager();
mFragmentManager.addOnBackStackChangedListener(this);
Expand Down Expand Up @@ -104,6 +115,7 @@ protected void onSaveInstanceState(Bundle outState) {
outState.putString(PATH, mPath);
}

@SuppressLint("NewApi") // Usages of New APIs are surrounded by sufficient conditional checks
@Override
public void onBackStackChanged() {

Expand All @@ -119,6 +131,7 @@ public void onBackStackChanged() {
if (HAS_ACTIONBAR) invalidateOptionsMenu();
}

@SuppressLint("NewApi") // Usages of New APIs are surrounded by sufficient conditional checks
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (HAS_ACTIONBAR) {
Expand Down Expand Up @@ -147,7 +160,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
* Add the initial Fragment with given path.
*/
private void addFragment() {
FileListFragment fragment = FileListFragment.newInstance(mPath);
FileListFragment fragment = FileListFragment.newInstance(mPath, mFilterIncludeExtensions);
mFragmentManager.beginTransaction()
.add(R.id.explorer_fragment, fragment).commit();
}
Expand All @@ -161,7 +174,7 @@ private void addFragment() {
private void replaceFragment(File file) {
mPath = file.getAbsolutePath();

FileListFragment fragment = FileListFragment.newInstance(mPath);
FileListFragment fragment = FileListFragment.newInstance(mPath, mFilterIncludeExtensions);
mFragmentManager.beginTransaction()
.replace(R.id.explorer_fragment, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
Expand Down
13 changes: 11 additions & 2 deletions aFileChooser/src/com/ipaulpro/afilechooser/FileListFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import android.widget.ListView;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
Expand All @@ -42,17 +43,21 @@ public class FileListFragment extends ListFragment implements

private FileListAdapter mAdapter;
private String mPath;
private ArrayList<String> mFilterIncludeExtensions = new ArrayList<String>();

/**
* Create a new instance with the given file path.
*
* @param path The absolute path of the file (directory) to display.
* @return A new Fragment with the given file path.
*/
public static FileListFragment newInstance(String path) {
public static FileListFragment newInstance(String path, ArrayList<String>
filterIncludeExtensions) {
FileListFragment fragment = new FileListFragment();
Bundle args = new Bundle();
args.putString(FileChooserActivity.PATH, path);
args.putStringArrayList(FileChooserActivity.EXTRA_FILTER_INCLUDE_EXTENSIONS,
filterIncludeExtensions);
fragment.setArguments(args);

return fragment;
Expand All @@ -66,6 +71,10 @@ public void onCreate(Bundle savedInstanceState) {
mPath = getArguments() != null ? getArguments().getString(
FileChooserActivity.PATH) : Environment
.getExternalStorageDirectory().getAbsolutePath();
if(getArguments() != null){
mFilterIncludeExtensions = getArguments().getStringArrayList(
FileChooserActivity.EXTRA_FILTER_INCLUDE_EXTENSIONS);
}
}

@Override
Expand All @@ -91,7 +100,7 @@ public void onListItemClick(ListView l, View v, int position, long id) {

@Override
public Loader<List<File>> onCreateLoader(int id, Bundle args) {
return new FileLoader(getActivity(), mPath);
return new FileLoader(getActivity(), mPath, mFilterIncludeExtensions);
}

@Override
Expand Down
7 changes: 5 additions & 2 deletions aFileChooser/src/com/ipaulpro/afilechooser/FileLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.ipaulpro.afilechooser;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
Expand Down Expand Up @@ -44,15 +45,17 @@ public class FileLoader extends AsyncTaskLoader<List<File>> {

private List<File> mData;
private String mPath;
private ArrayList<String> mFilterIncludeExtensions;

public FileLoader(Context context, String path) {
public FileLoader(Context context, String path, ArrayList<String> filterIncludeExtensions) {
super(context);
this.mPath = path;
this.mFilterIncludeExtensions = filterIncludeExtensions;
}

@Override
public List<File> loadInBackground() {
return FileUtils.getFileList(mPath);
return FileUtils.getFileList(mPath, mFilterIncludeExtensions);
}

@Override
Expand Down
29 changes: 27 additions & 2 deletions aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,31 @@ public int compare(File f1, File f2) {
}
};

/**
* File Filter that includes only files with the specified extensions to pass
* @author Kiran Rao
*
*/
private static class FileExtensionFilter implements FileFilter{
private ArrayList<String> mFilterIncludeExtensions;

public FileExtensionFilter(ArrayList<String> filterIncludeExtensions){
this.mFilterIncludeExtensions = filterIncludeExtensions;
}

@Override
public boolean accept(File file) {
final String fileName = file.getName();
boolean passesExtensionsFilter = mFilterIncludeExtensions.isEmpty()
? true: mFilterIncludeExtensions.contains(getExtension(Uri
.fromFile(file).toString()));
// Return files only (not directories) and skip hidden files
return file.isFile() && !fileName.startsWith(HIDDEN_PREFIX) &&
passesExtensionsFilter;
}

}

/**
* File (not directories) filter.
*
Expand Down Expand Up @@ -441,7 +466,7 @@ public boolean accept(File file) {

* @author paulburke
*/
public static List<File> getFileList(String path) {
public static List<File> getFileList(String path, ArrayList<String> filterIncludeExtensions) {
ArrayList<File> list = new ArrayList<File>();

// Current directory File instance
Expand All @@ -457,7 +482,7 @@ public static List<File> getFileList(String path) {
}

// List file in this directory with the file filter
final File[] files = pathDir.listFiles(mFileFilter);
final File[] files = pathDir.listFiles(new FileExtensionFilter(filterIncludeExtensions));
if (files != null) {
// Sort the files alphabetically
Arrays.sort(files, mComparator);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.ipaulpro.afilechooserexample;

import java.io.File;
import java.util.ArrayList;

import android.app.Activity;
import android.content.ActivityNotFoundException;
Expand All @@ -29,6 +30,7 @@
import android.widget.Button;
import android.widget.Toast;

import com.ipaulpro.afilechooser.FileChooserActivity;
import com.ipaulpro.afilechooser.utils.FileUtils;

/**
Expand All @@ -37,6 +39,11 @@
public class FileChooserExampleActivity extends Activity {

private static final int REQUEST_CODE = 6384; // onActivityResult request code
private static final ArrayList<String> INCLUDE_EXTENSIONS_LIST = new ArrayList<String>();
static{
INCLUDE_EXTENSIONS_LIST.add(".apk");
INCLUDE_EXTENSIONS_LIST.add(".bin");
}

@Override
public void onCreate(Bundle savedInstanceState) {
Expand All @@ -49,7 +56,8 @@ public void onCreate(Bundle savedInstanceState) {
@Override
public void onClick(View v) {
// Display the file chooser dialog
showChooser();
//showChooser();
startFileChooserActivity();
}
});

Expand All @@ -69,6 +77,14 @@ private void showChooser() {
}
}

private void startFileChooserActivity(){
startActivityForResult(
new Intent(this, FileChooserActivity.class).putStringArrayListExtra(
FileChooserActivity.EXTRA_FILTER_INCLUDE_EXTENSIONS, INCLUDE_EXTENSIONS_LIST),
REQUEST_CODE);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
Expand Down