That fuck shit the fascists are using
at master 109 lines 3.1 kB view raw
1package org.tm.archive.providers; 2 3import android.content.ContentValues; 4import android.database.Cursor; 5import android.net.Uri; 6import android.os.MemoryFile; 7import android.os.ParcelFileDescriptor; 8 9import androidx.annotation.NonNull; 10import androidx.annotation.Nullable; 11 12import org.signal.core.util.StreamUtil; 13import org.signal.core.util.logging.Log; 14import org.tm.archive.dependencies.ApplicationDependencies; 15import org.tm.archive.util.MemoryFileUtil; 16import org.tm.archive.util.Util; 17 18import java.io.FileNotFoundException; 19import java.io.IOException; 20import java.io.InputStream; 21import java.io.OutputStream; 22 23public final class BlobContentProvider extends BaseContentProvider { 24 25 private static final String TAG = Log.tag(BlobContentProvider.class); 26 27 @Override 28 public boolean onCreate() { 29 Log.i(TAG, "onCreate()"); 30 return true; 31 } 32 33 @Override 34 public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException { 35 Log.i(TAG, "openFile() called: " + uri); 36 37 try { 38 try (InputStream stream = BlobProvider.getInstance().getStream(ApplicationDependencies.getApplication(), uri)) { 39 Long fileSize = BlobProvider.getFileSize(uri); 40 if (fileSize == null) { 41 Log.w(TAG, "No file size available"); 42 throw new FileNotFoundException(); 43 } 44 45 return getParcelStreamForStream(stream, Util.toIntExact(fileSize)); 46 } 47 } catch (IOException e) { 48 throw new FileNotFoundException(); 49 } 50 } 51 52 private static @NonNull ParcelFileDescriptor getParcelStreamForStream(@NonNull InputStream in, int fileSize) throws IOException { 53 MemoryFile memoryFile = new MemoryFile(null, fileSize); 54 55 try (OutputStream out = memoryFile.getOutputStream()) { 56 StreamUtil.copy(in, out); 57 } 58 59 return MemoryFileUtil.getParcelFileDescriptor(memoryFile); 60 } 61 62 @Nullable 63 @Override 64 public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { 65 Log.i(TAG, "query() called: " + uri); 66 67 String mimeType = BlobProvider.getMimeType(uri); 68 String fileName = BlobProvider.getFileName(uri); 69 Long fileSize = BlobProvider.getFileSize(uri); 70 71 if (fileSize == null) { 72 Log.w(TAG, "No file size"); 73 return null; 74 } 75 76 if (mimeType == null) { 77 Log.w(TAG, "No mime type"); 78 return null; 79 } 80 81 if (fileName == null) { 82 fileName = createFileNameForMimeType(mimeType); 83 } 84 85 return createCursor(projection, fileName, fileSize); 86 } 87 88 @Nullable 89 @Override 90 public String getType(@NonNull Uri uri) { 91 return BlobProvider.getMimeType(uri); 92 } 93 94 @Nullable 95 @Override 96 public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { 97 return null; 98 } 99 100 @Override 101 public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { 102 return 0; 103 } 104 105 @Override 106 public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { 107 return 0; 108 } 109}