package com.openfarmanager.android.fragments; import android.app.Activity; import android.app.Dialog; import android.content.Intent; import android.os.Build; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentManager; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.WindowManager; import com.openfarmanager.android.App; import com.openfarmanager.android.R; import com.openfarmanager.android.core.AbstractCommand; import com.openfarmanager.android.core.CancelableCommand; import com.openfarmanager.android.core.archive.ArchiveScanner; import com.openfarmanager.android.dialogs.CopyMoveFileDialog; import com.openfarmanager.android.dialogs.CreateArchiveDialog; import com.openfarmanager.android.dialogs.ExtractArchiveDialog; import com.openfarmanager.android.filesystem.FileProxy; import com.openfarmanager.android.filesystem.actions.multi.network.CopyFromNetworkMultiTask; import com.openfarmanager.android.filesystem.actions.multi.network.CopyToNetworkMultiTask; import com.openfarmanager.android.filesystem.actions.network.CopyFromNetworkTask; import com.openfarmanager.android.filesystem.actions.network.CopyToNetworkTask; import com.openfarmanager.android.filesystem.commands.CopyCommand; import com.openfarmanager.android.filesystem.commands.CopyFromNetworkCommand; import com.openfarmanager.android.filesystem.commands.CopyToNetworkCommand; import com.openfarmanager.android.filesystem.commands.CreateArchiveCommand; import com.openfarmanager.android.filesystem.commands.ExtractArchiveCommand; import com.openfarmanager.android.filesystem.commands.MoveCommand; import com.openfarmanager.android.filesystem.commands.MoveFromNetworkCommand; import com.openfarmanager.android.filesystem.commands.MoveToNetworkCommand; import com.openfarmanager.android.filesystem.commands.RenameCommand; import com.openfarmanager.android.filesystem.commands.RenameOnNetworkCommand; import com.openfarmanager.android.model.NetworkEnum; import com.openfarmanager.android.model.SelectParams; import com.openfarmanager.android.utils.FileUtilsExt; import com.openfarmanager.android.utils.SystemUtils; import com.openfarmanager.android.view.OnSwipeTouchListener; import java.io.File; import java.util.HashMap; import java.util.List; import static com.openfarmanager.android.controllers.FileSystemController.ARG_EXPAND_LEFT_PANEL; import static com.openfarmanager.android.controllers.FileSystemController.ARG_EXPAND_RIGHT_PANEL; import static com.openfarmanager.android.controllers.FileSystemController.EXPAND_PANEL; import static com.openfarmanager.android.controllers.FileSystemController.GAIN_FOCUS; /** * @author Vlad Namashko */ @SuppressWarnings("ConstantConditions") public abstract class BaseFileSystemPanel extends BasePanel { public static final String ARG_PANEL_LOCATION = "arg_panel_location"; public static final int REQUEST_CODE_REQUEST_PERMISSION = 442; protected File mLastSelectedFile; // TODO: temp protected String mEncryptedArchivePassword; protected ExtractArchiveDialog.ExtractArchiveResult mExtractArchiveResult; protected Handler mHandler; protected boolean mIsActivePanel; // protected int mPanelLocation = -1; protected HashMap<String, Integer> mDirectorySelection = new HashMap<String, Integer>(); public void setupGestures(RecyclerView view) { view.addOnItemTouchListener(new OnSwipeTouchListener(view.getContext()) { public void onTouch() { gainFocus(); } public void onSwipeLeft() { if (App.sInstance.getSettings().isFlexiblePanelsMode()) { mHandler.sendMessage(mHandler.obtainMessage(EXPAND_PANEL, ARG_EXPAND_RIGHT_PANEL, 0)); } } public void onSwipeRight() { if (App.sInstance.getSettings().isFlexiblePanelsMode()) { mHandler.sendMessage(mHandler.obtainMessage(EXPAND_PANEL, ARG_EXPAND_LEFT_PANEL, 0)); } } }); } public FragmentManager fragmentManager() throws Exception { Activity parent = getActivity(); FragmentManager result = null; if (parent != null) { if (!parent.isFinishing()) { result = getActivity().getSupportFragmentManager(); } } else { result = getFragmentManager(); } if (result == null) { throw new NullPointerException(); } return result; } public void gainFocus() { if (mHandler != null) { Message message = mHandler.obtainMessage(); message.what = GAIN_FOCUS; message.arg1 = getPanelLocation(); mHandler.sendMessage(message); } } public int getPanelLocation() { return getArguments().getInt(ARG_PANEL_LOCATION); } /** * To be overriden in sub classes. * * @return null */ protected String getArchivePassword() { return mEncryptedArchivePassword; } /** * To be overriden in sub classes. * * @return null */ public ArchiveScanner.File getCurrentArchiveItem() { return null; } public AbstractCommand getCopyToCommand(MainPanel inactivePanel, File destination) { if (inactivePanel instanceof NetworkPanel) { return new CopyToNetworkCommand((MainPanel) this, (NetworkPanel) inactivePanel); } if (this instanceof NetworkPanel) { return new CopyFromNetworkCommand((NetworkPanel) this, inactivePanel); } return new CopyCommand((MainPanel) this, destination); } public AbstractCommand getMoveCommand(MainPanel inactivePanel, CopyMoveFileDialog.CopyMoveFileResult result) { if (result.isRename) { if (this instanceof NetworkPanel) { return new RenameOnNetworkCommand(this, result.destination, getLastSelectedFile()); } else { return new MoveCommand((MainPanel) this, result.inactivePanel.getCurrentDir(), result.destination, result.isRename, mLastSelectedFile); } } if (inactivePanel instanceof NetworkPanel) { return new MoveToNetworkCommand((MainPanel) this, (NetworkPanel) inactivePanel); } else if (this instanceof NetworkPanel) { return new MoveFromNetworkCommand((NetworkPanel) this, inactivePanel); } return new MoveCommand((MainPanel) this, result.inactivePanel.getCurrentDir(), result.destination, result.isRename, mLastSelectedFile); } protected AbstractCommand getCreateArchiveCommand(CreateArchiveDialog.CreateArchiveResult createArchiveResult) { return new CreateArchiveCommand((MainPanel) this, FileUtilsExt.addSeparatorToTheEnd(getCurrentDir().getAbsolutePath()) + createArchiveResult.archiveName, createArchiveResult.archiveType, createArchiveResult.isCompressionEnabled, createArchiveResult.compression); } protected AbstractCommand getExtractArchiveCommand(ExtractArchiveDialog.ExtractArchiveResult result, String password) { return new ExtractArchiveCommand((MainPanel) this, mLastSelectedFile, new File(result.destination), result.isCompressed, password, getCurrentArchiveItem()); } protected AbstractCommand mSelectFilesCommand = (AbstractCommand) args -> select((SelectParams) args[0]); protected CancelableCommand mRequestPasswordCommand = new CancelableCommand() { @Override public void execute(final Object... args) { mEncryptedArchivePassword = (String) args[0]; getExtractArchiveCommand(mExtractArchiveResult, mEncryptedArchivePassword).execute(); mEncryptedArchivePassword = null; } @Override public void cancel() { } }; public void requestSdcardPermission() { if (Build.VERSION.SDK_INT >= 21) { try { RequestPermissionFragment.newInstance(getString(R.string.sd_card_access_request), new YesNoDialog.YesNoDialogListener() { @Override public void yes() { try { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, REQUEST_CODE_REQUEST_PERMISSION); } catch (Exception e) { // unexpected case, just ignore it e.printStackTrace(); } } @Override public void no() { } }).show(fragmentManager(), "errorDialog"); } catch (Exception ignore) {} } } protected void adjustDialogSize(Dialog dialog) { adjustDialogSize(dialog, 0.8f); } /** * Adjust dialog size. Actuall for old android version only (due to absence of Holo themes). * * @param dialog dialog whose size should be adjusted. */ protected void adjustDialogSize(Dialog dialog, float scaleFactor) { if (!SystemUtils.isHoneycombOrNever()) { DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.copyFrom(dialog.getWindow().getAttributes()); params.width = (int) (metrics.widthPixels * scaleFactor); params.height = (int) (metrics.heightPixels * scaleFactor); dialog.getWindow().setAttributes(params); } } public abstract FileProxy getLastSelectedFile(); public abstract List<FileProxy> getSelectedFileProxies(); public abstract List<File> getSelectedFiles(); public abstract File getCurrentDir(); protected abstract String getCurrentPath(); public abstract int select(SelectParams selectParams); public abstract void openDirectory(String path); protected abstract void invalidatePanels(MainPanel inactivePanel); protected abstract void invalidatePanels(MainPanel inactivePanel, boolean force); }