package com.openfarmanager.android.model; import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; import com.openfarmanager.android.App; import com.openfarmanager.android.R; import com.openfarmanager.android.core.archive.ArchiveUtils; import com.openfarmanager.android.filesystem.FileProxy; import com.openfarmanager.android.filesystem.FileSystemFile; import com.openfarmanager.android.filesystem.GoogleDriveFile; import java.io.File; import java.io.Serializable; import java.util.List; public enum FileActionEnum implements Parcelable, Serializable { INFO, SEND, COPY, EDIT, DELETE, MOVE, NEW, SELECT, RENAME, FILE_OPEN_WITH, ARCHIVE_EXTRACT, CREATE_BOOKMARK, CREATE_ARCHIVE, OPEN, SET_AS_HOME, EXPORT_AS, OPEN_WEB, SHARE, COPY_PATH, ADD_STAR, REMOVE_STAR; private static FileActionEnum[] sActionsForMultipleSelectedItems = new FileActionEnum[] {COPY, SET_AS_HOME, MOVE, DELETE, CREATE_ARCHIVE}; private static FileActionEnum[] sActionsForDirectory = new FileActionEnum[] {INFO, SET_AS_HOME, COPY, MOVE, DELETE, RENAME, COPY_PATH, CREATE_ARCHIVE}; private static FileActionEnum[] sActionsForFile = new FileActionEnum[] {INFO, SET_AS_HOME, SEND, COPY, MOVE, DELETE, EDIT, RENAME, COPY_PATH, FILE_OPEN_WITH, CREATE_ARCHIVE}; private static FileActionEnum[] sActionsForNetwork = new FileActionEnum[] {COPY, MOVE, DELETE, RENAME}; // google drive private static FileActionEnum[] sActionsForNetworkWithExport = new FileActionEnum[] {COPY, MOVE, EXPORT_AS, DELETE, RENAME}; private static FileActionEnum[] sActionsForNetworkWithOpenWith = new FileActionEnum[] {COPY, MOVE, OPEN_WEB, DELETE, RENAME}; private static FileActionEnum[] sActionsForNetworkWithExportAndOpenWith = new FileActionEnum[] {COPY, MOVE, EXPORT_AS, OPEN_WEB, DELETE, RENAME}; public static FileActionEnum[] getAvailableActionsForNetwork(NetworkEnum networkType, List<FileProxy> selectedFiles) { FileActionEnum[] actionEnums = selectActionsForNetwork(networkType, selectedFiles); if (selectedFiles.size() == 1) { FileActionEnum[] actions = new FileActionEnum[actionEnums.length + 1]; System.arraycopy(actionEnums, 0, actions, 0, actionEnums.length); actions[actionEnums.length] = COPY_PATH; return actions; } return actionEnums; } private static FileActionEnum[] selectActionsForNetwork(NetworkEnum networkType, List<FileProxy> selectedFiles) { boolean isSingleFileSelected = selectedFiles != null && selectedFiles.size() == 1; if (networkType == NetworkEnum.GoogleDrive && isSingleFileSelected) { GoogleDriveFile file = (GoogleDriveFile) selectedFiles.get(0); boolean provideExport = file.getExportLinks() != null && file.getExportLinks().size() > 0; boolean provideOpenWith = file.hasOpenWithLink(); FileActionEnum[] actions = null; if (provideExport && provideOpenWith) { actions = sActionsForNetworkWithExportAndOpenWith; } else if (provideExport) { actions = sActionsForNetworkWithExport; } else if (provideOpenWith) { actions = sActionsForNetworkWithOpenWith; } else { actions = sActionsForNetwork; } if (actions != null) { FileActionEnum[] allActions = new FileActionEnum[actions.length + 1]; System.arraycopy(actions, 0, allActions, 0, 2); allActions[2] = file.isStarred() ? REMOVE_STAR : ADD_STAR; System.arraycopy(actions, 2, allActions, 3, actions.length - 2); return allActions; } } else if (networkType == NetworkEnum.Dropbox && isSingleFileSelected) { FileActionEnum[] allActions = new FileActionEnum[sActionsForNetwork.length + 1]; allActions[0] = SHARE; System.arraycopy(sActionsForNetwork, 0, allActions, 1, sActionsForNetwork.length); return allActions; } return sActionsForNetwork; } public static FileActionEnum[] getAvailableActions(List<File> selectedFiles, File lastSelectedFile) { boolean oneFileSelected = selectedFiles.size() == 1 && (lastSelectedFile != null && lastSelectedFile.isFile()); FileActionEnum[] actions; if (selectedFiles.size() == 1 && lastSelectedFile instanceof FileSystemFile) { FileSystemFile file = (FileSystemFile) lastSelectedFile; if (file.isBookmark()) { actions = new FileActionEnum[1]; //actions[0] = RENAME; actions[0] = DELETE; return actions; } } if (oneFileSelected) { boolean extractSupport = ArchiveUtils.isArchiveSupported(lastSelectedFile) || ArchiveUtils.isCompressionSupported(lastSelectedFile); if (extractSupport) { actions = new FileActionEnum[sActionsForFile.length + 1]; System.arraycopy(sActionsForFile, 0, actions, 0, sActionsForFile.length); actions[sActionsForFile.length] = FileActionEnum.ARCHIVE_EXTRACT; } else { actions = sActionsForFile; } } else { actions = selectedFiles.size() == 1 ? sActionsForDirectory : sActionsForMultipleSelectedItems; } return actions; } public String getName() { Resources res = App.sInstance.getResources(); switch (this) { case INFO: return res.getString(R.string.action_info); case SET_AS_HOME: return res.getString(R.string.action_set_as_home); case SEND: return res.getString(R.string.action_send); case COPY: return res.getString(R.string.action_copy); case EDIT: return res.getString(R.string.action_edit); case DELETE: return res.getString(R.string.action_delete); case MOVE: return res.getString(R.string.action_move); case RENAME: return res.getString(R.string.action_rename); case FILE_OPEN_WITH: return res.getString(R.string.action_open_with); case ARCHIVE_EXTRACT: return res.getString(R.string.action_archive_extract); case CREATE_ARCHIVE: return res.getString(R.string.action_create_archive); case OPEN: return res.getString(R.string.action_open); case EXPORT_AS: return res.getString(R.string.export_as); case OPEN_WEB: return res.getString(R.string.open_with); case SHARE: return res.getString(R.string.action_share); case ADD_STAR: return res.getString(R.string.add_star); case REMOVE_STAR: return res.getString(R.string.remove_star); case COPY_PATH: return res.getString(R.string.action_copy_path); } return ""; } public static String[] names(FileActionEnum[] actions) { String[] names = new String[actions.length]; int i = 0; for (FileActionEnum action : actions) { names[i++] = action.getName(); } return names; } public static final Parcelable.Creator<FileActionEnum> CREATOR = new Parcelable.Creator<FileActionEnum>() { public FileActionEnum createFromParcel(Parcel source) { return FileActionEnum.values()[source.readInt()]; } public FileActionEnum[] newArray(int size) { throw new UnsupportedOperationException(); } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeInt(ordinal()); } }