package org.commcare.activities.components; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import android.util.Log; import org.commcare.activities.FormEntryActivity; import org.commcare.provider.FormsProviderAPI; import org.commcare.provider.InstanceProviderAPI; import java.io.File; public class FormFileSystemHelpers { private static final String TAG = FormFileSystemHelpers.class.getSimpleName(); public static String getFormPath(Context context, Uri uri) throws FormEntryActivity.FormQueryException { Cursor c = null; try { c = context.getContentResolver().query(uri, null, null, null, null); if (c == null) { throw new FormEntryActivity.FormQueryException("Bad URI: resolved to null"); } else if (c.getCount() != 1) { throw new FormEntryActivity.FormQueryException("Bad URI: " + uri); } else { c.moveToFirst(); return c.getString(c.getColumnIndex(FormsProviderAPI.FormsColumns.FORM_FILE_PATH)); } } finally { if (c != null) { c.close(); } } } private static int getFormInstanceCount(Context context, String instancePath, Uri instanceProviderContentURI) { String selection = InstanceProviderAPI.InstanceColumns.INSTANCE_FILE_PATH + " like '" + instancePath + "'"; Cursor c = null; int instanceCount = 0; try { c = context.getContentResolver().query(instanceProviderContentURI, null, selection, null, null); if (c != null) { instanceCount = c.getCount(); } } finally { if (c != null) { c.close(); } } return instanceCount; } public static void removeMediaAttachedToUnsavedForm(Context context, String instancePath, Uri instanceProviderContentURI) { int instanceCount = getFormInstanceCount(context, instancePath, instanceProviderContentURI); // if it's not already saved, erase everything if (instanceCount < 1) { int images = 0; int audio = 0; int video = 0; // delete media first String instanceFolder = instancePath.substring(0, instancePath.lastIndexOf("/") + 1); Log.i(TAG, "attempting to delete: " + instanceFolder); String where = MediaStore.Images.Media.DATA + " like '" + instanceFolder + "%'"; // images Cursor imageCursor = null; try { String[] projection = { MediaStore.Images.ImageColumns._ID }; imageCursor = context.getContentResolver().query( android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, where, null, null); if (imageCursor != null && imageCursor.getCount() > 0) { imageCursor.moveToFirst(); int columnIndex = imageCursor.getColumnIndex(MediaStore.Images.ImageColumns._ID); String id = imageCursor.getString(columnIndex); Log.i(TAG, "attempting to delete: " + Uri.withAppendedPath( android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)); images = context.getContentResolver() .delete( Uri.withAppendedPath( android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id), null, null); } } finally { if (imageCursor != null) { imageCursor.close(); } } // audio Cursor audioCursor = null; try { String[] projection = { MediaStore.Audio.AudioColumns._ID }; audioCursor = context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, where, null, null); if (audioCursor != null && audioCursor.getCount() > 0) { audioCursor.moveToFirst(); int columnIndex = audioCursor.getColumnIndex(MediaStore.Audio.AudioColumns._ID); String id = audioCursor.getString(columnIndex); Log.i( TAG, "attempting to delete: " + Uri.withAppendedPath( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id)); audio = context.getContentResolver() .delete( Uri.withAppendedPath( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id), null, null); } } finally { if (audioCursor != null) { audioCursor.close(); } } // video Cursor videoCursor = null; try { String[] projection = { MediaStore.Video.VideoColumns._ID }; videoCursor = context.getContentResolver().query( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, where, null, null); if (videoCursor != null && videoCursor.getCount() > 0) { videoCursor.moveToFirst(); int columnIndex = videoCursor.getColumnIndex(MediaStore.Video.VideoColumns._ID); String id = videoCursor.getString(columnIndex); Log.i( TAG, "attempting to delete: " + Uri.withAppendedPath( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id)); video = context.getContentResolver() .delete( Uri.withAppendedPath( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id), null, null); } } finally { if (videoCursor != null) { videoCursor.close(); } } Log.i(TAG, "removed from content providers: " + images + " image files, " + audio + " audio files," + " and " + video + " video files."); File f = new File(instanceFolder); if (f.exists() && f.isDirectory()) { for (File del : f.listFiles()) { Log.i(TAG, "deleting file: " + del.getAbsolutePath()); del.delete(); } f.delete(); } } } }