package org.openintents.filemanager; import android.content.Intent; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.FragmentActivity; import android.view.KeyEvent; import org.openintents.filemanager.lists.FileListFragment; import org.openintents.filemanager.lists.MultiselectListFragment; import org.openintents.filemanager.lists.PickFileListFragment; import org.openintents.filemanager.util.FileUtils; import org.openintents.filemanager.util.UIUtils; import org.openintents.intents.FileManagerIntents; import java.io.File; public class IntentFilterActivity extends FragmentActivity { private FileListFragment mFragment; @Override protected void onCreate(Bundle savedInstance) { UIUtils.setThemeFor(this); super.onCreate(savedInstance); Intent intent = getIntent(); // Initialize arguments Bundle extras = intent.getExtras(); if (extras == null) extras = new Bundle(); // Add a path if path is not specified in this activity's call if (!extras.containsKey(FileManagerIntents.EXTRA_DIR_PATH)) { // Set a default path so that we launch a proper list. File defaultFile = new File( PreferenceActivity.getDefaultPickFilePath(this)); if (!defaultFile.exists()) { PreferenceActivity.setDefaultPickFilePath(this, Environment .getExternalStorageDirectory().getAbsolutePath()); defaultFile = new File( PreferenceActivity.getDefaultPickFilePath(this)); } extras.putString(FileManagerIntents.EXTRA_DIR_PATH, defaultFile.getAbsolutePath()); } // Add a path if a path has been specified in this activity's call. File data = FileUtils.getFile(getIntent().getData()); if (data != null) { File dir = FileUtils.getPathWithoutFilename(data); if (dir != null) { extras.putString(FileManagerIntents.EXTRA_DIR_PATH, data.getAbsolutePath()); } if (dir != data) { // data is a file extras.putString(FileManagerIntents.EXTRA_FILENAME, data.getName()); } } // Add a mimetype filter if it was specified through the type of the // intent. if (!extras.containsKey(FileManagerIntents.EXTRA_FILTER_MIMETYPE) && intent.getType() != null) extras.putString(FileManagerIntents.EXTRA_FILTER_MIMETYPE, intent.getType()); // Actually fill the ui chooseListType(intent, extras); } private void chooseListType(Intent intent, Bundle extras) { // Multiselect if (FileManagerIntents.ACTION_MULTI_SELECT.equals(intent.getAction())) { String tag = "MultiSelectListFragment"; mFragment = (MultiselectListFragment) getSupportFragmentManager() .findFragmentByTag(tag); // Only add if it doesn't exist if (mFragment == null) { mFragment = new MultiselectListFragment(); // Pass extras through to the list fragment. This helps // centralize the path resolving, etc. mFragment.setArguments(extras); setTitle(R.string.multiselect_title); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, mFragment, tag).commit(); } } // Item pickers else if (FileManagerIntents.ACTION_PICK_DIRECTORY.equals(intent.getAction()) || FileManagerIntents.ACTION_PICK_FILE.equals(intent.getAction()) || Intent.ACTION_GET_CONTENT.equals(intent.getAction())) { if (intent.hasExtra(FileManagerIntents.EXTRA_TITLE)) setTitle(intent.getStringExtra(FileManagerIntents.EXTRA_TITLE)); else setTitle(R.string.pick_title); mFragment = (PickFileListFragment) getSupportFragmentManager() .findFragmentByTag(PickFileListFragment.class.getName()); // Only add if it doesn't exist if (mFragment == null) { mFragment = new PickFileListFragment(); // Pass extras through to the list fragment. This helps // centralize the path resolving, etc. extras.putBoolean( FileManagerIntents.EXTRA_IS_GET_CONTENT_INITIATED, intent.getAction().equals(Intent.ACTION_GET_CONTENT)); extras.putBoolean( FileManagerIntents.EXTRA_DIRECTORIES_ONLY, intent.getAction().equals( FileManagerIntents.ACTION_PICK_DIRECTORY)); mFragment.setArguments(extras); getSupportFragmentManager() .beginTransaction() .add(android.R.id.content, mFragment, PickFileListFragment.class.getName()).commit(); } } } // The following methods should properly handle back button presses on every // API Level. @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // Only check fragment back-ability if we're on the filepicker fragment. if (mFragment instanceof PickFileListFragment && VERSION.SDK_INT > VERSION_CODES.DONUT) { if (keyCode == KeyEvent.KEYCODE_BACK && ((PickFileListFragment) mFragment).pressBack()) return true; } return super.onKeyUp(keyCode, event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Only check fragment back-ability if we're on the filepicker fragment. if (mFragment instanceof PickFileListFragment && VERSION.SDK_INT <= VERSION_CODES.DONUT) { if (keyCode == KeyEvent.KEYCODE_BACK && ((PickFileListFragment) mFragment).pressBack()) return true; } return super.onKeyDown(keyCode, event); } }