package com.mercandalli.android.apps.files.file.local; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.support.v7.widget.PopupMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.apps.files.common.listener.IListener; import com.mercandalli.android.apps.files.file.FileManager; import com.mercandalli.android.apps.files.file.FileModel; import com.mercandalli.android.library.base.dialog.DialogUtils; import com.mercandalli.android.library.base.precondition.Preconditions; /** * A simple class that open a Dialog with the actions related to the {@link FileModel}. */ public class FileLocalOverflowActions implements PopupMenu.OnMenuItemClickListener { private final Activity mActivity; private final String mUploadString; private final String mRenameString; private final String mDeleteString; private final String mPropertiesString; private final FileManager mFileManager; private final FileLocalActionCallback mFileLocalActionCallback; private FileModel mFileModel; private boolean mShowCopyCut = true; public FileLocalOverflowActions( final Context context, final FileLocalActionCallback fileLocalActionCallback) { Preconditions.checkNotNull(context); Preconditions.checkNotNull(fileLocalActionCallback); mActivity = (Activity) context; mFileLocalActionCallback = fileLocalActionCallback; mFileManager = FileManager.getInstance(context); mUploadString = context.getString(R.string.upload); mRenameString = context.getString(R.string.rename); mDeleteString = context.getString(R.string.delete); mPropertiesString = context.getString(R.string.properties); } @Override public boolean onMenuItemClick(final MenuItem item) { final int itemId = item.getItemId(); switch (itemId) { case R.id.popup_overflow_file_upload: upload(mFileModel); return true; case R.id.popup_overflow_file_open_as: openAs(mFileModel); return true; case R.id.popup_overflow_file_rename: rename(mFileModel); return true; case R.id.popup_overflow_file_delete: delete(mFileModel); return true; case R.id.popup_overflow_file_copy: copy(mFileModel); return true; case R.id.popup_overflow_file_cut: cut(mFileModel); return true; case R.id.popup_overflow_file_properties: properties(mFileModel); return true; } return false; } /** * Show the {@link AlertDialog}. */ public void show( final FileModel fileModel, final View overflow, final boolean isLogged) { Preconditions.checkNotNull(fileModel); mFileModel = fileModel; final PopupMenu popupMenu = new PopupMenu(mActivity, overflow); popupMenu.getMenuInflater().inflate(R.menu.popup_overflow_file, popupMenu.getMenu()); final Menu menu = popupMenu.getMenu(); for (int i = 0, size = menu.size(); i < size; i++) { final MenuItem menuItem = menu.getItem(i); final int currentId = menuItem.getItemId(); if (currentId == R.id.popup_overflow_file_upload && !isLogged) { menuItem.setVisible(false); } else if (currentId == R.id.popup_overflow_file_open_as && fileModel.isDirectory()) { menuItem.setVisible(false); } else if (currentId == R.id.popup_overflow_file_copy && !mShowCopyCut) { menuItem.setVisible(false); } else if (currentId == R.id.popup_overflow_file_cut && !mShowCopyCut) { menuItem.setVisible(false); } } popupMenu.setOnMenuItemClickListener(this); popupMenu.show(); } public void setShowCopyCut(boolean showCopyCut) { mShowCopyCut = showCopyCut; } //region Actions private void upload(final FileModel fileModel) { if (fileModel.isDirectory()) { Toast.makeText(mActivity, mActivity.getString(R.string.not_implemented), Toast.LENGTH_SHORT).show(); } else { DialogUtils.alert( mActivity, mUploadString, "Upload file " + fileModel.getName(), mUploadString, new DialogUtils.OnDialogUtilsListener() { @Override public void onDialogUtilsCalledBack() { if (fileModel.getFile() != null) { mFileManager.upload(fileModel, -1, new IListener() { @Override public void execute() { mFileLocalActionCallback.refreshData(); } }); } } }, mActivity.getResources().getString(android.R.string.cancel), null); } } /** * Open local file as... (Open a dialog to select). * * @param fileModel The {@link FileModel} to open. */ private void openAs(final FileModel fileModel) { mFileManager.openLocalAs(mActivity, fileModel); } private void rename(final FileModel fileModel) { DialogUtils.prompt( mActivity, mRenameString, "Rename " + (fileModel.isDirectory() ? "directory" : "file") + " " + fileModel.getName() + " ?", "Ok", new DialogUtils.OnDialogUtilsStringListener() { @Override public void onDialogUtilsStringCalledBack(String text) { mFileManager.rename(fileModel, text, new IListener() { @Override public void execute() { if (mFileLocalActionCallback.isFileToCut()) { mFileLocalActionCallback.clearFileToCut(); mFileLocalActionCallback.refreshFab(); } if (mFileLocalActionCallback.isFileToCopy()) { mFileLocalActionCallback.clearFileToCopy(); mFileLocalActionCallback.refreshFab(); } mFileLocalActionCallback.refreshData(); } }); } }, mActivity.getResources().getString(android.R.string.cancel), null, fileModel.getFullName()); } private void delete(final FileModel fileModel) { DialogUtils.alert( mActivity, mDeleteString, "Delete " + (fileModel.isDirectory() ? "directory" : "file") + " " + fileModel.getName() + " ?", mActivity.getResources().getString(android.R.string.yes), new DialogUtils.OnDialogUtilsListener() { @Override public void onDialogUtilsCalledBack() { mFileManager.delete(fileModel, new IListener() { @Override public void execute() { if (mFileLocalActionCallback.isFileToCut()) { mFileLocalActionCallback.clearFileToCut(); mFileLocalActionCallback.refreshFab(); } if (mFileLocalActionCallback.isFileToCopy()) { mFileLocalActionCallback.clearFileToCopy(); mFileLocalActionCallback.refreshFab(); } mFileLocalActionCallback.refreshData(); } }); } }, mActivity.getResources().getString(android.R.string.no), null); } private void copy(final FileModel fileModel) { mFileLocalActionCallback.addCopyFile(fileModel); Toast.makeText(mActivity, "File ready to copy.", Toast.LENGTH_SHORT).show(); mFileLocalActionCallback.refreshFab(); } private void cut(final FileModel fileModel) { mFileLocalActionCallback.addCutFile(fileModel); Toast.makeText(mActivity, "File ready to cut.", Toast.LENGTH_SHORT).show(); mFileLocalActionCallback.refreshFab(); } private void properties(final FileModel fileModel) { DialogUtils.alert(mActivity, mPropertiesString + " : " + fileModel.getName(), mFileManager.toSpanned(mActivity, fileModel), "OK", null, null, null); } //endregion Actions /** * An interface to provide methods to do actions (rename, cut...) */ /* package */ interface FileLocalActionCallback { void refreshFab(); void refreshData(); void addCopyFile(FileModel fileModel); void addCutFile(FileModel fileModel); boolean isFileToCut(); boolean isFileToCopy(); void clearFileToCut(); void clearFileToCopy(); } }