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;
+ }
+ }
+}