package com.openfarmanager.android.filesystem.actions; import android.content.Context; import android.content.DialogInterface; import android.net.Uri; import android.os.AsyncTask; import com.annimon.stream.Stream; import com.openfarmanager.android.App; import com.openfarmanager.android.core.bus.RxBus; import com.openfarmanager.android.core.bus.TaskCancelledEvent; import com.openfarmanager.android.core.bus.TaskErrorEvent; import com.openfarmanager.android.core.bus.TaskOkEvent; import com.openfarmanager.android.dialogs.FileActionProgressDialog; import com.openfarmanager.android.model.TaskStatusEnum; import com.openfarmanager.android.utils.FileUtilsExt; import com.openfarmanager.android.utils.StorageUtils; import java.io.File; import java.util.List; /** * @author Vlad Namashko */ public abstract class FileActionTask extends AsyncTask<Void, Integer, TaskStatusEnum> { protected final static byte[] BUFFER = new byte[2048 * 1024]; protected List<File> mItems; protected FileActionProgressDialog mProgressDialog; protected Context mContext; protected String mCurrentFile; protected long mTotalSize = 0; protected long mDoneSize = 0; protected boolean mNoProgress; protected String mSdCardPath; protected Uri mBaseUri; protected boolean mUseStorageApi; protected int mInvokedOnPanel; /** * Task start time in milliseconds. For debug purposes. */ protected long mTaskStartTime; public FileActionTask(Context context, int invokedOnPanel, List<File> items) { mContext = context; mInvokedOnPanel = invokedOnPanel; mItems = items; } protected FileActionTask() { } @Override protected void onPreExecute() { Stream.of(mItems).forEach(file -> mTotalSize += FileUtilsExt.sizeOf(file)); mProgressDialog = new FileActionProgressDialog(mContext, mProgressDialogDismissListener); mProgressDialog.setIndeterminate(mNoProgress); mProgressDialog.show(); super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { String currentName = mCurrentFile == null ? "" : mCurrentFile; mProgressDialog.updateProgress(currentName, values[0]); super.onProgressUpdate(values); } @Override protected void onPostExecute(TaskStatusEnum status) { try { mProgressDialog.dismiss(); } catch (Exception ignore) { } if (status == TaskStatusEnum.OK) { RxBus.getInstance().postEvent(new TaskOkEvent(mInvokedOnPanel)); } else { RxBus.getInstance().postEvent(new TaskErrorEvent(mInvokedOnPanel).setStatus(status).setExtra(getExtra())); } super.onPostExecute(status); } protected Object getExtra() { return ""; } protected void updateProgress() { if (mTotalSize > 0) { publishProgress((int) (100 * mDoneSize / mTotalSize)); } } protected boolean createDirectoryIfNotExists(String dir) { File outputDir = new File(dir); return outputDir.exists() || (mUseStorageApi ? StorageUtils.mkDir(mBaseUri, mSdCardPath, outputDir) : outputDir.mkdirs()); } protected boolean createDirectoryIfNotExists(File outputDir) { return outputDir.exists() || (mUseStorageApi ? StorageUtils.mkDir(mBaseUri, mSdCardPath, outputDir) : outputDir.mkdirs()); } private DialogInterface.OnDismissListener mProgressDialogDismissListener = new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { cancel(true); // mListener.onActionFinish(TaskStatusEnum.CANCELED); RxBus.getInstance().postEvent(new TaskCancelledEvent(mInvokedOnPanel)); } }; }