diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e07e098efe..9d7a328216 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -557,6 +557,18 @@ + + + + + + diff --git a/src/org/thoughtcrime/securesms/database/Database.java b/src/org/thoughtcrime/securesms/database/Database.java index 793fd09e90..814251361b 100644 --- a/src/org/thoughtcrime/securesms/database/Database.java +++ b/src/org/thoughtcrime/securesms/database/Database.java @@ -28,10 +28,7 @@ import java.util.Set; public abstract class Database { - protected static final String ID_WHERE = "_id = ?"; - private static final String CONVERSATION_URI = "content://textsecure/thread/"; - private static final String CONVERSATION_LIST_URI = "content://textsecure/conversation-list"; - private static final String ATTACHMENT_URI = "content://textsecure/attachment/"; + protected static final String ID_WHERE = "_id = ?"; protected SQLCipherOpenHelper databaseHelper; protected final Context context; @@ -47,29 +44,29 @@ public abstract class Database { } protected void notifyConversationListeners(long threadId) { - context.getContentResolver().notifyChange(Uri.parse(CONVERSATION_URI + threadId), null); + context.getContentResolver().notifyChange(DatabaseContentProviders.Conversation.getUriForThread(threadId), null); } protected void notifyConversationListListeners() { - context.getContentResolver().notifyChange(Uri.parse(CONVERSATION_LIST_URI), null); + context.getContentResolver().notifyChange(DatabaseContentProviders.ConversationList.CONTENT_URI, null); } protected void setNotifyConverationListeners(Cursor cursor, long threadId) { - cursor.setNotificationUri(context.getContentResolver(), Uri.parse(CONVERSATION_URI + threadId)); + cursor.setNotificationUri(context.getContentResolver(), DatabaseContentProviders.Conversation.getUriForThread(threadId)); } protected void setNotifyConverationListListeners(Cursor cursor) { - cursor.setNotificationUri(context.getContentResolver(), Uri.parse(CONVERSATION_LIST_URI)); + cursor.setNotificationUri(context.getContentResolver(), DatabaseContentProviders.ConversationList.CONTENT_URI); } protected void registerAttachmentListeners(@NonNull ContentObserver observer) { - context.getContentResolver().registerContentObserver(Uri.parse(ATTACHMENT_URI), + context.getContentResolver().registerContentObserver(DatabaseContentProviders.Attachment.CONTENT_URI, true, observer); } protected void notifyAttachmentListeners() { - context.getContentResolver().notifyChange(Uri.parse(ATTACHMENT_URI), null); + context.getContentResolver().notifyChange(DatabaseContentProviders.Attachment.CONTENT_URI, null); } public void reset(SQLCipherOpenHelper databaseHelper) { diff --git a/src/org/thoughtcrime/securesms/database/DatabaseContentProviders.java b/src/org/thoughtcrime/securesms/database/DatabaseContentProviders.java new file mode 100644 index 0000000000..e02661155d --- /dev/null +++ b/src/org/thoughtcrime/securesms/database/DatabaseContentProviders.java @@ -0,0 +1,67 @@ +package org.thoughtcrime.securesms.database; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +/** + * Starting in API 26, a {@link ContentProvider} needs to be defined for each authority you wish to + * observe changes on. These classes essentially do nothing except exist so Android doesn't complain. + */ +public class DatabaseContentProviders { + + public static class ConversationList extends NoopContentProvider { + public static final Uri CONTENT_URI = Uri.parse("content://org.thoughtcrime.securesms.database.conversationlist"); + } + + public static class Conversation extends NoopContentProvider { + private static final String CONTENT_URI_STRING = "content://org.thoughtcrime.securesms.database.conversation/"; + + public static Uri getUriForThread(long threadId) { + return Uri.parse(CONTENT_URI_STRING + threadId); + } + } + + public static class Attachment extends NoopContentProvider { + public static final Uri CONTENT_URI = Uri.parse("content://org.thoughtcrime.securesms.database.attachment"); + } + + private static abstract class NoopContentProvider extends ContentProvider { + + @Override + public boolean onCreate() { + return false; + } + + @Nullable + @Override + public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { + return null; + } + + @Nullable + @Override + public String getType(@NonNull Uri uri) { + return null; + } + + @Nullable + @Override + public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { + return null; + } + + @Override + public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { + return 0; + } + + @Override + public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { + return 0; + } + } +}