package com.doplgangr.secrecy.Jobs; import android.content.Context; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; import android.provider.DocumentsContract; import com.doplgangr.secrecy.CustomApp; import com.doplgangr.secrecy.FileSystem.storage; import com.doplgangr.secrecy.Util; import com.path.android.jobqueue.Job; import com.path.android.jobqueue.Params; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class DeleteFileJob extends Job { public static final int PRIORITY = 2; //Slightly higher than shredding files Context context = CustomApp.context; private File file; private OutputStream os = null; private long size = 0; private Uri uri; public DeleteFileJob(File file) { super(new Params(PRIORITY) .groupBy(file.getAbsolutePath())); //group according to file name this.file = file; } public void addURI(Uri uri) { this.uri = uri; } @Override public void onAdded() { } @Override public void onRun() throws Throwable { os = new FileOutputStream(file); if (file != null) size = file.length(); Util.log("Delete ", file); FileUtils.forceDelete(file); if (uri != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) DocumentsContract.deleteDocument(context.getContentResolver(), uri); //For kitkat users context.getContentResolver().delete(uri, null, null); //Try to delete under content resolver } new SingleMediaScanner(context, file); //Rescan and remove from gallery storage.shredFile(os, size); } @Override protected void onCancel() { //Rarhhh go die. new SingleMediaScanner(context, file); //Rescan and remove from gallery storage.shredFile(os, size); } @Override protected boolean shouldReRunOnThrowable(Throwable throwable) { //ignore everything and rerun throwable.printStackTrace(); return true; } @Override protected int getRetryLimit() { return 10; //This is quite reasonable. Isn't it? } public class SingleMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient { private MediaScannerConnection mMs; private java.io.File mFile; public SingleMediaScanner(Context context, java.io.File f) { mFile = f; mMs = new MediaScannerConnection(context, this); mMs.connect(); } @Override public void onMediaScannerConnected() { mMs.scanFile(mFile.getAbsolutePath(), null); } @Override public void onScanCompleted(String path, Uri uri) { mMs.disconnect(); } } }