import com.cyanogenmod.filemanager.ui.widgets.Breadcrumb;
import com.cyanogenmod.filemanager.ui.widgets.ButtonItem;
import com.cyanogenmod.filemanager.ui.widgets.NavigationView;
+import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnDirectoryChangedListener;
import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnFilePickedListener;
import com.cyanogenmod.filemanager.util.DialogHelper;
import com.cyanogenmod.filemanager.util.ExceptionUtil;
* application.
*/
public class PickerActivity extends Activity
- implements OnCancelListener, OnDismissListener, OnFilePickedListener {
+ implements OnCancelListener, OnDismissListener, OnFilePickedListener, OnDirectoryChangedListener {
private static final String TAG = "PickerActivity"; //$NON-NLS-1$
// Extra data for Gallery CROP action
private static final String EXTRA_CROP = "crop"; //$NON-NLS-1$
- private FileSystemObject mFso; // The picked item
+ // Scheme for file and directory picking
+ private static final String FILE_URI_SCHEME = "file"; //$NON-NLS-1$
+ private static final String FOLDER_URI_SCHEME = "folder"; //$NON-NLS-1$
+ private static final String DIRECTORY_URI_SCHEME = "directory"; //$NON-NLS-1$
+
+ FileSystemObject mFso; // The picked item
+ FileSystemObject mCurrentDirectory;
private AlertDialog mDialog;
private Handler mHandler;
/**
* proposed file
*/
private void init() {
- // Check that call has a valid request (GET_CONTENT a and mime type)
- String action = getIntent().getAction();
-
- Log.d(TAG, "PickerActivity. action: " + String.valueOf(action)); //$NON-NLS-1$
- if (action.compareTo(Intent.ACTION_GET_CONTENT.toString()) != 0) {
+ final boolean pickingDirectory;
+ final Intent intent = getIntent();
+
+ if (isFilePickIntent(intent)) {
+ // ok
+ Log.d(TAG, "PickerActivity: got file pick intent: " + String.valueOf(intent)); //$NON-NLS-1$
+ pickingDirectory = false;
+ } else if (isDirectoryPickIntent(getIntent())) {
+ // ok
+ Log.d(TAG, "PickerActivity: got folder pick intent: " + String.valueOf(intent)); //$NON-NLS-1$
+ pickingDirectory = true;
+ } else {
+ Log.d(TAG, "PickerActivity got unrecognized intent: " + String.valueOf(intent)); //$NON-NLS-1$
setResult(Activity.RESULT_CANCELED);
finish();
return;
Map<DisplayRestrictions, Object> restrictions = new HashMap<DisplayRestrictions, Object>();
//- Mime/Type restriction
String mimeType = getIntent().getType();
- Log.d(TAG, "PickerActivity. type: " + String.valueOf(mimeType)); //$NON-NLS-1$
if (mimeType != null) {
if (!MimeTypeHelper.isMimeTypeKnown(this, mimeType)) {
Log.i(TAG,
Boolean.valueOf(localOnly));
}
}
+ if (pickingDirectory) {
+ restrictions.put(DisplayRestrictions.DIRECTORY_ONLY_RESTRICTION, Boolean.TRUE);
+ }
// Create or use the console
if (!initializeConsole()) {
(NavigationView)this.mRootView.findViewById(R.id.navigation_view);
this.mNavigationView.setRestrictions(restrictions);
this.mNavigationView.setOnFilePickedListener(this);
+ this.mNavigationView.setOnDirectoryChangedListener(this);
this.mNavigationView.setBreadcrumb(breadcrumb);
// Apply the current theme
// Create the dialog
this.mDialog = DialogHelper.createDialog(
- this, R.drawable.ic_launcher, R.string.picker_title, this.mRootView);
+ this, R.drawable.ic_launcher,
+ pickingDirectory ? R.string.directory_picker_title : R.string.picker_title,
+ this.mRootView);
+
this.mDialog.setButton(
- DialogInterface.BUTTON_NEUTRAL,
+ DialogInterface.BUTTON_NEGATIVE,
getString(R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
dlg.cancel();
}
});
+ if (pickingDirectory) {
+ this.mDialog.setButton(
+ DialogInterface.BUTTON_POSITIVE,
+ getString(R.string.select),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dlg, int which) {
+ PickerActivity.this.mFso = PickerActivity.this.mCurrentDirectory;
+ dlg.dismiss();
+ }
+ });
+ }
this.mDialog.setCancelable(true);
this.mDialog.setOnCancelListener(this);
this.mDialog.setOnDismissListener(this);
ButtonItem fs = (ButtonItem)this.mRootView.findViewById(R.id.ab_filesystem_info);
fs.setContentDescription(getString(R.string.actionbar_button_storage_cd));
+ final File initialDir = getInitialDirectoryFromIntent(getIntent());
+ final String rootDirectory;
+
+ if (initialDir != null) {
+ rootDirectory = initialDir.getAbsolutePath();
+ } else {
+ rootDirectory = FileHelper.ROOT_DIRECTORY;
+ }
+
this.mHandler = new Handler();
this.mHandler.post(new Runnable() {
@Override
public void run() {
// Navigate to. The navigation view will redirect to the appropriate directory
- PickerActivity.this.mNavigationView.changeCurrentDir(FileHelper.ROOT_DIRECTORY);
+ PickerActivity.this.mNavigationView.changeCurrentDir(rootDirectory);
}
});
// Return the picked file, as expected (this activity should fill the intent data
// and return RESULT_OK result)
Intent result = new Intent();
- result.setData(Uri.fromFile(src));
+ result.setData(getResultUriForFileFromIntent(src, getIntent()));
setResult(Activity.RESULT_OK, result);
finish();
}
}
+ private boolean isFilePickIntent(Intent intent) {
+ final String action = intent.getAction();
+
+ if (Intent.ACTION_GET_CONTENT.equals(action)) {
+ return true;
+ }
+ if (Intent.ACTION_PICK.equals(action)) {
+ final Uri data = intent.getData();
+ if (data != null && FILE_URI_SCHEME.equals(data.getScheme())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isDirectoryPickIntent(Intent intent) {
+ if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) {
+ String scheme = intent.getData().getScheme();
+ if (FOLDER_URI_SCHEME.equals(scheme) || DIRECTORY_URI_SCHEME.equals(scheme)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private File getInitialDirectoryFromIntent(Intent intent) {
+ if (!Intent.ACTION_PICK.equals(intent.getAction())) {
+ return null;
+ }
+
+ final Uri data = intent.getData();
+ if (data == null) {
+ return null;
+ }
+
+ final String path = data.getPath();
+ if (path == null) {
+ return null;
+ }
+
+ final File file = new File(path);
+ if (!file.exists() || !file.isAbsolute()) {
+ return null;
+ }
+
+ if (file.isDirectory()) {
+ return file;
+ }
+ return file.getParentFile();
+ }
+
+ private Uri getResultUriForFileFromIntent(File src, Intent intent) {
+ Uri result = Uri.fromFile(src);
+
+ if (Intent.ACTION_PICK.equals(intent.getAction()) && intent.getData() != null) {
+ String scheme = intent.getData().getScheme();
+ if (scheme != null) {
+ result = result.buildUpon().scheme(scheme).build();
+ }
+ }
+
+ return result;
+ }
+
/**
* {@inheritDoc}
*/
}
/**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onDirectoryChanged(FileSystemObject item) {
+ this.mCurrentDirectory = item;
+ }
+
+ /**
* Method invoked when an action item is clicked.
*
* @param view The button pushed
import com.cyanogenmod.filemanager.util.FileHelper;
import com.cyanogenmod.filemanager.util.StorageHelper;
+import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
}
/**
+ * An interface to communicate a change of the current directory
+ */
+ public interface OnDirectoryChangedListener {
+ /**
+ * Method invoked when the current directory changes
+ *
+ * @param item The newly active directory
+ */
+ void onDirectoryChanged(FileSystemObject item);
+ }
+
+ /**
* The navigation view mode
* @hide
*/
private OnNavigationSelectionChangedListener mOnNavigationSelectionChangedListener;
private OnNavigationRequestMenuListener mOnNavigationRequestMenuListener;
private OnFilePickedListener mOnFilePickedListener;
+ private OnDirectoryChangedListener mOnDirectoryChangedListener;
private boolean mChRooted;
}
/**
+ * Method that sets the listener for directory changes
+ *
+ * @param onDirectoryChangedListener The listener reference
+ */
+ public void setOnDirectoryChangedListener(
+ OnDirectoryChangedListener onDirectoryChangedListener) {
+ this.mOnDirectoryChangedListener = onDirectoryChangedListener;
+ }
+
+ /**
* Method that sets if the view should use flinger gesture detection.
*
* @param useFlinger If the view should use flinger gesture detection
//The current directory is now the "newDir"
this.mCurrentDir = newDir;
-
+ if (this.mOnDirectoryChangedListener != null) {
+ FileSystemObject dir = FileHelper.createFileSystemObject(new File(newDir));
+ this.mOnDirectoryChangedListener.onDirectoryChanged(dir);
+ }
} finally {
//If calling activity is search, then save the search history
if (searchInfo != null) {