package com.marcodinacci.android.commons.io; import java.io.IOException; import java.io.OutputStream; import com.marcodinacci.android.commons.AsyncTaskListener; import android.os.AsyncTask; import android.os.Environment; import android.util.Log; public class StreamDataTask extends AsyncTask<DataSink<OutputStream>, Integer, Long> { private static final String TAG = "StreamDataTask"; private boolean mCloseOnWrite; private boolean mFlushOnWrite; private DataSink<OutputStream>[] mParams; private AsyncTaskListener<Integer, Long>[] mTaskListeners; public StreamDataTask(AsyncTaskListener<Integer,Long>[] asyncTaskListeners, boolean flushOnWrite, boolean closeOnWrite) { mFlushOnWrite = flushOnWrite; mCloseOnWrite = closeOnWrite; mTaskListeners = asyncTaskListeners; } @Override protected Long doInBackground(DataSink<OutputStream>... params) { mParams = params; long bytesWritten = 0; int progress = 100 / params.length; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { for (DataSink<OutputStream> dataSink : params) { try { OutputStream os = dataSink.getSink(); byte[] data = dataSink.getData(); os.write(data); bytesWritten += data.length; } catch (java.io.IOException e) { Log.e(TAG, "Exception in doInBackground", e); } publishProgress(progress); progress+= progress; } } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { String msg = "Cannot write to storage as it's mounted read only. " + "If the phone is connected to a PC, please disconnect it"; Log.e(TAG, msg); // TODO rethrow exception, capture it in the UI and show a Toast } else { Log.e(TAG, "Cannot write to disk, probably the SD card " + "is not available"); // TODO rethrow exception, capture it in the UI and show a Toast } return bytesWritten; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if(mTaskListeners != null) for (AsyncTaskListener<Integer, Long> listener : mTaskListeners) { if(listener != null) listener.onProgressUpdate(values); } } @Override protected void onPostExecute(Long result) { Log.d(TAG, "StreamDataTask.onPostExecute"); super.onPostExecute(result); for (DataSink<OutputStream> dataSink : mParams) { try { OutputStream os = dataSink.getSink(); if(mFlushOnWrite) os.flush(); if(mCloseOnWrite) os.close(); } catch (IOException e) { Log.e(TAG, e.getMessage()); } } if(mTaskListeners != null) for (AsyncTaskListener<Integer, Long> listener : mTaskListeners) { listener.onPostExecute(result); } } }