package info.guardianproject.pixelknot; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.provider.OpenableColumns; import android.support.annotation.Nullable; import android.text.TextUtils; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; public class PixelKnotContentProvider extends ContentProvider { private static final String[] DEFAULT_COLUMNS = { OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }; public static final Uri CONTENT_URI = Uri.parse("content://info.guardianproject.pixelknot/"); @Override public boolean onCreate() { return true; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { StegoEncryptionJob job = getJobFromUri(uri); if (job == null) return null; if (projection == null) { projection = DEFAULT_COLUMNS; } ArrayList<String> cols = new ArrayList<>(); ArrayList<Object> values = new ArrayList<>(); int i = 0; for (String col : projection) { if (OpenableColumns.DISPLAY_NAME.equals(col)) { cols.add(col); values.add(job.getOutputImageName()); } else if (OpenableColumns.SIZE.equals(col)) { cols.add(col); values.add(job.getOutputLength()); } } final MatrixCursor cursor = new MatrixCursor(cols.toArray(new String[0]), 1); cursor.addRow(values); return cursor; } private StegoEncryptionJob getJobFromUri(Uri uri) { String jobId = uri.getLastPathSegment(); if (TextUtils.isEmpty(jobId)) return null; return (StegoEncryptionJob) App.getInstance().getJobById(jobId); } @Nullable @Override public String getType(Uri uri) { return "image/jpeg"; } @Nullable @Override public Uri insert(Uri uri, ContentValues contentValues) { throw new RuntimeException("Not supported"); } @Override public int delete(Uri uri, String s, String[] strings) { throw new RuntimeException("Not supported"); } @Override public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { throw new RuntimeException("Not supported"); } @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { StegoEncryptionJob job = getJobFromUri(uri); if (job == null) return null; try { return ParcelFileDescriptor.open(job.getOutputFile(), ParcelFileDescriptor.MODE_READ_ONLY); } catch (IOException e) { throw new FileNotFoundException("Failed to open " + uri.toString()); } } }