2014-12-12 10:03:24 +01:00
|
|
|
package org.thoughtcrime.securesms.mms;
|
|
|
|
|
|
|
|
import android.content.ContentUris;
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.UriMatcher;
|
|
|
|
import android.net.Uri;
|
2021-10-04 09:51:19 +02:00
|
|
|
|
2020-08-19 02:06:26 +02:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
2014-12-12 10:03:24 +01:00
|
|
|
|
2021-01-13 07:11:30 +01:00
|
|
|
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
|
|
|
|
import org.session.libsession.messaging.sending_receiving.attachments.AttachmentId;
|
2021-10-04 09:51:19 +02:00
|
|
|
import org.thoughtcrime.securesms.dependencies.DatabaseComponent;
|
2019-02-26 02:47:30 +01:00
|
|
|
import org.thoughtcrime.securesms.providers.BlobProvider;
|
2014-12-12 10:03:24 +01:00
|
|
|
import org.thoughtcrime.securesms.providers.PartProvider;
|
|
|
|
|
2014-12-30 10:36:51 +01:00
|
|
|
import java.io.IOException;
|
2014-12-12 10:03:24 +01:00
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
|
|
public class PartAuthority {
|
|
|
|
|
2019-08-07 08:48:54 +02:00
|
|
|
private static final String PART_URI_STRING = "content://network.loki.provider.securesms/part";
|
|
|
|
private static final String THUMB_URI_STRING = "content://network.loki.provider.securesms/thumb";
|
|
|
|
private static final String STICKER_URI_STRING = "content://network.loki.provider.securesms/sticker";
|
2019-04-17 16:21:30 +02:00
|
|
|
private static final Uri PART_CONTENT_URI = Uri.parse(PART_URI_STRING);
|
|
|
|
private static final Uri THUMB_CONTENT_URI = Uri.parse(THUMB_URI_STRING);
|
|
|
|
private static final Uri STICKER_CONTENT_URI = Uri.parse(STICKER_URI_STRING);
|
2014-12-12 10:03:24 +01:00
|
|
|
|
2015-10-13 03:25:05 +02:00
|
|
|
private static final int PART_ROW = 1;
|
|
|
|
private static final int THUMB_ROW = 2;
|
2015-10-15 23:40:45 +02:00
|
|
|
private static final int PERSISTENT_ROW = 3;
|
2019-02-26 02:47:30 +01:00
|
|
|
private static final int BLOB_ROW = 4;
|
2019-04-17 16:21:30 +02:00
|
|
|
private static final int STICKER_ROW = 5;
|
2014-12-12 10:03:24 +01:00
|
|
|
|
|
|
|
private static final UriMatcher uriMatcher;
|
|
|
|
|
|
|
|
static {
|
|
|
|
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
|
2020-07-29 07:45:10 +02:00
|
|
|
uriMatcher.addURI("network.loki.provider.securesms", "part/*/#", PART_ROW);
|
|
|
|
uriMatcher.addURI("network.loki.provider.securesms", "thumb/*/#", THUMB_ROW);
|
|
|
|
uriMatcher.addURI("network.loki.provider.securesms", "sticker/#", STICKER_ROW);
|
2019-02-26 02:47:30 +01:00
|
|
|
uriMatcher.addURI(BlobProvider.AUTHORITY, BlobProvider.PATH, BLOB_ROW);
|
2014-12-12 10:03:24 +01:00
|
|
|
}
|
|
|
|
|
2018-01-25 04:17:44 +01:00
|
|
|
public static InputStream getAttachmentStream(@NonNull Context context, @NonNull Uri uri)
|
2014-12-30 10:36:51 +01:00
|
|
|
throws IOException
|
2014-12-12 10:03:24 +01:00
|
|
|
{
|
2015-06-08 20:07:46 +02:00
|
|
|
int match = uriMatcher.match(uri);
|
2015-01-13 20:47:32 +01:00
|
|
|
try {
|
|
|
|
switch (match) {
|
2021-10-04 09:51:19 +02:00
|
|
|
case PART_ROW: return DatabaseComponent.get(context).attachmentDatabase().getAttachmentStream(new PartUriParser(uri).getPartId(), 0);
|
|
|
|
case THUMB_ROW: return DatabaseComponent.get(context).attachmentDatabase().getThumbnailStream(new PartUriParser(uri).getPartId());
|
2019-02-26 02:47:30 +01:00
|
|
|
case BLOB_ROW: return BlobProvider.getInstance().getStream(context, uri);
|
2017-05-11 00:21:52 +02:00
|
|
|
default: return context.getContentResolver().openInputStream(uri);
|
|
|
|
}
|
|
|
|
} catch (SecurityException se) {
|
|
|
|
throw new IOException(se);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-25 04:17:44 +01:00
|
|
|
public static @Nullable String getAttachmentFileName(@NonNull Context context, @NonNull Uri uri) {
|
2017-05-11 00:21:52 +02:00
|
|
|
int match = uriMatcher.match(uri);
|
|
|
|
|
|
|
|
switch (match) {
|
|
|
|
case THUMB_ROW:
|
|
|
|
case PART_ROW:
|
2021-10-04 09:51:19 +02:00
|
|
|
Attachment attachment = DatabaseComponent.get(context).attachmentDatabase().getAttachment(new PartUriParser(uri).getPartId());
|
2017-05-11 00:21:52 +02:00
|
|
|
|
|
|
|
if (attachment != null) return attachment.getFileName();
|
|
|
|
else return null;
|
2019-02-26 02:47:30 +01:00
|
|
|
case BLOB_ROW:
|
|
|
|
return BlobProvider.getFileName(uri);
|
2017-05-11 00:21:52 +02:00
|
|
|
default:
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-25 04:17:44 +01:00
|
|
|
public static @Nullable Long getAttachmentSize(@NonNull Context context, @NonNull Uri uri) {
|
2017-05-11 00:21:52 +02:00
|
|
|
int match = uriMatcher.match(uri);
|
|
|
|
|
|
|
|
switch (match) {
|
|
|
|
case THUMB_ROW:
|
2015-05-18 17:16:06 +02:00
|
|
|
case PART_ROW:
|
2021-10-04 09:51:19 +02:00
|
|
|
Attachment attachment = DatabaseComponent.get(context).attachmentDatabase().getAttachment(new PartUriParser(uri).getPartId());
|
2017-05-11 00:21:52 +02:00
|
|
|
|
|
|
|
if (attachment != null) return attachment.getSize();
|
|
|
|
else return null;
|
2019-02-26 02:47:30 +01:00
|
|
|
case BLOB_ROW:
|
|
|
|
return BlobProvider.getFileSize(uri);
|
2017-05-11 00:21:52 +02:00
|
|
|
default:
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-25 04:17:44 +01:00
|
|
|
public static @Nullable String getAttachmentContentType(@NonNull Context context, @NonNull Uri uri) {
|
2017-05-11 00:21:52 +02:00
|
|
|
int match = uriMatcher.match(uri);
|
|
|
|
|
|
|
|
switch (match) {
|
2015-05-18 17:16:06 +02:00
|
|
|
case THUMB_ROW:
|
2017-05-11 00:21:52 +02:00
|
|
|
case PART_ROW:
|
2021-10-04 09:51:19 +02:00
|
|
|
Attachment attachment = DatabaseComponent.get(context).attachmentDatabase().getAttachment(new PartUriParser(uri).getPartId());
|
2017-05-11 00:21:52 +02:00
|
|
|
|
|
|
|
if (attachment != null) return attachment.getContentType();
|
|
|
|
else return null;
|
2019-02-26 02:47:30 +01:00
|
|
|
case BLOB_ROW:
|
|
|
|
return BlobProvider.getMimeType(uri);
|
2015-05-18 17:16:06 +02:00
|
|
|
default:
|
2017-05-11 00:21:52 +02:00
|
|
|
return null;
|
2014-12-12 10:03:24 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-13 03:25:05 +02:00
|
|
|
public static Uri getAttachmentPublicUri(Uri uri) {
|
2015-05-21 20:55:03 +02:00
|
|
|
PartUriParser partUri = new PartUriParser(uri);
|
|
|
|
return PartProvider.getContentUri(partUri.getPartId());
|
2014-12-12 10:03:24 +01:00
|
|
|
}
|
2015-04-01 00:44:41 +02:00
|
|
|
|
2015-10-13 03:25:05 +02:00
|
|
|
public static Uri getAttachmentDataUri(AttachmentId attachmentId) {
|
|
|
|
Uri uri = Uri.withAppendedPath(PART_CONTENT_URI, String.valueOf(attachmentId.getUniqueId()));
|
|
|
|
return ContentUris.withAppendedId(uri, attachmentId.getRowId());
|
2015-05-18 17:16:06 +02:00
|
|
|
}
|
|
|
|
|
2015-10-13 03:25:05 +02:00
|
|
|
public static Uri getAttachmentThumbnailUri(AttachmentId attachmentId) {
|
|
|
|
Uri uri = Uri.withAppendedPath(THUMB_CONTENT_URI, String.valueOf(attachmentId.getUniqueId()));
|
|
|
|
return ContentUris.withAppendedId(uri, attachmentId.getRowId());
|
2015-04-01 00:44:41 +02:00
|
|
|
}
|
2015-11-18 21:54:40 +01:00
|
|
|
|
|
|
|
public static boolean isLocalUri(final @NonNull Uri uri) {
|
|
|
|
int match = uriMatcher.match(uri);
|
|
|
|
switch (match) {
|
|
|
|
case PART_ROW:
|
|
|
|
case THUMB_ROW:
|
|
|
|
case PERSISTENT_ROW:
|
2019-02-26 02:47:30 +01:00
|
|
|
case BLOB_ROW:
|
2015-11-18 21:54:40 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2014-12-12 10:03:24 +01:00
|
|
|
}
|