package org.ebookdroid.ui.library;
import org.ebookdroid.CodecType;
import org.emdev.ui.uimanager.IUIManager;
import org.emdev.ui.uimanager.UIManagerAppCompat;
import org.sufficientlysecure.viewer.R;
import org.ebookdroid.common.cache.CacheManager;
import org.ebookdroid.common.settings.LibSettings;
import org.ebookdroid.common.settings.SettingsManager;
import org.ebookdroid.common.settings.books.BookSettings;
import org.ebookdroid.common.settings.books.Bookmark;
import org.ebookdroid.ui.library.adapters.BookNode;
import org.ebookdroid.ui.library.adapters.BrowserAdapter;
import org.ebookdroid.ui.library.dialogs.FolderDlg;
import org.ebookdroid.ui.library.tasks.CopyBookTask;
import org.ebookdroid.ui.library.tasks.MoveBookTask;
import org.ebookdroid.ui.library.tasks.RenameBookTask;
import org.ebookdroid.ui.opds.OPDSActivity;
import org.ebookdroid.ui.settings.SettingsUI;
import org.ebookdroid.ui.viewer.ViewerActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.ImageView;
import java.io.File;
import java.io.FileFilter;
import java.util.Set;
import org.emdev.BaseDroidApp;
import org.emdev.common.android.AndroidVersion;
import org.emdev.common.filesystem.CompositeFilter;
import org.emdev.common.filesystem.DirectoryFilter;
import org.emdev.common.filesystem.PathFromUri;
import org.emdev.ui.AbstractActivityController;
import org.emdev.ui.actions.ActionDialogBuilder;
import org.emdev.ui.actions.ActionEx;
import org.emdev.ui.actions.ActionMenuHelper;
import org.emdev.ui.actions.ActionMethod;
import org.emdev.ui.actions.params.Constant;
import org.emdev.ui.actions.params.EditableValue;
import org.emdev.utils.CompareUtils;
import org.emdev.utils.FileUtils;
import org.emdev.utils.LengthUtils;
public class BrowserActivityController extends AbstractActivityController<BrowserActivity> implements IBrowserActivity {
private static final String CURRENT_DIRECTORY = "currentDirectory";
FileFilter filter;
BrowserAdapter adapter;
public BrowserActivityController(final BrowserActivity activity) {
super(activity, BEFORE_CREATE, ON_POST_CREATE);
this.filter = new CompositeFilter(false, DirectoryFilter.NOT_HIDDEN, LibSettings.current().allowedFileTypes);
}
/**
* {@inheritDoc}
*
* @see org.emdev.ui.AbstractActivityController#beforeCreate(android.app.Activity)
*/
@Override
public void beforeCreate(final BrowserActivity activity) {
adapter = new BrowserAdapter(filter);
}
/**
* {@inheritDoc}
*
* @see org.emdev.ui.AbstractActivityController#onPostCreate(android.os.Bundle, boolean)
*/
@Override
public void onPostCreate(final Bundle savedInstanceState, final boolean recreated) {
if (recreated) {
return;
}
goHome(null);
final BrowserActivity activity = getManagedComponent();
final Uri data = activity.getIntent().getData();
if (data != null) {
setCurrentDir(new File(PathFromUri.retrieve(activity.getContentResolver(), data)));
} else if (savedInstanceState != null) {
final String absolutePath = savedInstanceState.getString(CURRENT_DIRECTORY);
if (absolutePath != null) {
setCurrentDir(new File(absolutePath));
}
} else {
final Set<String> dirs = LibSettings.current().autoScanDirs;
if (LengthUtils.isNotEmpty(dirs)) {
setCurrentDir(new File(dirs.iterator().next()));
}
}
showProgress(false);
}
public boolean onKeyUp(final int keyCode, final KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && !event.isCanceled()) {
final File dir = adapter.getCurrentDirectory();
final File parent = dir != null ? dir.getParentFile() : null;
if (parent != null) {
setCurrentDir(parent);
} else {
getManagedComponent().finish();
}
return true;
}
return false;
}
@ActionMethod(ids = R.id.browserhome)
public void goHome(final ActionEx action) {
if (BaseDroidApp.EXT_STORAGE.exists()) {
setCurrentDir(BaseDroidApp.EXT_STORAGE);
} else {
setCurrentDir(new File("/"));
}
}
@ActionMethod(ids = R.id.browserupfolder)
public void goUp(final ActionEx action) {
final File dir = adapter.getCurrentDirectory();
final File parent = dir != null ? dir.getParentFile() : null;
if (parent != null) {
setCurrentDir(parent);
}
}
@ActionMethod(ids = R.id.mainmenu_settings)
public void showSettings(final ActionEx action) {
SettingsUI.showAppSettings(getManagedComponent(), null);
}
@ActionMethod(ids = R.id.browserrecent)
public void goRecent(final ActionEx action) {
final BrowserActivity activity = getManagedComponent();
final Intent myIntent = new Intent(activity, RecentActivity.class);
activity.startActivity(myIntent);
activity.finish();
}
@ActionMethod(ids = R.id.mainmenu_opds)
public void goOPDSBrowser(final ActionEx action) {
final BrowserActivity activity = getManagedComponent();
final Intent myIntent = new Intent(activity, OPDSActivity.class);
activity.startActivity(myIntent);
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.library.IBrowserActivity#showDocument(android.net.Uri, org.ebookdroid.common.settings.books.Bookmark)
*/
@Override
public void showDocument(final Uri uri, final Bookmark b) {
final BrowserActivity activity = getManagedComponent();
final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setClass(activity, ViewerActivity.class);
if (b != null) {
intent.putExtra("pageIndex", "" + b.page.viewIndex);
intent.putExtra("offsetX", "" + b.offsetX);
intent.putExtra("offsetY", "" + b.offsetY);
}
activity.startActivity(intent);
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.library.IBrowserActivity#setCurrentDir(java.io.File)
*/
@Override
public void setCurrentDir(final File newDir) {
adapter.setCurrentDirectory(newDir);
getManagedComponent().setTitle(newDir);
}
/**
* {@inheritDoc}
*
* @see org.emdev.common.filesystem.FileSystemScanner.ProgressListener#showProgress(boolean)
*/
@Override
public void showProgress(final boolean show) {
final BrowserActivity activity = getManagedComponent();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
UIManagerAppCompat.setProgressSpinnerVisible(activity, show);
}
});
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.library.IBrowserActivity#loadThumbnail(java.lang.String, android.widget.ImageView, int)
*/
@Override
public void loadThumbnail(final String path, final ImageView imageView, final int defaultResID) {
imageView.setImageResource(defaultResID);
}
@ActionMethod(ids = R.id.actions_goToBookmark)
public void openBook(final ActionEx action) {
final File file = action.getParameter(ActionMenuHelper.MENU_ITEM_SOURCE);
if (!file.isDirectory()) {
final Bookmark b = action.getParameter("bookmark");
showDocument(Uri.fromFile(file), b);
}
}
@ActionMethod(ids = R.id.bookmenu_removefromrecent)
public void removeBookFromRecents(final ActionEx action) {
final File file = action.getParameter(ActionMenuHelper.MENU_ITEM_SOURCE);
if (file != null) {
SettingsManager.removeBookFromRecents(file.getAbsolutePath());
adapter.notifyDataSetInvalidated();
}
}
@ActionMethod(ids = R.id.bookmenu_cleardata)
public void removeCachedBookFiles(final ActionEx action) {
final File file = action.getParameter(ActionMenuHelper.MENU_ITEM_SOURCE);
if (file != null) {
CacheManager.clear(file.getAbsolutePath());
adapter.notifyDataSetInvalidated();
}
}
@ActionMethod(ids = R.id.bookmenu_deletesettings)
public void removeBookSettings(final ActionEx action) {
final File file = action.getParameter(ActionMenuHelper.MENU_ITEM_SOURCE);
if (file != null) {
final BookSettings bs = SettingsManager.getBookSettings(file.getAbsolutePath());
if (bs != null) {
SettingsManager.deleteBookSettings(bs);
adapter.notifyDataSetInvalidated();
}
}
}
@ActionMethod(ids = { R.id.bookmenu_copy, R.id.bookmenu_move })
public void copyBook(final ActionEx action) {
final File file = action.getParameter("source");
if (file == null) {
return;
}
final boolean isCopy = action.id == R.id.bookmenu_copy;
final int titleId = isCopy ? R.string.copy_book_to_dlg_title : R.string.move_book_to_dlg_title;
final int id = isCopy ? R.id.actions_doCopyBook : R.id.actions_doMoveBook;
getOrCreateAction(id).putValue("source", file);
final FolderDlg dlg = new FolderDlg(this);
dlg.show(new File(file.getAbsolutePath()), titleId, id);
}
@ActionMethod(ids = R.id.actions_doCopyBook)
public void doCopyBook(final ActionEx action) {
final File targetFolder = action.getParameter(FolderDlg.SELECTED_FOLDER);
final File book = action.getParameter("source");
final BookNode node = new BookNode(book, SettingsManager.getBookSettings(book.getAbsolutePath()));
new CopyBookTask(this.getManagedComponent(), null, targetFolder).execute(node);
}
@ActionMethod(ids = R.id.actions_doMoveBook)
public void doMoveBook(final ActionEx action) {
final File targetFolder = action.getParameter(FolderDlg.SELECTED_FOLDER);
final File book = action.getParameter("source");
final BookNode node = new BookNode(book, SettingsManager.getBookSettings(book.getAbsolutePath()));
new MoveBookTask(this.getContext(), null, targetFolder) {
@Override
protected void processTargetFile(final File target) {
super.processTargetFile(target);
adapter.remove(origin);
}
}.execute(node);
}
@ActionMethod(ids = R.id.bookmenu_rename)
public void renameBook(final ActionEx action) {
final File file = action.getParameter("source");
if (file == null) {
return;
}
final FileUtils.FilePath path = FileUtils.parseFilePath(file.getAbsolutePath(), CodecType.getAllExtensions());
final EditText input = new AppCompatEditText(getManagedComponent());
input.setSingleLine();
input.setText(path.name);
input.selectAll();
final ActionDialogBuilder builder = new ActionDialogBuilder(this.getManagedComponent(), this);
builder.setTitle(R.string.book_rename_title);
builder.setMessage(R.string.book_rename_msg);
builder.setView(input);
builder.setPositiveButton(R.id.actions_doRenameBook, new Constant("source", file), new Constant("file", path),
new EditableValue("input", input));
builder.setNegativeButton().show();
}
@ActionMethod(ids = R.id.actions_doRenameBook)
public void doRenameBook(final ActionEx action) {
final File book = action.getParameter("source");
final BookNode node = new BookNode(book, SettingsManager.getBookSettings(book.getAbsolutePath()));
final FileUtils.FilePath path = action.getParameter("file");
final Editable value = action.getParameter("input");
final String newName = value.toString();
if (!CompareUtils.equals(path.name, newName)) {
path.name = newName;
new RenameBookTask(this.getContext(), null, path) {
@Override
protected void processTargetFile(final File target) {
super.processTargetFile(target);
adapter.remove(origin);
}
}.execute(node);
}
}
@ActionMethod(ids = R.id.bookmenu_delete)
public void deleteBook(final ActionEx action) {
final File file = action.getParameter("source");
if (file == null) {
return;
}
final ActionDialogBuilder builder = new ActionDialogBuilder(getContext(), this);
builder.setTitle(R.string.book_delete_title);
builder.setMessage(R.string.book_delete_msg);
builder.setPositiveButton(R.id.actions_doDeleteBook, new Constant("source", file));
builder.setNegativeButton().show();
}
@ActionMethod(ids = R.id.actions_doDeleteBook)
public void doDeleteBook(final ActionEx action) {
final File file = action.getParameter("source");
if (file == null) {
return;
}
if (file.delete()) {
CacheManager.clear(file.getAbsolutePath());
adapter.remove(file);
}
}
}