package com.dwdesign.tweetings.util; import static android.text.TextUtils.isEmpty; import static com.dwdesign.tweetings.util.Utils.getImageMimeType; import java.io.File; import java.io.IOException; import com.dwdesign.tweetings.R; import com.dwdesign.tweetings.fragment.ProgressDialogFragment; import android.content.Context; import android.media.MediaScannerConnection; import android.os.AsyncTask; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.webkit.MimeTypeMap; import android.widget.Toast; import android.util.Log; import com.dwdesign.tweetings.Constants; public class SaveImageTask extends AsyncTask<Void, Void, File> implements Constants { private static final String PROGRESS_FRAGMENT_TAG = "progress"; private final File src; private final FragmentActivity activity; public SaveImageTask(final FragmentActivity activity, final File src) { this.activity = activity; this.src = src; } @Override protected File doInBackground(final Void... args) { if (src == null) return null; return saveImage(activity, src); } @Override protected void onCancelled() { final FragmentManager fm = activity.getSupportFragmentManager(); final DialogFragment fragment = (DialogFragment) fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG); if (fragment != null && fragment.isVisible()) { fragment.dismiss(); } super.onCancelled(); } @Override protected void onPostExecute(final File result) { final FragmentManager fm = activity.getSupportFragmentManager(); final DialogFragment fragment = (DialogFragment) fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG); if (fragment != null) { fragment.dismiss(); } super.onPostExecute(result); if (result != null && result.exists()) { Toast.makeText(activity, activity.getString(R.string.file_saved_to, result.getPath()), Toast.LENGTH_SHORT) .show(); } else { Toast.makeText(activity, R.string.error_occurred, Toast.LENGTH_SHORT).show(); } } @Override protected void onPreExecute() { final DialogFragment fragment = new ProgressDialogFragment(); fragment.setCancelable(false); fragment.show(activity.getSupportFragmentManager(), PROGRESS_FRAGMENT_TAG); super.onPreExecute(); } public static File saveImage(final Context context, final File image_file) { if (context == null && image_file == null) return null; try { final String name = image_file.getName(); if (isEmpty(name)) return null; final String mime_type = getImageMimeType(image_file); final MimeTypeMap map = MimeTypeMap.getSingleton(); final String extension = map.getExtensionFromMimeType(mime_type); if (extension == null) return null; final String name_to_save = name.indexOf(".") != -1 ? name : name + "." + extension; final File pub_dir = EnvironmentAccessor .getExternalStoragePublicDirectory(EnvironmentAccessor.DIRECTORY_PICTURES); if (pub_dir == null) return null; final File save_dir = new File(pub_dir, "Tweetings"); if (!save_dir.isDirectory() && !save_dir.mkdirs()) return null; final File save_file = new File(save_dir, name_to_save); FileUtils.copyFile(image_file, save_file); if (save_file != null && mime_type != null) { MediaScannerConnection.scanFile(context, new String[] { save_file.getPath() }, new String[] { mime_type }, null); } return save_file; } catch (final IOException e) { Log.w(LOGTAG, "Failed to save file", e); return null; } } }