+++ /dev/null
-/*
- * Copyright (C) 2008 OpenIntents.org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Based on AndDev.org's file browser V 2.0.
- */
-
-package org.openintents.filemanager;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.openintents.filemanager.DistributionLibraryListActivity;
-import org.openintents.filemanager.util.CompressManager;
-import org.openintents.filemanager.util.ExtractManager;
-import org.openintents.filemanager.util.FileUtils;
-import org.openintents.filemanager.util.MimeTypeParser;
-import org.openintents.filemanager.util.MimeTypes;
-import org.openintents.intents.FileManagerIntents;
-import org.openintents.util.MenuIntentOptionsWithIcons;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.content.res.XmlResourceParser;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Parcelable;
-import android.preference.PreferenceManager;
-import android.support.v2.os.Build;
-import android.support.v2.view.MenuCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.inputmethod.EditorInfo;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnKeyListener;
-import android.view.Window;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
-import android.widget.AdapterView;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.widget.Toast;
-
-public class FileManagerActivity extends DistributionLibraryListActivity implements OnSharedPreferenceChangeListener {
- private static final String TAG = "FileManagerActivity";
-
- private static final String NOMEDIA_FILE = ".nomedia";
-
- private static final String DIALOG_EXISTS_ACTION_RENAME = "action_rename";
- private static final String DIALOG_EXISTS_ACTION_MULTI_COMPRESS_ZIP = "action_multi_compress_zip";
-
- /**
- * @since 2011-03-23
- */
- private static final Character FILE_EXTENSION_SEPARATOR = '.';
-
- private int mState;
-
- private static final int STATE_BROWSE = 1;
- private static final int STATE_PICK_FILE = 2;
- private static final int STATE_PICK_DIRECTORY = 3;
- private static final int STATE_MULTI_SELECT = 4;
-
- protected static final int REQUEST_CODE_MOVE = 1;
- protected static final int REQUEST_CODE_COPY = 2;
- protected static final int REQUEST_CODE_EXTRACT = 4;
-
- /**
- * @since 2011-02-11
- */
- private static final int REQUEST_CODE_MULTI_SELECT = 3;
-
- private static final int MENU_PREFERENCES = Menu.FIRST + 3;
- private static final int MENU_NEW_FOLDER = Menu.FIRST + 4;
- private static final int MENU_DELETE = Menu.FIRST + 5;
- private static final int MENU_RENAME = Menu.FIRST + 6;
- private static final int MENU_SEND = Menu.FIRST + 7;
- private static final int MENU_OPEN = Menu.FIRST + 8;
- private static final int MENU_MOVE = Menu.FIRST + 9;
- private static final int MENU_COPY = Menu.FIRST + 10;
- /**
- * @since 2011-09-29
- */
- private static final int MENU_MORE = Menu.FIRST + 11;
- private static final int MENU_INCLUDE_IN_MEDIA_SCAN = Menu.FIRST + 12;
- private static final int MENU_EXCLUDE_FROM_MEDIA_SCAN = Menu.FIRST + 13;
- private static final int MENU_SETTINGS = Menu.FIRST + 14;
- private static final int MENU_MULTI_SELECT = Menu.FIRST + 15;
- private static final int MENU_FILTER = Menu.FIRST + 16;
- private static final int MENU_DETAILS = Menu.FIRST + 17;
- private static final int MENU_BOOKMARKS = Menu.FIRST + 18;
- private static final int MENU_BOOKMARK = Menu.FIRST + 19;
- private static final int MENU_COMPRESS = Menu.FIRST + 20;
- private static final int MENU_EXTRACT = Menu.FIRST + 21;
- private static final int MENU_REFRESH = Menu.FIRST + 22;
- private static final int MENU_DISTRIBUTION_START = Menu.FIRST + 100; // MUST BE LAST
-
- private static final int DIALOG_NEW_FOLDER = 1;
- private static final int DIALOG_DELETE = 2;
- private static final int DIALOG_RENAME = 3;
-
- /**
- * @since 2011-02-12
- */
- private static final int DIALOG_MULTI_DELETE = 4;
- private static final int DIALOG_FILTER = 5;
- private static final int DIALOG_DETAILS = 6;
-
- private static final int DIALOG_BOOKMARKS = 7;
- private static final int DIALOG_COMPRESSING = 8;
- private static final int DIALOG_WARNING_EXISTS = 9;
- private static final int DIALOG_CHANGE_FILE_EXTENSION = 10;
- private static final int DIALOG_MULTI_COMPRESS_ZIP = 11;
-
- private static final int DIALOG_DISTRIBUTION_START = 100; // MUST BE LAST
-
- private static final int COPY_BUFFER_SIZE = 32 * 1024;
-
- private static final String BUNDLE_CURRENT_DIRECTORY = "current_directory";
- private static final String BUNDLE_CONTEXT_FILE = "context_file";
- private static final String BUNDLE_CONTEXT_TEXT = "context_text";
- private static final String BUNDLE_SHOW_DIRECTORY_INPUT = "show_directory_input";
- private static final String BUNDLE_STEPS_BACK = "steps_back";
- private static final String BUNDLE_DIRECTORY_ENTRIES = "directory_entries";
-
- private static boolean mSoftKeyboardAvailable;
- /** Shows whether activity state has been restored (e.g. from a rotation). */
- private static boolean mRestored = false;
-
- static {
- try {
- org.openintents.filemanager.compatibility.SoftKeyboard.checkAvailable();
- mSoftKeyboardAvailable = true;
- } catch (Throwable t) {
- mSoftKeyboardAvailable = false;
- }
- }
-
-
- /** Contains directories and files together */
- private ArrayList<IconifiedText> directoryEntries = new ArrayList<IconifiedText>();
-
- /** Dir separate for sorting */
- List<IconifiedText> mListDir = new ArrayList<IconifiedText>();
-
- /** Files separate for sorting */
- List<IconifiedText> mListFile = new ArrayList<IconifiedText>();
-
- /** SD card separate for sorting */
- List<IconifiedText> mListSdCard = new ArrayList<IconifiedText>();
-
- // There's a ".nomedia" file here
- private boolean mNoMedia;
-
- private File currentDirectory = new File("");
-
- private String mSdCardPath = "";
-
- private MimeTypes mMimeTypes;
- /** Files shown are filtered using this extension */
- private String mFilterFiletype = "";
- /** Files shown are filtered using this mimetype */
- private String mFilterMimetype = null;
-
- private String mContextText;
- private File mContextFile = new File("");
- private Drawable mContextIcon;
-
- /** How many steps one can make back using the back key. */
- private int mStepsBack;
-
- private EditText mEditFilename;
- private Button mButtonPick;
- private LinearLayout mDirectoryButtons;
-
- /**
- * @since 2011-02-11
- */
- private Button mButtonMove;
-
- /**
- * @since 2011-02-11
- */
- private Button mButtonCopy;
-
- /**
- * @since 2011-02-11
- */
- private Button mButtonDelete;
-
- private Button mButtonCompress;
-
- private boolean fileDeleted = false;
- private int positionAtDelete;
- private boolean deletedFileIsDirectory = false;
-
- private LinearLayout mDirectoryInput;
- private EditText mEditDirectory;
- private ImageButton mButtonDirectoryPick;
-
- /**
- * @since 2011-02-11
- */
- private LinearLayout mActionNormal;
-
- /**
- * @since 2011-02-11
- */
- private LinearLayout mActionMultiselect;
-
- private TextView mEmptyText;
- private ProgressBar mProgressBar;
-
- private DirectoryScanner mDirectoryScanner;
- private File mPreviousDirectory;
-
- private MenuItem mExcludeMediaScanMenuItem;
- private MenuItem mIncludeMediaScanMenuItem;
-
- private Handler currentHandler;
-
- private boolean mWritableOnly;
-
- private IconifiedText[] mDirectoryEntries;
-
- static final public int MESSAGE_SHOW_DIRECTORY_CONTENTS = 500; // List of contents is ready, obj = DirectoryContents
- static final public int MESSAGE_SET_PROGRESS = 501; // Set progress bar, arg1 = current value, arg2 = max value
- static final public int MESSAGE_ICON_CHANGED = 502; // View needs to be redrawn, obj = IconifiedText
-
- private ImageView mCheckIconSelect;
- private boolean mSelected = false;
-
- /**
- * use it field to pass params to onCreateDialog method
- */
- private String mDialogArgument;
-
- /**
- * to show warning dialog to user if he want to change file extension
- */
- private String mOldFileName;
- private String mNewFileName;
-
- /**
- * use this filed to set behaviour in DIALOG_WARNING_EXISTS
- */
- private String mDialogExistsAction = "";
-
- private Drawable mIconChecked;
- private Drawable mIconUnchecked;
-
- private ThumbnailLoader mThumbnailLoader;
-
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- mDistribution.setFirst(MENU_DISTRIBUTION_START, DIALOG_DISTRIBUTION_START);
-
- // Check whether EULA has been accepted
- // or information about new version can be presented.
- if (mDistribution.showEulaOrNewVersion()) {
- return;
- }
-
- currentHandler = new Handler() {
- public void handleMessage(Message msg) {
- FileManagerActivity.this.handleMessage(msg);
- }
- };
-
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- setContentView(R.layout.filelist);
-
-
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- prefs.registerOnSharedPreferenceChangeListener(this);
-
-
- mEmptyText = (TextView) findViewById(R.id.empty_text);
- mProgressBar = (ProgressBar) findViewById(R.id.scan_progress);
-
- getListView().setOnCreateContextMenuListener(this);
- getListView().setEmptyView(findViewById(R.id.empty));
- getListView().setTextFilterEnabled(true);
- getListView().requestFocus();
- getListView().requestFocusFromTouch();
-
- mDirectoryButtons = (LinearLayout) findViewById(R.id.directory_buttons);
- mActionNormal = (LinearLayout) findViewById(R.id.action_normal);
- mActionMultiselect = (LinearLayout) findViewById(R.id.action_multiselect);
- mEditFilename = (EditText) findViewById(R.id.filename);
-
-
- mButtonPick = (Button) findViewById(R.id.button_pick);
-
- mButtonPick.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View arg0) {
- pickFileOrDirectory();
- }
- });
-
- // Initialize only when necessary:
- mDirectoryInput = null;
-
- // Create map of extensions:
- getMimeTypes();
-
- getSdCardPath();
-
- mState = STATE_BROWSE;
-
- Intent intent = getIntent();
- String action = intent.getAction();
-
- File browseto = new File("/");
-
- if (!TextUtils.isEmpty(mSdCardPath)) {
- browseto = new File(mSdCardPath);
- }
-
- // Default state
- mState = STATE_BROWSE;
- mWritableOnly = false;
-
- if (action != null) {
-
- if (action.equals(FileManagerIntents.ACTION_PICK_FILE)) {
- mState = STATE_PICK_FILE;
- mFilterFiletype = intent.getStringExtra("FILE_EXTENSION");
- if(mFilterFiletype == null)
- mFilterFiletype = "";
- mFilterMimetype = intent.getType();
- if(mFilterMimetype == null)
- mFilterMimetype = "";
- } else if (action.equals(FileManagerIntents.ACTION_PICK_DIRECTORY)) {
- mState = STATE_PICK_DIRECTORY;
- mWritableOnly = intent.getBooleanExtra(FileManagerIntents.EXTRA_WRITEABLE_ONLY, false);
-
- // Remove edit text and make button fill whole line
- mEditFilename.setVisibility(View.GONE);
- mButtonPick.setLayoutParams(new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
- LinearLayout.LayoutParams.WRAP_CONTENT));
- } else if (action.equals(FileManagerIntents.ACTION_MULTI_SELECT)) {
- mState = STATE_MULTI_SELECT;
-
- // Remove buttons
- mDirectoryButtons.setVisibility(View.GONE);
- mActionNormal.setVisibility(View.GONE);
-
- // Multi select action: move
- mButtonMove = (Button) findViewById(R.id.button_move);
- mButtonMove.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View arg0) {
- if (checkSelection()) {
- promptDestinationAndMoveFile();
- }
- }
- });
-
- // Multi select action: copy
- mButtonCopy = (Button) findViewById(R.id.button_copy);
- mButtonCopy.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View arg0) {
- if (checkSelection()) {
- promptDestinationAndCopyFile();
- }
- }
- });
-
- // Multi select action: delete
- mButtonDelete = (Button) findViewById(R.id.button_delete);
- mButtonDelete.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View arg0) {
- if (checkSelection()) {
- showDialog(DIALOG_MULTI_DELETE);
- }
- }
- });
-
- // Multi select action: delete
- mButtonCompress = (Button) findViewById(R.id.button_compress_zip);
- mButtonCompress.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View arg0) {
- if (checkSelection()) {
- showDialog(DIALOG_MULTI_COMPRESS_ZIP);
- }
- }
- });
-
- // Cache the checked and unchecked icons
- mIconChecked = getResources().getDrawable(R.drawable.ic_button_checked);
- mIconUnchecked = getResources().getDrawable(R.drawable.ic_button_unchecked);
-
- mCheckIconSelect = (ImageView) findViewById(R.id.check_icon_select);
- mCheckIconSelect.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- mSelected = !mSelected;
-
- if(mSelected){
- mCheckIconSelect.setImageDrawable(mIconChecked);
- } else {
- mCheckIconSelect.setImageDrawable(mIconUnchecked);
- }
-
- toggleSelection(mSelected);
- }
- });
-
- }
-
- }
-
- if (mState == STATE_BROWSE) {
- // Remove edit text and button.
- mEditFilename.setVisibility(View.GONE);
- mButtonPick.setVisibility(View.GONE);
- }
-
- if (mState != STATE_MULTI_SELECT) {
- // Remove multiselect action buttons
- mActionMultiselect.setVisibility(View.GONE);
- }
-
- // Set current directory and file based on intent data.
- File file = FileUtils.getFile(intent.getData());
- if (file != null) {
- File dir = FileUtils.getPathWithoutFilename(file);
- if (dir.isDirectory()) {
- browseto = dir;
- }
- if (!file.isDirectory()) {
- mEditFilename.setText(file.getName());
- }
- } else{
- if(mState == STATE_PICK_FILE || mState == STATE_PICK_DIRECTORY
- || action.equals(Intent.ACTION_GET_CONTENT)){
- String path = PreferenceActivity.getDefaultPickFilePath(this);
- if(path != null){
- File dir = new File(path);
- if(dir.exists() && dir.isDirectory()){
- browseto = dir;
- }
- }
- }
- }
-
- String title = intent.getStringExtra(FileManagerIntents.EXTRA_TITLE);
- if (title != null) {
- setTitle(title);
- }
-
- String buttontext = intent.getStringExtra(FileManagerIntents.EXTRA_BUTTON_TEXT);
- if (buttontext != null) {
- mButtonPick.setText(buttontext);
- }
-
- mStepsBack = 0;
-
- // Reset mRestored flag.
- mRestored = false;
- if (icicle != null) {
- browseto = new File(icicle.getString(BUNDLE_CURRENT_DIRECTORY));
- mContextFile = new File(icicle.getString(BUNDLE_CONTEXT_FILE));
- mContextText = icicle.getString(BUNDLE_CONTEXT_TEXT);
-
- boolean show = icicle.getBoolean(BUNDLE_SHOW_DIRECTORY_INPUT);
- showDirectoryInput(show);
-
- mStepsBack = icicle.getInt(BUNDLE_STEPS_BACK);
- // had to bypass direct casting as it was causing a rather unexplainable crash
- Parcelable tmpDirectoryEntries[] = icicle.getParcelableArray(BUNDLE_DIRECTORY_ENTRIES);
- mDirectoryEntries = new IconifiedText[tmpDirectoryEntries.length];
- for(int i=0; i<tmpDirectoryEntries.length; i++){
- mDirectoryEntries[i] = (IconifiedText) tmpDirectoryEntries[i];
- }
- mRestored = true;
- }
-
- getListView().setOnScrollListener(new AbsListView.OnScrollListener() {
-
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- IconifiedTextListAdapter adapter = (IconifiedTextListAdapter) getListAdapter();
- if(adapter != null){
- switch (scrollState) {
- case OnScrollListener.SCROLL_STATE_IDLE:
- adapter.toggleScrolling(false);
- adapter.notifyDataSetChanged();
- break;
- case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
- adapter.toggleScrolling(true);
- break;
- case OnScrollListener.SCROLL_STATE_FLING:
- adapter.toggleScrolling(true);
- break;
- }
- }
- }
-
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem,
- int visibleItemCount, int totalItemCount) {
- // Not used
- }
- });
-
- browseTo(browseto);
- }
-
- public void onDestroy() {
- super.onDestroy();
-
- // Stop the scanner.
- DirectoryScanner scanner = mDirectoryScanner;
-
- if (scanner != null) {
- scanner.cancel = true;
- }
-
- mDirectoryScanner = null;
-
- ThumbnailLoader loader = mThumbnailLoader;
-
- if (loader != null) {
- loader.cancel();
- mThumbnailLoader = null;
- }
-
- ListView lv;
- if((lv = getListView()) != null){
- lv.setAdapter(null);
- }
- }
-
- private void handleMessage(Message message) {
-// Log.v(TAG, "Received message " + message.what);
-
- switch (message.what) {
- case MESSAGE_SHOW_DIRECTORY_CONTENTS:
- showDirectoryContents((DirectoryContents) message.obj);
- break;
-
- case MESSAGE_SET_PROGRESS:
- setProgress(message.arg1, message.arg2);
- break;
- }
- }
-
- private void setProgress(int progress, int maxProgress) {
- mProgressBar.setMax(maxProgress);
- mProgressBar.setProgress(progress);
- mProgressBar.setVisibility(View.VISIBLE);
- }
-
- private void showDirectoryContents(DirectoryContents contents) {
- mDirectoryScanner = null;
-
- mListSdCard = contents.listSdCard;
- mListDir = contents.listDir;
- mListFile = contents.listFile;
- mNoMedia = contents.noMedia;
-
- if(!mRestored){
- directoryEntries.ensureCapacity(mListSdCard.size() + mListDir.size() + mListFile.size());
-
- addAllElements(directoryEntries, mListSdCard);
- addAllElements(directoryEntries, mListDir);
- addAllElements(directoryEntries, mListFile);
-
- mDirectoryEntries = directoryEntries.toArray(new IconifiedText[0]);
- }
- else {
- directoryEntries.clear();
- directoryEntries.ensureCapacity(mDirectoryEntries.length);
- for(int i = 0; i < mDirectoryEntries.length; i++){
- directoryEntries.add(mDirectoryEntries[i]);
- }
-
- // Once mRestore flag has been used, we should toggle it so that further refreshes don't take it into account
- mRestored = false;
- }
-
- IconifiedTextListAdapter itla = new IconifiedTextListAdapter(this);
- itla.setListItems(directoryEntries, getListView().hasTextFilter(), currentDirectory, mMimeTypes);
- setListAdapter(itla);
- getListView().setTextFilterEnabled(true);
-
- ThumbnailLoader mThumbnailLoader = ((IconifiedTextListAdapter) getListAdapter()).getThumbnailLoader();
-
- if(fileDeleted){
- getListView().setSelection(positionAtDelete);
- }
-
- selectInList(mPreviousDirectory);
- refreshDirectoryPanel();
- setProgressBarIndeterminateVisibility(false);
-
- mProgressBar.setVisibility(View.GONE);
- mEmptyText.setVisibility(View.VISIBLE);
-
- toggleCheckBoxVisibility(mState == STATE_MULTI_SELECT);
- }
-
- private void onCreateDirectoryInput() {
- mDirectoryInput = (LinearLayout) findViewById(R.id.directory_input);
- mEditDirectory = (EditText) findViewById(R.id.directory_text);
-
-
- mEditDirectory.setOnKeyListener(new OnKeyListener() {
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- // If the event is a key-down event on the "enter" button
- if ((event.getAction() == KeyEvent.ACTION_DOWN)
- && (keyCode == KeyEvent.KEYCODE_ENTER)){
-
- goToDirectoryInEditText();
-
- return true;
- }
- return false;
- }
- });
-
- mButtonDirectoryPick = (ImageButton) findViewById(R.id.button_directory_pick);
-
- mButtonDirectoryPick.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View arg0) {
- goToDirectoryInEditText();
- }
- });
- }
-
- //private boolean mHaveShownErrorMessage;
- private File mHaveShownErrorMessageForFile = null;
-
- private void hideKeyboard(IBinder windowToken, int flags){
- if(mSoftKeyboardAvailable){
- (new org.openintents.filemanager.compatibility.SoftKeyboard(this))
- .hideSoftInputFromWindow(windowToken, flags);
- }
- }
-
- private void goToDirectoryInEditText() {
- File browseto = new File(mEditDirectory.getText().toString());
-
- /*
- * After calling showDirectoryInput(false); the keyboard stays displayed.
- * Hide it by calling hideKeyboard(windowToken, 0);
- * Might be a bit problematic - it hides the keyboard even if id didn't
- * appear after focusing the editText (user had it displayed before).
- * But I think letting it displayed when user doesn't want to
- * is much worse (and much more common) than hiding it although
- * the user wants it displayed
- */
-
- IBinder windowToken = mEditDirectory.getWindowToken();
-
- if (browseto.equals(currentDirectory)) {
- showDirectoryInput(false);
- hideKeyboard(windowToken, 0);
- } else {
- if (mHaveShownErrorMessageForFile != null
- && mHaveShownErrorMessageForFile.equals(browseto)) {
- // Don't let user get stuck in wrong directory.
- mHaveShownErrorMessageForFile = null;
- showDirectoryInput(false);
- hideKeyboard(windowToken, 0);
- } else {
- if (!browseto.exists()) {
- // browseTo() below will show an error message,
- // because file does not exist.
- // It is ok to show this the first time.
- mHaveShownErrorMessageForFile = browseto;
- }else{
- showDirectoryInput(false);
- hideKeyboard(windowToken, 0);
- }
- browseTo(browseto);
- }
- }
- }
-
- /**
- * Show the directory line as input box instead of button row.
- * If Directory input does not exist yet, it is created.
- * Since the default is show == false, nothing is created if
- * it is not necessary (like after icicle).
- * @param show
- */
- private void showDirectoryInput(boolean show) {
- if (show) {
- if (mDirectoryInput == null) {
- onCreateDirectoryInput();
- }
- }
- if (mDirectoryInput != null) {
- mDirectoryInput.setVisibility(show ? View.VISIBLE : View.GONE);
- mDirectoryButtons.setVisibility(show ? View.GONE : View.VISIBLE);
- }
-
- refreshDirectoryPanel();
- }
-
- /**
- *
- */
- private void refreshDirectoryPanel() {
- if (isDirectoryInputVisible()) {
- // Set directory path
- String path = currentDirectory.getAbsolutePath();
- mEditDirectory.setText(path);
-
- // Set selection to last position so user can continue to type:
- mEditDirectory.setSelection(path.length());
- } else {
- setDirectoryButtons();
- }
- }
- /*
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- }
-*/
-
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- // TODO Auto-generated method stub
- super.onSaveInstanceState(outState);
-
- // remember file name
- outState.putString(BUNDLE_CURRENT_DIRECTORY, currentDirectory.getAbsolutePath());
- outState.putString(BUNDLE_CONTEXT_FILE, mContextFile.getAbsolutePath());
- outState.putString(BUNDLE_CONTEXT_TEXT, mContextText);
- boolean show = isDirectoryInputVisible();
- outState.putBoolean(BUNDLE_SHOW_DIRECTORY_INPUT, show);
- outState.putInt(BUNDLE_STEPS_BACK, mStepsBack);
- outState.putParcelableArray(BUNDLE_DIRECTORY_ENTRIES, mDirectoryEntries);
- }
-
- /**
- * @return
- */
- private boolean isDirectoryInputVisible() {
- return ((mDirectoryInput != null) && (mDirectoryInput.getVisibility() == View.VISIBLE));
- }
-
- private void pickFileOrDirectory() {
- File file = null;
- if (mState == STATE_PICK_FILE) {
- String filename = mEditFilename.getText().toString();
- file = FileUtils.getFile(currentDirectory.getAbsolutePath(), filename);
- } else if (mState == STATE_PICK_DIRECTORY) {
- file = currentDirectory;
- }
-
- PreferenceActivity.setDefaultPickFilePath(this, currentDirectory.getAbsolutePath());
-
- Intent intent = getIntent();
- intent.setData(FileUtils.getUri(file));
- setResult(RESULT_OK, intent);
- finish();
- }
-
- /**
- *
- */
- private void getMimeTypes() {
- MimeTypeParser mtp = null;
- try {
- mtp = new MimeTypeParser(this, this.getPackageName());
- } catch (NameNotFoundException e) {
- //Should never happen
- }
-
- XmlResourceParser in = getResources().getXml(R.xml.mimetypes);
-
- try {
- mMimeTypes = mtp.fromXmlResource(in);
- } catch (XmlPullParserException e) {
- Log
- .e(
- TAG,
- "PreselectedChannelsActivity: XmlPullParserException",
- e);
- throw new RuntimeException(
- "PreselectedChannelsActivity: XmlPullParserException");
- } catch (IOException e) {
- Log.e(TAG, "PreselectedChannelsActivity: IOException", e);
- throw new RuntimeException(
- "PreselectedChannelsActivity: IOException");
- }
- }
-
- /**
- * This function browses up one level
- * according to the field: currentDirectory
- */
- private void upOneLevel(){
- if (mStepsBack > 0) {
- mStepsBack--;
- }
- if(currentDirectory.getParent() != null)
- browseTo(currentDirectory.getParentFile());
- }
-
- /**
- * Jump to some location by clicking on a
- * directory button.
- *
- * This resets the counter for "back" actions.
- *
- * @param aDirectory
- */
- private void jumpTo(final File aDirectory) {
- mStepsBack = 0;
- browseTo(aDirectory);
- }
-
- /**
- * Browse to some location by clicking on a list item.
- * @param aDirectory
- */
- private void browseTo(final File aDirectory){
- // setTitle(aDirectory.getAbsolutePath());
-
- if (aDirectory.isDirectory()){
- if (aDirectory.equals(currentDirectory)) {
- // Switch from button to directory input
- showDirectoryInput(true);
- } else {
- mPreviousDirectory = currentDirectory;
- currentDirectory = aDirectory;
- refreshList();
-// selectInList(previousDirectory);
- // refreshDirectoryPanel();
- }
- }else{
- if (mState == STATE_BROWSE || mState == STATE_PICK_DIRECTORY) {
- // Lets start an intent to View the file, that was clicked...
- openFile(aDirectory);
- } else if (mState == STATE_PICK_FILE) {
- // Pick the file
- mEditFilename.setText(aDirectory.getName());
- }
- }
- }
-
-
- private void openFile(File aFile) {
- if (!aFile.exists()) {
- Toast.makeText(this, R.string.error_file_does_not_exists, Toast.LENGTH_SHORT).show();
- return;
- }
-
- Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
-
- Uri data = FileUtils.getUri(aFile);
- String type = mMimeTypes.getMimeType(aFile.getName());
- intent.setDataAndType(data, type);
-
- // Were we in GET_CONTENT mode?
- Intent originalIntent = getIntent();
-
- if (originalIntent != null && originalIntent.getAction() != null && originalIntent.getAction().equals(Intent.ACTION_GET_CONTENT)) {
- // In that case, we should probably just return the requested data.
- PreferenceActivity.setDefaultPickFilePath(this,
- FileUtils.getPathWithoutFilename(aFile).getAbsolutePath());
- intent.setData(Uri.parse(FileManagerProvider.FILE_PROVIDER_PREFIX + aFile));
- setResult(RESULT_OK, intent);
- finish();
- return;
- }
-
-
-
- try {
- startActivity(intent);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(this, R.string.application_not_available, Toast.LENGTH_SHORT).show();
- };
- }
-
- public void refreshList() {
-
- boolean directoriesOnly = mState == STATE_PICK_DIRECTORY;
-
- // Cancel an existing scanner, if applicable.
- DirectoryScanner scanner = mDirectoryScanner;
-
- if (scanner != null) {
- scanner.cancel = true;
- }
-
- ThumbnailLoader loader = mThumbnailLoader;
-
- if (loader != null) {
- loader.cancel();
- mThumbnailLoader = null;
- }
-
- directoryEntries.clear();
- mListDir.clear();
- mListFile.clear();
- mListSdCard.clear();
-
- setProgressBarIndeterminateVisibility(true);
-
- // Don't show the "folder empty" text since we're scanning.
- mEmptyText.setVisibility(View.GONE);
-
- // Also DON'T show the progress bar - it's kind of lame to show that
- // for less than a second.
- mProgressBar.setVisibility(View.GONE);
- setListAdapter(null);
-
- mDirectoryScanner = new DirectoryScanner(currentDirectory, this, currentHandler, mMimeTypes, mFilterFiletype, mFilterMimetype, mSdCardPath, mWritableOnly, directoriesOnly);
- mDirectoryScanner.start();
-
-
-
- // Add the "." == "current directory"
- /*directoryEntries.add(new IconifiedText(
- getString(R.string.current_dir),
- getResources().getDrawable(R.drawable.ic_launcher_folder))); */
- // and the ".." == 'Up one level'
- /*
- if(currentDirectory.getParent() != null)
- directoryEntries.add(new IconifiedText(
- getString(R.string.up_one_level),
- getResources().getDrawable(R.drawable.ic_launcher_folder_open)));
- */
- }
-
- private void selectInList(File selectFile) {
- String filename = selectFile.getName();
- IconifiedTextListAdapter la = (IconifiedTextListAdapter) getListAdapter();
- int count = la.getCount();
- for (int i = 0; i < count; i++) {
- IconifiedText it = (IconifiedText) la.getItem(i);
- if (it.getText().equals(filename)) {
- getListView().setSelection(i);
- break;
- }
- }
- }
-
- private void addAllElements(List<IconifiedText> addTo, List<IconifiedText> addFrom) {
- int size = addFrom.size();
- for (int i = 0; i < size; i++) {
- addTo.add(addFrom.get(i));
- }
- }
-
- private void setDirectoryButtons() {
- String[] parts = currentDirectory.getAbsolutePath().split("/");
-
- mDirectoryButtons.removeAllViews();
-
- int WRAP_CONTENT = LinearLayout.LayoutParams.WRAP_CONTENT;
-
- // Add home button separately
- ImageButton ib = new ImageButton(this);
- ib.setImageResource(R.drawable.ic_launcher_home_small);
- ib.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
- ib.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- jumpTo(new File("/"));
- }
- });
- mDirectoryButtons.addView(ib);
-
- // Add other buttons
-
- String dir = "";
-
- for (int i = 1; i < parts.length; i++) {
- dir += "/" + parts[i];
- if (dir.equals(mSdCardPath)) {
- // Add SD card button
- ib = new ImageButton(this);
- ib.setImageResource(R.drawable.ic_launcher_sdcard_small);
- ib.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
- ib.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- jumpTo(new File(mSdCardPath));
- }
- });
- mDirectoryButtons.addView(ib);
- } else {
- Button b = new Button(this);
- b.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
- b.setText(parts[i]);
- b.setTag(dir);
- b.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- String dir = (String) view.getTag();
- jumpTo(new File(dir));
- }
- });
- mDirectoryButtons.addView(b);
- }
- }
-
- checkButtonLayout();
- }
-
- private void checkButtonLayout() {
-
- // Let's measure how much space we need:
- int spec = View.MeasureSpec.UNSPECIFIED;
- mDirectoryButtons.measure(spec, spec);
- int count = mDirectoryButtons.getChildCount();
-
- int requiredwidth = mDirectoryButtons.getMeasuredWidth();
- int width = getWindowManager().getDefaultDisplay().getWidth();
-
- if (requiredwidth > width) {
- int WRAP_CONTENT = LinearLayout.LayoutParams.WRAP_CONTENT;
-
- // Create a new button that shows that there is more to the left:
- ImageButton ib = new ImageButton(this);
- ib.setImageResource(R.drawable.ic_menu_back_small);
- ib.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
- //
- ib.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- // Up one directory.
- upOneLevel();
- }
- });
- mDirectoryButtons.addView(ib, 0);
-
- // New button needs even more space
- ib.measure(spec, spec);
- requiredwidth += ib.getMeasuredWidth();
-
- // Need to take away some buttons
- // but leave at least "back" button and one directory button.
- while (requiredwidth > width && mDirectoryButtons.getChildCount() > 2) {
- View view = mDirectoryButtons.getChildAt(1);
- requiredwidth -= view.getMeasuredWidth();
-
- mDirectoryButtons.removeViewAt(1);
- }
- }
- }
-
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- super.onListItemClick(l, v, position, id);
-
- IconifiedTextListAdapter adapter = (IconifiedTextListAdapter) getListAdapter();
-
- if (adapter == null) {
- return;
- }
-
- IconifiedText text = (IconifiedText) adapter.getItem(position);
-
- if (mState == STATE_MULTI_SELECT) {
- text.setSelected(!text.isSelected());
- adapter.notifyDataSetChanged();
- return;
- }
-
- String file = text.getText();
- /*
- if (selectedFileString.equals(getString(R.string.up_one_level))) {
- upOneLevel();
- } else {
- */
- String curdir = currentDirectory
- .getAbsolutePath() ;
- File clickedFile = FileUtils.getFile(curdir, file);
- if (clickedFile != null) {
- if (clickedFile.isDirectory()) {
- // If we click on folders, we can return later by the "back" key.
- mStepsBack++;
- }
- browseTo(clickedFile);
- }
- /*
- }
- */
- }
-
- private void getSdCardPath() {
- mSdCardPath = android.os.Environment
- .getExternalStorageDirectory().getAbsolutePath();
- }
-
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
-
- int icon = android.R.drawable.ic_menu_add;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- icon = R.drawable.ic_menu_add_folder;
- }
- MenuItem item = menu.add(0, MENU_NEW_FOLDER, 0, R.string.menu_new_folder).setIcon(
- icon).setShortcut('0', 'f');
- MenuCompat.setShowAsAction(item, 0/*MenuItem.SHOW_AS_ACTION_IF_ROOM*/);
-
- if (mState == STATE_BROWSE) {
- // Multi select option menu.
- menu.add(0, MENU_MULTI_SELECT, 0, R.string.menu_multi_select).setIcon(
- R.drawable.ic_menu_multiselect).setShortcut('1', 'm');
- }
-
- mIncludeMediaScanMenuItem = menu.add(0, MENU_INCLUDE_IN_MEDIA_SCAN, 0, R.string.menu_include_in_media_scan).setShortcut('2', 's')
- .setIcon(android.R.drawable.ic_menu_gallery);
- mExcludeMediaScanMenuItem = menu.add(0, MENU_EXCLUDE_FROM_MEDIA_SCAN, 0, R.string.menu_exclude_from_media_scan).setShortcut('2', 's')
- .setIcon(android.R.drawable.ic_menu_gallery);
-
- menu.add(0, MENU_BOOKMARKS, 0, R.string.bookmarks).setIcon(
- R.drawable.ic_menu_star);
-
-
- menu.add(0, MENU_SETTINGS, 0, R.string.settings).setIcon(
- android.R.drawable.ic_menu_preferences).setShortcut('9', 'p');
-
- /* We don't want to allow the user to override a filter set
- * by an application.
- */
- if(mState != STATE_PICK_FILE) {
- menu.add(0, MENU_FILTER, 0, R.string.menu_filter).setIcon(
- android.R.drawable.ic_menu_search);
- }
-
- menu.add(0, MENU_REFRESH, 0, R.string.menu_refresh).setIcon(
- android.R.drawable.ic_menu_rotate);
-
- mDistribution.onCreateOptionsMenu(menu);
- return true;
- }
-
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
-
- mIncludeMediaScanMenuItem.setVisible(false);
- mExcludeMediaScanMenuItem.setVisible(false);
-
- boolean showMediaScanMenuItem = PreferenceActivity.getMediaScanFromPreference(this);
-
- // We only know about ".nomedia" once we have the results list back.
- if (showMediaScanMenuItem && mListDir != null) {
- if (mNoMedia) {
- mIncludeMediaScanMenuItem.setVisible(true);
- } else {
- mExcludeMediaScanMenuItem.setVisible(true);
- }
- }
-
- // Generate any additional actions that can be performed on the
- // overall list. This allows other applications to extend
- // our menu with their own actions.
- Intent intent = new Intent(null, getIntent().getData());
- intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
- // menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,
- // new ComponentName(this, NoteEditor.class), null, intent, 0, null);
-
- // Workaround to add icons:
- MenuIntentOptionsWithIcons menu2 = new MenuIntentOptionsWithIcons(this,
- menu);
- menu2.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,
- new ComponentName(this, FileManagerActivity.class), null, intent,
- 0, null);
-
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_NEW_FOLDER:
- showDialog(DIALOG_NEW_FOLDER);
- return true;
-
- case MENU_MULTI_SELECT:
- promptMultiSelect();
- return true;
-
- case MENU_INCLUDE_IN_MEDIA_SCAN:
- includeInMediaScan();
- return true;
-
- case MENU_EXCLUDE_FROM_MEDIA_SCAN:
- excludeFromMediaScan();
- return true;
-
- case MENU_SETTINGS:
- showSettings();
- return true;
-
- case MENU_FILTER:
- showDialog(DIALOG_FILTER);
- return true;
-
- case MENU_BOOKMARKS:
- showDialog(DIALOG_BOOKMARKS);
- return true;
-
- case MENU_REFRESH:
- refreshList();
- return true;
- }
- return super.onOptionsItemSelected(item);
-
- }
-
- private void showSettings() {
- Intent intent = new Intent(this, PreferenceActivity.class);
- startActivity(intent);
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view,
- ContextMenuInfo menuInfo) {
- AdapterView.AdapterContextMenuInfo info;
- try {
- info = (AdapterView.AdapterContextMenuInfo) menuInfo;
- } catch (ClassCastException e) {
- Log.e(TAG, "bad menuInfo", e);
- return;
- }
-/*
- Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
- if (cursor == null) {
- // For some reason the requested item isn't available, do nothing
- return;
- }
-*/
- IconifiedTextListAdapter adapter = (IconifiedTextListAdapter) getListAdapter();
-
- if (adapter == null) {
- return;
- }
-
- IconifiedText it = (IconifiedText) adapter.getItem(info.position);
- menu.setHeaderTitle(it.getText());
- menu.setHeaderIcon(it.getIcon());
- File file = FileUtils.getFile(currentDirectory, it.getText());
-
-
- if (!file.isDirectory()) {
- if (mState == STATE_PICK_FILE) {
- // Show "open" menu
- menu.add(0, MENU_OPEN, 0, R.string.menu_open);
- }
- menu.add(0, MENU_SEND, 0, R.string.menu_send);
- }
- menu.add(0, MENU_MOVE, 0, R.string.menu_move);
-
- if (!file.isDirectory()) {
- menu.add(0, MENU_COPY, 0, R.string.menu_copy);
- }
-
- menu.add(0, MENU_RENAME, 0, R.string.menu_rename);
- menu.add(0, MENU_DELETE, 0, R.string.menu_delete);
-
- //if (!file.isDirectory()) {
- Uri data = Uri.fromFile(file);
- Intent intent = new Intent(null, data);
- String type = mMimeTypes.getMimeType(file.getName());
-
- intent.setDataAndType(data, type);
- intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE);
- //intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
-
- Log.v(TAG, "Data=" + data);
- Log.v(TAG, "Type=" + type);
-
- if (type != null) {
- // Add additional options for the MIME type of the selected file.
- menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,
- new ComponentName(this, FileManagerActivity.class), null, intent, 0, null);
- }
- //}
-
- if (FileUtils.checkIfZipArchive(file)){
- menu.add(0, MENU_EXTRACT, 0, R.string.menu_extract);
- } else {
- menu.add(0, MENU_COMPRESS, 0, R.string.menu_compress);
- }
- menu.add(0, MENU_DETAILS, 0, R.string.menu_details);
- menu.add(0, MENU_BOOKMARK, 0, R.string.menu_bookmark);
- menu.add(0, MENU_MORE, 0, R.string.menu_more);
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- super.onContextItemSelected(item);
- AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item
- .getMenuInfo();
-
- // Remember current selection
- IconifiedTextListAdapter adapter = (IconifiedTextListAdapter) getListAdapter();
-
- if (adapter == null) {
- return false;
- }
-
- IconifiedText ic = (IconifiedText) adapter.getItem(menuInfo.position);
- mContextText = ic.getText();
- mContextIcon = ic.getIcon();
- mContextFile = FileUtils.getFile(currentDirectory, ic.getText());
-
- switch (item.getItemId()) {
- case MENU_OPEN:
- openFile(mContextFile);
- return true;
-
- case MENU_MOVE:
- promptDestinationAndMoveFile();
- return true;
-
- case MENU_COPY:
- promptDestinationAndCopyFile();
- return true;
-
- case MENU_DELETE:
- showDialog(DIALOG_DELETE);
- return true;
-
- case MENU_RENAME:
- showDialog(DIALOG_RENAME);
- return true;
-
- case MENU_SEND:
- sendFile(mContextFile);
- return true;
-
- case MENU_DETAILS:
- showDialog(DIALOG_DETAILS);
- return true;
-
- case MENU_COMPRESS:
- showDialog(DIALOG_COMPRESSING);
- return true;
-
- case MENU_EXTRACT:
- promptDestinationAndExtract();
- return true;
-
- case MENU_BOOKMARK:
- String path = mContextFile.getAbsolutePath();
- Cursor query = managedQuery(BookmarksProvider.CONTENT_URI,
- new String[]{BookmarksProvider._ID},
- BookmarksProvider.PATH + "=?",
- new String[]{path},
- null);
- if(!query.moveToFirst()){
- ContentValues values = new ContentValues();
- values.put(BookmarksProvider.NAME, mContextFile.getName());
- values.put(BookmarksProvider.PATH, path);
- getContentResolver().insert(BookmarksProvider.CONTENT_URI, values);
- Toast.makeText(this, R.string.bookmark_added, Toast.LENGTH_SHORT).show();
- }
- else{
- Toast.makeText(this, R.string.bookmark_already_exists, Toast.LENGTH_SHORT).show();
- }
- return true;
-
- case MENU_MORE:
- if (!PreferenceActivity.getShowAllWarning(FileManagerActivity.this)) {
- showMoreCommandsDialog();
- return true;
- }
-
- showWarningDialog();
-
- return true;
- }
-
- return false;
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
-
- switch (id) {
- case DIALOG_NEW_FOLDER:
- LayoutInflater inflater = LayoutInflater.from(this);
- View view = inflater.inflate(R.layout.dialog_new_folder, null);
- final EditText et = (EditText) view
- .findViewById(R.id.foldername);
- et.setText("");
- //accept "return" key
- TextView.OnEditorActionListener returnListener = new TextView.OnEditorActionListener(){
- public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_NULL
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- createNewFolder(et.getText().toString()); //match this behavior to your OK button
- dismissDialog(DIALOG_NEW_FOLDER);
- }
- return true;
- }
-
- };
- et.setOnEditorActionListener(returnListener);
- //end of code regarding "return key"
-
- return new AlertDialog.Builder(this)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setTitle(R.string.create_new_folder).setView(view).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- createNewFolder(et.getText().toString());
- }
-
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
-
- }).create();
-
-
- case DIALOG_DELETE:
- return new AlertDialog.Builder(this).setTitle(getString(R.string.really_delete, mContextText))
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- deleteFileOrFolder(mContextFile);
- }
-
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
-
- }).create();
-
- case DIALOG_RENAME:
- inflater = LayoutInflater.from(this);
- view = inflater.inflate(R.layout.dialog_new_folder, null);
- final EditText et2 = (EditText) view
- .findViewById(R.id.foldername);
- //accept "return" key
- TextView.OnEditorActionListener returnListener2 = new TextView.OnEditorActionListener(){
- public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_NULL
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- renameFileOrFolder(mContextFile, et2.getText().toString()); //match this behavior to your OK button
- dismissDialog(DIALOG_RENAME);
- }
- return true;
- }
-
- };
- et2.setOnEditorActionListener(returnListener2);
- //end of code regarding "return key"
- return new AlertDialog.Builder(this)
- .setTitle(R.string.menu_rename).setView(view).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
-
- renameFileOrFolder(mContextFile, et2.getText().toString());
- }
-
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
-
- }).create();
-
- case DIALOG_MULTI_DELETE:
- String contentText = null;
- int count = 0;
- for (IconifiedText it : mDirectoryEntries) {
- if (!it.isSelected()) {
- continue;
- }
-
- contentText = it.getText();
- count++;
- }
- String string;
- if (count == 1) {
- string = getString(R.string.really_delete, contentText);
- } else {
- string = getString(R.string.really_delete_multiselect, count);
- }
- return new AlertDialog.Builder(this).setTitle(string)
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- deleteMultiFile();
-
- Intent intent = getIntent();
- setResult(RESULT_OK, intent);
- finish();
- }
-
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
-
- }).create();
-
- case DIALOG_FILTER:
- inflater = LayoutInflater.from(this);
- view = inflater.inflate(R.layout.dialog_new_folder, null);
- ((TextView)view.findViewById(R.id.foldernametext)).setText(R.string.extension);
- final EditText et3 = (EditText) view
- .findViewById(R.id.foldername);
- et3.setText("");
- return new AlertDialog.Builder(this)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setTitle(R.string.menu_filter).setView(view).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- mFilterFiletype = et3.getText().toString().trim();
- refreshList();
- }
-
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
-
- }).create();
-
-
- case DIALOG_DETAILS:
- inflater = LayoutInflater.from(this);
- view = inflater.inflate(R.layout.dialog_details, null);
-
- return new AlertDialog.Builder(this).setTitle(mContextText).
- setIcon(mContextIcon).setView(view).create();
-
- case DIALOG_BOOKMARKS:
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
-
- final Cursor bookmarksCursor = getBookmarks();
-
- builder.setTitle(R.string.bookmarks);
-
- builder.setCursor(bookmarksCursor, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- if (bookmarksCursor.moveToPosition(item)) {
- String path = bookmarksCursor.getString(
- bookmarksCursor.getColumnIndex(BookmarksProvider.PATH));
- File file = new File(path);
- if (file != null) {
- if (file.isDirectory()) {
- mStepsBack++;
- }
- browseTo(file);
- }
- } else{
- Toast.makeText(FileManagerActivity.this, R.string.bookmark_not_found,
- Toast.LENGTH_SHORT).show();
- }
- }
- }, BookmarksProvider.NAME);
-
- return builder.create();
-
- case DIALOG_COMPRESSING:
- inflater = LayoutInflater.from(this);
- view = inflater.inflate(R.layout.dialog_new_folder, null);
- final EditText editText = (EditText) view.findViewById(R.id.foldername);
- //accept "return" key
- TextView.OnEditorActionListener returnListener3 = new TextView.OnEditorActionListener(){
- public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_NULL
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- if (new File(mContextFile.getParent()+File.separator+editText.getText().toString()).exists()){
- mDialogArgument = editText.getText().toString();
- showDialog(DIALOG_WARNING_EXISTS);
- } else {
- new CompressManager(FileManagerActivity.this).compress(mContextFile, editText.getText().toString());
- } //match this behavior to your OK button
- dismissDialog(DIALOG_COMPRESSING);
- }
- return true;
- }
-
- };
- editText.setOnEditorActionListener(returnListener3);
- //end of code regarding "return key"
- return new AlertDialog.Builder(this)
- .setTitle(R.string.menu_compress).setView(view).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- if (new File(mContextFile.getParent()+File.separator+editText.getText().toString()).exists()){
- mDialogArgument = editText.getText().toString();
- showDialog(DIALOG_WARNING_EXISTS);
- } else {
- new CompressManager(FileManagerActivity.this).compress(mContextFile, editText.getText().toString());
- }
- }
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
- }).create();
-
- case DIALOG_MULTI_COMPRESS_ZIP:
- inflater = LayoutInflater.from(this);
- view = inflater.inflate(R.layout.dialog_new_folder, null);
- final EditText editText1 = (EditText) view.findViewById(R.id.foldername);
- //accept "return" key
- TextView.OnEditorActionListener returnListener4 = new TextView.OnEditorActionListener(){
- public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_NULL
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- if (new File(currentDirectory+File.separator+editText1.getText().toString()).exists()){
- mDialogArgument = editText1.getText().toString();
- mDialogExistsAction = DIALOG_EXISTS_ACTION_MULTI_COMPRESS_ZIP;
- showDialog(DIALOG_WARNING_EXISTS);
- } else {
- compressMultiFile(editText1.getText().toString());
- } //match this behavior to your OK button
- dismissDialog(DIALOG_MULTI_COMPRESS_ZIP);
- }
- return true;
- }
-
- };
- editText1.setOnEditorActionListener(returnListener4);
- //end of code regarding "return key"
- return new AlertDialog.Builder(this)
- .setTitle(R.string.menu_compress).setView(view).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- if (new File(currentDirectory+File.separator+editText1.getText().toString()).exists()){
- mDialogArgument = editText1.getText().toString();
- mDialogExistsAction = DIALOG_EXISTS_ACTION_MULTI_COMPRESS_ZIP;
- showDialog(DIALOG_WARNING_EXISTS);
- } else {
- compressMultiFile(editText1.getText().toString());
- }
- }
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // Cancel should not do anything.
- }
- }).create();
-
- case DIALOG_WARNING_EXISTS:
- return new AlertDialog.Builder(this).setTitle(getString(R.string.warning_overwrite, mDialogArgument))
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- if (mDialogExistsAction.equals(DIALOG_EXISTS_ACTION_MULTI_COMPRESS_ZIP)){
- compressMultiFile(mDialogArgument);
- } else if (mDialogExistsAction.equals(DIALOG_EXISTS_ACTION_RENAME)){
- File newFile = FileUtils.getFile(currentDirectory, mNewFileName);
- rename(FileUtils.getFile(currentDirectory, mOldFileName), newFile);
- } else {
- new File(mContextFile.getParent()+File.separator+mDialogArgument).delete();
- new CompressManager(FileManagerActivity.this).compress(mContextFile, mDialogArgument);
- }
- mDialogExistsAction = "";
- }
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- if (mDialogExistsAction.equals(DIALOG_EXISTS_ACTION_RENAME)){
- mContextText = mOldFileName;
- showDialog(DIALOG_RENAME);
- } else if (mDialogExistsAction.equals(DIALOG_EXISTS_ACTION_MULTI_COMPRESS_ZIP)){
- showDialog(DIALOG_MULTI_COMPRESS_ZIP);
- } else {
- showDialog(DIALOG_COMPRESSING);
- }
- mDialogExistsAction = "";
- }
- }).create();
-
- case DIALOG_CHANGE_FILE_EXTENSION:
- return new AlertDialog.Builder(this).setTitle(getString(R.string.change_file_extension))
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- File newFile = FileUtils.getFile(currentDirectory, mNewFileName);
- if (newFile.exists()){
- mDialogExistsAction = DIALOG_EXISTS_ACTION_RENAME;
- showDialog(DIALOG_WARNING_EXISTS);
- } else {
- rename(FileUtils.getFile(currentDirectory, mOldFileName), newFile);
- }
- }
- }).setNegativeButton(android.R.string.cancel, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- mContextText = mOldFileName;
- showDialog(DIALOG_RENAME);
- }
- }).create();
- }
- return super.onCreateDialog(id);
-
- }
-
- private Cursor getBookmarks(){
- return managedQuery(BookmarksProvider.CONTENT_URI,
- new String[] {
- BookmarksProvider._ID,
- BookmarksProvider.NAME,
- BookmarksProvider.PATH,
- }, null, null, null);
- }
-
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- super.onPrepareDialog(id, dialog);
-
- switch (id) {
- case DIALOG_NEW_FOLDER:
- EditText et = (EditText) dialog.findViewById(R.id.foldername);
- et.setText("");
- break;
-
- case DIALOG_DELETE:
- ((AlertDialog) dialog).setTitle(getString(R.string.really_delete, mContextText));
- break;
-
- case DIALOG_RENAME:
- et = (EditText) dialog.findViewById(R.id.foldername);
- et.setText(mContextText);
- TextView tv = (TextView) dialog.findViewById(R.id.foldernametext);
- if (mContextFile.isDirectory()) {
- tv.setText(R.string.file_name);
- } else {
- tv.setText(R.string.file_name);
- }
- et.setSelection(0, mContextText.lastIndexOf(".") == -1 ? mContextText.length() : mContextText.lastIndexOf("."));
- ((AlertDialog) dialog).setIcon(mContextIcon);
- break;
-
- case DIALOG_MULTI_DELETE:
- break;
-
- case DIALOG_DETAILS:
- final TextView type = ((TextView)dialog.findViewById(R.id.details_type_value));
- type.setText((mContextFile.isDirectory() ? R.string.details_type_folder :
- (mContextFile.isFile() ? R.string.details_type_file :
- R.string.details_type_other)));
-
- final TextView size = ((TextView)dialog.findViewById(R.id.details_size_value));
- size.setText(FileUtils.formatSize(this, mContextFile.length()));
-
- // Creates a background thread that obtains the size of a directory and updates
- // the TextView accordingly.
- if(mContextFile.isDirectory()){
- final AsyncTask folderSizeTask = new AsyncTask<File, Long, Long>(){
-
- protected long totalSize = 0L;
-
- @Override
- protected Long doInBackground(File... file) {
- sizeOf(file[0]);
- return totalSize;
- }
-
- @Override
- protected void onProgressUpdate(Long... updatedSize){
- size.setText(FileUtils.formatSize(size.getContext(), updatedSize[0]));
- }
-
- @Override
- protected void onPostExecute(Long result){
- size.setText(FileUtils.formatSize(size.getContext(), result));
- }
-
- private void sizeOf(File file){
- if(file.isFile()){
- totalSize += file.length();
- publishProgress(totalSize);
- } else {
- File[] files = file.listFiles();
-
- if(files != null && files.length != 0){
- for(File subFile : files){
- sizeOf(subFile);
- }
- }
- }
- }
- }.execute(mContextFile);
-
- ((AlertDialog) dialog).setOnCancelListener(new OnCancelListener(){
- @Override
- public void onCancel(DialogInterface dialog) {
- folderSizeTask.cancel(true);
- }
- });
- }
-
- String perms = (mContextFile.canRead() ? "R" : "-") +
- (mContextFile.canWrite() ? "W" : "-") +
- (FileUtils.canExecute(mContextFile) ? "X" : "-");
-
- final TextView permissions = ((TextView)dialog.findViewById(R.id.details_permissions_value));
- permissions.setText(perms);
-
- final TextView hidden = ((TextView)dialog.findViewById(R.id.details_hidden_value));
- hidden.setText(mContextFile.isHidden() ? R.string.details_yes : R.string.details_no);
-
- final TextView lastmodified = ((TextView)dialog.findViewById(R.id.details_lastmodified_value));
- lastmodified.setText(FileUtils.formatDate(this, mContextFile.lastModified()));
- ((AlertDialog) dialog).setIcon(mContextIcon);
- ((AlertDialog) dialog).setTitle(mContextText);
- break;
-
- case DIALOG_COMPRESSING:
- TextView textView = (TextView) dialog.findViewById(R.id.foldernametext);
- textView.setText(R.string.compress_into_archive);
- final EditText editText = (EditText) dialog.findViewById(R.id.foldername);
- String archiveName = "";
- if (mContextFile.isDirectory()){
- archiveName = mContextFile.getName()+".zip";
- } else {
- String extension = FileUtils.getExtension(mContextFile.getName());
- archiveName = mContextFile.getName().replaceAll(extension, "")+".zip";
- }
- editText.setText(archiveName);
- editText.setSelection(0, archiveName.length()-4);
- break;
-
- case DIALOG_MULTI_COMPRESS_ZIP:
- textView = (TextView) dialog.findViewById(R.id.foldernametext);
- textView.setText(R.string.compress_into_archive);
- final EditText editText1 = (EditText) dialog.findViewById(R.id.foldername);
- archiveName = currentDirectory.getName()+".zip";
- editText1.setText(archiveName);
- editText1.setSelection(0, archiveName.length()-4);
- break;
-
- case DIALOG_WARNING_EXISTS:
- dialog.setTitle(getString(R.string.warning_overwrite, mDialogArgument));
- }
- }
-
- /**
- * @since 2011-09-30
- */
- private void showWarningDialog() {
- LayoutInflater li = LayoutInflater.from(this);
- View warningView = li.inflate(R.layout.dialog_warning, null);
- final CheckBox showWarningAgain = (CheckBox)warningView.findViewById(R.id.showagaincheckbox);
-
- showWarningAgain.setChecked(PreferenceActivity.getShowAllWarning(FileManagerActivity.this));
-
- new AlertDialog.Builder(this).setView(warningView).setTitle(getString(R.string.title_warning_some_may_not_work))
- .setMessage(getString(R.string.warning_some_may_not_work, mContextText))
- .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(
- android.R.string.ok, new OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- PreferenceActivity.setShowAllWarning(FileManagerActivity.this, showWarningAgain.isChecked());
-
- showMoreCommandsDialog();
- }
-
- }).create()
- .show();
- }
-
- /**
- * @since 2011-09-30
- */
- private void showMoreCommandsDialog() {
- final Uri data = Uri.fromFile(mContextFile);
- final Intent intent = new Intent(null, data);
- String type = mMimeTypes.getMimeType(mContextFile.getName());
-
- intent.setDataAndType(data, type);
-
- Log.v(TAG, "Data=" + data);
- Log.v(TAG, "Type=" + type);
-
- if (type != null) {
- // Add additional options for the MIME type of the selected file.
- PackageManager pm = getPackageManager();
- final List<ResolveInfo> lri = pm.queryIntentActivityOptions(
- new ComponentName(this, FileManagerActivity.class),
- null, intent, 0);
- final int N = lri != null ? lri.size() : 0;
-
- // Create name list for menu item.
- final List<CharSequence> items = new ArrayList<CharSequence>();
- /* Some of the options don't go to the list hence we have to remove them
- * to keep the lri correspond with the menu items. In the addition, we have
- * to remove them after the first iteration, otherwise the iteration breaks.
- */
- List<ResolveInfo> toRemove = new ArrayList<ResolveInfo>();
- for (int i = 0; i < N; i++) {
- final ResolveInfo ri = lri.get(i);
- Intent rintent = new Intent(intent);
- rintent.setComponent(
- new ComponentName(
- ri.activityInfo.applicationInfo.packageName,
- ri.activityInfo.name));
- ActivityInfo info = rintent.resolveActivityInfo(pm, 0);
- String permission = info.permission;
- if(info.exported && (permission == null
- || checkCallingPermission(permission) == PackageManager.PERMISSION_GRANTED))
- items.add(ri.loadLabel(pm));
- else
- toRemove.add(ri);
- }
-
- for(ResolveInfo ri : toRemove){
- lri.remove(ri);
- }
-
- new AlertDialog.Builder(this)
- .setTitle(mContextText)
- .setIcon(mContextIcon)
- .setItems(items.toArray(new CharSequence[0]),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- final ResolveInfo ri = lri.get(item);
- Intent rintent = new Intent(intent)
- .setComponent(new ComponentName(
- ri.activityInfo.applicationInfo.packageName,
- ri.activityInfo.name));
- startActivity(rintent);
- }
- }).create()
- .show();
- }
- }
-
- private void includeInMediaScan() {
- // Delete the .nomedia file.
- File file = FileUtils.getFile(currentDirectory, NOMEDIA_FILE);
- if (file.delete()) {
- Toast.makeText(this, getString(R.string.media_scan_included), Toast.LENGTH_LONG).show();
- mNoMedia = false;
- } else {
- // That didn't work.
- Toast.makeText(this, getString(R.string.error_generic), Toast.LENGTH_LONG).show();
- }
- }
-
- private void excludeFromMediaScan() {
- // Create the .nomedia file.
- File file = FileUtils.getFile(currentDirectory, NOMEDIA_FILE);
- try {
- if (file.createNewFile()) {
- mNoMedia = true;
- Toast.makeText(this, getString(R.string.media_scan_excluded), Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(this, getString(R.string.error_media_scan), Toast.LENGTH_LONG).show();
- }
- } catch (IOException e) {
- // That didn't work.
- Toast.makeText(this, getString(R.string.error_generic) + e.getMessage(), Toast.LENGTH_LONG).show();
- }
- }
-
- private boolean checkSelection() {
- for (IconifiedText it : mDirectoryEntries) {
- if (!it.isSelected()) {
- continue;
- }
-
- return true;
- }
-
- Toast.makeText(this, R.string.error_selection, Toast.LENGTH_SHORT).show();
-
- return false;
- }
-
- private void toggleSelection(boolean selected) {
- for(IconifiedText it : mDirectoryEntries){
- it.setSelected(selected);
- }
-
- ((BaseAdapter) getListAdapter()).notifyDataSetChanged();
- }
-
- private void toggleCheckBoxVisibility(boolean visible) {
- for(IconifiedText it : mDirectoryEntries){
- it.setCheckIconVisible(visible);
- }
-
- ((BaseAdapter) getListAdapter()).notifyDataSetChanged();
- }
-
- private void promptDestinationAndMoveFile() {
-
- Intent intent = new Intent(FileManagerIntents.ACTION_PICK_DIRECTORY);
-
- intent.setData(FileUtils.getUri(currentDirectory));
-
- intent.putExtra(FileManagerIntents.EXTRA_TITLE, getString(R.string.move_title));
- intent.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, getString(R.string.move_button));
- intent.putExtra(FileManagerIntents.EXTRA_WRITEABLE_ONLY, true);
-
- startActivityForResult(intent, REQUEST_CODE_MOVE);
- }
-
- private void promptDestinationAndExtract() {
- Intent intent = new Intent(FileManagerIntents.ACTION_PICK_DIRECTORY);
- intent.setData(FileUtils.getUri(currentDirectory));
- intent.putExtra(FileManagerIntents.EXTRA_TITLE, getString(R.string.extract_title));
- intent.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, getString(R.string.extract_button));
- intent.putExtra(FileManagerIntents.EXTRA_WRITEABLE_ONLY, true);
- startActivityForResult(intent, REQUEST_CODE_EXTRACT);
- }
-
- private void promptDestinationAndCopyFile() {
-
- Intent intent = new Intent(FileManagerIntents.ACTION_PICK_DIRECTORY);
-
- intent.setData(FileUtils.getUri(currentDirectory));
-
- intent.putExtra(FileManagerIntents.EXTRA_TITLE, getString(R.string.copy_title));
- intent.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, getString(R.string.copy_button));
- intent.putExtra(FileManagerIntents.EXTRA_WRITEABLE_ONLY, true);
-
- startActivityForResult(intent, REQUEST_CODE_COPY);
- }
-
- /**
- * Starts activity for multi select.
- */
- private void promptMultiSelect() {
- Intent intent = new Intent(FileManagerIntents.ACTION_MULTI_SELECT);
-
- intent.setData(FileUtils.getUri(currentDirectory));
-
- intent.putExtra(FileManagerIntents.EXTRA_TITLE, getString(R.string.multiselect_title));
- //intent.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, getString(R.string.move_button));
-
- startActivityForResult(intent, REQUEST_CODE_MULTI_SELECT);
- }
-
- private void createNewFolder(String foldername) {
- if (!TextUtils.isEmpty(foldername)) {
- File file = FileUtils.getFile(currentDirectory, foldername);
- if (file.mkdirs()) {
-
- // Change into new directory:
- browseTo(file);
- } else {
- Toast.makeText(this, R.string.error_creating_new_folder, Toast.LENGTH_SHORT).show();
- }
- }
- }
-
- private void compressMultiFile(String out) {
- List<File> files = new ArrayList<File>();
- for (IconifiedText it : mDirectoryEntries) {
- if (!it.isSelected()) {
- continue;
- }
-
- File file = FileUtils.getFile(currentDirectory, it.getText());
- files.add(file);
- }
- new CompressManager(FileManagerActivity.this).compress(files, out);
- }
-
- /*! Recursively delete a directory and all of its children.
- * @params toastOnError If set to true, this function will toast if an error occurs.
- * @returns true if successful, false otherwise.
- */
- private boolean recursiveDelete(File file, boolean toastOnError) {
- // Recursively delete all contents.
- File[] files = file.listFiles();
-
- if (files == null) {
- Toast.makeText(this, getString(R.string.error_deleting_folder, file.getAbsolutePath()), Toast.LENGTH_LONG);
- return false;
- }
-
- for (int x=0; x<files.length; x++) {
- File childFile = files[x];
- if (childFile.isDirectory()) {
- if (!recursiveDelete(childFile, toastOnError)) {
- return false;
- }
- } else {
- if (!childFile.delete()) {
- Toast.makeText(this, getString(R.string.error_deleting_child_file, childFile.getAbsolutePath()), Toast.LENGTH_LONG);
- return false;
- }
- }
- }
-
- if (!file.delete()) {
- Toast.makeText(this, getString(R.string.error_deleting_folder, file.getAbsolutePath()), Toast.LENGTH_LONG);
- return false;
- }
-
- return true;
- }
-
- private class RecursiveDeleteTask extends AsyncTask<Object, Void, Integer> {
-
- private FileManagerActivity activity = FileManagerActivity.this;
- private static final int success = 0;
- private static final int err_deleting_folder = 1;
- private static final int err_deleting_child_file = 2;
- private static final int err_deleting_file = 3;
-
- private File errorFile;
-
- /**
- * Recursively delete a file or directory and all of its children.
- *
- * @returns 0 if successful, error value otherwise.
- */
- private int recursiveDelete(File file) {
- if (file.isDirectory() && file.listFiles() != null)
- for (File childFile : file.listFiles()) {
- if (childFile.isDirectory()) {
- int result = recursiveDelete(childFile);
- if (result > 0) {
- return result;
- }
- } else {
- if (!childFile.delete()) {
- errorFile = childFile;
- return err_deleting_child_file;
- }
- }
- }
-
- if (!file.delete()) {
- errorFile = file;
- return file.isFile() ? err_deleting_file : err_deleting_folder;
- }
-
- return success;
- }
-
- @Override
- protected void onPreExecute() {
- Toast.makeText(activity, R.string.deleting_files, Toast.LENGTH_SHORT).show();
- }
-
- @SuppressWarnings("unchecked")
- @Override
- protected Integer doInBackground(Object... params) {
- Object files = params[0];
-
- if (files instanceof List<?>) {
- for (File file: (List<File>)files) {
- int result = recursiveDelete(file);
- if (result != success) return result;
- }
- return success;
- } else
- return recursiveDelete((File)files);
-
- }
-
- @Override
- protected void onPostExecute(Integer result) {
- switch (result) {
- case success:
- activity.refreshList();
- if(deletedFileIsDirectory){
- Toast.makeText(activity, R.string.folder_deleted,Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(activity, R.string.file_deleted,Toast.LENGTH_SHORT).show();
- }
- break;
- case err_deleting_folder:
- Toast.makeText(activity,getString(R.string.error_deleting_folder,
- errorFile.getAbsolutePath()), Toast.LENGTH_LONG).show();
- break;
- case err_deleting_child_file:
- Toast.makeText(activity,getString(R.string.error_deleting_child_file,
- errorFile.getAbsolutePath()),Toast.LENGTH_SHORT).show();
- break;
- case err_deleting_file:
- Toast.makeText(activity,getString(R.string.error_deleting_file,
- errorFile.getAbsolutePath()), Toast.LENGTH_LONG).show();
- break;
- }
- }
-
- }
-
- private void deleteFileOrFolder(File file) {
- fileDeleted = true;
- positionAtDelete = getListView().getFirstVisiblePosition();
- deletedFileIsDirectory = file.isDirectory();
- new RecursiveDeleteTask().execute(file);
-// if (file.isDirectory()) {
-// if (recursiveDelete(file, true)) {
-// refreshList();
-// Toast.makeText(this, R.string.folder_deleted, Toast.LENGTH_SHORT).show();
-// }
-// } else {
-// if (file.delete()) {
-// // Delete was successful.
-// refreshList();
-// Toast.makeText(this, R.string.file_deleted, Toast.LENGTH_SHORT).show();
-// } else {
-// Toast.makeText(this, R.string.error_deleting_file, Toast.LENGTH_SHORT).show();
-// }
-// }
- }
-
- private void deleteMultiFile() {
-// int toast = 0;
- LinkedList<File> files = new LinkedList<File>();
- for (IconifiedText it : mDirectoryEntries) {
- if (!it.isSelected()) {
- continue;
- }
-
- File file = FileUtils.getFile(currentDirectory, it.getText());
- files.add(file);
-// if (file.isDirectory()) {
-// if (!recursiveDelete(file, true)) {
-// break;
-// }
-// } else {
-// if (!file.delete()) {
-// toast = R.string.error_deleting_file;
-// break;
-// }
-// }
- }
-
- new RecursiveDeleteTask().execute(files);
-
-// if (toast == 0) {
-// // Delete was successful.
-// refreshList();
-// toast = R.string.file_deleted;
-// }
-//
-// Toast.makeText(FileManagerActivity.this, toast, Toast.LENGTH_SHORT).show();
- }
-
- private void renameFileOrFolder(File file, String newFileName) {
- mOldFileName = file.getName();
- mNewFileName = newFileName;
- mDialogArgument = mNewFileName;
- if (newFileName != null && newFileName.length() > 0){
- if (!file.isDirectory() && !FileUtils.getExtension(newFileName).equals(FileUtils.getExtension(file.getName()))){
- showDialog(DIALOG_CHANGE_FILE_EXTENSION);
- return;
- }
- }
- File newFile = FileUtils.getFile(currentDirectory, newFileName);
- if (newFile.exists()){
- mDialogExistsAction = DIALOG_EXISTS_ACTION_RENAME;
- showDialog(DIALOG_WARNING_EXISTS);
- } else {
- rename(file, newFile);
- }
- }
-
- /**
- * @param oldFile
- * @param newFile
- */
- private void rename(File oldFile, File newFile) {
- int toast = 0;
- if (oldFile.renameTo(newFile)) {
- // Rename was successful.
- refreshList();
- if (newFile.isDirectory()) {
- toast = R.string.folder_renamed;
- } else {
- toast = R.string.file_renamed;
- }
- } else {
- if (newFile.isDirectory()) {
- toast = R.string.error_renaming_folder;
- } else {
- toast = R.string.error_renaming_file;
- }
- }
- Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
- }
-
- /*@ RETURNS: A file name that is guaranteed to not exist yet.
- *
- * PARAMS:
- * context - Application context.
- * path - The path that the file is supposed to be in.
- * fileName - Desired file name. This name will be modified to
- * create a unique file if necessary.
- *
- */
- private File createUniqueCopyName(Context context, File path, String fileName) {
- // Does that file exist?
- File file = FileUtils.getFile(path, fileName);
-
- if (!file.exists()) {
- // Nope - we can take that.
- return file;
- }
-
- // Split file's name and extension to fix internationalization issue #307
- int fromIndex = fileName.lastIndexOf(FILE_EXTENSION_SEPARATOR);
- String extension = "";
- if (fromIndex > 0) {
- extension = fileName.substring(fromIndex);
- fileName = fileName.substring(0, fromIndex);
- }
-
- // Try a simple "copy of".
- file = FileUtils.getFile(path, context.getString(R.string.copied_file_name, fileName).concat(extension));
-
- if (!file.exists()) {
- // Nope - we can take that.
- return file;
- }
-
- int copyIndex = 2;
-
- // Well, we gotta find a unique name at some point.
- while (copyIndex < 500) {
- file = FileUtils.getFile(path, context.getString(R.string.copied_file_name_2, copyIndex, fileName).concat(extension));
-
- if (!file.exists()) {
- // Nope - we can take that.
- return file;
- }
-
- copyIndex++;
- }
-
- // I GIVE UP.
- return null;
- }
-
- private boolean copy(File oldFile, File newFile) {
- try {
- FileInputStream input = new FileInputStream(oldFile);
- FileOutputStream output = new FileOutputStream(newFile);
-
- byte[] buffer = new byte[COPY_BUFFER_SIZE];
-
- while (true) {
- int bytes = input.read(buffer);
-
- if (bytes <= 0) {
- break;
- }
-
- output.write(buffer, 0, bytes);
- }
-
- output.close();
- input.close();
-
- } catch (Exception e) {
- return false;
- }
- return true;
- }
-
- private void sendFile(File file) {
-
- String filename = file.getName();
- String content = "hh";
-
- Log.i(TAG, "Title to send: " + filename);
- Log.i(TAG, "Content to send: " + content);
-
- Intent i = new Intent();
- i.setAction(Intent.ACTION_SEND);
- i.setType(mMimeTypes.getMimeType(file.getName()));
- i.putExtra(Intent.EXTRA_SUBJECT, filename);
- //i.putExtra(Intent.EXTRA_STREAM, FileUtils.getUri(file));
- i.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + FileManagerProvider.AUTHORITY + file.getAbsolutePath()));
-
- i = Intent.createChooser(i, getString(R.string.menu_send));
-
- try {
- startActivity(i);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(this, R.string.send_not_available,
- Toast.LENGTH_SHORT).show();
- Log.e(TAG, "Email client not installed");
- }
- }
-
- // This code seems to work for SDK 2.3 (target="9")
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
-
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (mStepsBack > 0) {
- upOneLevel();
- return true;
- }
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
- // For targetSdkVersion="5" or higher, one needs to use the following code instead of the one above:
- // (See http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html )
-
- /*
- //@Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
- && keyCode == KeyEvent.KEYCODE_BACK
- && event.getRepeatCount() == 0) {
- // Take care of calling this method on earlier versions of
- // the platform where it doesn't exist.
- onBackPressed();
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
- //@Override
- public void onBackPressed() {
- // This will be called either automatically for you on 2.0
- // or later, or by the code above on earlier versions of the
- // platform.
- if (mStepsBack > 0) {
- upOneLevel();
- } else {
- finish();
- }
- }
- */
-
- /**
- * This is called after the file manager finished.
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
-
- switch (requestCode) {
- case REQUEST_CODE_MOVE:
- if (resultCode == RESULT_OK && data != null) {
- // obtain the filename
- File movefrom = mContextFile;
- File moveto = FileUtils.getFile(data.getData());
- if (moveto != null) {
- if (mState != STATE_MULTI_SELECT) {
- // Move single file.
- moveto = FileUtils.getFile(moveto, movefrom.getName());
- int toast = 0;
- if (movefrom.renameTo(moveto)) {
- // Move was successful.
- refreshList();
- if (moveto.isDirectory()) {
- toast = R.string.folder_moved;
- } else {
- toast = R.string.file_moved;
- }
- } else {
- if (moveto.isDirectory()) {
- toast = R.string.error_moving_folder;
- } else {
- toast = R.string.error_moving_file;
- }
- }
- Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
- } else {
- // Move multi file.
- int toast = 0;
- for (IconifiedText it : mDirectoryEntries) {
- if (!it.isSelected()) {
- continue;
- }
-
- movefrom = FileUtils.getFile(currentDirectory, it.getText());
- File newPath = FileUtils.getFile(moveto, movefrom.getName());
- if (!movefrom.renameTo(newPath)) {
- refreshList();
- if (moveto.isDirectory()) {
- toast = R.string.error_moving_folder;
- } else {
- toast = R.string.error_moving_file;
- }
- break;
- }
- }
-
- if (toast == 0) {
- // Move was successful.
- refreshList();
- toast = R.string.file_moved;
- }
-
- Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
-
- Intent intent = getIntent();
- setResult(RESULT_OK, intent);
- finish();
- }
-
- }
-
- }
- break;
-
- case REQUEST_CODE_EXTRACT:
- if (resultCode == RESULT_OK && data != null) {
- new ExtractManager(this).extract(mContextFile, data.getData().getPath());
- }
- break;
-
- case REQUEST_CODE_COPY:
- if (resultCode == RESULT_OK && data != null) {
- // obtain the filename
- File copyfrom = mContextFile;
- File copyto = FileUtils.getFile(data.getData());
- if (copyto != null) {
- if (mState != STATE_MULTI_SELECT) {
- // Copy single file.
- copyto = createUniqueCopyName(this, copyto, copyfrom.getName());
-
- if (copyto != null) {
- int toast = 0;
- if (copy(copyfrom, copyto)) {
- toast = R.string.file_copied;
- refreshList();
- } else {
- toast = R.string.error_copying_file;
- }
- Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
- }
- } else {
- // Copy multi file.
- int toast = 0;
- for (IconifiedText it : mDirectoryEntries) {
- if (!it.isSelected()) {
- continue;
- }
-
- copyfrom = FileUtils.getFile(currentDirectory, it.getText());
- File newPath = createUniqueCopyName(this, copyto, copyfrom.getName());
- if (copyto != null) {
- if (!copy(copyfrom, newPath)) {
- toast = R.string.error_copying_file;
- break;
- }
- }
- }
-
- if (toast == 0) {
- // Copy was successful.
- toast = R.string.file_copied;
- refreshList();
- }
-
- Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
-
- Intent intent = getIntent();
- setResult(RESULT_OK, intent);
- finish();
- }
- }
- }
- break;
-
- case REQUEST_CODE_MULTI_SELECT:
- if (resultCode == RESULT_OK && data != null) {
- refreshList();
- }
- break;
- }
-
- }
-
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- if (//When the user chooses to show/hide hidden files, update the list
- //to correspond with the user's choice
- PreferenceActivity.PREFS_DISPLAYHIDDENFILES.equals(key)
- //When the user changes the sortBy settings, update the list
- || PreferenceActivity.PREFS_SORTBY.equals(key)
- || PreferenceActivity.PREFS_ASCENDING.equals(key)){
-
- refreshList();
- }
- }
-
-
-}