mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 01:40:07 +01:00
Renamed database classes to table classes.
Because they're not databases. They're tables.
This commit is contained in:
committed by
Cody Henthorne
parent
b190f9495a
commit
7949996c5c
@@ -86,9 +86,9 @@ import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class AttachmentDatabase extends Database {
|
||||
public class AttachmentTable extends DatabaseTable {
|
||||
|
||||
private static final String TAG = Log.tag(AttachmentDatabase.class);
|
||||
private static final String TAG = Log.tag(AttachmentTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "part";
|
||||
public static final String ROW_ID = "_id";
|
||||
@@ -198,7 +198,7 @@ public class AttachmentDatabase extends Database {
|
||||
|
||||
private final AttachmentSecret attachmentSecret;
|
||||
|
||||
public AttachmentDatabase(Context context, SignalDatabase databaseHelper, AttachmentSecret attachmentSecret) {
|
||||
public AttachmentTable(Context context, SignalDatabase databaseHelper, AttachmentSecret attachmentSecret) {
|
||||
super(context, databaseHelper);
|
||||
this.attachmentSecret = attachmentSecret;
|
||||
}
|
||||
@@ -476,7 +476,7 @@ public class AttachmentDatabase extends Database {
|
||||
|
||||
public void trimAllAbandonedAttachments() {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
String selectAllMmsIds = "SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME;
|
||||
String selectAllMmsIds = "SELECT " + MmsTable.ID + " FROM " + MmsTable.TABLE_NAME;
|
||||
String where = MMS_ID + " != " + PREUPLOAD_MESSAGE_ID + " AND " + MMS_ID + " NOT IN (" + selectAllMmsIds + ")";
|
||||
|
||||
int deletes = db.delete(TABLE_NAME, where, null);
|
||||
@@ -1024,11 +1024,11 @@ public class AttachmentDatabase extends Database {
|
||||
String query = "SELECT DISTINCT " + STICKER_PACK_ID + ", " + STICKER_PACK_KEY +
|
||||
" FROM " + TABLE_NAME +
|
||||
" WHERE " +
|
||||
STICKER_PACK_ID + " NOT NULL AND " +
|
||||
STICKER_PACK_KEY + " NOT NULL AND " +
|
||||
STICKER_PACK_ID + " NOT IN (" +
|
||||
"SELECT DISTINCT " + StickerDatabase.PACK_ID + " FROM " + StickerDatabase.TABLE_NAME +
|
||||
")";
|
||||
STICKER_PACK_ID + " NOT NULL AND " +
|
||||
STICKER_PACK_KEY + " NOT NULL AND " +
|
||||
STICKER_PACK_ID + " NOT IN (" +
|
||||
"SELECT DISTINCT " + StickerTable.PACK_ID + " FROM " + StickerTable.TABLE_NAME +
|
||||
")";
|
||||
|
||||
return databaseHelper.getSignalReadableDatabase().rawQuery(query, null);
|
||||
}
|
||||
@@ -1232,7 +1232,7 @@ public class AttachmentDatabase extends Database {
|
||||
|
||||
public List<DatabaseAttachment> getAttachments(@NonNull Cursor cursor) {
|
||||
try {
|
||||
if (cursor.getColumnIndex(AttachmentDatabase.ATTACHMENT_JSON_ALIAS) != -1) {
|
||||
if (cursor.getColumnIndex(AttachmentTable.ATTACHMENT_JSON_ALIAS) != -1) {
|
||||
if (cursor.isNull(cursor.getColumnIndexOrThrow(ATTACHMENT_JSON_ALIAS))) {
|
||||
return new LinkedList<>();
|
||||
}
|
||||
@@ -17,9 +17,9 @@ import org.signal.core.util.withinTransaction
|
||||
* an accurate history of numbers we've queried so that we're only "charged" for
|
||||
* querying new numbers.
|
||||
*/
|
||||
class CdsDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class CdsTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
companion object {
|
||||
private val TAG = Log.tag(CdsDatabase::class.java)
|
||||
private val TAG = Log.tag(CdsTable::class.java)
|
||||
|
||||
const val TABLE_NAME = "cds"
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.ChatColor
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
|
||||
class ChatColorsDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class ChatColorsTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
private const val TABLE_NAME = "chat_colors"
|
||||
@@ -23,7 +23,7 @@ import java.util.concurrent.Executor;
|
||||
/**
|
||||
* Allows listening to database changes to varying degrees of specificity.
|
||||
*
|
||||
* A replacement for the observer system in {@link Database}. We should move to this over time.
|
||||
* A replacement for the observer system in {@link DatabaseTable}. We should move to this over time.
|
||||
*/
|
||||
public class DatabaseObserver {
|
||||
|
||||
|
||||
@@ -21,10 +21,9 @@ import android.content.Context;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class Database {
|
||||
public abstract class DatabaseTable {
|
||||
|
||||
protected static final String ID_WHERE = "_id = ?";
|
||||
protected static final String[] COUNT = new String[] { "COUNT(*)" };
|
||||
@@ -35,7 +34,7 @@ public abstract class Database {
|
||||
static final Set<RecipientIdDatabaseReference> recipientIdDatabaseTables = new HashSet<>();
|
||||
static final Set<ThreadIdDatabaseReference> threadIdDatabaseTables = new HashSet<>();
|
||||
|
||||
public Database(Context context, SignalDatabase databaseHelper) {
|
||||
public DatabaseTable(Context context, SignalDatabase databaseHelper) {
|
||||
this.context = context;
|
||||
this.databaseHelper = databaseHelper;
|
||||
|
||||
@@ -32,10 +32,10 @@ import java.util.UUID
|
||||
/**
|
||||
* Stores distribution lists, which represent different sets of people you may want to share a story with.
|
||||
*/
|
||||
class DistributionListDatabase constructor(context: Context?, databaseHelper: SignalDatabase?) : Database(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
class DistributionListTables constructor(context: Context?, databaseHelper: SignalDatabase?) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(DistributionListDatabase::class.java)
|
||||
private val TAG = Log.tag(DistributionListTables::class.java)
|
||||
|
||||
@JvmField
|
||||
val CREATE_TABLE: Array<String> = arrayOf(ListTable.CREATE_TABLE, MembershipTable.CREATE_TABLE)
|
||||
@@ -50,12 +50,12 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
|
||||
|
||||
fun insertInitialDistributionListAtCreationTime(db: net.zetetic.database.sqlcipher.SQLiteDatabase) {
|
||||
val recipientId = db.insert(
|
||||
RecipientDatabase.TABLE_NAME, null,
|
||||
RecipientTable.TABLE_NAME, null,
|
||||
contentValuesOf(
|
||||
RecipientDatabase.GROUP_TYPE to RecipientDatabase.GroupType.DISTRIBUTION_LIST.id,
|
||||
RecipientDatabase.DISTRIBUTION_LIST_ID to DistributionListId.MY_STORY_ID,
|
||||
RecipientDatabase.STORAGE_SERVICE_ID to Base64.encodeBytes(StorageSyncHelper.generateKey()),
|
||||
RecipientDatabase.PROFILE_SHARING to 1
|
||||
RecipientTable.GROUP_TYPE to RecipientTable.GroupType.DISTRIBUTION_LIST.id,
|
||||
RecipientTable.DISTRIBUTION_LIST_ID to DistributionListId.MY_STORY_ID,
|
||||
RecipientTable.STORAGE_SERVICE_ID to Base64.encodeBytes(StorageSyncHelper.generateKey()),
|
||||
RecipientTable.PROFILE_SHARING to 1
|
||||
)
|
||||
)
|
||||
db.insert(
|
||||
@@ -88,7 +88,7 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
|
||||
$ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
$NAME TEXT UNIQUE NOT NULL,
|
||||
$DISTRIBUTION_ID TEXT UNIQUE NOT NULL,
|
||||
$RECIPIENT_ID INTEGER UNIQUE REFERENCES ${RecipientDatabase.TABLE_NAME} (${RecipientDatabase.ID}),
|
||||
$RECIPIENT_ID INTEGER UNIQUE REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}),
|
||||
$ALLOWS_REPLIES INTEGER DEFAULT 1,
|
||||
$DELETION_TIMESTAMP INTEGER DEFAULT 0,
|
||||
$IS_UNKNOWN INTEGER DEFAULT 0,
|
||||
@@ -116,7 +116,7 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
|
||||
CREATE TABLE $TABLE_NAME (
|
||||
$ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
$LIST_ID INTEGER NOT NULL REFERENCES ${ListTable.TABLE_NAME} (${ListTable.ID}) ON DELETE CASCADE,
|
||||
$RECIPIENT_ID INTEGER NOT NULL REFERENCES ${RecipientDatabase.TABLE_NAME} (${RecipientDatabase.ID}),
|
||||
$RECIPIENT_ID INTEGER NOT NULL REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}),
|
||||
$PRIVACY_MODE INTEGER DEFAULT 0
|
||||
)
|
||||
"""
|
||||
@@ -408,14 +408,14 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si
|
||||
DistributionListPrivacyMode.ALL -> {
|
||||
SignalDatabase.recipients
|
||||
.getSignalContacts(false)!!
|
||||
.readToList { it.requireObject(RecipientDatabase.ID, RecipientId.SERIALIZER) }
|
||||
.readToList { it.requireObject(RecipientTable.ID, RecipientId.SERIALIZER) }
|
||||
}
|
||||
DistributionListPrivacyMode.ALL_EXCEPT -> {
|
||||
SignalDatabase.recipients
|
||||
.getSignalContacts(false)!!
|
||||
.readToList(
|
||||
predicate = { !rawMembers.contains(it) },
|
||||
mapper = { it.requireObject(RecipientDatabase.ID, RecipientId.SERIALIZER) }
|
||||
mapper = { it.requireObject(RecipientTable.ID, RecipientId.SERIALIZER) }
|
||||
)
|
||||
}
|
||||
DistributionListPrivacyMode.ONLY_WITH -> rawMembers
|
||||
@@ -10,7 +10,7 @@ import org.thoughtcrime.securesms.database.model.DonationReceiptRecord
|
||||
import java.math.BigDecimal
|
||||
import java.util.Currency
|
||||
|
||||
class DonationReceiptDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class DonationReceiptTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
companion object {
|
||||
private const val TABLE_NAME = "donation_receipt"
|
||||
|
||||
@@ -17,9 +17,9 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class DraftDatabase extends Database implements ThreadIdDatabaseReference {
|
||||
public class DraftTable extends DatabaseTable implements ThreadIdDatabaseReference {
|
||||
|
||||
private static final String TAG = Log.tag(DraftDatabase.class);
|
||||
private static final String TAG = Log.tag(DraftTable.class);
|
||||
|
||||
static final String TABLE_NAME = "drafts";
|
||||
public static final String ID = "_id";
|
||||
@@ -34,7 +34,7 @@ public class DraftDatabase extends Database implements ThreadIdDatabaseReference
|
||||
"CREATE INDEX IF NOT EXISTS draft_thread_index ON " + TABLE_NAME + " (" + THREAD_ID + ");",
|
||||
};
|
||||
|
||||
public DraftDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public DraftTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import kotlin.math.roundToInt
|
||||
/**
|
||||
* Contains all info necessary for full-text search of emoji tags.
|
||||
*/
|
||||
class EmojiSearchDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class EmojiSearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
const val TABLE_NAME = "emoji_search"
|
||||
@@ -10,7 +10,7 @@ import java.util.concurrent.TimeUnit
|
||||
/**
|
||||
* Track state of Group Call ring cancellations.
|
||||
*/
|
||||
class GroupCallRingDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class GroupCallRingTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
private val VALID_RING_DURATION = TimeUnit.MINUTES.toMillis(30)
|
||||
@@ -18,7 +18,7 @@ import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class GroupReceiptDatabase extends Database implements RecipientIdDatabaseReference {
|
||||
public class GroupReceiptTable extends DatabaseTable implements RecipientIdDatabaseReference {
|
||||
|
||||
public static final String TABLE_NAME = "group_receipts";
|
||||
|
||||
@@ -43,7 +43,7 @@ public class GroupReceiptDatabase extends Database implements RecipientIdDatabas
|
||||
"CREATE INDEX IF NOT EXISTS group_receipt_mms_id_index ON " + TABLE_NAME + " (" + MMS_ID + ");",
|
||||
};
|
||||
|
||||
public GroupReceiptDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public GroupReceiptTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ public class GroupReceiptDatabase extends Database implements RecipientIdDatabas
|
||||
|
||||
void deleteAbandonedRows() {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
db.delete(TABLE_NAME, MMS_ID + " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ")", null);
|
||||
db.delete(TABLE_NAME, MMS_ID + " NOT IN (SELECT " + MmsTable.ID + " FROM " + MmsTable.TABLE_NAME + ")", null);
|
||||
}
|
||||
|
||||
void deleteAllRows() {
|
||||
@@ -65,9 +65,9 @@ import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class GroupDatabase extends Database implements RecipientIdDatabaseReference {
|
||||
public class GroupTable extends DatabaseTable implements RecipientIdDatabaseReference {
|
||||
|
||||
private static final String TAG = Log.tag(GroupDatabase.class);
|
||||
private static final String TAG = Log.tag(GroupTable.class);
|
||||
|
||||
static final String TABLE_NAME = "groups";
|
||||
private static final String ID = "_id";
|
||||
@@ -139,7 +139,7 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
|
||||
static final List<String> TYPED_GROUP_PROJECTION = Stream.of(GROUP_PROJECTION).map(columnName -> TABLE_NAME + "." + columnName).toList();
|
||||
|
||||
public GroupDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public GroupTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -331,7 +331,7 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
String membershipQuery = "(" + Util.join(recipientLikeClauses, " OR ") + ")";
|
||||
|
||||
if (includeInactive) {
|
||||
query = membershipQuery + " AND (" + ACTIVE + " = ? OR " + RECIPIENT_ID + " IN (SELECT " + ThreadDatabase.RECIPIENT_ID + " FROM " + ThreadDatabase.TABLE_NAME + "))";
|
||||
query = membershipQuery + " AND (" + ACTIVE + " = ? OR " + RECIPIENT_ID + " IN (SELECT " + ThreadTable.RECIPIENT_ID + " FROM " + ThreadTable.TABLE_NAME + "))";
|
||||
queryArgs = SqlUtil.buildArgs(1);
|
||||
} else {
|
||||
query = membershipQuery + " AND " + ACTIVE + " = ?";
|
||||
@@ -352,9 +352,9 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
public Reader queryGroupsByRecency(@NonNull GroupQuery groupQuery) {
|
||||
SqlUtil.Query query = getGroupQueryWhereStatement(groupQuery.searchQuery, groupQuery.includeInactive, !groupQuery.includeV1, !groupQuery.includeMms);
|
||||
String sql = "SELECT * FROM " + TABLE_NAME +
|
||||
" LEFT JOIN " + ThreadDatabase.TABLE_NAME + " ON " + RECIPIENT_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID +
|
||||
" LEFT JOIN " + ThreadTable.TABLE_NAME + " ON " + RECIPIENT_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID +
|
||||
" WHERE " + query.getWhere() +
|
||||
" ORDER BY " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.DATE + " DESC";
|
||||
" ORDER BY " + ThreadTable.TABLE_NAME + "." + ThreadTable.DATE + " DESC";
|
||||
|
||||
return new Reader(databaseHelper.getSignalReadableDatabase().rawQuery(sql, query.getWhereArgs()));
|
||||
}
|
||||
@@ -374,7 +374,7 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
String caseInsensitiveQuery = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery);
|
||||
|
||||
if (includeInactive) {
|
||||
query = TITLE + " GLOB ? AND (" + ACTIVE + " = ? OR " + RECIPIENT_ID + " IN (SELECT " + ThreadDatabase.RECIPIENT_ID + " FROM " + ThreadDatabase.TABLE_NAME + "))";
|
||||
query = TITLE + " GLOB ? AND (" + ACTIVE + " = ? OR " + RECIPIENT_ID + " IN (SELECT " + ThreadTable.RECIPIENT_ID + " FROM " + ThreadTable.TABLE_NAME + "))";
|
||||
queryArgs = SqlUtil.buildArgs(caseInsensitiveQuery, 1);
|
||||
} else {
|
||||
query = TITLE + " GLOB ? AND " + ACTIVE + " = ?";
|
||||
@@ -464,10 +464,10 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
@WorkerThread
|
||||
public @NonNull List<GroupRecord> getGroupsContainingMember(@NonNull RecipientId recipientId, boolean pushOnly, boolean includeInactive) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String table = TABLE_NAME + " INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + TABLE_NAME + "." + RECIPIENT_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID;
|
||||
String table = TABLE_NAME + " INNER JOIN " + ThreadTable.TABLE_NAME + " ON " + TABLE_NAME + "." + RECIPIENT_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID;
|
||||
String query = MEMBERS + " LIKE ?";
|
||||
String[] args = SqlUtil.buildArgs("%" + recipientId.serialize() + "%");
|
||||
String orderBy = ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.DATE + " DESC";
|
||||
String orderBy = ThreadTable.TABLE_NAME + "." + ThreadTable.DATE + " DESC";
|
||||
|
||||
if (pushOnly) {
|
||||
query += " AND " + MMS + " = ?";
|
||||
@@ -647,9 +647,9 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
@Nullable GroupMasterKey groupMasterKey,
|
||||
@Nullable DecryptedGroup groupState)
|
||||
{
|
||||
RecipientDatabase recipientDatabase = SignalDatabase.recipients();
|
||||
RecipientId groupRecipientId = recipientDatabase.getOrInsertFromGroupId(groupId);
|
||||
List<RecipientId> members = new ArrayList<>(new HashSet<>(memberCollection));
|
||||
RecipientTable recipientTable = SignalDatabase.recipients();
|
||||
RecipientId groupRecipientId = recipientTable.getOrInsertFromGroupId(groupId);
|
||||
List<RecipientId> members = new ArrayList<>(new HashSet<>(memberCollection));
|
||||
|
||||
Collections.sort(members);
|
||||
|
||||
@@ -703,11 +703,11 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, contentValues);
|
||||
|
||||
if (groupState != null && groupState.hasDisappearingMessagesTimer()) {
|
||||
recipientDatabase.setExpireMessages(groupRecipientId, groupState.getDisappearingMessagesTimer().getDuration());
|
||||
recipientTable.setExpireMessages(groupRecipientId, groupState.getDisappearingMessagesTimer().getDuration());
|
||||
}
|
||||
|
||||
if (groupMembers != null && (groupId.isMms() || Recipient.resolved(groupRecipientId).isProfileSharing())) {
|
||||
recipientDatabase.setHasGroupsInCommon(groupMembers);
|
||||
recipientTable.setHasGroupsInCommon(groupMembers);
|
||||
}
|
||||
|
||||
Recipient.live(groupRecipientId).refresh();
|
||||
@@ -802,9 +802,9 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
}
|
||||
|
||||
public void update(@NonNull GroupId.V2 groupId, @NonNull DecryptedGroup decryptedGroup) {
|
||||
RecipientDatabase recipientDatabase = SignalDatabase.recipients();
|
||||
RecipientId groupRecipientId = recipientDatabase.getOrInsertFromGroupId(groupId);
|
||||
Optional<GroupRecord> existingGroup = getGroup(groupId);
|
||||
RecipientTable recipientTable = SignalDatabase.recipients();
|
||||
RecipientId groupRecipientId = recipientTable.getOrInsertFromGroupId(groupId);
|
||||
Optional<GroupRecord> existingGroup = getGroup(groupId);
|
||||
String title = decryptedGroup.getTitle();
|
||||
ContentValues contentValues = new ContentValues();
|
||||
|
||||
@@ -852,11 +852,11 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
new String[]{ groupId.toString() });
|
||||
|
||||
if (decryptedGroup.hasDisappearingMessagesTimer()) {
|
||||
recipientDatabase.setExpireMessages(groupRecipientId, decryptedGroup.getDisappearingMessagesTimer().getDuration());
|
||||
recipientTable.setExpireMessages(groupRecipientId, decryptedGroup.getDisappearingMessagesTimer().getDuration());
|
||||
}
|
||||
|
||||
if (groupId.isMms() || Recipient.resolved(groupRecipientId).isProfileSharing()) {
|
||||
recipientDatabase.setHasGroupsInCommon(groupMembers);
|
||||
recipientTable.setHasGroupsInCommon(groupMembers);
|
||||
}
|
||||
|
||||
Recipient.live(groupRecipientId).refresh();
|
||||
@@ -1079,9 +1079,9 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
newMembers.add(toId);
|
||||
|
||||
ContentValues groupValues = new ContentValues();
|
||||
groupValues.put(GroupDatabase.MEMBERS, RecipientId.toSerializedList(newMembers));
|
||||
groupValues.put(GroupTable.MEMBERS, RecipientId.toSerializedList(newMembers));
|
||||
|
||||
getWritableDatabase().update(GroupDatabase.TABLE_NAME, groupValues, GroupDatabase.RECIPIENT_ID + " = ?", SqlUtil.buildArgs(group.recipientId));
|
||||
getWritableDatabase().update(GroupTable.TABLE_NAME, groupValues, GroupTable.RECIPIENT_ID + " = ?", SqlUtil.buildArgs(group.recipientId));
|
||||
|
||||
if (group.isV2Group()) {
|
||||
removeUnmigratedV1Members(group.id.requireV2(), Collections.singletonList(fromId));
|
||||
@@ -1510,16 +1510,16 @@ public class GroupDatabase extends Database implements RecipientIdDatabaseRefere
|
||||
|
||||
public @NonNull List<GroupId> getGroupsToDisplayAsStories() throws BadGroupIdException {
|
||||
String query = "SELECT " + GROUP_ID + ", (" +
|
||||
"SELECT " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_RECEIVED + " FROM " + MmsDatabase.TABLE_NAME +
|
||||
" WHERE " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.RECIPIENT_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID +
|
||||
" AND " + MmsDatabase.STORY_TYPE + " > 1 ORDER BY " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_RECEIVED + " DESC LIMIT 1" +
|
||||
") as active_timestamp" +
|
||||
"SELECT " + MmsTable.TABLE_NAME + "." + MmsTable.DATE_RECEIVED + " FROM " + MmsTable.TABLE_NAME +
|
||||
" WHERE " + MmsTable.TABLE_NAME + "." + MmsTable.RECIPIENT_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID +
|
||||
" AND " + MmsTable.STORY_TYPE + " > 1 ORDER BY " + MmsTable.TABLE_NAME + "." + MmsTable.DATE_RECEIVED + " DESC LIMIT 1" +
|
||||
") as active_timestamp" +
|
||||
" FROM " + TABLE_NAME +
|
||||
" INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID + " = " + TABLE_NAME + "." + RECIPIENT_ID +
|
||||
" INNER JOIN " + ThreadTable.TABLE_NAME + " ON " + ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID + " = " + TABLE_NAME + "." + RECIPIENT_ID +
|
||||
" WHERE " + ACTIVE + " = 1 " +
|
||||
" AND (" +
|
||||
SHOW_AS_STORY_STATE + " = " + ShowAsStoryState.ALWAYS.code +
|
||||
" OR (" + SHOW_AS_STORY_STATE + " = " + ShowAsStoryState.IF_ACTIVE.code + " AND active_timestamp IS NOT NULL)" +
|
||||
SHOW_AS_STORY_STATE + " = " + ShowAsStoryState.ALWAYS.code +
|
||||
" OR (" + SHOW_AS_STORY_STATE + " = " + ShowAsStoryState.IF_ACTIVE.code + " AND active_timestamp IS NOT NULL)" +
|
||||
") ORDER BY active_timestamp DESC";
|
||||
|
||||
try (Cursor cursor = getReadableDatabase().query(query)) {
|
||||
@@ -29,7 +29,6 @@ import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.signal.libsignal.protocol.InvalidKeyException;
|
||||
import org.thoughtcrime.securesms.database.model.IdentityRecord;
|
||||
import org.thoughtcrime.securesms.database.model.IdentityStoreRecord;
|
||||
import org.thoughtcrime.securesms.database.model.RecipientRecord;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
@@ -43,12 +42,11 @@ import org.whispersystems.signalservice.api.util.UuidUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
public class IdentityDatabase extends Database {
|
||||
public class IdentityTable extends DatabaseTable {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static final String TAG = Log.tag(IdentityDatabase.class);
|
||||
private static final String TAG = Log.tag(IdentityTable.class);
|
||||
|
||||
static final String TABLE_NAME = "identities";
|
||||
private static final String ID = "_id";
|
||||
@@ -89,7 +87,7 @@ public class IdentityDatabase extends Database {
|
||||
}
|
||||
}
|
||||
|
||||
IdentityDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
IdentityTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -207,7 +205,7 @@ public class IdentityDatabase extends Database {
|
||||
}
|
||||
|
||||
public void delete(@NonNull String addressName) {
|
||||
databaseHelper.getSignalWritableDatabase().delete(IdentityDatabase.TABLE_NAME, IdentityDatabase.ADDRESS + " = ?", SqlUtil.buildArgs(addressName));
|
||||
databaseHelper.getSignalWritableDatabase().delete(IdentityTable.TABLE_NAME, IdentityTable.ADDRESS + " = ?", SqlUtil.buildArgs(addressName));
|
||||
}
|
||||
|
||||
private Optional<IdentityRecord> getIdentityRecord(@NonNull String addressName) {
|
||||
@@ -1,301 +0,0 @@
|
||||
package org.thoughtcrime.securesms.database;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@SuppressLint({"RecipientIdDatabaseReferenceUsage", "ThreadIdDatabaseReferenceUsage"}) // Not a real table, just a view
|
||||
public class MediaDatabase extends Database {
|
||||
|
||||
public static final int ALL_THREADS = -1;
|
||||
private static final String THREAD_RECIPIENT_ID = "THREAD_RECIPIENT_ID";
|
||||
|
||||
private static final String BASE_MEDIA_QUERY = "SELECT " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + " AS " + AttachmentDatabase.ROW_ID + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_TYPE + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.UNIQUE_ID + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.TRANSFER_STATE + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.SIZE + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.FILE_NAME + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DATA + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CDN_NUMBER + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_LOCATION + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_DISPOSITION + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DIGEST + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.FAST_PREFLIGHT_ID + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VOICE_NOTE + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.BORDERLESS + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VIDEO_GIF + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.WIDTH + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.HEIGHT + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.QUOTE + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_PACK_ID + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_PACK_KEY + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_ID + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_EMOJI + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VISUAL_HASH + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.TRANSFORM_PROPERTIES + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DISPLAY_ORDER + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CAPTION + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.NAME + ", "
|
||||
+ AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.UPLOAD_TIMESTAMP + ", "
|
||||
+ MmsDatabase.TABLE_NAME + "." + MmsDatabase.MESSAGE_BOX + ", "
|
||||
+ MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_SENT + ", "
|
||||
+ MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_RECEIVED + ", "
|
||||
+ MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_SERVER + ", "
|
||||
+ MmsDatabase.TABLE_NAME + "." + MmsDatabase.THREAD_ID + ", "
|
||||
+ MmsDatabase.TABLE_NAME + "." + MmsDatabase.RECIPIENT_ID + ", "
|
||||
+ ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID + " as " + THREAD_RECIPIENT_ID + " "
|
||||
+ "FROM " + AttachmentDatabase.TABLE_NAME + " LEFT JOIN " + MmsDatabase.TABLE_NAME
|
||||
+ " ON " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + " = " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " "
|
||||
+ "LEFT JOIN " + ThreadDatabase.TABLE_NAME
|
||||
+ " ON " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + " = " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.THREAD_ID + " "
|
||||
+ "WHERE " + AttachmentDatabase.MMS_ID + " IN (SELECT " + MmsSmsColumns.ID
|
||||
+ " FROM " + MmsDatabase.TABLE_NAME
|
||||
+ " WHERE " + MmsDatabase.THREAD_ID + " __EQUALITY__ ?) AND (%s) AND "
|
||||
+ MmsDatabase.VIEW_ONCE + " = 0 AND "
|
||||
+ MmsDatabase.STORY_TYPE + " = 0 AND "
|
||||
+ AttachmentDatabase.DATA + " IS NOT NULL AND "
|
||||
+ "(" + AttachmentDatabase.QUOTE + " = 0 OR (" + AttachmentDatabase.QUOTE + " = 1 AND " + AttachmentDatabase.DATA_HASH + " IS NULL)) AND "
|
||||
+ AttachmentDatabase.STICKER_PACK_ID + " IS NULL AND "
|
||||
+ MmsDatabase.RECIPIENT_ID + " > 0 AND "
|
||||
+ THREAD_RECIPIENT_ID + " > 0";
|
||||
|
||||
private static final String UNIQUE_MEDIA_QUERY = "SELECT "
|
||||
+ "MAX(" + AttachmentDatabase.SIZE + ") as " + AttachmentDatabase.SIZE + ", "
|
||||
+ AttachmentDatabase.CONTENT_TYPE + " "
|
||||
+ "FROM " + AttachmentDatabase.TABLE_NAME + " "
|
||||
+ "WHERE " + AttachmentDatabase.STICKER_PACK_ID + " IS NULL AND " + AttachmentDatabase.TRANSFER_STATE + " = " + AttachmentDatabase.TRANSFER_PROGRESS_DONE + " "
|
||||
+ "GROUP BY " + AttachmentDatabase.DATA;
|
||||
|
||||
private static final String GALLERY_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentDatabase.CONTENT_TYPE + " NOT LIKE 'image/svg%' AND (" +
|
||||
AttachmentDatabase.CONTENT_TYPE + " LIKE 'image/%' OR " +
|
||||
AttachmentDatabase.CONTENT_TYPE + " LIKE 'video/%')");
|
||||
private static final String AUDIO_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentDatabase.CONTENT_TYPE + " LIKE 'audio/%'");
|
||||
private static final String ALL_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentDatabase.CONTENT_TYPE + " NOT LIKE 'text/x-signal-plain'");
|
||||
private static final String DOCUMENT_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentDatabase.CONTENT_TYPE + " LIKE 'image/svg%' OR (" +
|
||||
AttachmentDatabase.CONTENT_TYPE + " NOT LIKE 'image/%' AND " +
|
||||
AttachmentDatabase.CONTENT_TYPE + " NOT LIKE 'video/%' AND " +
|
||||
AttachmentDatabase.CONTENT_TYPE + " NOT LIKE 'audio/%' AND " +
|
||||
AttachmentDatabase.CONTENT_TYPE + " NOT LIKE 'text/x-signal-plain')");
|
||||
|
||||
MediaDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getGalleryMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, GALLERY_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getDocumentMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, DOCUMENT_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getAudioMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, AUDIO_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getAllMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, ALL_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
private static String applyEqualityOperator(long threadId, String query) {
|
||||
return query.replace("__EQUALITY__", threadId == ALL_THREADS ? "!=" : "=");
|
||||
}
|
||||
|
||||
public StorageBreakdown getStorageBreakdown() {
|
||||
StorageBreakdown storageBreakdown = new StorageBreakdown();
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
|
||||
try (Cursor cursor = database.rawQuery(UNIQUE_MEDIA_QUERY, new String[0])) {
|
||||
int sizeColumn = cursor.getColumnIndexOrThrow(AttachmentDatabase.SIZE);
|
||||
int contentTypeColumn = cursor.getColumnIndexOrThrow(AttachmentDatabase.CONTENT_TYPE);
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
int size = cursor.getInt(sizeColumn);
|
||||
String type = cursor.getString(contentTypeColumn);
|
||||
|
||||
switch (MediaUtil.getSlideTypeFromContentType(type)) {
|
||||
case GIF:
|
||||
case IMAGE:
|
||||
case MMS:
|
||||
storageBreakdown.photoSize += size;
|
||||
break;
|
||||
case VIDEO:
|
||||
storageBreakdown.videoSize += size;
|
||||
break;
|
||||
case AUDIO:
|
||||
storageBreakdown.audioSize += size;
|
||||
break;
|
||||
case LONG_TEXT:
|
||||
case DOCUMENT:
|
||||
storageBreakdown.documentSize += size;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return storageBreakdown;
|
||||
}
|
||||
|
||||
public static class MediaRecord {
|
||||
|
||||
private final DatabaseAttachment attachment;
|
||||
private final RecipientId recipientId;
|
||||
private final RecipientId threadRecipientId;
|
||||
private final long threadId;
|
||||
private final long date;
|
||||
private final boolean outgoing;
|
||||
|
||||
private MediaRecord(@Nullable DatabaseAttachment attachment,
|
||||
@NonNull RecipientId recipientId,
|
||||
@NonNull RecipientId threadRecipientId,
|
||||
long threadId,
|
||||
long date,
|
||||
boolean outgoing)
|
||||
{
|
||||
this.attachment = attachment;
|
||||
this.recipientId = recipientId;
|
||||
this.threadRecipientId = threadRecipientId;
|
||||
this.threadId = threadId;
|
||||
this.date = date;
|
||||
this.outgoing = outgoing;
|
||||
}
|
||||
|
||||
public static MediaRecord from(@NonNull Cursor cursor) {
|
||||
AttachmentDatabase attachmentDatabase = SignalDatabase.attachments();
|
||||
List<DatabaseAttachment> attachments = attachmentDatabase.getAttachments(cursor);
|
||||
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.RECIPIENT_ID)));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID));
|
||||
boolean outgoing = MessageDatabase.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)));
|
||||
|
||||
long date;
|
||||
|
||||
if (MmsDatabase.Types.isPushType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)))) {
|
||||
date = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.DATE_SENT));
|
||||
} else {
|
||||
date = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.DATE_RECEIVED));
|
||||
}
|
||||
|
||||
RecipientId threadRecipient = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_RECIPIENT_ID)));
|
||||
|
||||
return new MediaRecord(attachments != null && attachments.size() > 0 ? attachments.get(0) : null,
|
||||
recipientId,
|
||||
threadRecipient,
|
||||
threadId,
|
||||
date,
|
||||
outgoing);
|
||||
}
|
||||
|
||||
public @Nullable DatabaseAttachment getAttachment() {
|
||||
return attachment;
|
||||
}
|
||||
|
||||
public String getContentType() {
|
||||
return attachment.getContentType();
|
||||
}
|
||||
|
||||
public @NonNull RecipientId getRecipientId() {
|
||||
return recipientId;
|
||||
}
|
||||
|
||||
public @NonNull RecipientId getThreadRecipientId() {
|
||||
return threadRecipientId;
|
||||
}
|
||||
|
||||
public long getThreadId() {
|
||||
return threadId;
|
||||
}
|
||||
|
||||
public long getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public boolean isOutgoing() {
|
||||
return outgoing;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Sorting {
|
||||
Newest (AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + " DESC, " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DISPLAY_ORDER + " DESC, " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + " DESC"),
|
||||
Oldest (AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + " ASC, " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DISPLAY_ORDER + " DESC, " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + " ASC"),
|
||||
Largest(AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.SIZE + " DESC, " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DISPLAY_ORDER + " DESC");
|
||||
|
||||
private final String postFix;
|
||||
|
||||
Sorting(@NonNull String order) {
|
||||
postFix = " ORDER BY " + order;
|
||||
}
|
||||
|
||||
private String applyToQuery(@NonNull String query) {
|
||||
return query + postFix;
|
||||
}
|
||||
|
||||
public boolean isRelatedToFileSize() {
|
||||
return this == Largest;
|
||||
}
|
||||
|
||||
public static @NonNull Sorting deserialize(int code) {
|
||||
switch (code) {
|
||||
case 0:
|
||||
return Newest;
|
||||
case 1:
|
||||
return Oldest;
|
||||
case 2:
|
||||
return Largest;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown code: " + code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final static class StorageBreakdown {
|
||||
private long photoSize;
|
||||
private long videoSize;
|
||||
private long audioSize;
|
||||
private long documentSize;
|
||||
|
||||
public long getPhotoSize() {
|
||||
return photoSize;
|
||||
}
|
||||
|
||||
public long getVideoSize() {
|
||||
return videoSize;
|
||||
}
|
||||
|
||||
public long getAudioSize() {
|
||||
return audioSize;
|
||||
}
|
||||
|
||||
public long getDocumentSize() {
|
||||
return documentSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,301 @@
|
||||
package org.thoughtcrime.securesms.database;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@SuppressLint({"RecipientIdDatabaseReferenceUsage", "ThreadIdDatabaseReferenceUsage"}) // Not a real table, just a view
|
||||
public class MediaTable extends DatabaseTable {
|
||||
|
||||
public static final int ALL_THREADS = -1;
|
||||
private static final String THREAD_RECIPIENT_ID = "THREAD_RECIPIENT_ID";
|
||||
|
||||
private static final String BASE_MEDIA_QUERY = "SELECT " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + " AS " + AttachmentTable.ROW_ID + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_TYPE + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.UNIQUE_ID + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFER_STATE + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.SIZE + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.FILE_NAME + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.DATA + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.CDN_NUMBER + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_LOCATION + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_DISPOSITION + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.DIGEST + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.FAST_PREFLIGHT_ID + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.VOICE_NOTE + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.BORDERLESS + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.VIDEO_GIF + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.WIDTH + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.HEIGHT + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.QUOTE + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_ID + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_KEY + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_ID + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_EMOJI + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.VISUAL_HASH + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFORM_PROPERTIES + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.CAPTION + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.NAME + ", "
|
||||
+ AttachmentTable.TABLE_NAME + "." + AttachmentTable.UPLOAD_TIMESTAMP + ", "
|
||||
+ MmsTable.TABLE_NAME + "." + MmsTable.MESSAGE_BOX + ", "
|
||||
+ MmsTable.TABLE_NAME + "." + MmsTable.DATE_SENT + ", "
|
||||
+ MmsTable.TABLE_NAME + "." + MmsTable.DATE_RECEIVED + ", "
|
||||
+ MmsTable.TABLE_NAME + "." + MmsTable.DATE_SERVER + ", "
|
||||
+ MmsTable.TABLE_NAME + "." + MmsTable.THREAD_ID + ", "
|
||||
+ MmsTable.TABLE_NAME + "." + MmsTable.RECIPIENT_ID + ", "
|
||||
+ ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID + " as " + THREAD_RECIPIENT_ID + " "
|
||||
+ "FROM " + AttachmentTable.TABLE_NAME + " LEFT JOIN " + MmsTable.TABLE_NAME
|
||||
+ " ON " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " = " + MmsTable.TABLE_NAME + "." + MmsTable.ID + " "
|
||||
+ "LEFT JOIN " + ThreadTable.TABLE_NAME
|
||||
+ " ON " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + " = " + MmsTable.TABLE_NAME + "." + MmsTable.THREAD_ID + " "
|
||||
+ "WHERE " + AttachmentTable.MMS_ID + " IN (SELECT " + MmsSmsColumns.ID
|
||||
+ " FROM " + MmsTable.TABLE_NAME
|
||||
+ " WHERE " + MmsTable.THREAD_ID + " __EQUALITY__ ?) AND (%s) AND "
|
||||
+ MmsTable.VIEW_ONCE + " = 0 AND "
|
||||
+ MmsTable.STORY_TYPE + " = 0 AND "
|
||||
+ AttachmentTable.DATA + " IS NOT NULL AND "
|
||||
+ "(" + AttachmentTable.QUOTE + " = 0 OR (" + AttachmentTable.QUOTE + " = 1 AND " + AttachmentTable.DATA_HASH + " IS NULL)) AND "
|
||||
+ AttachmentTable.STICKER_PACK_ID + " IS NULL AND "
|
||||
+ MmsTable.RECIPIENT_ID + " > 0 AND "
|
||||
+ THREAD_RECIPIENT_ID + " > 0";
|
||||
|
||||
private static final String UNIQUE_MEDIA_QUERY = "SELECT "
|
||||
+ "MAX(" + AttachmentTable.SIZE + ") as " + AttachmentTable.SIZE + ", "
|
||||
+ AttachmentTable.CONTENT_TYPE + " "
|
||||
+ "FROM " + AttachmentTable.TABLE_NAME + " "
|
||||
+ "WHERE " + AttachmentTable.STICKER_PACK_ID + " IS NULL AND " + AttachmentTable.TRANSFER_STATE + " = " + AttachmentTable.TRANSFER_PROGRESS_DONE + " "
|
||||
+ "GROUP BY " + AttachmentTable.DATA;
|
||||
|
||||
private static final String GALLERY_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentTable.CONTENT_TYPE + " NOT LIKE 'image/svg%' AND (" +
|
||||
AttachmentTable.CONTENT_TYPE + " LIKE 'image/%' OR " +
|
||||
AttachmentTable.CONTENT_TYPE + " LIKE 'video/%')");
|
||||
private static final String AUDIO_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentTable.CONTENT_TYPE + " LIKE 'audio/%'");
|
||||
private static final String ALL_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentTable.CONTENT_TYPE + " NOT LIKE 'text/x-signal-plain'");
|
||||
private static final String DOCUMENT_MEDIA_QUERY = String.format(BASE_MEDIA_QUERY, AttachmentTable.CONTENT_TYPE + " LIKE 'image/svg%' OR (" +
|
||||
AttachmentTable.CONTENT_TYPE + " NOT LIKE 'image/%' AND " +
|
||||
AttachmentTable.CONTENT_TYPE + " NOT LIKE 'video/%' AND " +
|
||||
AttachmentTable.CONTENT_TYPE + " NOT LIKE 'audio/%' AND " +
|
||||
AttachmentTable.CONTENT_TYPE + " NOT LIKE 'text/x-signal-plain')");
|
||||
|
||||
MediaTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getGalleryMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, GALLERY_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getDocumentMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, DOCUMENT_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getAudioMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, AUDIO_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
public @NonNull Cursor getAllMediaForThread(long threadId, @NonNull Sorting sorting) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String query = sorting.applyToQuery(applyEqualityOperator(threadId, ALL_MEDIA_QUERY));
|
||||
String[] args = {threadId + ""};
|
||||
|
||||
return database.rawQuery(query, args);
|
||||
}
|
||||
|
||||
private static String applyEqualityOperator(long threadId, String query) {
|
||||
return query.replace("__EQUALITY__", threadId == ALL_THREADS ? "!=" : "=");
|
||||
}
|
||||
|
||||
public StorageBreakdown getStorageBreakdown() {
|
||||
StorageBreakdown storageBreakdown = new StorageBreakdown();
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
|
||||
try (Cursor cursor = database.rawQuery(UNIQUE_MEDIA_QUERY, new String[0])) {
|
||||
int sizeColumn = cursor.getColumnIndexOrThrow(AttachmentTable.SIZE);
|
||||
int contentTypeColumn = cursor.getColumnIndexOrThrow(AttachmentTable.CONTENT_TYPE);
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
int size = cursor.getInt(sizeColumn);
|
||||
String type = cursor.getString(contentTypeColumn);
|
||||
|
||||
switch (MediaUtil.getSlideTypeFromContentType(type)) {
|
||||
case GIF:
|
||||
case IMAGE:
|
||||
case MMS:
|
||||
storageBreakdown.photoSize += size;
|
||||
break;
|
||||
case VIDEO:
|
||||
storageBreakdown.videoSize += size;
|
||||
break;
|
||||
case AUDIO:
|
||||
storageBreakdown.audioSize += size;
|
||||
break;
|
||||
case LONG_TEXT:
|
||||
case DOCUMENT:
|
||||
storageBreakdown.documentSize += size;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return storageBreakdown;
|
||||
}
|
||||
|
||||
public static class MediaRecord {
|
||||
|
||||
private final DatabaseAttachment attachment;
|
||||
private final RecipientId recipientId;
|
||||
private final RecipientId threadRecipientId;
|
||||
private final long threadId;
|
||||
private final long date;
|
||||
private final boolean outgoing;
|
||||
|
||||
private MediaRecord(@Nullable DatabaseAttachment attachment,
|
||||
@NonNull RecipientId recipientId,
|
||||
@NonNull RecipientId threadRecipientId,
|
||||
long threadId,
|
||||
long date,
|
||||
boolean outgoing)
|
||||
{
|
||||
this.attachment = attachment;
|
||||
this.recipientId = recipientId;
|
||||
this.threadRecipientId = threadRecipientId;
|
||||
this.threadId = threadId;
|
||||
this.date = date;
|
||||
this.outgoing = outgoing;
|
||||
}
|
||||
|
||||
public static MediaRecord from(@NonNull Cursor cursor) {
|
||||
AttachmentTable attachmentDatabase = SignalDatabase.attachments();
|
||||
List<DatabaseAttachment> attachments = attachmentDatabase.getAttachments(cursor);
|
||||
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.RECIPIENT_ID)));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.THREAD_ID));
|
||||
boolean outgoing = MessageTable.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.MESSAGE_BOX)));
|
||||
|
||||
long date;
|
||||
|
||||
if (MmsTable.Types.isPushType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.MESSAGE_BOX)))) {
|
||||
date = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.DATE_SENT));
|
||||
} else {
|
||||
date = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.DATE_RECEIVED));
|
||||
}
|
||||
|
||||
RecipientId threadRecipient = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_RECIPIENT_ID)));
|
||||
|
||||
return new MediaRecord(attachments != null && attachments.size() > 0 ? attachments.get(0) : null,
|
||||
recipientId,
|
||||
threadRecipient,
|
||||
threadId,
|
||||
date,
|
||||
outgoing);
|
||||
}
|
||||
|
||||
public @Nullable DatabaseAttachment getAttachment() {
|
||||
return attachment;
|
||||
}
|
||||
|
||||
public String getContentType() {
|
||||
return attachment.getContentType();
|
||||
}
|
||||
|
||||
public @NonNull RecipientId getRecipientId() {
|
||||
return recipientId;
|
||||
}
|
||||
|
||||
public @NonNull RecipientId getThreadRecipientId() {
|
||||
return threadRecipientId;
|
||||
}
|
||||
|
||||
public long getThreadId() {
|
||||
return threadId;
|
||||
}
|
||||
|
||||
public long getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public boolean isOutgoing() {
|
||||
return outgoing;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Sorting {
|
||||
Newest (AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " DESC, " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + " DESC, " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + " DESC"),
|
||||
Oldest (AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " ASC, " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + " DESC, " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + " ASC"),
|
||||
Largest(AttachmentTable.TABLE_NAME + "." + AttachmentTable.SIZE + " DESC, " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + " DESC");
|
||||
|
||||
private final String postFix;
|
||||
|
||||
Sorting(@NonNull String order) {
|
||||
postFix = " ORDER BY " + order;
|
||||
}
|
||||
|
||||
private String applyToQuery(@NonNull String query) {
|
||||
return query + postFix;
|
||||
}
|
||||
|
||||
public boolean isRelatedToFileSize() {
|
||||
return this == Largest;
|
||||
}
|
||||
|
||||
public static @NonNull Sorting deserialize(int code) {
|
||||
switch (code) {
|
||||
case 0:
|
||||
return Newest;
|
||||
case 1:
|
||||
return Oldest;
|
||||
case 2:
|
||||
return Largest;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown code: " + code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final static class StorageBreakdown {
|
||||
private long photoSize;
|
||||
private long videoSize;
|
||||
private long audioSize;
|
||||
private long documentSize;
|
||||
|
||||
public long getPhotoSize() {
|
||||
return photoSize;
|
||||
}
|
||||
|
||||
public long getVideoSize() {
|
||||
return videoSize;
|
||||
}
|
||||
|
||||
public long getAudioSize() {
|
||||
return audioSize;
|
||||
}
|
||||
|
||||
public long getDocumentSize() {
|
||||
return documentSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class MentionDatabase extends Database implements RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
||||
public class MentionTable extends DatabaseTable implements RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
||||
|
||||
public static final String TABLE_NAME = "mention";
|
||||
|
||||
@@ -44,7 +44,7 @@ public class MentionDatabase extends Database implements RecipientIdDatabaseRefe
|
||||
"CREATE INDEX IF NOT EXISTS mention_recipient_id_thread_id_index ON " + TABLE_NAME + " (" + RECIPIENT_ID + ", " + THREAD_ID + ");"
|
||||
};
|
||||
|
||||
public MentionDatabase(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
|
||||
public MentionTable(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ public class MentionDatabase extends Database implements RecipientIdDatabaseRefe
|
||||
|
||||
void deleteAbandonedMentions() {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
String where = MESSAGE_ID + " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ") OR " + THREAD_ID + " NOT IN (SELECT " + ThreadDatabase.ID + " FROM " + ThreadDatabase.TABLE_NAME + ")";
|
||||
String where = MESSAGE_ID + " NOT IN (SELECT " + MmsTable.ID + " FROM " + MmsTable.TABLE_NAME + ") OR " + THREAD_ID + " NOT IN (SELECT " + ThreadTable.ID + " FROM " + ThreadTable.TABLE_NAME + ")";
|
||||
|
||||
db.delete(TABLE_NAME, where, null);
|
||||
}
|
||||
@@ -169,7 +169,7 @@ public class MentionDatabase extends Database implements RecipientIdDatabaseRefe
|
||||
@Override
|
||||
public void remapThread(long fromId, long toId) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(MentionDatabase.THREAD_ID, toId);
|
||||
values.put(MentionTable.THREAD_ID, toId);
|
||||
|
||||
getWritableDatabase().update(TABLE_NAME, values, THREAD_ID + " = ?", SqlUtil.buildArgs(fromId));
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import com.annimon.stream.function.Function;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.MentionSetting;
|
||||
import org.thoughtcrime.securesms.database.RecipientTable.MentionSetting;
|
||||
import org.thoughtcrime.securesms.database.model.Mention;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||
|
||||
@@ -47,10 +47,10 @@ import org.whispersystems.signalservice.internal.push.SignalServiceProtos
|
||||
* - We *don't* really need to optimize for retrieval, since that happens very infrequently. In particular, we don't want to slow down inserts in order to
|
||||
* improve retrieval time. That means we shouldn't be adding indexes that optimize for retrieval.
|
||||
*/
|
||||
class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SignalDatabase?) : Database(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
class MessageSendLogTables constructor(context: Context?, databaseHelper: SignalDatabase?) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(MessageSendLogDatabase::class.java)
|
||||
private val TAG = Log.tag(MessageSendLogTables::class.java)
|
||||
|
||||
@JvmField
|
||||
val CREATE_TABLE: Array<String> = arrayOf(PayloadTable.CREATE_TABLE, RecipientTable.CREATE_TABLE, MessageTable.CREATE_TABLE)
|
||||
@@ -88,21 +88,21 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: Sign
|
||||
|
||||
val CREATE_TRIGGERS = arrayOf(
|
||||
"""
|
||||
CREATE TRIGGER msl_sms_delete AFTER DELETE ON ${SmsDatabase.TABLE_NAME}
|
||||
CREATE TRIGGER msl_sms_delete AFTER DELETE ON ${SmsTable.TABLE_NAME}
|
||||
BEGIN
|
||||
DELETE FROM $TABLE_NAME WHERE $ID IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = old.${SmsDatabase.ID} AND ${MessageTable.IS_MMS} = 0);
|
||||
DELETE FROM $TABLE_NAME WHERE $ID IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = old.${SmsTable.ID} AND ${MessageTable.IS_MMS} = 0);
|
||||
END
|
||||
""",
|
||||
"""
|
||||
CREATE TRIGGER msl_mms_delete AFTER DELETE ON ${MmsDatabase.TABLE_NAME}
|
||||
CREATE TRIGGER msl_mms_delete AFTER DELETE ON ${MmsTable.TABLE_NAME}
|
||||
BEGIN
|
||||
DELETE FROM $TABLE_NAME WHERE $ID IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = old.${MmsDatabase.ID} AND ${MessageTable.IS_MMS} = 1);
|
||||
DELETE FROM $TABLE_NAME WHERE $ID IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = old.${MmsTable.ID} AND ${MessageTable.IS_MMS} = 1);
|
||||
END
|
||||
""",
|
||||
"""
|
||||
CREATE TRIGGER msl_attachment_delete AFTER DELETE ON ${AttachmentDatabase.TABLE_NAME}
|
||||
CREATE TRIGGER msl_attachment_delete AFTER DELETE ON ${AttachmentTable.TABLE_NAME}
|
||||
BEGIN
|
||||
DELETE FROM $TABLE_NAME WHERE $ID IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = old.${AttachmentDatabase.MMS_ID} AND ${MessageTable.IS_MMS} = 1);
|
||||
DELETE FROM $TABLE_NAME WHERE $ID IN (SELECT ${MessageTable.PAYLOAD_ID} FROM ${MessageTable.TABLE_NAME} WHERE ${MessageTable.MESSAGE_ID} = old.${AttachmentTable.MMS_ID} AND ${MessageTable.IS_MMS} = 1);
|
||||
END
|
||||
"""
|
||||
)
|
||||
@@ -60,14 +60,14 @@ import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public abstract class MessageDatabase extends Database implements MmsSmsColumns, RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
||||
public abstract class MessageTable extends DatabaseTable implements MmsSmsColumns, RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
||||
|
||||
private static final String TAG = Log.tag(MessageDatabase.class);
|
||||
private static final String TAG = Log.tag(MessageTable.class);
|
||||
|
||||
protected static final String THREAD_ID_WHERE = THREAD_ID + " = ?";
|
||||
protected static final String[] THREAD_ID_PROJECTION = new String[] { THREAD_ID };
|
||||
|
||||
public MessageDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public MessageTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -174,8 +174,8 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
|
||||
public abstract @NonNull InsertResult insertChatSessionRefreshedMessage(@NonNull RecipientId recipientId, long senderDeviceId, long sentTimestamp);
|
||||
public abstract void insertBadDecryptMessage(@NonNull RecipientId recipientId, int senderDevice, long sentTimestamp, long receivedTimestamp, long threadId);
|
||||
public abstract long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener);
|
||||
public abstract long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, @Nullable SmsDatabase.InsertListener insertListener) throws MmsException;
|
||||
public abstract long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, int defaultReceiptStatus, @Nullable SmsDatabase.InsertListener insertListener) throws MmsException;
|
||||
public abstract long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, @Nullable SmsTable.InsertListener insertListener) throws MmsException;
|
||||
public abstract long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, int defaultReceiptStatus, @Nullable SmsTable.InsertListener insertListener) throws MmsException;
|
||||
public abstract void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName);
|
||||
public abstract void insertGroupV1MigrationEvents(@NonNull RecipientId recipientId, long threadId, @NonNull GroupMigrationMembershipChange membershipChange);
|
||||
public abstract void insertNumberChangeMessages(@NonNull RecipientId recipientId);
|
||||
@@ -220,7 +220,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
|
||||
public abstract @NonNull Cursor getStoryReplies(long parentStoryId);
|
||||
public abstract @Nullable Long getOldestStorySendTimestamp(boolean hasSeenReleaseChannelStories);
|
||||
public abstract int deleteStoriesOlderThan(long timestamp, boolean hasSeenReleaseChannelStories);
|
||||
public abstract @NonNull MessageDatabase.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit);
|
||||
public abstract @NonNull MessageTable.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit);
|
||||
public abstract @Nullable ParentStoryId.GroupReply getParentStoryIdForGroupReply(long messageId);
|
||||
public abstract void deleteGroupStoryReplies(long parentStoryId);
|
||||
public abstract boolean isOutgoingStoryAlreadyInDatabase(@NonNull RecipientId recipientId, long sentTimestamp);
|
||||
@@ -313,7 +313,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
|
||||
* @param messageId An id representing the author-timestamp pair of the message that was read on a linked device. Note that the author could be self when
|
||||
* syncing read receipts for reactions.
|
||||
*/
|
||||
final @NonNull MmsSmsDatabase.TimestampReadResult setTimestampReadFromSyncMessage(SyncMessageId messageId, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead) {
|
||||
final @NonNull MmsSmsTable.TimestampReadResult setTimestampReadFromSyncMessage(SyncMessageId messageId, long proposedExpireStarted, @NonNull Map<Long, Long> threadToLatestRead) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalWritableDatabase();
|
||||
List<Pair<Long, Long>> expiring = new LinkedList<>();
|
||||
String[] projection = new String[] { ID, THREAD_ID, EXPIRES_IN, EXPIRE_STARTED };
|
||||
@@ -349,7 +349,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
|
||||
}
|
||||
}
|
||||
|
||||
return new MmsSmsDatabase.TimestampReadResult(expiring, threads);
|
||||
return new MmsSmsTable.TimestampReadResult(expiring, threads);
|
||||
}
|
||||
|
||||
private int getMessageCountForRecipientsAndType(String typeClause) {
|
||||
@@ -552,7 +552,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
|
||||
@Override
|
||||
public void remapThread(long fromId, long toId) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(SmsDatabase.THREAD_ID, toId);
|
||||
values.put(SmsTable.THREAD_ID, toId);
|
||||
getWritableDatabase().update(getTableName(), values, THREAD_ID + " = ?", SqlUtil.buildArgs(fromId));
|
||||
}
|
||||
|
||||
@@ -689,9 +689,9 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
|
||||
}
|
||||
|
||||
protected enum ReceiptType {
|
||||
READ(READ_RECEIPT_COUNT, GroupReceiptDatabase.STATUS_READ),
|
||||
DELIVERY(DELIVERY_RECEIPT_COUNT, GroupReceiptDatabase.STATUS_DELIVERED),
|
||||
VIEWED(VIEWED_RECEIPT_COUNT, GroupReceiptDatabase.STATUS_VIEWED);
|
||||
READ(READ_RECEIPT_COUNT, GroupReceiptTable.STATUS_READ),
|
||||
DELIVERY(DELIVERY_RECEIPT_COUNT, GroupReceiptTable.STATUS_DELIVERED),
|
||||
VIEWED(VIEWED_RECEIPT_COUNT, GroupReceiptTable.STATUS_VIEWED);
|
||||
|
||||
private final String columnName;
|
||||
private final int groupStatus;
|
||||
@@ -33,8 +33,8 @@ import org.signal.core.util.CursorUtil;
|
||||
import org.signal.core.util.SqlUtil;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.signal.libsignal.protocol.util.Pair;
|
||||
import org.thoughtcrime.securesms.database.MessageDatabase.MessageUpdate;
|
||||
import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId;
|
||||
import org.thoughtcrime.securesms.database.MessageTable.MessageUpdate;
|
||||
import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId;
|
||||
import org.thoughtcrime.securesms.database.model.MessageExportStatus;
|
||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
@@ -59,77 +59,77 @@ import java.util.stream.Collectors;
|
||||
|
||||
import static org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS;
|
||||
|
||||
public class MmsSmsDatabase extends Database {
|
||||
public class MmsSmsTable extends DatabaseTable {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static final String TAG = Log.tag(MmsSmsDatabase.class);
|
||||
private static final String TAG = Log.tag(MmsSmsTable.class);
|
||||
|
||||
public static final String TRANSPORT = "transport_type";
|
||||
public static final String MMS_TRANSPORT = "mms";
|
||||
public static final String SMS_TRANSPORT = "sms";
|
||||
|
||||
private static final String[] PROJECTION = {MmsSmsColumns.ID,
|
||||
MmsSmsColumns.UNIQUE_ROW_ID,
|
||||
SmsDatabase.BODY,
|
||||
SmsDatabase.TYPE,
|
||||
MmsSmsColumns.THREAD_ID,
|
||||
SmsDatabase.RECIPIENT_ID,
|
||||
SmsDatabase.ADDRESS_DEVICE_ID,
|
||||
SmsDatabase.SUBJECT,
|
||||
MmsSmsColumns.NORMALIZED_DATE_SENT,
|
||||
MmsSmsColumns.NORMALIZED_DATE_RECEIVED,
|
||||
MmsSmsColumns.DATE_SERVER,
|
||||
MmsDatabase.MESSAGE_TYPE,
|
||||
MmsDatabase.MESSAGE_BOX,
|
||||
SmsDatabase.STATUS,
|
||||
MmsSmsColumns.UNIDENTIFIED,
|
||||
MmsDatabase.PART_COUNT,
|
||||
MmsDatabase.CONTENT_LOCATION,
|
||||
MmsDatabase.TRANSACTION_ID,
|
||||
MmsDatabase.MESSAGE_SIZE,
|
||||
MmsDatabase.EXPIRY,
|
||||
MmsDatabase.STATUS,
|
||||
MmsSmsColumns.DELIVERY_RECEIPT_COUNT,
|
||||
MmsSmsColumns.READ_RECEIPT_COUNT,
|
||||
MmsSmsColumns.MISMATCHED_IDENTITIES,
|
||||
MmsDatabase.NETWORK_FAILURE,
|
||||
MmsSmsColumns.SUBSCRIPTION_ID,
|
||||
MmsSmsColumns.EXPIRES_IN,
|
||||
MmsSmsColumns.EXPIRE_STARTED,
|
||||
MmsSmsColumns.NOTIFIED,
|
||||
TRANSPORT,
|
||||
AttachmentDatabase.ATTACHMENT_JSON_ALIAS,
|
||||
MmsDatabase.QUOTE_ID,
|
||||
MmsDatabase.QUOTE_AUTHOR,
|
||||
MmsDatabase.QUOTE_BODY,
|
||||
MmsDatabase.QUOTE_MISSING,
|
||||
MmsDatabase.QUOTE_ATTACHMENT,
|
||||
MmsDatabase.QUOTE_TYPE,
|
||||
MmsDatabase.QUOTE_MENTIONS,
|
||||
MmsDatabase.SHARED_CONTACTS,
|
||||
MmsDatabase.LINK_PREVIEWS,
|
||||
MmsDatabase.VIEW_ONCE,
|
||||
MmsSmsColumns.READ,
|
||||
MmsSmsColumns.REACTIONS_UNREAD,
|
||||
MmsSmsColumns.REACTIONS_LAST_SEEN,
|
||||
MmsSmsColumns.REMOTE_DELETED,
|
||||
MmsDatabase.MENTIONS_SELF,
|
||||
MmsSmsColumns.NOTIFIED_TIMESTAMP,
|
||||
MmsSmsColumns.VIEWED_RECEIPT_COUNT,
|
||||
MmsSmsColumns.RECEIPT_TIMESTAMP,
|
||||
MmsDatabase.MESSAGE_RANGES,
|
||||
MmsDatabase.STORY_TYPE,
|
||||
MmsDatabase.PARENT_STORY_ID};
|
||||
private static final String[] PROJECTION = { MmsSmsColumns.ID,
|
||||
MmsSmsColumns.UNIQUE_ROW_ID,
|
||||
SmsTable.BODY,
|
||||
SmsTable.TYPE,
|
||||
MmsSmsColumns.THREAD_ID,
|
||||
SmsTable.RECIPIENT_ID,
|
||||
SmsTable.ADDRESS_DEVICE_ID,
|
||||
SmsTable.SUBJECT,
|
||||
MmsSmsColumns.NORMALIZED_DATE_SENT,
|
||||
MmsSmsColumns.NORMALIZED_DATE_RECEIVED,
|
||||
MmsSmsColumns.DATE_SERVER,
|
||||
MmsTable.MESSAGE_TYPE,
|
||||
MmsTable.MESSAGE_BOX,
|
||||
SmsTable.STATUS,
|
||||
MmsSmsColumns.UNIDENTIFIED,
|
||||
MmsTable.PART_COUNT,
|
||||
MmsTable.CONTENT_LOCATION,
|
||||
MmsTable.TRANSACTION_ID,
|
||||
MmsTable.MESSAGE_SIZE,
|
||||
MmsTable.EXPIRY,
|
||||
MmsTable.STATUS,
|
||||
MmsSmsColumns.DELIVERY_RECEIPT_COUNT,
|
||||
MmsSmsColumns.READ_RECEIPT_COUNT,
|
||||
MmsSmsColumns.MISMATCHED_IDENTITIES,
|
||||
MmsTable.NETWORK_FAILURE,
|
||||
MmsSmsColumns.SUBSCRIPTION_ID,
|
||||
MmsSmsColumns.EXPIRES_IN,
|
||||
MmsSmsColumns.EXPIRE_STARTED,
|
||||
MmsSmsColumns.NOTIFIED,
|
||||
TRANSPORT,
|
||||
AttachmentTable.ATTACHMENT_JSON_ALIAS,
|
||||
MmsTable.QUOTE_ID,
|
||||
MmsTable.QUOTE_AUTHOR,
|
||||
MmsTable.QUOTE_BODY,
|
||||
MmsTable.QUOTE_MISSING,
|
||||
MmsTable.QUOTE_ATTACHMENT,
|
||||
MmsTable.QUOTE_TYPE,
|
||||
MmsTable.QUOTE_MENTIONS,
|
||||
MmsTable.SHARED_CONTACTS,
|
||||
MmsTable.LINK_PREVIEWS,
|
||||
MmsTable.VIEW_ONCE,
|
||||
MmsSmsColumns.READ,
|
||||
MmsSmsColumns.REACTIONS_UNREAD,
|
||||
MmsSmsColumns.REACTIONS_LAST_SEEN,
|
||||
MmsSmsColumns.REMOTE_DELETED,
|
||||
MmsTable.MENTIONS_SELF,
|
||||
MmsSmsColumns.NOTIFIED_TIMESTAMP,
|
||||
MmsSmsColumns.VIEWED_RECEIPT_COUNT,
|
||||
MmsSmsColumns.RECEIPT_TIMESTAMP,
|
||||
MmsTable.MESSAGE_RANGES,
|
||||
MmsTable.STORY_TYPE,
|
||||
MmsTable.PARENT_STORY_ID};
|
||||
|
||||
private static final String SNIPPET_QUERY = "SELECT " + MmsSmsColumns.ID + ", 0 AS " + TRANSPORT + ", " + SmsDatabase.TYPE + " AS " + MmsSmsColumns.NORMALIZED_TYPE + ", " + SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " FROM " + SmsDatabase.TABLE_NAME + " " +
|
||||
"WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND " + SmsDatabase.TYPE + " NOT IN (" + SmsDatabase.Types.PROFILE_CHANGE_TYPE + ", " + SmsDatabase.Types.GV1_MIGRATION_TYPE + ", " + SmsDatabase.Types.CHANGE_NUMBER_TYPE + ", " + SmsDatabase.Types.BOOST_REQUEST_TYPE + ", " + SmsDatabase.Types.SMS_EXPORT_TYPE + ") AND " + SmsDatabase.TYPE + " & " + GROUP_V2_LEAVE_BITS + " != " + GROUP_V2_LEAVE_BITS + " " +
|
||||
private static final String SNIPPET_QUERY = "SELECT " + MmsSmsColumns.ID + ", 0 AS " + TRANSPORT + ", " + SmsTable.TYPE + " AS " + MmsSmsColumns.NORMALIZED_TYPE + ", " + SmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " FROM " + SmsTable.TABLE_NAME + " " +
|
||||
"WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND " + SmsTable.TYPE + " NOT IN (" + SmsTable.Types.PROFILE_CHANGE_TYPE + ", " + SmsTable.Types.GV1_MIGRATION_TYPE + ", " + SmsTable.Types.CHANGE_NUMBER_TYPE + ", " + SmsTable.Types.BOOST_REQUEST_TYPE + ", " + SmsTable.Types.SMS_EXPORT_TYPE + ") AND " + SmsTable.TYPE + " & " + GROUP_V2_LEAVE_BITS + " != " + GROUP_V2_LEAVE_BITS + " " +
|
||||
"UNION ALL " +
|
||||
"SELECT " + MmsSmsColumns.ID + ", 1 AS " + TRANSPORT + ", " + MmsDatabase.MESSAGE_BOX + " AS " + MmsSmsColumns.NORMALIZED_TYPE + ", " + MmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " FROM " + MmsDatabase.TABLE_NAME + " " +
|
||||
"WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND " + MmsDatabase.MESSAGE_BOX + " & " + GROUP_V2_LEAVE_BITS + " != " + GROUP_V2_LEAVE_BITS + " AND " + MmsDatabase.STORY_TYPE + " = 0 AND " + MmsDatabase.PARENT_STORY_ID + " <= 0 " +
|
||||
"SELECT " + MmsSmsColumns.ID + ", 1 AS " + TRANSPORT + ", " + MmsTable.MESSAGE_BOX + " AS " + MmsSmsColumns.NORMALIZED_TYPE + ", " + MmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " FROM " + MmsTable.TABLE_NAME + " " +
|
||||
"WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND " + MmsTable.MESSAGE_BOX + " & " + GROUP_V2_LEAVE_BITS + " != " + GROUP_V2_LEAVE_BITS + " AND " + MmsTable.STORY_TYPE + " = 0 AND " + MmsTable.PARENT_STORY_ID + " <= 0 " +
|
||||
"ORDER BY " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC " +
|
||||
"LIMIT 1";
|
||||
|
||||
public MmsSmsDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public MmsSmsTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -154,9 +154,9 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
private @NonNull Pair<RecipientId, Long> getGroupAddedBy(long threadId, long lastQuitChecked) {
|
||||
MessageDatabase mmsDatabase = SignalDatabase.mms();
|
||||
MessageDatabase smsDatabase = SignalDatabase.sms();
|
||||
long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked);
|
||||
MessageTable mmsDatabase = SignalDatabase.mms();
|
||||
MessageTable smsDatabase = SignalDatabase.sms();
|
||||
long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked);
|
||||
RecipientId id = smsDatabase.getOldestGroupUpdateSender(threadId, latestQuit);
|
||||
|
||||
return new Pair<>(id, latestQuit);
|
||||
@@ -166,7 +166,7 @@ public class MmsSmsDatabase extends Database {
|
||||
String[] projection = new String[] { "COUNT(*)" };
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " +
|
||||
MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " >= " + timestamp + " AND " +
|
||||
MmsDatabase.STORY_TYPE + " = 0 AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
MmsTable.STORY_TYPE + " = 0 AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
|
||||
try (Cursor cursor = queryTables(projection, selection, null, null, false)) {
|
||||
if (cursor != null && cursor.moveToNext()) {
|
||||
@@ -180,7 +180,7 @@ public class MmsSmsDatabase extends Database {
|
||||
Recipient author = Recipient.resolved(authorId);
|
||||
|
||||
try (Cursor cursor = queryTables(PROJECTION, MmsSmsColumns.NORMALIZED_DATE_SENT + " = " + timestamp, null, null, true)) {
|
||||
MmsSmsDatabase.Reader reader = readerFor(cursor);
|
||||
MmsSmsTable.Reader reader = readerFor(cursor);
|
||||
|
||||
MessageRecord messageRecord;
|
||||
|
||||
@@ -211,7 +211,7 @@ public class MmsSmsDatabase extends Database {
|
||||
public Cursor getConversation(long threadId, long offset, long limit) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC";
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsDatabase.STORY_TYPE + " = 0 AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsTable.STORY_TYPE + " = 0 AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
String limitStr = limit > 0 || offset > 0 ? offset + ", " + limit : null;
|
||||
String query = buildQuery(PROJECTION, selection, order, limitStr, false);
|
||||
|
||||
@@ -274,7 +274,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " ASC";
|
||||
String selection = MmsSmsColumns.NOTIFIED + " = 0 AND " + MmsDatabase.STORY_TYPE + " = 0 AND (" + MmsSmsColumns.READ + " = 0 OR " + MmsSmsColumns.REACTIONS_UNREAD + " = 1" + (stickyQuery.length() > 0 ? " OR (" + stickyQuery + ")" : "") + ")";
|
||||
String selection = MmsSmsColumns.NOTIFIED + " = 0 AND " + MmsTable.STORY_TYPE + " = 0 AND (" + MmsSmsColumns.READ + " = 0 OR " + MmsSmsColumns.REACTIONS_UNREAD + " = 1" + (stickyQuery.length() > 0 ? " OR (" + stickyQuery + ")" : "") + ")";
|
||||
|
||||
return queryTables(PROJECTION, selection, order, null, true);
|
||||
}
|
||||
@@ -286,10 +286,10 @@ public class MmsSmsDatabase extends Database {
|
||||
RecipientId author = messageRecord.isOutgoing() ? Recipient.self().getId() : messageRecord.getRecipient().getId();
|
||||
long timestamp = messageRecord.getDateSent();
|
||||
|
||||
String where = MmsDatabase.QUOTE_ID + " = ? AND " + MmsDatabase.QUOTE_AUTHOR + " = ?";
|
||||
String where = MmsTable.QUOTE_ID + " = ? AND " + MmsTable.QUOTE_AUTHOR + " = ?";
|
||||
String[] whereArgs = SqlUtil.buildArgs(timestamp, author);
|
||||
|
||||
try (Cursor cursor = getReadableDatabase().query(MmsDatabase.TABLE_NAME, new String[]{ "1" }, where, whereArgs, null, null, null, "1")) {
|
||||
try (Cursor cursor = getReadableDatabase().query(MmsTable.TABLE_NAME, new String[]{ "1" }, where, whereArgs, null, null, null, "1")) {
|
||||
return cursor.moveToFirst();
|
||||
}
|
||||
}
|
||||
@@ -303,7 +303,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
RecipientId author = targetMessage.isOutgoing() ? Recipient.self().getId() : targetMessage.getRecipient().getId();
|
||||
String query = MmsDatabase.QUOTE_ID + " = " + targetMessage.getDateSent() + " AND " + MmsDatabase.QUOTE_AUTHOR + " = " + author.serialize();
|
||||
String query = MmsTable.QUOTE_ID + " = " + targetMessage.getDateSent() + " AND " + MmsTable.QUOTE_AUTHOR + " = " + author.serialize();
|
||||
String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC";
|
||||
|
||||
List<MessageRecord> records = new ArrayList<>();
|
||||
@@ -331,14 +331,14 @@ public class MmsSmsDatabase extends Database {
|
||||
|
||||
private @NonNull String getStickyWherePartForParentStoryId(@Nullable Long parentStoryId) {
|
||||
if (parentStoryId == null) {
|
||||
return " AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
return " AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
}
|
||||
|
||||
return " AND " + MmsDatabase.PARENT_STORY_ID + " = " + parentStoryId;
|
||||
return " AND " + MmsTable.PARENT_STORY_ID + " = " + parentStoryId;
|
||||
}
|
||||
|
||||
public int getUnreadCount(long threadId) {
|
||||
String selection = MmsSmsColumns.READ + " = 0 AND " + MmsDatabase.STORY_TYPE + " = 0 AND " + MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
String selection = MmsSmsColumns.READ + " = 0 AND " + MmsTable.STORY_TYPE + " = 0 AND " + MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
|
||||
try (Cursor cursor = queryTables(PROJECTION, selection, null, null, false)) {
|
||||
return cursor != null ? cursor.getCount() : 0;
|
||||
@@ -346,8 +346,8 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
public boolean checkMessageExists(@NonNull MessageRecord messageRecord) {
|
||||
MessageDatabase db = messageRecord.isMms() ? SignalDatabase.mms()
|
||||
: SignalDatabase.sms();
|
||||
MessageTable db = messageRecord.isMms() ? SignalDatabase.mms()
|
||||
: SignalDatabase.sms();
|
||||
|
||||
try (Cursor cursor = db.getMessageCursor(messageRecord.getId())) {
|
||||
return cursor != null && cursor.getCount() > 0;
|
||||
@@ -468,37 +468,37 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
public Collection<SyncMessageId> incrementDeliveryReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp) {
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageDatabase.ReceiptType.DELIVERY);
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageTable.ReceiptType.DELIVERY);
|
||||
}
|
||||
|
||||
public boolean incrementDeliveryReceiptCount(SyncMessageId syncMessageId, long timestamp) {
|
||||
return incrementReceiptCount(syncMessageId, timestamp, MessageDatabase.ReceiptType.DELIVERY);
|
||||
return incrementReceiptCount(syncMessageId, timestamp, MessageTable.ReceiptType.DELIVERY);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return A list of ID's that were not updated.
|
||||
*/
|
||||
public @NonNull Collection<SyncMessageId> incrementReadReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp) {
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageDatabase.ReceiptType.READ);
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageTable.ReceiptType.READ);
|
||||
}
|
||||
|
||||
public boolean incrementReadReceiptCount(SyncMessageId syncMessageId, long timestamp) {
|
||||
return incrementReceiptCount(syncMessageId, timestamp, MessageDatabase.ReceiptType.READ);
|
||||
return incrementReceiptCount(syncMessageId, timestamp, MessageTable.ReceiptType.READ);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return A list of ID's that were not updated.
|
||||
*/
|
||||
public @NonNull Collection<SyncMessageId> incrementViewedReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp) {
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageDatabase.ReceiptType.VIEWED);
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageTable.ReceiptType.VIEWED);
|
||||
}
|
||||
|
||||
public @NonNull Collection<SyncMessageId> incrementViewedNonStoryReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp) {
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageDatabase.ReceiptType.VIEWED, MessageDatabase.MessageQualifier.NORMAL);
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, MessageTable.ReceiptType.VIEWED, MessageTable.MessageQualifier.NORMAL);
|
||||
}
|
||||
|
||||
public boolean incrementViewedReceiptCount(SyncMessageId syncMessageId, long timestamp) {
|
||||
return incrementReceiptCount(syncMessageId, timestamp, MessageDatabase.ReceiptType.VIEWED);
|
||||
return incrementReceiptCount(syncMessageId, timestamp, MessageTable.ReceiptType.VIEWED);
|
||||
}
|
||||
|
||||
public @NonNull Collection<SyncMessageId> incrementViewedStoryReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp) {
|
||||
@@ -509,7 +509,7 @@ public class MmsSmsDatabase extends Database {
|
||||
db.beginTransaction();
|
||||
try {
|
||||
for (SyncMessageId id : syncMessageIds) {
|
||||
Set<MessageUpdate> updates = incrementReceiptCountInternal(id, timestamp, MessageDatabase.ReceiptType.VIEWED, MessageDatabase.MessageQualifier.STORY);
|
||||
Set<MessageUpdate> updates = incrementReceiptCountInternal(id, timestamp, MessageTable.ReceiptType.VIEWED, MessageTable.MessageQualifier.STORY);
|
||||
|
||||
if (updates.size() > 0) {
|
||||
messageUpdates.addAll(updates);
|
||||
@@ -540,13 +540,13 @@ public class MmsSmsDatabase extends Database {
|
||||
*
|
||||
* @return Whether or not some thread was updated.
|
||||
*/
|
||||
private boolean incrementReceiptCount(SyncMessageId syncMessageId, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType) {
|
||||
return incrementReceiptCount(syncMessageId, timestamp, receiptType, MessageDatabase.MessageQualifier.ALL);
|
||||
private boolean incrementReceiptCount(SyncMessageId syncMessageId, long timestamp, @NonNull MessageTable.ReceiptType receiptType) {
|
||||
return incrementReceiptCount(syncMessageId, timestamp, receiptType, MessageTable.MessageQualifier.ALL);
|
||||
}
|
||||
|
||||
private boolean incrementReceiptCount(SyncMessageId syncMessageId, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType, @NonNull MessageDatabase.MessageQualifier messageQualifier) {
|
||||
private boolean incrementReceiptCount(SyncMessageId syncMessageId, long timestamp, @NonNull MessageTable.ReceiptType receiptType, @NonNull MessageTable.MessageQualifier messageQualifier) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
ThreadDatabase threadDatabase = SignalDatabase.threads();
|
||||
ThreadTable threadTable = SignalDatabase.threads();
|
||||
Set<MessageUpdate> messageUpdates = new HashSet<>();
|
||||
|
||||
db.beginTransaction();
|
||||
@@ -554,7 +554,7 @@ public class MmsSmsDatabase extends Database {
|
||||
messageUpdates = incrementReceiptCountInternal(syncMessageId, timestamp, receiptType, messageQualifier);
|
||||
|
||||
for (MessageUpdate messageUpdate : messageUpdates) {
|
||||
threadDatabase.update(messageUpdate.getThreadId(), false);
|
||||
threadTable.update(messageUpdate.getThreadId(), false);
|
||||
}
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
@@ -574,14 +574,14 @@ public class MmsSmsDatabase extends Database {
|
||||
*
|
||||
* @return All of the messages that didn't result in updates.
|
||||
*/
|
||||
private @NonNull Collection<SyncMessageId> incrementReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType) {
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, receiptType, MessageDatabase.MessageQualifier.ALL);
|
||||
private @NonNull Collection<SyncMessageId> incrementReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp, @NonNull MessageTable.ReceiptType receiptType) {
|
||||
return incrementReceiptCounts(syncMessageIds, timestamp, receiptType, MessageTable.MessageQualifier.ALL);
|
||||
}
|
||||
|
||||
private @NonNull Collection<SyncMessageId> incrementReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType, @NonNull MessageDatabase.MessageQualifier messageQualifier) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
ThreadDatabase threadDatabase = SignalDatabase.threads();
|
||||
Set<MessageUpdate> messageUpdates = new HashSet<>();
|
||||
private @NonNull Collection<SyncMessageId> incrementReceiptCounts(@NonNull List<SyncMessageId> syncMessageIds, long timestamp, @NonNull MessageTable.ReceiptType receiptType, @NonNull MessageTable.MessageQualifier messageQualifier) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
ThreadTable threadTable = SignalDatabase.threads();
|
||||
Set<MessageUpdate> messageUpdates = new HashSet<>();
|
||||
Collection<SyncMessageId> unhandled = new HashSet<>();
|
||||
|
||||
db.beginTransaction();
|
||||
@@ -597,7 +597,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
for (MessageUpdate update : messageUpdates) {
|
||||
threadDatabase.updateSilently(update.getThreadId(), false);
|
||||
threadTable.updateSilently(update.getThreadId(), false);
|
||||
}
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
@@ -621,7 +621,7 @@ public class MmsSmsDatabase extends Database {
|
||||
/**
|
||||
* Doesn't do any transactions or updates, so we can re-use the method safely.
|
||||
*/
|
||||
private @NonNull Set<MessageUpdate> incrementReceiptCountInternal(SyncMessageId syncMessageId, long timestamp, MessageDatabase.ReceiptType receiptType, @NonNull MessageDatabase.MessageQualifier messageQualifier) {
|
||||
private @NonNull Set<MessageUpdate> incrementReceiptCountInternal(SyncMessageId syncMessageId, long timestamp, MessageTable.ReceiptType receiptType, @NonNull MessageTable.MessageQualifier messageQualifier) {
|
||||
Set<MessageUpdate> messageUpdates = new HashSet<>();
|
||||
|
||||
messageUpdates.addAll(SignalDatabase.sms().incrementReceiptCount(syncMessageId, timestamp, receiptType, messageQualifier));
|
||||
@@ -635,7 +635,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
private @NonNull MessageExportState getMessageExportState(@NonNull MessageId messageId) throws NoSuchMessageException {
|
||||
String table = messageId.isMms() ? MmsDatabase.TABLE_NAME : SmsDatabase.TABLE_NAME;
|
||||
String table = messageId.isMms() ? MmsTable.TABLE_NAME : SmsTable.TABLE_NAME;
|
||||
String[] projection = SqlUtil.buildArgs(MmsSmsColumns.EXPORT_STATE);
|
||||
String[] args = SqlUtil.buildArgs(messageId.getId());
|
||||
|
||||
@@ -674,7 +674,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
public void markMessageExported(@NonNull MessageId messageId) {
|
||||
String table = messageId.isMms() ? MmsDatabase.TABLE_NAME : SmsDatabase.TABLE_NAME;
|
||||
String table = messageId.isMms() ? MmsTable.TABLE_NAME : SmsTable.TABLE_NAME;
|
||||
ContentValues contentValues = new ContentValues(1);
|
||||
|
||||
contentValues.put(MmsSmsColumns.EXPORTED, MessageExportStatus.EXPORTED.getCode());
|
||||
@@ -683,7 +683,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
public void markMessageExportFailed(@NonNull MessageId messageId) {
|
||||
String table = messageId.isMms() ? MmsDatabase.TABLE_NAME : SmsDatabase.TABLE_NAME;
|
||||
String table = messageId.isMms() ? MmsTable.TABLE_NAME : SmsTable.TABLE_NAME;
|
||||
ContentValues contentValues = new ContentValues(1);
|
||||
|
||||
contentValues.put(MmsSmsColumns.EXPORTED, MessageExportStatus.ERROR.getCode());
|
||||
@@ -692,7 +692,7 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
private void setMessageExportState(@NonNull MessageId messageId, @NonNull MessageExportState messageExportState) {
|
||||
String table = messageId.isMms() ? MmsDatabase.TABLE_NAME : SmsDatabase.TABLE_NAME;
|
||||
String table = messageId.isMms() ? MmsTable.TABLE_NAME : SmsTable.TABLE_NAME;
|
||||
ContentValues contentValues = new ContentValues(1);
|
||||
|
||||
contentValues.put(MmsSmsColumns.EXPORT_STATE, messageExportState.toByteArray());
|
||||
@@ -762,7 +762,7 @@ public class MmsSmsDatabase extends Database {
|
||||
|
||||
public int getQuotedMessagePosition(long threadId, long quoteId, @NonNull RecipientId recipientId) {
|
||||
String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC";
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsDatabase.STORY_TYPE + " = 0" + " AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsTable.STORY_TYPE + " = 0" + " AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
|
||||
try (Cursor cursor = queryTables(new String[]{ MmsSmsColumns.NORMALIZED_DATE_SENT, MmsSmsColumns.RECIPIENT_ID, MmsSmsColumns.REMOTE_DELETED}, selection, order, null, false)) {
|
||||
boolean isOwnNumber = Recipient.resolved(recipientId).isSelf();
|
||||
@@ -785,7 +785,7 @@ public class MmsSmsDatabase extends Database {
|
||||
|
||||
public int getMessagePositionInConversation(long threadId, long receivedTimestamp, @NonNull RecipientId recipientId) {
|
||||
String order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC";
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsDatabase.STORY_TYPE + " = 0" + " AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsTable.STORY_TYPE + " = 0" + " AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
|
||||
try (Cursor cursor = queryTables(new String[]{ MmsSmsColumns.NORMALIZED_DATE_RECEIVED, MmsSmsColumns.RECIPIENT_ID, MmsSmsColumns.REMOTE_DELETED}, selection, order, null, false)) {
|
||||
boolean isOwnNumber = Recipient.resolved(recipientId).isSelf();
|
||||
@@ -834,12 +834,12 @@ public class MmsSmsDatabase extends Database {
|
||||
order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " ASC";
|
||||
selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " +
|
||||
MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " < " + receivedTimestamp + " AND " +
|
||||
MmsDatabase.STORY_TYPE + " = 0 AND " + MmsDatabase.PARENT_STORY_ID + " = " + groupStoryId;
|
||||
MmsTable.STORY_TYPE + " = 0 AND " + MmsTable.PARENT_STORY_ID + " = " + groupStoryId;
|
||||
} else {
|
||||
order = MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC";
|
||||
selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " +
|
||||
MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " > " + receivedTimestamp + " AND " +
|
||||
MmsDatabase.STORY_TYPE + " = 0 AND " + MmsDatabase.PARENT_STORY_ID + " <= 0";
|
||||
MmsTable.STORY_TYPE + " = 0 AND " + MmsTable.PARENT_STORY_ID + " <= 0";
|
||||
}
|
||||
|
||||
try (Cursor cursor = queryTables(new String[]{ "COUNT(*)" }, selection, order, null, false)) {
|
||||
@@ -881,8 +881,8 @@ public class MmsSmsDatabase extends Database {
|
||||
SignalDatabase.mms().deleteAbandonedMessages();
|
||||
}
|
||||
|
||||
public @NonNull List<MessageDatabase.ReportSpamData> getReportSpamMessageServerData(long threadId, long timestamp, int limit) {
|
||||
List<MessageDatabase.ReportSpamData> data = new ArrayList<>();
|
||||
public @NonNull List<MessageTable.ReportSpamData> getReportSpamMessageServerData(long threadId, long timestamp, int limit) {
|
||||
List<MessageTable.ReportSpamData> data = new ArrayList<>();
|
||||
data.addAll(SignalDatabase.sms().getReportSpamMessageServerGuids(threadId, timestamp));
|
||||
data.addAll(SignalDatabase.mms().getReportSpamMessageServerGuids(threadId, timestamp));
|
||||
return data.stream()
|
||||
@@ -894,126 +894,126 @@ public class MmsSmsDatabase extends Database {
|
||||
private static @NonNull String buildQuery(String[] projection, String selection, String order, String limit, boolean includeAttachments) {
|
||||
String attachmentJsonJoin;
|
||||
if (includeAttachments) {
|
||||
attachmentJsonJoin = "json_group_array(json_object(" + "'" + AttachmentDatabase.ROW_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + ", " +
|
||||
"'" + AttachmentDatabase.UNIQUE_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.UNIQUE_ID + ", " +
|
||||
"'" + AttachmentDatabase.MMS_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + "," +
|
||||
"'" + AttachmentDatabase.SIZE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.SIZE + ", " +
|
||||
"'" + AttachmentDatabase.FILE_NAME + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.FILE_NAME + ", " +
|
||||
"'" + AttachmentDatabase.DATA + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DATA + ", " +
|
||||
"'" + AttachmentDatabase.CONTENT_TYPE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_TYPE + ", " +
|
||||
"'" + AttachmentDatabase.CDN_NUMBER + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CDN_NUMBER + ", " +
|
||||
"'" + AttachmentDatabase.CONTENT_LOCATION + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_LOCATION + ", " +
|
||||
"'" + AttachmentDatabase.FAST_PREFLIGHT_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.FAST_PREFLIGHT_ID + ", " +
|
||||
"'" + AttachmentDatabase.VOICE_NOTE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VOICE_NOTE + ", " +
|
||||
"'" + AttachmentDatabase.BORDERLESS + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.BORDERLESS + ", " +
|
||||
"'" + AttachmentDatabase.VIDEO_GIF + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VIDEO_GIF + ", " +
|
||||
"'" + AttachmentDatabase.WIDTH + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.WIDTH + ", " +
|
||||
"'" + AttachmentDatabase.HEIGHT + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.HEIGHT + ", " +
|
||||
"'" + AttachmentDatabase.QUOTE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.QUOTE + ", " +
|
||||
"'" + AttachmentDatabase.CONTENT_DISPOSITION + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_DISPOSITION + ", " +
|
||||
"'" + AttachmentDatabase.NAME + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.NAME + ", " +
|
||||
"'" + AttachmentDatabase.TRANSFER_STATE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.TRANSFER_STATE + ", " +
|
||||
"'" + AttachmentDatabase.CAPTION + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CAPTION + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_PACK_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_PACK_ID + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_PACK_KEY + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_PACK_KEY + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_ID + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_EMOJI + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_EMOJI + ", " +
|
||||
"'" + AttachmentDatabase.VISUAL_HASH + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VISUAL_HASH + ", " +
|
||||
"'" + AttachmentDatabase.TRANSFORM_PROPERTIES + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.TRANSFORM_PROPERTIES + ", " +
|
||||
"'" + AttachmentDatabase.DISPLAY_ORDER + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DISPLAY_ORDER + ", " +
|
||||
"'" + AttachmentDatabase.UPLOAD_TIMESTAMP + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.UPLOAD_TIMESTAMP + "))";
|
||||
attachmentJsonJoin = "json_group_array(json_object(" + "'" + AttachmentTable.ROW_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + ", " +
|
||||
"'" + AttachmentTable.UNIQUE_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.UNIQUE_ID + ", " +
|
||||
"'" + AttachmentTable.MMS_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + "," +
|
||||
"'" + AttachmentTable.SIZE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.SIZE + ", " +
|
||||
"'" + AttachmentTable.FILE_NAME + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.FILE_NAME + ", " +
|
||||
"'" + AttachmentTable.DATA + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DATA + ", " +
|
||||
"'" + AttachmentTable.CONTENT_TYPE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_TYPE + ", " +
|
||||
"'" + AttachmentTable.CDN_NUMBER + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CDN_NUMBER + ", " +
|
||||
"'" + AttachmentTable.CONTENT_LOCATION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_LOCATION + ", " +
|
||||
"'" + AttachmentTable.FAST_PREFLIGHT_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.FAST_PREFLIGHT_ID + ", " +
|
||||
"'" + AttachmentTable.VOICE_NOTE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VOICE_NOTE + ", " +
|
||||
"'" + AttachmentTable.BORDERLESS + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.BORDERLESS + ", " +
|
||||
"'" + AttachmentTable.VIDEO_GIF + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VIDEO_GIF + ", " +
|
||||
"'" + AttachmentTable.WIDTH + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.WIDTH + ", " +
|
||||
"'" + AttachmentTable.HEIGHT + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.HEIGHT + ", " +
|
||||
"'" + AttachmentTable.QUOTE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.QUOTE + ", " +
|
||||
"'" + AttachmentTable.CONTENT_DISPOSITION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_DISPOSITION + ", " +
|
||||
"'" + AttachmentTable.NAME + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.NAME + ", " +
|
||||
"'" + AttachmentTable.TRANSFER_STATE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFER_STATE + ", " +
|
||||
"'" + AttachmentTable.CAPTION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CAPTION + ", " +
|
||||
"'" + AttachmentTable.STICKER_PACK_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_ID + ", " +
|
||||
"'" + AttachmentTable.STICKER_PACK_KEY + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_KEY + ", " +
|
||||
"'" + AttachmentTable.STICKER_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_ID + ", " +
|
||||
"'" + AttachmentTable.STICKER_EMOJI + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_EMOJI + ", " +
|
||||
"'" + AttachmentTable.VISUAL_HASH + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VISUAL_HASH + ", " +
|
||||
"'" + AttachmentTable.TRANSFORM_PROPERTIES + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFORM_PROPERTIES + ", " +
|
||||
"'" + AttachmentTable.DISPLAY_ORDER + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + ", " +
|
||||
"'" + AttachmentTable.UPLOAD_TIMESTAMP + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.UPLOAD_TIMESTAMP + "))";
|
||||
} else {
|
||||
attachmentJsonJoin = "NULL";
|
||||
}
|
||||
|
||||
String[] mmsProjection = {MmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT,
|
||||
MmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED,
|
||||
MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " AS " + MmsSmsColumns.ID,
|
||||
"'MMS::' || " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " || '::' || " + MmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.UNIQUE_ROW_ID,
|
||||
attachmentJsonJoin + " AS " + AttachmentDatabase.ATTACHMENT_JSON_ALIAS,
|
||||
SmsDatabase.BODY,
|
||||
MmsSmsColumns.READ,
|
||||
MmsSmsColumns.THREAD_ID,
|
||||
SmsDatabase.TYPE,
|
||||
SmsDatabase.RECIPIENT_ID,
|
||||
SmsDatabase.ADDRESS_DEVICE_ID,
|
||||
SmsDatabase.SUBJECT,
|
||||
MmsDatabase.MESSAGE_TYPE,
|
||||
MmsDatabase.MESSAGE_BOX,
|
||||
SmsDatabase.STATUS,
|
||||
MmsDatabase.PART_COUNT,
|
||||
MmsDatabase.CONTENT_LOCATION,
|
||||
MmsDatabase.TRANSACTION_ID,
|
||||
MmsDatabase.MESSAGE_SIZE,
|
||||
MmsDatabase.EXPIRY,
|
||||
MmsDatabase.STATUS,
|
||||
MmsDatabase.UNIDENTIFIED,
|
||||
MmsSmsColumns.DELIVERY_RECEIPT_COUNT,
|
||||
MmsSmsColumns.READ_RECEIPT_COUNT,
|
||||
MmsSmsColumns.MISMATCHED_IDENTITIES,
|
||||
MmsSmsColumns.SUBSCRIPTION_ID,
|
||||
MmsSmsColumns.EXPIRES_IN,
|
||||
MmsSmsColumns.EXPIRE_STARTED,
|
||||
MmsSmsColumns.NOTIFIED,
|
||||
MmsDatabase.NETWORK_FAILURE, TRANSPORT,
|
||||
MmsDatabase.QUOTE_ID,
|
||||
MmsDatabase.QUOTE_AUTHOR,
|
||||
MmsDatabase.QUOTE_BODY,
|
||||
MmsDatabase.QUOTE_MISSING,
|
||||
MmsDatabase.QUOTE_ATTACHMENT,
|
||||
MmsDatabase.QUOTE_TYPE,
|
||||
MmsDatabase.QUOTE_MENTIONS,
|
||||
MmsDatabase.SHARED_CONTACTS,
|
||||
MmsDatabase.LINK_PREVIEWS,
|
||||
MmsDatabase.VIEW_ONCE,
|
||||
MmsSmsColumns.REACTIONS_UNREAD,
|
||||
MmsSmsColumns.REACTIONS_LAST_SEEN,
|
||||
MmsSmsColumns.DATE_SERVER,
|
||||
MmsSmsColumns.REMOTE_DELETED,
|
||||
MmsDatabase.MENTIONS_SELF,
|
||||
MmsSmsColumns.NOTIFIED_TIMESTAMP,
|
||||
MmsSmsColumns.VIEWED_RECEIPT_COUNT,
|
||||
MmsSmsColumns.RECEIPT_TIMESTAMP,
|
||||
MmsDatabase.MESSAGE_RANGES,
|
||||
MmsDatabase.STORY_TYPE,
|
||||
MmsDatabase.PARENT_STORY_ID};
|
||||
String[] mmsProjection = { MmsTable.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT,
|
||||
MmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED,
|
||||
MmsTable.TABLE_NAME + "." + MmsTable.ID + " AS " + MmsSmsColumns.ID,
|
||||
"'MMS::' || " + MmsTable.TABLE_NAME + "." + MmsTable.ID + " || '::' || " + MmsTable.DATE_SENT + " AS " + MmsSmsColumns.UNIQUE_ROW_ID,
|
||||
attachmentJsonJoin + " AS " + AttachmentTable.ATTACHMENT_JSON_ALIAS,
|
||||
SmsTable.BODY,
|
||||
MmsSmsColumns.READ,
|
||||
MmsSmsColumns.THREAD_ID,
|
||||
SmsTable.TYPE,
|
||||
SmsTable.RECIPIENT_ID,
|
||||
SmsTable.ADDRESS_DEVICE_ID,
|
||||
SmsTable.SUBJECT,
|
||||
MmsTable.MESSAGE_TYPE,
|
||||
MmsTable.MESSAGE_BOX,
|
||||
SmsTable.STATUS,
|
||||
MmsTable.PART_COUNT,
|
||||
MmsTable.CONTENT_LOCATION,
|
||||
MmsTable.TRANSACTION_ID,
|
||||
MmsTable.MESSAGE_SIZE,
|
||||
MmsTable.EXPIRY,
|
||||
MmsTable.STATUS,
|
||||
MmsTable.UNIDENTIFIED,
|
||||
MmsSmsColumns.DELIVERY_RECEIPT_COUNT,
|
||||
MmsSmsColumns.READ_RECEIPT_COUNT,
|
||||
MmsSmsColumns.MISMATCHED_IDENTITIES,
|
||||
MmsSmsColumns.SUBSCRIPTION_ID,
|
||||
MmsSmsColumns.EXPIRES_IN,
|
||||
MmsSmsColumns.EXPIRE_STARTED,
|
||||
MmsSmsColumns.NOTIFIED,
|
||||
MmsTable.NETWORK_FAILURE, TRANSPORT,
|
||||
MmsTable.QUOTE_ID,
|
||||
MmsTable.QUOTE_AUTHOR,
|
||||
MmsTable.QUOTE_BODY,
|
||||
MmsTable.QUOTE_MISSING,
|
||||
MmsTable.QUOTE_ATTACHMENT,
|
||||
MmsTable.QUOTE_TYPE,
|
||||
MmsTable.QUOTE_MENTIONS,
|
||||
MmsTable.SHARED_CONTACTS,
|
||||
MmsTable.LINK_PREVIEWS,
|
||||
MmsTable.VIEW_ONCE,
|
||||
MmsSmsColumns.REACTIONS_UNREAD,
|
||||
MmsSmsColumns.REACTIONS_LAST_SEEN,
|
||||
MmsSmsColumns.DATE_SERVER,
|
||||
MmsSmsColumns.REMOTE_DELETED,
|
||||
MmsTable.MENTIONS_SELF,
|
||||
MmsSmsColumns.NOTIFIED_TIMESTAMP,
|
||||
MmsSmsColumns.VIEWED_RECEIPT_COUNT,
|
||||
MmsSmsColumns.RECEIPT_TIMESTAMP,
|
||||
MmsTable.MESSAGE_RANGES,
|
||||
MmsTable.STORY_TYPE,
|
||||
MmsTable.PARENT_STORY_ID};
|
||||
|
||||
String[] smsProjection = {SmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT,
|
||||
SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED,
|
||||
MmsSmsColumns.ID, "'SMS::' || " + MmsSmsColumns.ID + " || '::' || " + SmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.UNIQUE_ROW_ID,
|
||||
"NULL AS " + AttachmentDatabase.ATTACHMENT_JSON_ALIAS,
|
||||
SmsDatabase.BODY, MmsSmsColumns.READ, MmsSmsColumns.THREAD_ID,
|
||||
SmsDatabase.TYPE, SmsDatabase.RECIPIENT_ID, SmsDatabase.ADDRESS_DEVICE_ID, SmsDatabase.SUBJECT, MmsDatabase.MESSAGE_TYPE,
|
||||
MmsDatabase.MESSAGE_BOX, SmsDatabase.STATUS, MmsDatabase.PART_COUNT,
|
||||
MmsDatabase.CONTENT_LOCATION, MmsDatabase.TRANSACTION_ID,
|
||||
MmsDatabase.MESSAGE_SIZE, MmsDatabase.EXPIRY, MmsDatabase.STATUS,
|
||||
MmsDatabase.UNIDENTIFIED,
|
||||
MmsSmsColumns.DELIVERY_RECEIPT_COUNT, MmsSmsColumns.READ_RECEIPT_COUNT,
|
||||
MmsSmsColumns.MISMATCHED_IDENTITIES,
|
||||
MmsSmsColumns.SUBSCRIPTION_ID, MmsSmsColumns.EXPIRES_IN, MmsSmsColumns.EXPIRE_STARTED,
|
||||
MmsSmsColumns.NOTIFIED,
|
||||
MmsDatabase.NETWORK_FAILURE, TRANSPORT,
|
||||
MmsDatabase.QUOTE_ID,
|
||||
MmsDatabase.QUOTE_AUTHOR,
|
||||
MmsDatabase.QUOTE_BODY,
|
||||
MmsDatabase.QUOTE_MISSING,
|
||||
MmsDatabase.QUOTE_ATTACHMENT,
|
||||
MmsDatabase.QUOTE_TYPE,
|
||||
MmsDatabase.QUOTE_MENTIONS,
|
||||
MmsDatabase.SHARED_CONTACTS,
|
||||
MmsDatabase.LINK_PREVIEWS,
|
||||
MmsDatabase.VIEW_ONCE,
|
||||
MmsSmsColumns.REACTIONS_UNREAD,
|
||||
MmsSmsColumns.REACTIONS_LAST_SEEN,
|
||||
MmsSmsColumns.DATE_SERVER,
|
||||
MmsSmsColumns.REMOTE_DELETED,
|
||||
MmsDatabase.MENTIONS_SELF,
|
||||
MmsSmsColumns.NOTIFIED_TIMESTAMP,
|
||||
MmsSmsColumns.VIEWED_RECEIPT_COUNT,
|
||||
MmsSmsColumns.RECEIPT_TIMESTAMP,
|
||||
MmsDatabase.MESSAGE_RANGES,
|
||||
"0 AS " + MmsDatabase.STORY_TYPE,
|
||||
"0 AS " + MmsDatabase.PARENT_STORY_ID};
|
||||
String[] smsProjection = { SmsTable.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT,
|
||||
SmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED,
|
||||
MmsSmsColumns.ID, "'SMS::' || " + MmsSmsColumns.ID + " || '::' || " + SmsTable.DATE_SENT + " AS " + MmsSmsColumns.UNIQUE_ROW_ID,
|
||||
"NULL AS " + AttachmentTable.ATTACHMENT_JSON_ALIAS,
|
||||
SmsTable.BODY, MmsSmsColumns.READ, MmsSmsColumns.THREAD_ID,
|
||||
SmsTable.TYPE, SmsTable.RECIPIENT_ID, SmsTable.ADDRESS_DEVICE_ID, SmsTable.SUBJECT, MmsTable.MESSAGE_TYPE,
|
||||
MmsTable.MESSAGE_BOX, SmsTable.STATUS, MmsTable.PART_COUNT,
|
||||
MmsTable.CONTENT_LOCATION, MmsTable.TRANSACTION_ID,
|
||||
MmsTable.MESSAGE_SIZE, MmsTable.EXPIRY, MmsTable.STATUS,
|
||||
MmsTable.UNIDENTIFIED,
|
||||
MmsSmsColumns.DELIVERY_RECEIPT_COUNT, MmsSmsColumns.READ_RECEIPT_COUNT,
|
||||
MmsSmsColumns.MISMATCHED_IDENTITIES,
|
||||
MmsSmsColumns.SUBSCRIPTION_ID, MmsSmsColumns.EXPIRES_IN, MmsSmsColumns.EXPIRE_STARTED,
|
||||
MmsSmsColumns.NOTIFIED,
|
||||
MmsTable.NETWORK_FAILURE, TRANSPORT,
|
||||
MmsTable.QUOTE_ID,
|
||||
MmsTable.QUOTE_AUTHOR,
|
||||
MmsTable.QUOTE_BODY,
|
||||
MmsTable.QUOTE_MISSING,
|
||||
MmsTable.QUOTE_ATTACHMENT,
|
||||
MmsTable.QUOTE_TYPE,
|
||||
MmsTable.QUOTE_MENTIONS,
|
||||
MmsTable.SHARED_CONTACTS,
|
||||
MmsTable.LINK_PREVIEWS,
|
||||
MmsTable.VIEW_ONCE,
|
||||
MmsSmsColumns.REACTIONS_UNREAD,
|
||||
MmsSmsColumns.REACTIONS_LAST_SEEN,
|
||||
MmsSmsColumns.DATE_SERVER,
|
||||
MmsSmsColumns.REMOTE_DELETED,
|
||||
MmsTable.MENTIONS_SELF,
|
||||
MmsSmsColumns.NOTIFIED_TIMESTAMP,
|
||||
MmsSmsColumns.VIEWED_RECEIPT_COUNT,
|
||||
MmsSmsColumns.RECEIPT_TIMESTAMP,
|
||||
MmsTable.MESSAGE_RANGES,
|
||||
"0 AS " + MmsTable.STORY_TYPE,
|
||||
"0 AS " + MmsTable.PARENT_STORY_ID};
|
||||
|
||||
SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
|
||||
SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
|
||||
@@ -1023,13 +1023,13 @@ public class MmsSmsDatabase extends Database {
|
||||
smsQueryBuilder.setDistinct(true);
|
||||
}
|
||||
|
||||
smsQueryBuilder.setTables(SmsDatabase.TABLE_NAME);
|
||||
smsQueryBuilder.setTables(SmsTable.TABLE_NAME);
|
||||
|
||||
if (includeAttachments) {
|
||||
mmsQueryBuilder.setTables(MmsDatabase.TABLE_NAME + " LEFT OUTER JOIN " + AttachmentDatabase.TABLE_NAME +
|
||||
" ON " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + " = " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID);
|
||||
mmsQueryBuilder.setTables(MmsTable.TABLE_NAME + " LEFT OUTER JOIN " + AttachmentTable.TABLE_NAME +
|
||||
" ON " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " = " + MmsTable.TABLE_NAME + "." + MmsTable.ID);
|
||||
} else {
|
||||
mmsQueryBuilder.setTables(MmsDatabase.TABLE_NAME);
|
||||
mmsQueryBuilder.setTables(MmsTable.TABLE_NAME);
|
||||
}
|
||||
|
||||
Set<String> mmsColumnsPresent = new HashSet<>();
|
||||
@@ -1045,40 +1045,40 @@ public class MmsSmsDatabase extends Database {
|
||||
mmsColumnsPresent.add(MmsSmsColumns.SUBSCRIPTION_ID);
|
||||
mmsColumnsPresent.add(MmsSmsColumns.EXPIRES_IN);
|
||||
mmsColumnsPresent.add(MmsSmsColumns.EXPIRE_STARTED);
|
||||
mmsColumnsPresent.add(MmsDatabase.MESSAGE_TYPE);
|
||||
mmsColumnsPresent.add(MmsDatabase.MESSAGE_BOX);
|
||||
mmsColumnsPresent.add(MmsDatabase.DATE_SENT);
|
||||
mmsColumnsPresent.add(MmsDatabase.DATE_RECEIVED);
|
||||
mmsColumnsPresent.add(MmsDatabase.DATE_SERVER);
|
||||
mmsColumnsPresent.add(MmsDatabase.PART_COUNT);
|
||||
mmsColumnsPresent.add(MmsDatabase.CONTENT_LOCATION);
|
||||
mmsColumnsPresent.add(MmsDatabase.TRANSACTION_ID);
|
||||
mmsColumnsPresent.add(MmsDatabase.MESSAGE_SIZE);
|
||||
mmsColumnsPresent.add(MmsDatabase.EXPIRY);
|
||||
mmsColumnsPresent.add(MmsDatabase.NOTIFIED);
|
||||
mmsColumnsPresent.add(MmsDatabase.STATUS);
|
||||
mmsColumnsPresent.add(MmsDatabase.UNIDENTIFIED);
|
||||
mmsColumnsPresent.add(MmsDatabase.NETWORK_FAILURE);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_ID);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_AUTHOR);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_BODY);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_MISSING);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_ATTACHMENT);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_TYPE);
|
||||
mmsColumnsPresent.add(MmsDatabase.QUOTE_MENTIONS);
|
||||
mmsColumnsPresent.add(MmsDatabase.SHARED_CONTACTS);
|
||||
mmsColumnsPresent.add(MmsDatabase.LINK_PREVIEWS);
|
||||
mmsColumnsPresent.add(MmsDatabase.VIEW_ONCE);
|
||||
mmsColumnsPresent.add(MmsDatabase.REACTIONS_UNREAD);
|
||||
mmsColumnsPresent.add(MmsDatabase.REACTIONS_LAST_SEEN);
|
||||
mmsColumnsPresent.add(MmsDatabase.REMOTE_DELETED);
|
||||
mmsColumnsPresent.add(MmsDatabase.MENTIONS_SELF);
|
||||
mmsColumnsPresent.add(MmsTable.MESSAGE_TYPE);
|
||||
mmsColumnsPresent.add(MmsTable.MESSAGE_BOX);
|
||||
mmsColumnsPresent.add(MmsTable.DATE_SENT);
|
||||
mmsColumnsPresent.add(MmsTable.DATE_RECEIVED);
|
||||
mmsColumnsPresent.add(MmsTable.DATE_SERVER);
|
||||
mmsColumnsPresent.add(MmsTable.PART_COUNT);
|
||||
mmsColumnsPresent.add(MmsTable.CONTENT_LOCATION);
|
||||
mmsColumnsPresent.add(MmsTable.TRANSACTION_ID);
|
||||
mmsColumnsPresent.add(MmsTable.MESSAGE_SIZE);
|
||||
mmsColumnsPresent.add(MmsTable.EXPIRY);
|
||||
mmsColumnsPresent.add(MmsTable.NOTIFIED);
|
||||
mmsColumnsPresent.add(MmsTable.STATUS);
|
||||
mmsColumnsPresent.add(MmsTable.UNIDENTIFIED);
|
||||
mmsColumnsPresent.add(MmsTable.NETWORK_FAILURE);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_ID);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_AUTHOR);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_BODY);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_MISSING);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_ATTACHMENT);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_TYPE);
|
||||
mmsColumnsPresent.add(MmsTable.QUOTE_MENTIONS);
|
||||
mmsColumnsPresent.add(MmsTable.SHARED_CONTACTS);
|
||||
mmsColumnsPresent.add(MmsTable.LINK_PREVIEWS);
|
||||
mmsColumnsPresent.add(MmsTable.VIEW_ONCE);
|
||||
mmsColumnsPresent.add(MmsTable.REACTIONS_UNREAD);
|
||||
mmsColumnsPresent.add(MmsTable.REACTIONS_LAST_SEEN);
|
||||
mmsColumnsPresent.add(MmsTable.REMOTE_DELETED);
|
||||
mmsColumnsPresent.add(MmsTable.MENTIONS_SELF);
|
||||
mmsColumnsPresent.add(MmsSmsColumns.NOTIFIED_TIMESTAMP);
|
||||
mmsColumnsPresent.add(MmsSmsColumns.VIEWED_RECEIPT_COUNT);
|
||||
mmsColumnsPresent.add(MmsSmsColumns.RECEIPT_TIMESTAMP);
|
||||
mmsColumnsPresent.add(MmsDatabase.MESSAGE_RANGES);
|
||||
mmsColumnsPresent.add(MmsDatabase.STORY_TYPE);
|
||||
mmsColumnsPresent.add(MmsDatabase.PARENT_STORY_ID);
|
||||
mmsColumnsPresent.add(MmsTable.MESSAGE_RANGES);
|
||||
mmsColumnsPresent.add(MmsTable.STORY_TYPE);
|
||||
mmsColumnsPresent.add(MmsTable.PARENT_STORY_ID);
|
||||
|
||||
Set<String> smsColumnsPresent = new HashSet<>();
|
||||
smsColumnsPresent.add(MmsSmsColumns.ID);
|
||||
@@ -1094,22 +1094,22 @@ public class MmsSmsDatabase extends Database {
|
||||
smsColumnsPresent.add(MmsSmsColumns.EXPIRES_IN);
|
||||
smsColumnsPresent.add(MmsSmsColumns.EXPIRE_STARTED);
|
||||
smsColumnsPresent.add(MmsSmsColumns.NOTIFIED);
|
||||
smsColumnsPresent.add(SmsDatabase.TYPE);
|
||||
smsColumnsPresent.add(SmsDatabase.SUBJECT);
|
||||
smsColumnsPresent.add(SmsDatabase.DATE_SENT);
|
||||
smsColumnsPresent.add(SmsDatabase.DATE_RECEIVED);
|
||||
smsColumnsPresent.add(SmsDatabase.DATE_SERVER);
|
||||
smsColumnsPresent.add(SmsDatabase.STATUS);
|
||||
smsColumnsPresent.add(SmsDatabase.UNIDENTIFIED);
|
||||
smsColumnsPresent.add(SmsDatabase.REACTIONS_UNREAD);
|
||||
smsColumnsPresent.add(SmsDatabase.REACTIONS_LAST_SEEN);
|
||||
smsColumnsPresent.add(SmsTable.TYPE);
|
||||
smsColumnsPresent.add(SmsTable.SUBJECT);
|
||||
smsColumnsPresent.add(SmsTable.DATE_SENT);
|
||||
smsColumnsPresent.add(SmsTable.DATE_RECEIVED);
|
||||
smsColumnsPresent.add(SmsTable.DATE_SERVER);
|
||||
smsColumnsPresent.add(SmsTable.STATUS);
|
||||
smsColumnsPresent.add(SmsTable.UNIDENTIFIED);
|
||||
smsColumnsPresent.add(SmsTable.REACTIONS_UNREAD);
|
||||
smsColumnsPresent.add(SmsTable.REACTIONS_LAST_SEEN);
|
||||
smsColumnsPresent.add(MmsSmsColumns.REMOTE_DELETED);
|
||||
smsColumnsPresent.add(MmsSmsColumns.NOTIFIED_TIMESTAMP);
|
||||
smsColumnsPresent.add(MmsSmsColumns.RECEIPT_TIMESTAMP);
|
||||
smsColumnsPresent.add("0 AS " + MmsDatabase.STORY_TYPE);
|
||||
smsColumnsPresent.add("0 AS " + MmsDatabase.PARENT_STORY_ID);
|
||||
smsColumnsPresent.add("0 AS " + MmsTable.STORY_TYPE);
|
||||
smsColumnsPresent.add("0 AS " + MmsTable.PARENT_STORY_ID);
|
||||
|
||||
String mmsGroupBy = includeAttachments ? MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID : null;
|
||||
String mmsGroupBy = includeAttachments ? MmsTable.TABLE_NAME + "." + MmsTable.ID : null;
|
||||
|
||||
String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(TRANSPORT, mmsProjection, mmsColumnsPresent, 4, MMS_TRANSPORT, selection, null, mmsGroupBy, null);
|
||||
String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(TRANSPORT, smsProjection, smsColumnsPresent, 4, SMS_TRANSPORT, selection, null, null, null);
|
||||
@@ -1135,25 +1135,25 @@ public class MmsSmsDatabase extends Database {
|
||||
|
||||
public static class Reader implements Closeable {
|
||||
|
||||
private final Cursor cursor;
|
||||
private SmsDatabase.Reader smsReader;
|
||||
private MmsDatabase.Reader mmsReader;
|
||||
private final Cursor cursor;
|
||||
private SmsTable.Reader smsReader;
|
||||
private MmsTable.Reader mmsReader;
|
||||
|
||||
public Reader(Cursor cursor) {
|
||||
this.cursor = cursor;
|
||||
}
|
||||
|
||||
private SmsDatabase.Reader getSmsReader() {
|
||||
private SmsTable.Reader getSmsReader() {
|
||||
if (smsReader == null) {
|
||||
smsReader = SmsDatabase.readerFor(cursor);
|
||||
smsReader = SmsTable.readerFor(cursor);
|
||||
}
|
||||
|
||||
return smsReader;
|
||||
}
|
||||
|
||||
private MmsDatabase.Reader getMmsReader() {
|
||||
private MmsTable.Reader getMmsReader() {
|
||||
if (mmsReader == null) {
|
||||
mmsReader = MmsDatabase.readerFor(cursor);
|
||||
mmsReader = MmsTable.readerFor(cursor);
|
||||
}
|
||||
|
||||
return mmsReader;
|
||||
@@ -1169,8 +1169,8 @@ public class MmsSmsDatabase extends Database {
|
||||
public MessageRecord getCurrent() {
|
||||
String type = cursor.getString(cursor.getColumnIndexOrThrow(TRANSPORT));
|
||||
|
||||
if (MmsSmsDatabase.MMS_TRANSPORT.equals(type)) return getMmsReader().getCurrent();
|
||||
else if (MmsSmsDatabase.SMS_TRANSPORT.equals(type)) return getSmsReader().getCurrent();
|
||||
if (MmsSmsTable.MMS_TRANSPORT.equals(type)) return getMmsReader().getCurrent();
|
||||
else if (MmsSmsTable.SMS_TRANSPORT.equals(type)) return getSmsReader().getCurrent();
|
||||
else throw new AssertionError("Bad type: " + type);
|
||||
}
|
||||
|
||||
@@ -117,9 +117,9 @@ import java.util.UUID;
|
||||
|
||||
import static org.thoughtcrime.securesms.contactshare.Contact.Avatar;
|
||||
|
||||
public class MmsDatabase extends MessageDatabase {
|
||||
public class MmsTable extends MessageTable {
|
||||
|
||||
private static final String TAG = Log.tag(MmsDatabase.class);
|
||||
private static final String TAG = Log.tag(MmsTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "mms";
|
||||
static final String DATE_SENT = "date";
|
||||
@@ -216,7 +216,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
};
|
||||
|
||||
private static final String[] MMS_PROJECTION = new String[] {
|
||||
MmsDatabase.TABLE_NAME + "." + ID + " AS " + ID,
|
||||
MmsTable.TABLE_NAME + "." + ID + " AS " + ID,
|
||||
THREAD_ID, DATE_SENT + " AS " + NORMALIZED_DATE_SENT,
|
||||
DATE_RECEIVED + " AS " + NORMALIZED_DATE_RECEIVED,
|
||||
DATE_SERVER,
|
||||
@@ -230,35 +230,35 @@ public class MmsDatabase extends MessageDatabase {
|
||||
REMOTE_DELETED, MENTIONS_SELF, NOTIFIED_TIMESTAMP, VIEWED_RECEIPT_COUNT, RECEIPT_TIMESTAMP, MESSAGE_RANGES,
|
||||
STORY_TYPE, PARENT_STORY_ID,
|
||||
"json_group_array(json_object(" +
|
||||
"'" + AttachmentDatabase.ROW_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + ", " +
|
||||
"'" + AttachmentDatabase.UNIQUE_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.UNIQUE_ID + ", " +
|
||||
"'" + AttachmentDatabase.MMS_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + ", " +
|
||||
"'" + AttachmentDatabase.SIZE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.SIZE + ", " +
|
||||
"'" + AttachmentDatabase.FILE_NAME + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.FILE_NAME + ", " +
|
||||
"'" + AttachmentDatabase.DATA + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DATA + ", " +
|
||||
"'" + AttachmentDatabase.CONTENT_TYPE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_TYPE + ", " +
|
||||
"'" + AttachmentDatabase.CDN_NUMBER + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CDN_NUMBER + ", " +
|
||||
"'" + AttachmentDatabase.CONTENT_LOCATION + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_LOCATION + ", " +
|
||||
"'" + AttachmentDatabase.FAST_PREFLIGHT_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.FAST_PREFLIGHT_ID + "," +
|
||||
"'" + AttachmentDatabase.VOICE_NOTE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VOICE_NOTE + "," +
|
||||
"'" + AttachmentDatabase.BORDERLESS + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.BORDERLESS + "," +
|
||||
"'" + AttachmentDatabase.VIDEO_GIF + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VIDEO_GIF + "," +
|
||||
"'" + AttachmentDatabase.WIDTH + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.WIDTH + "," +
|
||||
"'" + AttachmentDatabase.HEIGHT + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.HEIGHT + "," +
|
||||
"'" + AttachmentDatabase.QUOTE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.QUOTE + ", " +
|
||||
"'" + AttachmentDatabase.CONTENT_DISPOSITION + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CONTENT_DISPOSITION + ", " +
|
||||
"'" + AttachmentDatabase.NAME + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.NAME + ", " +
|
||||
"'" + AttachmentDatabase.TRANSFER_STATE + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.TRANSFER_STATE + ", " +
|
||||
"'" + AttachmentDatabase.CAPTION + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.CAPTION + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_PACK_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_PACK_ID + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_PACK_KEY + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_PACK_KEY + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_ID + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_ID + ", " +
|
||||
"'" + AttachmentDatabase.STICKER_EMOJI + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.STICKER_EMOJI + ", " +
|
||||
"'" + AttachmentDatabase.VISUAL_HASH + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.VISUAL_HASH + ", " +
|
||||
"'" + AttachmentDatabase.TRANSFORM_PROPERTIES + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.TRANSFORM_PROPERTIES + ", " +
|
||||
"'" + AttachmentDatabase.DISPLAY_ORDER + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.DISPLAY_ORDER + ", " +
|
||||
"'" + AttachmentDatabase.UPLOAD_TIMESTAMP + "', " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.UPLOAD_TIMESTAMP +
|
||||
")) AS " + AttachmentDatabase.ATTACHMENT_JSON_ALIAS,
|
||||
"'" + AttachmentTable.ROW_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + ", " +
|
||||
"'" + AttachmentTable.UNIQUE_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.UNIQUE_ID + ", " +
|
||||
"'" + AttachmentTable.MMS_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + ", " +
|
||||
"'" + AttachmentTable.SIZE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.SIZE + ", " +
|
||||
"'" + AttachmentTable.FILE_NAME + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.FILE_NAME + ", " +
|
||||
"'" + AttachmentTable.DATA + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DATA + ", " +
|
||||
"'" + AttachmentTable.CONTENT_TYPE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_TYPE + ", " +
|
||||
"'" + AttachmentTable.CDN_NUMBER + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CDN_NUMBER + ", " +
|
||||
"'" + AttachmentTable.CONTENT_LOCATION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_LOCATION + ", " +
|
||||
"'" + AttachmentTable.FAST_PREFLIGHT_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.FAST_PREFLIGHT_ID + "," +
|
||||
"'" + AttachmentTable.VOICE_NOTE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VOICE_NOTE + "," +
|
||||
"'" + AttachmentTable.BORDERLESS + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.BORDERLESS + "," +
|
||||
"'" + AttachmentTable.VIDEO_GIF + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VIDEO_GIF + "," +
|
||||
"'" + AttachmentTable.WIDTH + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.WIDTH + "," +
|
||||
"'" + AttachmentTable.HEIGHT + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.HEIGHT + "," +
|
||||
"'" + AttachmentTable.QUOTE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.QUOTE + ", " +
|
||||
"'" + AttachmentTable.CONTENT_DISPOSITION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_DISPOSITION + ", " +
|
||||
"'" + AttachmentTable.NAME + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.NAME + ", " +
|
||||
"'" + AttachmentTable.TRANSFER_STATE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFER_STATE + ", " +
|
||||
"'" + AttachmentTable.CAPTION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CAPTION + ", " +
|
||||
"'" + AttachmentTable.STICKER_PACK_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_ID + ", " +
|
||||
"'" + AttachmentTable.STICKER_PACK_KEY + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_KEY + ", " +
|
||||
"'" + AttachmentTable.STICKER_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_ID + ", " +
|
||||
"'" + AttachmentTable.STICKER_EMOJI + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_EMOJI + ", " +
|
||||
"'" + AttachmentTable.VISUAL_HASH + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VISUAL_HASH + ", " +
|
||||
"'" + AttachmentTable.TRANSFORM_PROPERTIES + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFORM_PROPERTIES + ", " +
|
||||
"'" + AttachmentTable.DISPLAY_ORDER + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + ", " +
|
||||
"'" + AttachmentTable.UPLOAD_TIMESTAMP + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.UPLOAD_TIMESTAMP +
|
||||
")) AS " + AttachmentTable.ATTACHMENT_JSON_ALIAS,
|
||||
};
|
||||
|
||||
private static final String IS_STORY_CLAUSE = STORY_TYPE + " > 0 AND " + REMOTE_DELETED + " = 0";
|
||||
@@ -270,7 +270,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
private final EarlyReceiptCache earlyDeliveryReceiptCache = new EarlyReceiptCache("MmsDelivery");
|
||||
|
||||
public MmsDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public MmsTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -621,7 +621,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getOutgoingStoriesTo(@NonNull RecipientId recipientId) {
|
||||
public @NonNull MessageTable.Reader getOutgoingStoriesTo(@NonNull RecipientId recipientId) {
|
||||
Recipient recipient = Recipient.resolved(recipientId);
|
||||
Long threadId = null;
|
||||
|
||||
@@ -644,14 +644,14 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllOutgoingStories(boolean reverse, int limit) {
|
||||
public @NonNull MessageTable.Reader getAllOutgoingStories(boolean reverse, int limit) {
|
||||
String where = IS_STORY_CLAUSE + " AND (" + getOutgoingTypeClause() + ")";
|
||||
|
||||
return new Reader(rawQuery(where, null, reverse, limit));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllOutgoingStoriesAt(long sentTimestamp) {
|
||||
public @NonNull MessageTable.Reader getAllOutgoingStoriesAt(long sentTimestamp) {
|
||||
String where = IS_STORY_CLAUSE + " AND " + DATE_SENT + " = ? AND (" + getOutgoingTypeClause() + ")";
|
||||
String[] whereArgs = SqlUtil.buildArgs(sentTimestamp);
|
||||
Cursor cursor = rawQuery(where, whereArgs, false, -1L);
|
||||
@@ -685,7 +685,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllStoriesFor(@NonNull RecipientId recipientId, int limit) {
|
||||
public @NonNull MessageTable.Reader getAllStoriesFor(@NonNull RecipientId recipientId, int limit) {
|
||||
long threadId = SignalDatabase.threads().getThreadIdIfExistsFor(recipientId);
|
||||
String where = IS_STORY_CLAUSE + " AND " + THREAD_ID_WHERE;
|
||||
String[] whereArgs = SqlUtil.buildArgs(threadId);
|
||||
@@ -695,7 +695,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit) {
|
||||
public @NonNull MessageTable.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit) {
|
||||
final long threadId = SignalDatabase.threads().getThreadIdIfExistsFor(recipientId);
|
||||
final String query = IS_STORY_CLAUSE +
|
||||
" AND NOT (" + getOutgoingTypeClause() + ") " +
|
||||
@@ -826,10 +826,10 @@ public class MmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
public @NonNull List<RecipientId> getUnreadStoryThreadRecipientIds() {
|
||||
SQLiteDatabase db = getReadableDatabase();
|
||||
String query = "SELECT DISTINCT " + ThreadDatabase.RECIPIENT_ID + "\n"
|
||||
String query = "SELECT DISTINCT " + ThreadTable.RECIPIENT_ID + "\n"
|
||||
+ "FROM " + TABLE_NAME + "\n"
|
||||
+ "JOIN " + ThreadDatabase.TABLE_NAME + "\n"
|
||||
+ "ON " + TABLE_NAME + "." + THREAD_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + "\n"
|
||||
+ "JOIN " + ThreadTable.TABLE_NAME + "\n"
|
||||
+ "ON " + TABLE_NAME + "." + THREAD_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + "\n"
|
||||
+ "WHERE " + IS_STORY_CLAUSE + " AND (" + getOutgoingTypeClause() + ") = 0 AND " + VIEWED_RECEIPT_COUNT + " = 0 AND " + TABLE_NAME + "." + READ + " = 0";
|
||||
|
||||
try (Cursor cursor = db.rawQuery(query, null)) {
|
||||
@@ -877,7 +877,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
results = new ArrayList<>(cursor.getCount());
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
results.add(new StoryResult(RecipientId.from(CursorUtil.requireLong(cursor, ThreadDatabase.RECIPIENT_ID)),
|
||||
results.add(new StoryResult(RecipientId.from(CursorUtil.requireLong(cursor, ThreadTable.RECIPIENT_ID)),
|
||||
CursorUtil.requireLong(cursor, "mms_id"),
|
||||
CursorUtil.requireLong(cursor, "sent_timestamp"),
|
||||
CursorUtil.requireBoolean(cursor, "is_outgoing")));
|
||||
@@ -1288,12 +1288,12 @@ public class MmsDatabase extends MessageDatabase {
|
||||
private Cursor rawQuery(@NonNull String[] projection, @NonNull String where, @Nullable String[] arguments, boolean reverse, long limit) {
|
||||
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
|
||||
String rawQueryString = "SELECT " + Util.join(projection, ",") +
|
||||
" FROM " + MmsDatabase.TABLE_NAME + " LEFT OUTER JOIN " + AttachmentDatabase.TABLE_NAME +
|
||||
" ON (" + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " = " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + ")" +
|
||||
" WHERE " + where + " GROUP BY " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID;
|
||||
" FROM " + MmsTable.TABLE_NAME + " LEFT OUTER JOIN " + AttachmentTable.TABLE_NAME +
|
||||
" ON (" + MmsTable.TABLE_NAME + "." + MmsTable.ID + " = " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + ")" +
|
||||
" WHERE " + where + " GROUP BY " + MmsTable.TABLE_NAME + "." + MmsTable.ID;
|
||||
|
||||
if (reverse) {
|
||||
rawQueryString += " ORDER BY " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " DESC";
|
||||
rawQueryString += " ORDER BY " + MmsTable.TABLE_NAME + "." + MmsTable.ID + " DESC";
|
||||
}
|
||||
|
||||
if (limit > 0) {
|
||||
@@ -1330,7 +1330,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
public Reader getMessages(Collection<Long> messageIds) {
|
||||
String ids = TextUtils.join(",", messageIds);
|
||||
return readerFor(rawQuery(MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " IN (" + ids + ")", null));
|
||||
return readerFor(rawQuery(MmsTable.TABLE_NAME + "." + MmsTable.ID + " IN (" + ids + ")", null));
|
||||
}
|
||||
|
||||
private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional<Long> threadId) {
|
||||
@@ -1679,14 +1679,14 @@ public class MmsDatabase extends MessageDatabase {
|
||||
*/
|
||||
void trimEntriesForExpiredMessages() {
|
||||
SQLiteDatabase database = databaseHelper.getSignalWritableDatabase();
|
||||
String trimmedCondition = " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ")";
|
||||
String trimmedCondition = " NOT IN (SELECT " + MmsTable.ID + " FROM " + MmsTable.TABLE_NAME + ")";
|
||||
|
||||
database.delete(GroupReceiptDatabase.TABLE_NAME, GroupReceiptDatabase.MMS_ID + trimmedCondition, null);
|
||||
database.delete(GroupReceiptTable.TABLE_NAME, GroupReceiptTable.MMS_ID + trimmedCondition, null);
|
||||
|
||||
String[] columns = new String[] { AttachmentDatabase.ROW_ID, AttachmentDatabase.UNIQUE_ID };
|
||||
String where = AttachmentDatabase.MMS_ID + trimmedCondition;
|
||||
String[] columns = new String[] { AttachmentTable.ROW_ID, AttachmentTable.UNIQUE_ID };
|
||||
String where = AttachmentTable.MMS_ID + trimmedCondition;
|
||||
|
||||
try (Cursor cursor = database.query(AttachmentDatabase.TABLE_NAME, columns, where, null, null, null, null)) {
|
||||
try (Cursor cursor = database.query(AttachmentTable.TABLE_NAME, columns, where, null, null, null, null)) {
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
SignalDatabase.attachments().deleteAttachment(new AttachmentId(cursor.getLong(0), cursor.getLong(1)));
|
||||
}
|
||||
@@ -1694,7 +1694,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
SignalDatabase.mentions().deleteAbandonedMentions();
|
||||
|
||||
try (Cursor cursor = database.query(ThreadDatabase.TABLE_NAME, new String[] { ThreadDatabase.ID }, ThreadDatabase.EXPIRES_IN + " > 0", null, null, null, null)) {
|
||||
try (Cursor cursor = database.query(ThreadTable.TABLE_NAME, new String[] { ThreadTable.ID }, ThreadTable.EXPIRES_IN + " > 0", null, null, null, null)) {
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
SignalDatabase.threads().setLastScrolled(cursor.getLong(0), 0);
|
||||
SignalDatabase.threads().update(cursor.getLong(0), false);
|
||||
@@ -1727,9 +1727,9 @@ public class MmsDatabase extends MessageDatabase {
|
||||
public OutgoingMediaMessage getOutgoingMessage(long messageId)
|
||||
throws MmsException, NoSuchMessageException
|
||||
{
|
||||
AttachmentDatabase attachmentDatabase = SignalDatabase.attachments();
|
||||
MentionDatabase mentionDatabase = SignalDatabase.mentions();
|
||||
Cursor cursor = null;
|
||||
AttachmentTable attachmentDatabase = SignalDatabase.attachments();
|
||||
MentionTable mentionDatabase = SignalDatabase.mentions();
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
cursor = rawQuery(RAW_ID_WHERE, new String[] {String.valueOf(messageId)});
|
||||
@@ -1747,8 +1747,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID));
|
||||
int distributionType = SignalDatabase.threads().getDistributionType(threadId);
|
||||
String mismatchDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.MISMATCHED_IDENTITIES));
|
||||
String networkDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.NETWORK_FAILURE));
|
||||
String mismatchDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.MISMATCHED_IDENTITIES));
|
||||
String networkDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.NETWORK_FAILURE));
|
||||
StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE));
|
||||
ParentStoryId parentStoryId = ParentStoryId.deserialize(CursorUtil.requireLong(cursor, PARENT_STORY_ID));
|
||||
|
||||
@@ -2205,16 +2205,16 @@ public class MmsDatabase extends MessageDatabase {
|
||||
public long insertMessageOutbox(@NonNull OutgoingMediaMessage message,
|
||||
long threadId,
|
||||
boolean forceSms,
|
||||
@Nullable SmsDatabase.InsertListener insertListener)
|
||||
@Nullable SmsTable.InsertListener insertListener)
|
||||
throws MmsException
|
||||
{
|
||||
return insertMessageOutbox(message, threadId, forceSms, GroupReceiptDatabase.STATUS_UNDELIVERED, insertListener);
|
||||
return insertMessageOutbox(message, threadId, forceSms, GroupReceiptTable.STATUS_UNDELIVERED, insertListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long insertMessageOutbox(@NonNull OutgoingMediaMessage message,
|
||||
long threadId, boolean forceSms, int defaultReceiptStatus,
|
||||
@Nullable SmsDatabase.InsertListener insertListener)
|
||||
@Nullable SmsTable.InsertListener insertListener)
|
||||
throws MmsException
|
||||
{
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
@@ -2326,8 +2326,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||
if (message.getRecipient().isGroup()) {
|
||||
OutgoingGroupUpdateMessage outgoingGroupUpdateMessage = (message instanceof OutgoingGroupUpdateMessage) ? (OutgoingGroupUpdateMessage) message : null;
|
||||
|
||||
GroupReceiptDatabase receiptDatabase = SignalDatabase.groupReceipts();
|
||||
Set<RecipientId> members = new HashSet<>();
|
||||
GroupReceiptTable receiptDatabase = SignalDatabase.groupReceipts();
|
||||
Set<RecipientId> members = new HashSet<>();
|
||||
|
||||
if (outgoingGroupUpdateMessage != null && outgoingGroupUpdateMessage.isV2Group()) {
|
||||
MessageGroupContext.GroupV2Properties groupV2Properties = outgoingGroupUpdateMessage.requireGroupV2Properties();
|
||||
@@ -2337,22 +2337,22 @@ public class MmsDatabase extends MessageDatabase {
|
||||
.toList());
|
||||
members.remove(Recipient.self().getId());
|
||||
} else {
|
||||
members.addAll(Stream.of(SignalDatabase.groups().getGroupMembers(message.getRecipient().requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF)).map(Recipient::getId).toList());
|
||||
members.addAll(Stream.of(SignalDatabase.groups().getGroupMembers(message.getRecipient().requireGroupId(), GroupTable.MemberSet.FULL_MEMBERS_EXCLUDING_SELF)).map(Recipient::getId).toList());
|
||||
}
|
||||
|
||||
receiptDatabase.insert(members, messageId, defaultReceiptStatus, message.getSentTimeMillis());
|
||||
|
||||
for (RecipientId recipientId : earlyDeliveryReceipts.keySet()) {
|
||||
receiptDatabase.update(recipientId, messageId, GroupReceiptDatabase.STATUS_DELIVERED, -1);
|
||||
receiptDatabase.update(recipientId, messageId, GroupReceiptTable.STATUS_DELIVERED, -1);
|
||||
}
|
||||
} else if (message.getRecipient().isDistributionList()) {
|
||||
GroupReceiptDatabase receiptDatabase = SignalDatabase.groupReceipts();
|
||||
List<RecipientId> members = SignalDatabase.distributionLists().getMembers(message.getRecipient().requireDistributionListId());
|
||||
GroupReceiptTable receiptDatabase = SignalDatabase.groupReceipts();
|
||||
List<RecipientId> members = SignalDatabase.distributionLists().getMembers(message.getRecipient().requireDistributionListId());
|
||||
|
||||
receiptDatabase.insert(members, messageId, defaultReceiptStatus, message.getSentTimeMillis());
|
||||
|
||||
for (RecipientId recipientId : earlyDeliveryReceipts.keySet()) {
|
||||
receiptDatabase.update(recipientId, messageId, GroupReceiptDatabase.STATUS_DELIVERED, -1);
|
||||
receiptDatabase.update(recipientId, messageId, GroupReceiptTable.STATUS_DELIVERED, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2399,9 +2399,9 @@ public class MmsDatabase extends MessageDatabase {
|
||||
boolean unarchive)
|
||||
throws MmsException
|
||||
{
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
AttachmentDatabase partsDatabase = SignalDatabase.attachments();
|
||||
MentionDatabase mentionDatabase = SignalDatabase.mentions();
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
AttachmentTable partsDatabase = SignalDatabase.attachments();
|
||||
MentionTable mentionDatabase = SignalDatabase.mentions();
|
||||
|
||||
boolean mentionsSelf = Stream.of(mentions).filter(m -> Recipient.resolved(m.getRecipientId()).isSelf()).findFirst().isPresent();
|
||||
|
||||
@@ -2477,14 +2477,14 @@ public class MmsDatabase extends MessageDatabase {
|
||||
public boolean deleteMessage(long messageId) {
|
||||
Log.d(TAG, "deleteMessage(" + messageId + ")");
|
||||
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
AttachmentDatabase attachmentDatabase = SignalDatabase.attachments();
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
AttachmentTable attachmentDatabase = SignalDatabase.attachments();
|
||||
attachmentDatabase.deleteAttachmentsForMessage(messageId);
|
||||
|
||||
GroupReceiptDatabase groupReceiptDatabase = SignalDatabase.groupReceipts();
|
||||
GroupReceiptTable groupReceiptDatabase = SignalDatabase.groupReceipts();
|
||||
groupReceiptDatabase.deleteRowsForMessage(messageId);
|
||||
|
||||
MentionDatabase mentionDatabase = SignalDatabase.mentions();
|
||||
MentionTable mentionDatabase = SignalDatabase.mentions();
|
||||
mentionDatabase.deleteMentionsForMessage(messageId);
|
||||
|
||||
SQLiteDatabase database = databaseHelper.getSignalWritableDatabase();
|
||||
@@ -2617,8 +2617,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
long bodyTextSize = CursorExtensionsKt.readToSingleLong(messageTextSize);
|
||||
|
||||
String select = "SUM(" + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.SIZE + ") AS s";
|
||||
String fromJoin = TABLE_NAME + " INNER JOIN " + AttachmentDatabase.TABLE_NAME + " ON " + TABLE_NAME + "." + ID + " = " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID;
|
||||
String select = "SUM(" + AttachmentTable.TABLE_NAME + "." + AttachmentTable.SIZE + ") AS s";
|
||||
String fromJoin = TABLE_NAME + " INNER JOIN " + AttachmentTable.TABLE_NAME + " ON " + TABLE_NAME + "." + ID + " = " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID;
|
||||
String where = getInsecureMessageClause() + " AND " + EXPORTED + " < " + MessageExportStatus.EXPORTED.serialize();
|
||||
|
||||
long fileSize = CursorExtensionsKt.readToSingleLong(getReadableDatabase().rawQuery("SELECT " + select + " FROM " + fromJoin + " WHERE " + where, null));
|
||||
@@ -2682,7 +2682,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
void deleteAbandonedMessages() {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadDatabase.TABLE_NAME + ")";
|
||||
String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadTable.TABLE_NAME + ")";
|
||||
|
||||
int deletes = db.delete(TABLE_NAME, where, null);
|
||||
if (deletes > 0) {
|
||||
@@ -2736,15 +2736,15 @@ public class MmsDatabase extends MessageDatabase {
|
||||
long nearestExpiration = Long.MAX_VALUE;
|
||||
|
||||
String query = "SELECT " +
|
||||
TABLE_NAME + "." + ID + ", " +
|
||||
VIEW_ONCE + ", " +
|
||||
DATE_RECEIVED + " " +
|
||||
"FROM " + TABLE_NAME + " INNER JOIN " + AttachmentDatabase.TABLE_NAME + " " +
|
||||
"ON " + TABLE_NAME + "." + ID + " = " + AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.MMS_ID + " " +
|
||||
TABLE_NAME + "." + ID + ", " +
|
||||
VIEW_ONCE + ", " +
|
||||
DATE_RECEIVED + " " +
|
||||
"FROM " + TABLE_NAME + " INNER JOIN " + AttachmentTable.TABLE_NAME + " " +
|
||||
"ON " + TABLE_NAME + "." + ID + " = " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " " +
|
||||
"WHERE " +
|
||||
VIEW_ONCE + " > 0 AND " +
|
||||
"(" + AttachmentDatabase.DATA + " NOT NULL OR " + AttachmentDatabase.TRANSFER_STATE + " != ?)";
|
||||
String[] args = new String[] { String.valueOf(AttachmentDatabase.TRANSFER_PROGRESS_DONE) };
|
||||
VIEW_ONCE + " > 0 AND " +
|
||||
"(" + AttachmentTable.DATA + " NOT NULL OR " + AttachmentTable.TRANSFER_STATE + " != ?)";
|
||||
String[] args = new String[] { String.valueOf(AttachmentTable.TRANSFER_PROGRESS_DONE) };
|
||||
|
||||
try (Cursor cursor = db.rawQuery(query, args)) {
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
@@ -2800,7 +2800,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
public void remapThread(long fromId, long toId) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(SmsDatabase.THREAD_ID, toId);
|
||||
values.put(SmsTable.THREAD_ID, toId);
|
||||
getWritableDatabase().update(TABLE_NAME, values, THREAD_ID + " = ?", SqlUtil.buildArgs(fromId));
|
||||
}
|
||||
|
||||
@@ -2894,7 +2894,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
* 1. They only utilize one of the two interfaces (legacy or iterator)
|
||||
* 1. They close this reader after use, preferably via try-with-resources or a use block.
|
||||
*/
|
||||
public static class Reader implements MessageDatabase.Reader {
|
||||
public static class Reader implements MessageTable.Reader {
|
||||
|
||||
private final Cursor cursor;
|
||||
private final Context context;
|
||||
@@ -2914,7 +2914,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
@Override
|
||||
public MessageRecord getCurrent() {
|
||||
long mmsType = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_TYPE));
|
||||
long mmsType = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.MESSAGE_TYPE));
|
||||
|
||||
if (mmsType == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) {
|
||||
return getNotificationMmsMessageRecord(cursor);
|
||||
@@ -2925,7 +2925,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
@Override
|
||||
public @NonNull MessageExportState getMessageExportStateForCurrentRecord() {
|
||||
byte[] messageExportState = CursorUtil.requireBlob(cursor, MmsDatabase.EXPORT_STATE);
|
||||
byte[] messageExportState = CursorUtil.requireBlob(cursor, MmsTable.EXPORT_STATE);
|
||||
if (messageExportState == null) {
|
||||
return MessageExportState.getDefaultInstance();
|
||||
}
|
||||
@@ -2943,28 +2943,28 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
private NotificationMmsMessageRecord getNotificationMmsMessageRecord(Cursor cursor) {
|
||||
long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.ID));
|
||||
long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_SENT));
|
||||
long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_RECEIVED));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID));
|
||||
long mailbox = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX));
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.RECIPIENT_ID));
|
||||
int addressDeviceId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.ADDRESS_DEVICE_ID));
|
||||
long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.ID));
|
||||
long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.NORMALIZED_DATE_SENT));
|
||||
long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.NORMALIZED_DATE_RECEIVED));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.THREAD_ID));
|
||||
long mailbox = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.MESSAGE_BOX));
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.RECIPIENT_ID));
|
||||
int addressDeviceId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.ADDRESS_DEVICE_ID));
|
||||
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
|
||||
|
||||
String contentLocation = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.CONTENT_LOCATION));
|
||||
String transactionId = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.TRANSACTION_ID));
|
||||
long messageSize = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_SIZE));
|
||||
long expiry = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.EXPIRY));
|
||||
int status = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.STATUS));
|
||||
int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.DELIVERY_RECEIPT_COUNT));
|
||||
int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.READ_RECEIPT_COUNT));
|
||||
int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.SUBSCRIPTION_ID));
|
||||
String contentLocation = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.CONTENT_LOCATION));
|
||||
String transactionId = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.TRANSACTION_ID));
|
||||
long messageSize = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.MESSAGE_SIZE));
|
||||
long expiry = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.EXPIRY));
|
||||
int status = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.STATUS));
|
||||
int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.DELIVERY_RECEIPT_COUNT));
|
||||
int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.READ_RECEIPT_COUNT));
|
||||
int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.SUBSCRIPTION_ID));
|
||||
int viewedReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsSmsColumns.VIEWED_RECEIPT_COUNT));
|
||||
long receiptTimestamp = CursorUtil.requireLong(cursor, MmsSmsColumns.RECEIPT_TIMESTAMP);
|
||||
StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE));
|
||||
ParentStoryId parentStoryId = ParentStoryId.deserialize(CursorUtil.requireLong(cursor, PARENT_STORY_ID));
|
||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.BODY));
|
||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.BODY));
|
||||
|
||||
if (!TextSecurePreferences.isReadReceiptsEnabled(context)) {
|
||||
readReceiptCount = 0;
|
||||
@@ -2999,26 +2999,26 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
private MediaMmsMessageRecord getMediaMmsMessageRecord(Cursor cursor) {
|
||||
long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.ID));
|
||||
long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_SENT));
|
||||
long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_RECEIVED));
|
||||
long dateServer = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.DATE_SERVER));
|
||||
long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID));
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.RECIPIENT_ID));
|
||||
int addressDeviceId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.ADDRESS_DEVICE_ID));
|
||||
int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.DELIVERY_RECEIPT_COUNT));
|
||||
int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.READ_RECEIPT_COUNT));
|
||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.BODY));
|
||||
int partCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.PART_COUNT));
|
||||
String mismatchDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.MISMATCHED_IDENTITIES));
|
||||
String networkDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.NETWORK_FAILURE));
|
||||
int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.SUBSCRIPTION_ID));
|
||||
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.EXPIRES_IN));
|
||||
long expireStarted = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.EXPIRE_STARTED));
|
||||
boolean unidentified = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.UNIDENTIFIED)) == 1;
|
||||
boolean isViewOnce = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.VIEW_ONCE)) == 1;
|
||||
boolean remoteDelete = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.REMOTE_DELETED)) == 1;
|
||||
long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.ID));
|
||||
long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.NORMALIZED_DATE_SENT));
|
||||
long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.NORMALIZED_DATE_RECEIVED));
|
||||
long dateServer = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.DATE_SERVER));
|
||||
long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.MESSAGE_BOX));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.THREAD_ID));
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.RECIPIENT_ID));
|
||||
int addressDeviceId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.ADDRESS_DEVICE_ID));
|
||||
int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.DELIVERY_RECEIPT_COUNT));
|
||||
int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.READ_RECEIPT_COUNT));
|
||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.BODY));
|
||||
int partCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.PART_COUNT));
|
||||
String mismatchDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.MISMATCHED_IDENTITIES));
|
||||
String networkDocument = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.NETWORK_FAILURE));
|
||||
int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.SUBSCRIPTION_ID));
|
||||
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.EXPIRES_IN));
|
||||
long expireStarted = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.EXPIRE_STARTED));
|
||||
boolean unidentified = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.UNIDENTIFIED)) == 1;
|
||||
boolean isViewOnce = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.VIEW_ONCE)) == 1;
|
||||
boolean remoteDelete = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.REMOTE_DELETED)) == 1;
|
||||
boolean mentionsSelf = CursorUtil.requireBoolean(cursor, MENTIONS_SELF);
|
||||
long notifiedTimestamp = CursorUtil.requireLong(cursor, NOTIFIED_TIMESTAMP);
|
||||
int viewedReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsSmsColumns.VIEWED_RECEIPT_COUNT));
|
||||
@@ -3106,11 +3106,11 @@ public class MmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
private @Nullable Quote getQuote(@NonNull Cursor cursor) {
|
||||
long quoteId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_ID));
|
||||
long quoteAuthor = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_AUTHOR));
|
||||
CharSequence quoteText = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_BODY));
|
||||
int quoteType = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_TYPE));
|
||||
boolean quoteMissing = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_MISSING)) == 1;
|
||||
long quoteId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.QUOTE_ID));
|
||||
long quoteAuthor = cursor.getLong(cursor.getColumnIndexOrThrow(MmsTable.QUOTE_AUTHOR));
|
||||
CharSequence quoteText = cursor.getString(cursor.getColumnIndexOrThrow(MmsTable.QUOTE_BODY));
|
||||
int quoteType = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.QUOTE_TYPE));
|
||||
boolean quoteMissing = cursor.getInt(cursor.getColumnIndexOrThrow(MmsTable.QUOTE_MISSING)) == 1;
|
||||
List<Mention> quoteMentions = parseQuoteMentions(context, cursor);
|
||||
List<DatabaseAttachment> attachments = SignalDatabase.attachments().getAttachments(cursor);
|
||||
List<? extends Attachment> quoteAttachments = Stream.of(attachments).filter(Attachment::isQuote).toList();
|
||||
@@ -20,7 +20,7 @@ import java.time.DayOfWeek
|
||||
/**
|
||||
* Database for maintaining Notification Profiles, Notification Profile Schedules, and Notification Profile allowed memebers.
|
||||
*/
|
||||
class NotificationProfileDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
class NotificationProfileDatabase(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
|
||||
companion object {
|
||||
@JvmField
|
||||
@@ -13,9 +13,9 @@ import org.thoughtcrime.securesms.util.Base64
|
||||
import org.whispersystems.signalservice.api.push.ServiceId
|
||||
import java.io.IOException
|
||||
|
||||
class OneTimePreKeyDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class OneTimePreKeyTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
companion object {
|
||||
private val TAG = Log.tag(OneTimePreKeyDatabase::class.java)
|
||||
private val TAG = Log.tag(OneTimePreKeyTable::class.java)
|
||||
|
||||
const val TABLE_NAME = "one_time_prekeys"
|
||||
const val ID = "_id"
|
||||
@@ -44,9 +44,9 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public final class PaymentDatabase extends Database implements RecipientIdDatabaseReference {
|
||||
public final class PaymentTable extends DatabaseTable implements RecipientIdDatabaseReference {
|
||||
|
||||
private static final String TAG = Log.tag(PaymentDatabase.class);
|
||||
private static final String TAG = Log.tag(PaymentTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "payments";
|
||||
|
||||
@@ -98,7 +98,7 @@ public final class PaymentDatabase extends Database implements RecipientIdDataba
|
||||
|
||||
private final MutableLiveData<Object> changeSignal;
|
||||
|
||||
PaymentDatabase(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
|
||||
PaymentTable(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
|
||||
this.changeSignal = new MutableLiveData<>(new Object());
|
||||
@@ -410,7 +410,7 @@ public final class PaymentDatabase extends Database implements RecipientIdDataba
|
||||
.where(query.getWhere(), (Object[]) query.getWhereArgs())
|
||||
.run();
|
||||
|
||||
payments.addAll(CursorExtensionsKt.readToList(cursor, PaymentDatabase::readPayment));
|
||||
payments.addAll(CursorExtensionsKt.readToList(cursor, PaymentTable::readPayment));
|
||||
}
|
||||
|
||||
return payments;
|
||||
@@ -16,10 +16,10 @@ import org.whispersystems.signalservice.api.messages.SendMessageResult
|
||||
* When we receive delivery receipts for these messages, we remove entries from the table and can clear
|
||||
* the `needsPniSignature` flag on the recipient when all are delivered.
|
||||
*/
|
||||
class PendingPniSignatureMessageDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
class PendingPniSignatureMessageTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(PendingPniSignatureMessageDatabase::class.java)
|
||||
private val TAG = Log.tag(PendingPniSignatureMessageTable::class.java)
|
||||
|
||||
const val TABLE_NAME = "pending_pni_signature_message"
|
||||
|
||||
@@ -31,7 +31,7 @@ class PendingPniSignatureMessageDatabase(context: Context, databaseHelper: Signa
|
||||
const val CREATE_TABLE = """
|
||||
CREATE TABLE $TABLE_NAME (
|
||||
$ID INTEGER PRIMARY KEY,
|
||||
$RECIPIENT_ID INTEGER NOT NULL REFERENCES ${RecipientDatabase.TABLE_NAME} (${RecipientDatabase.ID}) ON DELETE CASCADE,
|
||||
$RECIPIENT_ID INTEGER NOT NULL REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}) ON DELETE CASCADE,
|
||||
$SENT_TIMESTAMP INTEGER NOT NULL,
|
||||
$DEVICE_ID INTEGER NOT NULL
|
||||
)
|
||||
@@ -6,7 +6,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
import org.thoughtcrime.securesms.util.FeatureFlags
|
||||
|
||||
/**
|
||||
* A write-through cache for [PendingRetryReceiptDatabase].
|
||||
* A write-through cache for [PendingRetryReceiptTable].
|
||||
*
|
||||
* We have to read from this cache every time we process an incoming message. As a result, it's a very performance-sensitive operation.
|
||||
*
|
||||
@@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.util.FeatureFlags
|
||||
* future reads can happen in memory.
|
||||
*/
|
||||
class PendingRetryReceiptCache @VisibleForTesting constructor(
|
||||
private val database: PendingRetryReceiptDatabase = SignalDatabase.pendingRetryReceipts
|
||||
private val database: PendingRetryReceiptTable = SignalDatabase.pendingRetryReceipts
|
||||
) {
|
||||
|
||||
private val pendingRetries: MutableMap<RemoteMessageId, PendingRetryReceiptModel> = HashMap()
|
||||
|
||||
@@ -22,7 +22,7 @@ import java.util.List;
|
||||
*
|
||||
* Do not use directly! The only class that should be accessing this is {@link PendingRetryReceiptCache}
|
||||
*/
|
||||
public final class PendingRetryReceiptDatabase extends Database implements RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
||||
public final class PendingRetryReceiptTable extends DatabaseTable implements RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
||||
|
||||
public static final String TABLE_NAME = "pending_retry_receipts";
|
||||
|
||||
@@ -41,7 +41,7 @@ public final class PendingRetryReceiptDatabase extends Database implements Recip
|
||||
THREAD_ID + " INTEGER NOT NULL, " +
|
||||
"UNIQUE(" + AUTHOR + "," + SENT_TIMESTAMP + ") ON CONFLICT REPLACE);";
|
||||
|
||||
PendingRetryReceiptDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
PendingRetryReceiptTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.whispersystems.signalservice.api.push.ACI
|
||||
import org.whispersystems.signalservice.api.push.PNI
|
||||
|
||||
/**
|
||||
* Encapsulates data around processing a tuple of user data into a user entry in [RecipientDatabase].
|
||||
* Encapsulates data around processing a tuple of user data into a user entry in [RecipientTable].
|
||||
* Also lets you apply a list of [PnpOperation]s to get what the resulting dataset would be.
|
||||
*/
|
||||
data class PnpDataSet(
|
||||
@@ -132,7 +132,7 @@ data class PnpDataSet(
|
||||
|
||||
/**
|
||||
* Represents a set of actions that need to be applied to incorporate a tuple of user data
|
||||
* into [RecipientDatabase].
|
||||
* into [RecipientTable].
|
||||
*/
|
||||
data class PnpChangeSet(
|
||||
val id: PnpIdResolver,
|
||||
@@ -172,7 +172,7 @@ sealed class PnpIdResolver {
|
||||
}
|
||||
|
||||
/**
|
||||
* An operation that needs to be performed on the [RecipientDatabase] as part of merging in new user data.
|
||||
* An operation that needs to be performed on the [RecipientTable] as part of merging in new user data.
|
||||
* Lets us describe various situations as a series of operations, making code clearer and tests easier.
|
||||
*/
|
||||
sealed class PnpOperation {
|
||||
|
||||
@@ -16,9 +16,9 @@ import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
|
||||
public class PushDatabase extends Database {
|
||||
public class PushTable extends DatabaseTable {
|
||||
|
||||
private static final String TAG = Log.tag(PushDatabase.class);
|
||||
private static final String TAG = Log.tag(PushTable.class);
|
||||
|
||||
private static final String TABLE_NAME = "push";
|
||||
public static final String ID = "_id";
|
||||
@@ -45,7 +45,7 @@ public class PushDatabase extends Database {
|
||||
SERVER_DELIVERED_TIMESTAMP + " INTEGER DEFAULT 0, " +
|
||||
SERVER_GUID + " TEXT DEFAULT NULL);";
|
||||
|
||||
public PushDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public PushTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
/**
|
||||
* Store reactions on messages.
|
||||
*/
|
||||
class ReactionDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
class ReactionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
|
||||
companion object {
|
||||
const val TABLE_NAME = "reaction"
|
||||
@@ -32,7 +32,7 @@ class ReactionDatabase(context: Context, databaseHelper: SignalDatabase) : Datab
|
||||
$ID INTEGER PRIMARY KEY,
|
||||
$MESSAGE_ID INTEGER NOT NULL,
|
||||
$IS_MMS INTEGER NOT NULL,
|
||||
$AUTHOR_ID INTEGER NOT NULL REFERENCES ${RecipientDatabase.TABLE_NAME} (${RecipientDatabase.ID}) ON DELETE CASCADE,
|
||||
$AUTHOR_ID INTEGER NOT NULL REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}) ON DELETE CASCADE,
|
||||
$EMOJI TEXT NOT NULL,
|
||||
$DATE_SENT INTEGER NOT NULL,
|
||||
$DATE_RECEIVED INTEGER NOT NULL,
|
||||
@@ -43,15 +43,15 @@ class ReactionDatabase(context: Context, databaseHelper: SignalDatabase) : Datab
|
||||
@JvmField
|
||||
val CREATE_TRIGGERS = arrayOf(
|
||||
"""
|
||||
CREATE TRIGGER reactions_sms_delete AFTER DELETE ON ${SmsDatabase.TABLE_NAME}
|
||||
CREATE TRIGGER reactions_sms_delete AFTER DELETE ON ${SmsTable.TABLE_NAME}
|
||||
BEGIN
|
||||
DELETE FROM $TABLE_NAME WHERE $MESSAGE_ID = old.${SmsDatabase.ID} AND $IS_MMS = 0;
|
||||
DELETE FROM $TABLE_NAME WHERE $MESSAGE_ID = old.${SmsTable.ID} AND $IS_MMS = 0;
|
||||
END
|
||||
""",
|
||||
"""
|
||||
CREATE TRIGGER reactions_mms_delete AFTER DELETE ON ${MmsDatabase.TABLE_NAME}
|
||||
CREATE TRIGGER reactions_mms_delete AFTER DELETE ON ${MmsTable.TABLE_NAME}
|
||||
BEGIN
|
||||
DELETE FROM $TABLE_NAME WHERE $MESSAGE_ID = old.${MmsDatabase.ID} AND $IS_MMS = 1;
|
||||
DELETE FROM $TABLE_NAME WHERE $MESSAGE_ID = old.${MmsTable.ID} AND $IS_MMS = 1;
|
||||
END
|
||||
"""
|
||||
)
|
||||
@@ -200,9 +200,9 @@ class ReactionDatabase(context: Context, databaseHelper: SignalDatabase) : Datab
|
||||
|
||||
fun deleteAbandonedReactions() {
|
||||
val query = """
|
||||
($IS_MMS = 0 AND $MESSAGE_ID NOT IN (SELECT ${SmsDatabase.ID} FROM ${SmsDatabase.TABLE_NAME}))
|
||||
($IS_MMS = 0 AND $MESSAGE_ID NOT IN (SELECT ${SmsTable.ID} FROM ${SmsTable.TABLE_NAME}))
|
||||
OR
|
||||
($IS_MMS = 1 AND $MESSAGE_ID NOT IN (SELECT ${MmsDatabase.ID} FROM ${MmsDatabase.TABLE_NAME}))
|
||||
($IS_MMS = 1 AND $MESSAGE_ID NOT IN (SELECT ${MmsTable.ID} FROM ${MmsTable.TABLE_NAME}))
|
||||
""".trimIndent()
|
||||
|
||||
writableDatabase.delete(TABLE_NAME, query, null)
|
||||
@@ -49,10 +49,10 @@ import org.thoughtcrime.securesms.conversation.colors.ChatColors.Companion.forCh
|
||||
import org.thoughtcrime.securesms.conversation.colors.ChatColors.Id.Companion.forLongValue
|
||||
import org.thoughtcrime.securesms.conversation.colors.ChatColorsMapper.getChatColors
|
||||
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil
|
||||
import org.thoughtcrime.securesms.database.GroupDatabase.LegacyGroupInsertException
|
||||
import org.thoughtcrime.securesms.database.GroupDatabase.MissedGroupMigrationInsertException
|
||||
import org.thoughtcrime.securesms.database.GroupDatabase.ShowAsStoryState
|
||||
import org.thoughtcrime.securesms.database.IdentityDatabase.VerifiedStatus
|
||||
import org.thoughtcrime.securesms.database.GroupTable.LegacyGroupInsertException
|
||||
import org.thoughtcrime.securesms.database.GroupTable.MissedGroupMigrationInsertException
|
||||
import org.thoughtcrime.securesms.database.GroupTable.ShowAsStoryState
|
||||
import org.thoughtcrime.securesms.database.IdentityTable.VerifiedStatus
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.groups
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.identities
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.runPostSuccessfulTransaction
|
||||
@@ -115,10 +115,10 @@ import java.util.Optional
|
||||
import java.util.concurrent.TimeUnit
|
||||
import kotlin.math.max
|
||||
|
||||
open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(RecipientDatabase::class.java)
|
||||
private val TAG = Log.tag(RecipientTable::class.java)
|
||||
|
||||
private val UNREGISTERED_LIFESPAN: Long = TimeUnit.DAYS.toMillis(30)
|
||||
|
||||
@@ -382,15 +382,15 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
|
||||
private val INSIGHTS_INVITEE_LIST =
|
||||
"""
|
||||
SELECT $TABLE_NAME.$ID
|
||||
FROM $TABLE_NAME INNER JOIN ${ThreadDatabase.TABLE_NAME} ON $TABLE_NAME.$ID = ${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.RECIPIENT_ID}
|
||||
FROM $TABLE_NAME INNER JOIN ${ThreadTable.TABLE_NAME} ON $TABLE_NAME.$ID = ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID}
|
||||
WHERE
|
||||
$TABLE_NAME.$GROUP_ID IS NULL AND
|
||||
$TABLE_NAME.$REGISTERED = ${RegisteredState.NOT_REGISTERED.id} AND
|
||||
$TABLE_NAME.$SEEN_INVITE_REMINDER < ${InsightsBannerTier.TIER_TWO.id} AND
|
||||
${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.HAS_SENT} AND
|
||||
${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.DATE} > ? AND
|
||||
${ThreadTable.TABLE_NAME}.${ThreadTable.HAS_SENT} AND
|
||||
${ThreadTable.TABLE_NAME}.${ThreadTable.DATE} > ? AND
|
||||
$TABLE_NAME.$HIDDEN = 0
|
||||
ORDER BY ${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.DATE} DESC LIMIT 50
|
||||
ORDER BY ${ThreadTable.TABLE_NAME}.${ThreadTable.DATE} DESC LIMIT 50
|
||||
"""
|
||||
}
|
||||
|
||||
@@ -1123,19 +1123,19 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
|
||||
private fun getRecordForSync(query: String?, args: Array<String>?): List<RecipientRecord> {
|
||||
val table =
|
||||
"""
|
||||
$TABLE_NAME LEFT OUTER JOIN ${IdentityDatabase.TABLE_NAME} ON $TABLE_NAME.$SERVICE_ID = ${IdentityDatabase.TABLE_NAME}.${IdentityDatabase.ADDRESS}
|
||||
LEFT OUTER JOIN ${GroupDatabase.TABLE_NAME} ON $TABLE_NAME.$GROUP_ID = ${GroupDatabase.TABLE_NAME}.${GroupDatabase.GROUP_ID}
|
||||
LEFT OUTER JOIN ${ThreadDatabase.TABLE_NAME} ON $TABLE_NAME.$ID = ${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.RECIPIENT_ID}
|
||||
$TABLE_NAME LEFT OUTER JOIN ${IdentityTable.TABLE_NAME} ON $TABLE_NAME.$SERVICE_ID = ${IdentityTable.TABLE_NAME}.${IdentityTable.ADDRESS}
|
||||
LEFT OUTER JOIN ${GroupTable.TABLE_NAME} ON $TABLE_NAME.$GROUP_ID = ${GroupTable.TABLE_NAME}.${GroupTable.GROUP_ID}
|
||||
LEFT OUTER JOIN ${ThreadTable.TABLE_NAME} ON $TABLE_NAME.$ID = ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID}
|
||||
""".trimIndent()
|
||||
val out: MutableList<RecipientRecord> = ArrayList()
|
||||
val columns: Array<String> = TYPED_RECIPIENT_PROJECTION + arrayOf(
|
||||
"$TABLE_NAME.$STORAGE_PROTO",
|
||||
"$TABLE_NAME.$UNREGISTERED_TIMESTAMP",
|
||||
"${GroupDatabase.TABLE_NAME}.${GroupDatabase.V2_MASTER_KEY}",
|
||||
"${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.ARCHIVED}",
|
||||
"${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.READ}",
|
||||
"${IdentityDatabase.TABLE_NAME}.${IdentityDatabase.VERIFIED} AS $IDENTITY_STATUS",
|
||||
"${IdentityDatabase.TABLE_NAME}.${IdentityDatabase.IDENTITY_KEY} AS $IDENTITY_KEY"
|
||||
"${GroupTable.TABLE_NAME}.${GroupTable.V2_MASTER_KEY}",
|
||||
"${ThreadTable.TABLE_NAME}.${ThreadTable.ARCHIVED}",
|
||||
"${ThreadTable.TABLE_NAME}.${ThreadTable.READ}",
|
||||
"${IdentityTable.TABLE_NAME}.${IdentityTable.VERIFIED} AS $IDENTITY_STATUS",
|
||||
"${IdentityTable.TABLE_NAME}.${IdentityTable.IDENTITY_KEY} AS $IDENTITY_KEY"
|
||||
)
|
||||
|
||||
readableDatabase.query(table, columns, query, args, "$TABLE_NAME.$ID", null, null).use { cursor ->
|
||||
@@ -3157,7 +3157,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
|
||||
}
|
||||
|
||||
fun getRecipientsForMultiDeviceSync(): List<Recipient> {
|
||||
val subquery = "SELECT ${ThreadDatabase.TABLE_NAME}.${ThreadDatabase.RECIPIENT_ID} FROM ${ThreadDatabase.TABLE_NAME}"
|
||||
val subquery = "SELECT ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} FROM ${ThreadTable.TABLE_NAME}"
|
||||
val selection = "$REGISTERED = ? AND $GROUP_ID IS NULL AND $ID != ? AND ($SYSTEM_CONTACT_URI NOT NULL OR $ID IN ($subquery))"
|
||||
val args = arrayOf(RegisteredState.REGISTERED.id.toString(), Recipient.self().id.serialize())
|
||||
val recipients: MutableList<Recipient> = ArrayList()
|
||||
@@ -3300,11 +3300,11 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
|
||||
val select =
|
||||
"""
|
||||
SELECT r.$ID FROM $TABLE_NAME AS r
|
||||
INNER JOIN ${ThreadDatabase.TABLE_NAME} AS t ON t.${ThreadDatabase.RECIPIENT_ID} = r.$ID
|
||||
INNER JOIN ${ThreadTable.TABLE_NAME} AS t ON t.${ThreadTable.RECIPIENT_ID} = r.$ID
|
||||
WHERE
|
||||
r.$PROFILE_SHARING = 0 AND (
|
||||
EXISTS(SELECT 1 FROM ${SmsDatabase.TABLE_NAME} WHERE ${SmsDatabase.THREAD_ID} = t.${ThreadDatabase.ID} AND ${SmsDatabase.DATE_RECEIVED} < ?) OR
|
||||
EXISTS(SELECT 1 FROM ${MmsDatabase.TABLE_NAME} WHERE ${MmsDatabase.THREAD_ID} = t.${ThreadDatabase.ID} AND ${MmsDatabase.DATE_RECEIVED} < ?)
|
||||
EXISTS(SELECT 1 FROM ${SmsTable.TABLE_NAME} WHERE ${SmsTable.THREAD_ID} = t.${ThreadTable.ID} AND ${SmsTable.DATE_RECEIVED} < ?) OR
|
||||
EXISTS(SELECT 1 FROM ${MmsTable.TABLE_NAME} WHERE ${MmsTable.THREAD_ID} = t.${ThreadTable.ID} AND ${MmsTable.DATE_RECEIVED} < ?)
|
||||
)
|
||||
""".trimIndent()
|
||||
|
||||
@@ -3953,9 +3953,9 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
|
||||
private fun getSyncExtras(cursor: Cursor): RecipientRecord.SyncExtras {
|
||||
val storageProtoRaw = cursor.optionalString(STORAGE_PROTO).orElse(null)
|
||||
val storageProto = if (storageProtoRaw != null) Base64.decodeOrThrow(storageProtoRaw) else null
|
||||
val archived = cursor.optionalBoolean(ThreadDatabase.ARCHIVED).orElse(false)
|
||||
val forcedUnread = cursor.optionalInt(ThreadDatabase.READ).map { status: Int -> status == ThreadDatabase.ReadStatus.FORCED_UNREAD.serialize() }.orElse(false)
|
||||
val groupMasterKey = cursor.optionalBlob(GroupDatabase.V2_MASTER_KEY).map { GroupUtil.requireMasterKey(it) }.orElse(null)
|
||||
val archived = cursor.optionalBoolean(ThreadTable.ARCHIVED).orElse(false)
|
||||
val forcedUnread = cursor.optionalInt(ThreadTable.READ).map { status: Int -> status == ThreadTable.ReadStatus.FORCED_UNREAD.serialize() }.orElse(false)
|
||||
val groupMasterKey = cursor.optionalBlob(GroupTable.V2_MASTER_KEY).map { GroupUtil.requireMasterKey(it) }.orElse(null)
|
||||
val identityKey = cursor.optionalString(IDENTITY_KEY).map { Base64.decodeOrThrow(it) }.orElse(null)
|
||||
val identityStatus = cursor.optionalInt(IDENTITY_STATUS).map { VerifiedStatus.forState(it) }.orElse(VerifiedStatus.DEFAULT)
|
||||
val unregisteredTimestamp = cursor.optionalLong(UNREGISTERED_TIMESTAMP).orElse(0)
|
||||
@@ -17,7 +17,7 @@ import java.util.Map;
|
||||
/**
|
||||
* The backing datastore for {@link RemappedRecords}. See that class for more details.
|
||||
*/
|
||||
public class RemappedRecordsDatabase extends Database {
|
||||
public class RemappedRecordTables extends DatabaseTable {
|
||||
|
||||
public static final String[] CREATE_TABLE = { Recipients.CREATE_TABLE,
|
||||
Threads.CREATE_TABLE };
|
||||
@@ -42,7 +42,7 @@ public class RemappedRecordsDatabase extends Database {
|
||||
NEW_ID + " INTEGER)";
|
||||
}
|
||||
|
||||
RemappedRecordsDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
RemappedRecordTables(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -24,10 +24,10 @@ import java.util.concurrent.TimeUnit
|
||||
/**
|
||||
* Stores remotely configured megaphones.
|
||||
*/
|
||||
class RemoteMegaphoneDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class RemoteMegaphoneTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(RemoteMegaphoneDatabase::class.java)
|
||||
private val TAG = Log.tag(RemoteMegaphoneTable::class.java)
|
||||
|
||||
private const val TABLE_NAME = "remote_megaphone"
|
||||
private const val ID = "_id"
|
||||
@@ -1,170 +0,0 @@
|
||||
package org.thoughtcrime.securesms.database;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.annimon.stream.Stream;
|
||||
|
||||
/**
|
||||
* Contains all databases necessary for full-text search (FTS).
|
||||
*/
|
||||
@SuppressLint({ "RecipientIdDatabaseReferenceUsage", "ThreadIdDatabaseReferenceUsage"}) // Handles updates via triggers
|
||||
public class SearchDatabase extends Database {
|
||||
|
||||
public static final String SMS_FTS_TABLE_NAME = "sms_fts";
|
||||
public static final String MMS_FTS_TABLE_NAME = "mms_fts";
|
||||
|
||||
public static final String ID = "rowid";
|
||||
public static final String BODY = MmsSmsColumns.BODY;
|
||||
public static final String THREAD_ID = MmsSmsColumns.THREAD_ID;
|
||||
public static final String SNIPPET = "snippet";
|
||||
public static final String CONVERSATION_RECIPIENT = "conversation_recipient";
|
||||
public static final String MESSAGE_RECIPIENT = "message_recipient";
|
||||
public static final String IS_MMS = "is_mms";
|
||||
public static final String MESSAGE_ID = "message_id";
|
||||
|
||||
public static final String SNIPPET_WRAP = "...";
|
||||
|
||||
public static final String[] CREATE_TABLE = {
|
||||
"CREATE VIRTUAL TABLE " + SMS_FTS_TABLE_NAME + " USING fts5(" + BODY + ", " + THREAD_ID + " UNINDEXED, content=" + SmsDatabase.TABLE_NAME + ", content_rowid=" + SmsDatabase.ID + ");",
|
||||
|
||||
"CREATE TRIGGER sms_ai AFTER INSERT ON " + SmsDatabase.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES (new." + SmsDatabase.ID + ", new." + SmsDatabase.BODY + ", new." + SmsDatabase.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER sms_ad AFTER DELETE ON " + SmsDatabase.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + SMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + SmsDatabase.ID + ", old." + SmsDatabase.BODY + ", old." + SmsDatabase.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER sms_au AFTER UPDATE ON " + SmsDatabase.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + SMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + SmsDatabase.ID + ", old." + SmsDatabase.BODY + ", old." + SmsDatabase.THREAD_ID + ");\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES(new." + SmsDatabase.ID + ", new." + SmsDatabase.BODY + ", new." + SmsDatabase.THREAD_ID + ");\n" +
|
||||
"END;",
|
||||
|
||||
|
||||
"CREATE VIRTUAL TABLE " + MMS_FTS_TABLE_NAME + " USING fts5(" + BODY + ", " + THREAD_ID + " UNINDEXED, content=" + MmsDatabase.TABLE_NAME + ", content_rowid=" + MmsDatabase.ID + ");",
|
||||
|
||||
"CREATE TRIGGER mms_ai AFTER INSERT ON " + MmsDatabase.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES (new." + MmsDatabase.ID + ", new." + MmsDatabase.BODY + ", new." + MmsDatabase.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER mms_ad AFTER DELETE ON " + MmsDatabase.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + MMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + MmsDatabase.ID + ", old." + MmsDatabase.BODY + ", old." + MmsDatabase.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER mms_au AFTER UPDATE ON " + MmsDatabase.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + MMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + MmsDatabase.ID + ", old." + MmsDatabase.BODY + ", old." + MmsDatabase.THREAD_ID + ");\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES (new." + MmsDatabase.ID + ", new." + MmsDatabase.BODY + ", new." + MmsDatabase.THREAD_ID + ");\n" +
|
||||
"END;"
|
||||
};
|
||||
|
||||
private static final String MESSAGES_QUERY =
|
||||
"SELECT " +
|
||||
ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + SMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
SmsDatabase.TABLE_NAME + "." + SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"0 AS " + IS_MMS + " " +
|
||||
"FROM " + SmsDatabase.TABLE_NAME + " " +
|
||||
"INNER JOIN " + SMS_FTS_TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + ID + " = " + SmsDatabase.TABLE_NAME + "." + SmsDatabase.ID + " " +
|
||||
"INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + " " +
|
||||
"WHERE " + SMS_FTS_TABLE_NAME + " MATCH ? " +
|
||||
"AND " + SmsDatabase.TABLE_NAME + "." + SmsDatabase.TYPE + " & " + MmsSmsColumns.Types.GROUP_V2_BIT + " = 0 " +
|
||||
"AND " + SmsDatabase.TABLE_NAME + "." + SmsDatabase.TYPE + " & " + MmsSmsColumns.Types.BASE_TYPE_MASK + " != " + MmsSmsColumns.Types.PROFILE_CHANGE_TYPE + " " +
|
||||
"AND " + SmsDatabase.TABLE_NAME + "." + SmsDatabase.TYPE + " & " + MmsSmsColumns.Types.BASE_TYPE_MASK + " != " + MmsSmsColumns.Types.GROUP_CALL_TYPE + " " +
|
||||
"UNION ALL " +
|
||||
"SELECT " +
|
||||
ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + MMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"1 AS " + IS_MMS + " " +
|
||||
"FROM " + MmsDatabase.TABLE_NAME + " " +
|
||||
"INNER JOIN " + MMS_FTS_TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + ID + " = " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " " +
|
||||
"INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + " " +
|
||||
"WHERE " + MMS_FTS_TABLE_NAME + " MATCH ? " +
|
||||
"AND " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.MESSAGE_BOX + " & " + MmsSmsColumns.Types.GROUP_V2_BIT + " = 0 " +
|
||||
"AND " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.MESSAGE_BOX + " & " + MmsSmsColumns.Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION + " = 0 " +
|
||||
"ORDER BY " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC " +
|
||||
"LIMIT 500";
|
||||
|
||||
private static final String MESSAGES_FOR_THREAD_QUERY =
|
||||
"SELECT " +
|
||||
ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + SMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
SmsDatabase.TABLE_NAME + "." + SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"0 AS " + IS_MMS + " " +
|
||||
"FROM " + SmsDatabase.TABLE_NAME + " " +
|
||||
"INNER JOIN " + SMS_FTS_TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + ID + " = " + SmsDatabase.TABLE_NAME + "." + SmsDatabase.ID + " " +
|
||||
"INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + " " +
|
||||
"WHERE " + SMS_FTS_TABLE_NAME + " MATCH ? AND " + SmsDatabase.TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? " +
|
||||
"UNION ALL " +
|
||||
"SELECT " +
|
||||
ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + MMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
MmsDatabase.TABLE_NAME + "." + MmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"1 AS " + IS_MMS + " " +
|
||||
"FROM " + MmsDatabase.TABLE_NAME + " " +
|
||||
"INNER JOIN " + MMS_FTS_TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + ID + " = " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " " +
|
||||
"INNER JOIN " + ThreadDatabase.TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadDatabase.TABLE_NAME + "." + ThreadDatabase.ID + " " +
|
||||
"WHERE " + MMS_FTS_TABLE_NAME + " MATCH ? AND " + MmsDatabase.TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? " +
|
||||
"ORDER BY " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC " +
|
||||
"LIMIT 500";
|
||||
|
||||
public SearchDatabase(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
public Cursor queryMessages(@NonNull String query) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String fullTextSearchQuery = createFullTextSearchQuery(query);
|
||||
|
||||
if (TextUtils.isEmpty(fullTextSearchQuery)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return db.rawQuery(MESSAGES_QUERY, new String[] { fullTextSearchQuery, fullTextSearchQuery });
|
||||
}
|
||||
|
||||
public Cursor queryMessages(@NonNull String query, long threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String fullTextSearchQuery = createFullTextSearchQuery(query);
|
||||
|
||||
if (TextUtils.isEmpty(fullTextSearchQuery)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return db.rawQuery(MESSAGES_FOR_THREAD_QUERY, new String[] { fullTextSearchQuery,
|
||||
String.valueOf(threadId),
|
||||
fullTextSearchQuery,
|
||||
String.valueOf(threadId) });
|
||||
}
|
||||
|
||||
private static String createFullTextSearchQuery(@NonNull String query) {
|
||||
return Stream.of(query.split(" "))
|
||||
.map(String::trim)
|
||||
.filter(s -> s.length() > 0)
|
||||
.map(SearchDatabase::fullTextSearchEscape)
|
||||
.collect(StringBuilder::new, (sb, s) -> sb.append(s).append("* "))
|
||||
.toString();
|
||||
}
|
||||
|
||||
private static String fullTextSearchEscape(String s) {
|
||||
return "\"" + s.replace("\"", "\"\"") + "\"";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
package org.thoughtcrime.securesms.database;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.annimon.stream.Stream;
|
||||
|
||||
/**
|
||||
* Contains all databases necessary for full-text search (FTS).
|
||||
*/
|
||||
@SuppressLint({ "RecipientIdDatabaseReferenceUsage", "ThreadIdDatabaseReferenceUsage"}) // Handles updates via triggers
|
||||
public class SearchTable extends DatabaseTable {
|
||||
|
||||
public static final String SMS_FTS_TABLE_NAME = "sms_fts";
|
||||
public static final String MMS_FTS_TABLE_NAME = "mms_fts";
|
||||
|
||||
public static final String ID = "rowid";
|
||||
public static final String BODY = MmsSmsColumns.BODY;
|
||||
public static final String THREAD_ID = MmsSmsColumns.THREAD_ID;
|
||||
public static final String SNIPPET = "snippet";
|
||||
public static final String CONVERSATION_RECIPIENT = "conversation_recipient";
|
||||
public static final String MESSAGE_RECIPIENT = "message_recipient";
|
||||
public static final String IS_MMS = "is_mms";
|
||||
public static final String MESSAGE_ID = "message_id";
|
||||
|
||||
public static final String SNIPPET_WRAP = "...";
|
||||
|
||||
public static final String[] CREATE_TABLE = {
|
||||
"CREATE VIRTUAL TABLE " + SMS_FTS_TABLE_NAME + " USING fts5(" + BODY + ", " + THREAD_ID + " UNINDEXED, content=" + SmsTable.TABLE_NAME + ", content_rowid=" + SmsTable.ID + ");",
|
||||
|
||||
"CREATE TRIGGER sms_ai AFTER INSERT ON " + SmsTable.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES (new." + SmsTable.ID + ", new." + SmsTable.BODY + ", new." + SmsTable.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER sms_ad AFTER DELETE ON " + SmsTable.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + SMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + SmsTable.ID + ", old." + SmsTable.BODY + ", old." + SmsTable.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER sms_au AFTER UPDATE ON " + SmsTable.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + SMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + SmsTable.ID + ", old." + SmsTable.BODY + ", old." + SmsTable.THREAD_ID + ");\n" +
|
||||
" INSERT INTO " + SMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES(new." + SmsTable.ID + ", new." + SmsTable.BODY + ", new." + SmsTable.THREAD_ID + ");\n" +
|
||||
"END;",
|
||||
|
||||
|
||||
"CREATE VIRTUAL TABLE " + MMS_FTS_TABLE_NAME + " USING fts5(" + BODY + ", " + THREAD_ID + " UNINDEXED, content=" + MmsTable.TABLE_NAME + ", content_rowid=" + MmsTable.ID + ");",
|
||||
|
||||
"CREATE TRIGGER mms_ai AFTER INSERT ON " + MmsTable.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES (new." + MmsTable.ID + ", new." + MmsTable.BODY + ", new." + MmsTable.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER mms_ad AFTER DELETE ON " + MmsTable.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + MMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + MmsTable.ID + ", old." + MmsTable.BODY + ", old." + MmsTable.THREAD_ID + ");\n" +
|
||||
"END;\n",
|
||||
"CREATE TRIGGER mms_au AFTER UPDATE ON " + MmsTable.TABLE_NAME + " BEGIN\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + MMS_FTS_TABLE_NAME + ", " + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES('delete', old." + MmsTable.ID + ", old." + MmsTable.BODY + ", old." + MmsTable.THREAD_ID + ");\n" +
|
||||
" INSERT INTO " + MMS_FTS_TABLE_NAME + "(" + ID + ", " + BODY + ", " + THREAD_ID + ") VALUES (new." + MmsTable.ID + ", new." + MmsTable.BODY + ", new." + MmsTable.THREAD_ID + ");\n" +
|
||||
"END;"
|
||||
};
|
||||
|
||||
private static final String MESSAGES_QUERY =
|
||||
"SELECT " +
|
||||
ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + SMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
SmsTable.TABLE_NAME + "." + SmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"0 AS " + IS_MMS + " " +
|
||||
"FROM " + SmsTable.TABLE_NAME + " " +
|
||||
"INNER JOIN " + SMS_FTS_TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + ID + " = " + SmsTable.TABLE_NAME + "." + SmsTable.ID + " " +
|
||||
"INNER JOIN " + ThreadTable.TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + " " +
|
||||
"WHERE " + SMS_FTS_TABLE_NAME + " MATCH ? " +
|
||||
"AND " + SmsTable.TABLE_NAME + "." + SmsTable.TYPE + " & " + MmsSmsColumns.Types.GROUP_V2_BIT + " = 0 " +
|
||||
"AND " + SmsTable.TABLE_NAME + "." + SmsTable.TYPE + " & " + MmsSmsColumns.Types.BASE_TYPE_MASK + " != " + MmsSmsColumns.Types.PROFILE_CHANGE_TYPE + " " +
|
||||
"AND " + SmsTable.TABLE_NAME + "." + SmsTable.TYPE + " & " + MmsSmsColumns.Types.BASE_TYPE_MASK + " != " + MmsSmsColumns.Types.GROUP_CALL_TYPE + " " +
|
||||
"UNION ALL " +
|
||||
"SELECT " +
|
||||
ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + MMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
MmsTable.TABLE_NAME + "." + MmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"1 AS " + IS_MMS + " " +
|
||||
"FROM " + MmsTable.TABLE_NAME + " " +
|
||||
"INNER JOIN " + MMS_FTS_TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + ID + " = " + MmsTable.TABLE_NAME + "." + MmsTable.ID + " " +
|
||||
"INNER JOIN " + ThreadTable.TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + " " +
|
||||
"WHERE " + MMS_FTS_TABLE_NAME + " MATCH ? " +
|
||||
"AND " + MmsTable.TABLE_NAME + "." + MmsTable.MESSAGE_BOX + " & " + MmsSmsColumns.Types.GROUP_V2_BIT + " = 0 " +
|
||||
"AND " + MmsTable.TABLE_NAME + "." + MmsTable.MESSAGE_BOX + " & " + MmsSmsColumns.Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION + " = 0 " +
|
||||
"ORDER BY " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC " +
|
||||
"LIMIT 500";
|
||||
|
||||
private static final String MESSAGES_FOR_THREAD_QUERY =
|
||||
"SELECT " +
|
||||
ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + SMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
SmsTable.TABLE_NAME + "." + SmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
SMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"0 AS " + IS_MMS + " " +
|
||||
"FROM " + SmsTable.TABLE_NAME + " " +
|
||||
"INNER JOIN " + SMS_FTS_TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + ID + " = " + SmsTable.TABLE_NAME + "." + SmsTable.ID + " " +
|
||||
"INNER JOIN " + ThreadTable.TABLE_NAME + " ON " + SMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + " " +
|
||||
"WHERE " + SMS_FTS_TABLE_NAME + " MATCH ? AND " + SmsTable.TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? " +
|
||||
"UNION ALL " +
|
||||
"SELECT " +
|
||||
ThreadTable.TABLE_NAME + "." + ThreadTable.RECIPIENT_ID + " AS " + CONVERSATION_RECIPIENT + ", " +
|
||||
MmsSmsColumns.RECIPIENT_ID + " AS " + MESSAGE_RECIPIENT + ", " +
|
||||
"snippet(" + MMS_FTS_TABLE_NAME + ", -1, '', '', '" + SNIPPET_WRAP + "', 7) AS " + SNIPPET + ", " +
|
||||
MmsTable.TABLE_NAME + "." + MmsTable.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + THREAD_ID + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + BODY + ", " +
|
||||
MMS_FTS_TABLE_NAME + "." + ID + " AS " + MESSAGE_ID + ", " +
|
||||
"1 AS " + IS_MMS + " " +
|
||||
"FROM " + MmsTable.TABLE_NAME + " " +
|
||||
"INNER JOIN " + MMS_FTS_TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + ID + " = " + MmsTable.TABLE_NAME + "." + MmsTable.ID + " " +
|
||||
"INNER JOIN " + ThreadTable.TABLE_NAME + " ON " + MMS_FTS_TABLE_NAME + "." + THREAD_ID + " = " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + " " +
|
||||
"WHERE " + MMS_FTS_TABLE_NAME + " MATCH ? AND " + MmsTable.TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? " +
|
||||
"ORDER BY " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED + " DESC " +
|
||||
"LIMIT 500";
|
||||
|
||||
public SearchTable(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
public Cursor queryMessages(@NonNull String query) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String fullTextSearchQuery = createFullTextSearchQuery(query);
|
||||
|
||||
if (TextUtils.isEmpty(fullTextSearchQuery)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return db.rawQuery(MESSAGES_QUERY, new String[] { fullTextSearchQuery, fullTextSearchQuery });
|
||||
}
|
||||
|
||||
public Cursor queryMessages(@NonNull String query, long threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String fullTextSearchQuery = createFullTextSearchQuery(query);
|
||||
|
||||
if (TextUtils.isEmpty(fullTextSearchQuery)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return db.rawQuery(MESSAGES_FOR_THREAD_QUERY, new String[] { fullTextSearchQuery,
|
||||
String.valueOf(threadId),
|
||||
fullTextSearchQuery,
|
||||
String.valueOf(threadId) });
|
||||
}
|
||||
|
||||
private static String createFullTextSearchQuery(@NonNull String query) {
|
||||
return Stream.of(query.split(" "))
|
||||
.map(String::trim)
|
||||
.filter(s -> s.length() > 0)
|
||||
.map(SearchTable::fullTextSearchEscape)
|
||||
.collect(StringBuilder::new, (sb, s) -> sb.append(s).append("* "))
|
||||
.toString();
|
||||
}
|
||||
|
||||
private static String fullTextSearchEscape(String s) {
|
||||
return "\"" + s.replace("\"", "\"\"") + "\"";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,11 +21,11 @@ import java.util.Set;
|
||||
|
||||
/**
|
||||
* Keeps track of which recipients are aware of which distributionIds. For the storage of sender
|
||||
* keys themselves, see {@link SenderKeyDatabase}.
|
||||
* keys themselves, see {@link SenderKeyTable}.
|
||||
*/
|
||||
public class SenderKeySharedDatabase extends Database {
|
||||
public class SenderKeySharedTable extends DatabaseTable {
|
||||
|
||||
private static final String TAG = Log.tag(SenderKeySharedDatabase.class);
|
||||
private static final String TAG = Log.tag(SenderKeySharedTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "sender_key_shared";
|
||||
|
||||
@@ -42,7 +42,7 @@ public class SenderKeySharedDatabase extends Database {
|
||||
TIMESTAMP + " INTEGER DEFAULT 0, " +
|
||||
"UNIQUE(" + DISTRIBUTION_ID + "," + ADDRESS + ", " + DEVICE + ") ON CONFLICT REPLACE);";
|
||||
|
||||
SenderKeySharedDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
SenderKeySharedTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -17,17 +17,15 @@ import org.signal.core.util.CursorUtil;
|
||||
import org.signal.core.util.SqlUtil;
|
||||
import org.whispersystems.signalservice.api.push.DistributionId;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Stores all of the sender keys -- both the ones we create, and the ones we're told about.
|
||||
*
|
||||
* When working with SenderKeys, keep this in mind: they're not *really* keys. They're sessions.
|
||||
* The name is largely historical, and there's too much momentum to change it.
|
||||
*/
|
||||
public class SenderKeyDatabase extends Database {
|
||||
public class SenderKeyTable extends DatabaseTable {
|
||||
|
||||
private static final String TAG = Log.tag(SenderKeyDatabase.class);
|
||||
private static final String TAG = Log.tag(SenderKeyTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "sender_keys";
|
||||
|
||||
@@ -46,7 +44,7 @@ public class SenderKeyDatabase extends Database {
|
||||
CREATED_AT + " INTEGER NOT NULL, " +
|
||||
"UNIQUE(" + ADDRESS + "," + DEVICE + ", " + DISTRIBUTION_ID + ") ON CONFLICT REPLACE);";
|
||||
|
||||
SenderKeyDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
SenderKeyTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ import org.whispersystems.signalservice.api.push.SignalServiceAddress
|
||||
import java.io.IOException
|
||||
import java.util.LinkedList
|
||||
|
||||
class SessionDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class SessionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
companion object {
|
||||
private val TAG = Log.tag(SessionDatabase::class.java)
|
||||
private val TAG = Log.tag(SessionTable::class.java)
|
||||
|
||||
const val TABLE_NAME = "sessions"
|
||||
const val ID = "_id"
|
||||
@@ -37,109 +37,109 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data
|
||||
),
|
||||
SignalDatabaseOpenHelper {
|
||||
|
||||
val sms: SmsDatabase = SmsDatabase(context, this)
|
||||
val mms: MmsDatabase = MmsDatabase(context, this)
|
||||
val attachments: AttachmentDatabase = AttachmentDatabase(context, this, attachmentSecret)
|
||||
val media: MediaDatabase = MediaDatabase(context, this)
|
||||
val thread: ThreadDatabase = ThreadDatabase(context, this)
|
||||
val mmsSmsDatabase: MmsSmsDatabase = MmsSmsDatabase(context, this)
|
||||
val identityDatabase: IdentityDatabase = IdentityDatabase(context, this)
|
||||
val draftDatabase: DraftDatabase = DraftDatabase(context, this)
|
||||
val pushDatabase: PushDatabase = PushDatabase(context, this)
|
||||
val groupDatabase: GroupDatabase = GroupDatabase(context, this)
|
||||
val recipientDatabase: RecipientDatabase = RecipientDatabase(context, this)
|
||||
val groupReceiptDatabase: GroupReceiptDatabase = GroupReceiptDatabase(context, this)
|
||||
val preKeyDatabase: OneTimePreKeyDatabase = OneTimePreKeyDatabase(context, this)
|
||||
val signedPreKeyDatabase: SignedPreKeyDatabase = SignedPreKeyDatabase(context, this)
|
||||
val sessionDatabase: SessionDatabase = SessionDatabase(context, this)
|
||||
val senderKeyDatabase: SenderKeyDatabase = SenderKeyDatabase(context, this)
|
||||
val senderKeySharedDatabase: SenderKeySharedDatabase = SenderKeySharedDatabase(context, this)
|
||||
val pendingRetryReceiptDatabase: PendingRetryReceiptDatabase = PendingRetryReceiptDatabase(context, this)
|
||||
val searchDatabase: SearchDatabase = SearchDatabase(context, this)
|
||||
val stickerDatabase: StickerDatabase = StickerDatabase(context, this, attachmentSecret)
|
||||
val storageIdDatabase: UnknownStorageIdDatabase = UnknownStorageIdDatabase(context, this)
|
||||
val remappedRecordsDatabase: RemappedRecordsDatabase = RemappedRecordsDatabase(context, this)
|
||||
val mentionDatabase: MentionDatabase = MentionDatabase(context, this)
|
||||
val paymentDatabase: PaymentDatabase = PaymentDatabase(context, this)
|
||||
val chatColorsDatabase: ChatColorsDatabase = ChatColorsDatabase(context, this)
|
||||
val emojiSearchDatabase: EmojiSearchDatabase = EmojiSearchDatabase(context, this)
|
||||
val messageSendLogDatabase: MessageSendLogDatabase = MessageSendLogDatabase(context, this)
|
||||
val sms: SmsTable = SmsTable(context, this)
|
||||
val mms: MmsTable = MmsTable(context, this)
|
||||
val attachments: AttachmentTable = AttachmentTable(context, this, attachmentSecret)
|
||||
val media: MediaTable = MediaTable(context, this)
|
||||
val thread: ThreadTable = ThreadTable(context, this)
|
||||
val mmsSmsTable: MmsSmsTable = MmsSmsTable(context, this)
|
||||
val identityTable: IdentityTable = IdentityTable(context, this)
|
||||
val draftTable: DraftTable = DraftTable(context, this)
|
||||
val pushTable: PushTable = PushTable(context, this)
|
||||
val groupTable: GroupTable = GroupTable(context, this)
|
||||
val recipientTable: RecipientTable = RecipientTable(context, this)
|
||||
val groupReceiptTable: GroupReceiptTable = GroupReceiptTable(context, this)
|
||||
val preKeyDatabase: OneTimePreKeyTable = OneTimePreKeyTable(context, this)
|
||||
val signedPreKeyTable: SignedPreKeyTable = SignedPreKeyTable(context, this)
|
||||
val sessionTable: SessionTable = SessionTable(context, this)
|
||||
val senderKeyTable: SenderKeyTable = SenderKeyTable(context, this)
|
||||
val senderKeySharedTable: SenderKeySharedTable = SenderKeySharedTable(context, this)
|
||||
val pendingRetryReceiptTable: PendingRetryReceiptTable = PendingRetryReceiptTable(context, this)
|
||||
val searchTable: SearchTable = SearchTable(context, this)
|
||||
val stickerTable: StickerTable = StickerTable(context, this, attachmentSecret)
|
||||
val storageIdDatabase: UnknownStorageIdTable = UnknownStorageIdTable(context, this)
|
||||
val remappedRecordTables: RemappedRecordTables = RemappedRecordTables(context, this)
|
||||
val mentionTable: MentionTable = MentionTable(context, this)
|
||||
val paymentTable: PaymentTable = PaymentTable(context, this)
|
||||
val chatColorsTable: ChatColorsTable = ChatColorsTable(context, this)
|
||||
val emojiSearchTable: EmojiSearchTable = EmojiSearchTable(context, this)
|
||||
val messageSendLogTables: MessageSendLogTables = MessageSendLogTables(context, this)
|
||||
val avatarPickerDatabase: AvatarPickerDatabase = AvatarPickerDatabase(context, this)
|
||||
val groupCallRingDatabase: GroupCallRingDatabase = GroupCallRingDatabase(context, this)
|
||||
val reactionDatabase: ReactionDatabase = ReactionDatabase(context, this)
|
||||
val groupCallRingTable: GroupCallRingTable = GroupCallRingTable(context, this)
|
||||
val reactionTable: ReactionTable = ReactionTable(context, this)
|
||||
val notificationProfileDatabase: NotificationProfileDatabase = NotificationProfileDatabase(context, this)
|
||||
val donationReceiptDatabase: DonationReceiptDatabase = DonationReceiptDatabase(context, this)
|
||||
val distributionListDatabase: DistributionListDatabase = DistributionListDatabase(context, this)
|
||||
val storySendsDatabase: StorySendsDatabase = StorySendsDatabase(context, this)
|
||||
val cdsDatabase: CdsDatabase = CdsDatabase(context, this)
|
||||
val remoteMegaphoneDatabase: RemoteMegaphoneDatabase = RemoteMegaphoneDatabase(context, this)
|
||||
val pendingPniSignatureMessageDatabase: PendingPniSignatureMessageDatabase = PendingPniSignatureMessageDatabase(context, this)
|
||||
val donationReceiptTable: DonationReceiptTable = DonationReceiptTable(context, this)
|
||||
val distributionListTables: DistributionListTables = DistributionListTables(context, this)
|
||||
val storySendTable: StorySendTable = StorySendTable(context, this)
|
||||
val cdsTable: CdsTable = CdsTable(context, this)
|
||||
val remoteMegaphoneTable: RemoteMegaphoneTable = RemoteMegaphoneTable(context, this)
|
||||
val pendingPniSignatureMessageTable: PendingPniSignatureMessageTable = PendingPniSignatureMessageTable(context, this)
|
||||
|
||||
override fun onOpen(db: net.zetetic.database.sqlcipher.SQLiteDatabase) {
|
||||
db.setForeignKeyConstraintsEnabled(true)
|
||||
}
|
||||
|
||||
override fun onCreate(db: net.zetetic.database.sqlcipher.SQLiteDatabase) {
|
||||
db.execSQL(SmsDatabase.CREATE_TABLE)
|
||||
db.execSQL(MmsDatabase.CREATE_TABLE)
|
||||
db.execSQL(AttachmentDatabase.CREATE_TABLE)
|
||||
db.execSQL(ThreadDatabase.CREATE_TABLE)
|
||||
db.execSQL(IdentityDatabase.CREATE_TABLE)
|
||||
db.execSQL(DraftDatabase.CREATE_TABLE)
|
||||
db.execSQL(PushDatabase.CREATE_TABLE)
|
||||
db.execSQL(GroupDatabase.CREATE_TABLE)
|
||||
db.execSQL(RecipientDatabase.CREATE_TABLE)
|
||||
db.execSQL(GroupReceiptDatabase.CREATE_TABLE)
|
||||
db.execSQL(OneTimePreKeyDatabase.CREATE_TABLE)
|
||||
db.execSQL(SignedPreKeyDatabase.CREATE_TABLE)
|
||||
db.execSQL(SessionDatabase.CREATE_TABLE)
|
||||
db.execSQL(SenderKeyDatabase.CREATE_TABLE)
|
||||
db.execSQL(SenderKeySharedDatabase.CREATE_TABLE)
|
||||
db.execSQL(PendingRetryReceiptDatabase.CREATE_TABLE)
|
||||
db.execSQL(StickerDatabase.CREATE_TABLE)
|
||||
db.execSQL(UnknownStorageIdDatabase.CREATE_TABLE)
|
||||
db.execSQL(MentionDatabase.CREATE_TABLE)
|
||||
db.execSQL(PaymentDatabase.CREATE_TABLE)
|
||||
db.execSQL(ChatColorsDatabase.CREATE_TABLE)
|
||||
db.execSQL(EmojiSearchDatabase.CREATE_TABLE)
|
||||
db.execSQL(SmsTable.CREATE_TABLE)
|
||||
db.execSQL(MmsTable.CREATE_TABLE)
|
||||
db.execSQL(AttachmentTable.CREATE_TABLE)
|
||||
db.execSQL(ThreadTable.CREATE_TABLE)
|
||||
db.execSQL(IdentityTable.CREATE_TABLE)
|
||||
db.execSQL(DraftTable.CREATE_TABLE)
|
||||
db.execSQL(PushTable.CREATE_TABLE)
|
||||
db.execSQL(GroupTable.CREATE_TABLE)
|
||||
db.execSQL(RecipientTable.CREATE_TABLE)
|
||||
db.execSQL(GroupReceiptTable.CREATE_TABLE)
|
||||
db.execSQL(OneTimePreKeyTable.CREATE_TABLE)
|
||||
db.execSQL(SignedPreKeyTable.CREATE_TABLE)
|
||||
db.execSQL(SessionTable.CREATE_TABLE)
|
||||
db.execSQL(SenderKeyTable.CREATE_TABLE)
|
||||
db.execSQL(SenderKeySharedTable.CREATE_TABLE)
|
||||
db.execSQL(PendingRetryReceiptTable.CREATE_TABLE)
|
||||
db.execSQL(StickerTable.CREATE_TABLE)
|
||||
db.execSQL(UnknownStorageIdTable.CREATE_TABLE)
|
||||
db.execSQL(MentionTable.CREATE_TABLE)
|
||||
db.execSQL(PaymentTable.CREATE_TABLE)
|
||||
db.execSQL(ChatColorsTable.CREATE_TABLE)
|
||||
db.execSQL(EmojiSearchTable.CREATE_TABLE)
|
||||
db.execSQL(AvatarPickerDatabase.CREATE_TABLE)
|
||||
db.execSQL(GroupCallRingDatabase.CREATE_TABLE)
|
||||
db.execSQL(ReactionDatabase.CREATE_TABLE)
|
||||
db.execSQL(DonationReceiptDatabase.CREATE_TABLE)
|
||||
db.execSQL(StorySendsDatabase.CREATE_TABLE)
|
||||
db.execSQL(CdsDatabase.CREATE_TABLE)
|
||||
db.execSQL(RemoteMegaphoneDatabase.CREATE_TABLE)
|
||||
db.execSQL(PendingPniSignatureMessageDatabase.CREATE_TABLE)
|
||||
executeStatements(db, SearchDatabase.CREATE_TABLE)
|
||||
executeStatements(db, RemappedRecordsDatabase.CREATE_TABLE)
|
||||
executeStatements(db, MessageSendLogDatabase.CREATE_TABLE)
|
||||
db.execSQL(GroupCallRingTable.CREATE_TABLE)
|
||||
db.execSQL(ReactionTable.CREATE_TABLE)
|
||||
db.execSQL(DonationReceiptTable.CREATE_TABLE)
|
||||
db.execSQL(StorySendTable.CREATE_TABLE)
|
||||
db.execSQL(CdsTable.CREATE_TABLE)
|
||||
db.execSQL(RemoteMegaphoneTable.CREATE_TABLE)
|
||||
db.execSQL(PendingPniSignatureMessageTable.CREATE_TABLE)
|
||||
executeStatements(db, SearchTable.CREATE_TABLE)
|
||||
executeStatements(db, RemappedRecordTables.CREATE_TABLE)
|
||||
executeStatements(db, MessageSendLogTables.CREATE_TABLE)
|
||||
executeStatements(db, NotificationProfileDatabase.CREATE_TABLE)
|
||||
executeStatements(db, DistributionListDatabase.CREATE_TABLE)
|
||||
executeStatements(db, DistributionListTables.CREATE_TABLE)
|
||||
|
||||
executeStatements(db, RecipientDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, SmsDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, MmsDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, AttachmentDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, ThreadDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, DraftDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, GroupDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, GroupReceiptDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, StickerDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, UnknownStorageIdDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, MentionDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, PaymentDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, MessageSendLogDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, GroupCallRingDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, RecipientTable.CREATE_INDEXS)
|
||||
executeStatements(db, SmsTable.CREATE_INDEXS)
|
||||
executeStatements(db, MmsTable.CREATE_INDEXS)
|
||||
executeStatements(db, AttachmentTable.CREATE_INDEXS)
|
||||
executeStatements(db, ThreadTable.CREATE_INDEXS)
|
||||
executeStatements(db, DraftTable.CREATE_INDEXS)
|
||||
executeStatements(db, GroupTable.CREATE_INDEXS)
|
||||
executeStatements(db, GroupReceiptTable.CREATE_INDEXES)
|
||||
executeStatements(db, StickerTable.CREATE_INDEXES)
|
||||
executeStatements(db, UnknownStorageIdTable.CREATE_INDEXES)
|
||||
executeStatements(db, MentionTable.CREATE_INDEXES)
|
||||
executeStatements(db, PaymentTable.CREATE_INDEXES)
|
||||
executeStatements(db, MessageSendLogTables.CREATE_INDEXES)
|
||||
executeStatements(db, GroupCallRingTable.CREATE_INDEXES)
|
||||
executeStatements(db, NotificationProfileDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, DonationReceiptDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, StorySendsDatabase.CREATE_INDEXS)
|
||||
executeStatements(db, DistributionListDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, PendingPniSignatureMessageDatabase.CREATE_INDEXES)
|
||||
executeStatements(db, DonationReceiptTable.CREATE_INDEXS)
|
||||
executeStatements(db, StorySendTable.CREATE_INDEXS)
|
||||
executeStatements(db, DistributionListTables.CREATE_INDEXES)
|
||||
executeStatements(db, PendingPniSignatureMessageTable.CREATE_INDEXES)
|
||||
|
||||
executeStatements(db, MessageSendLogDatabase.CREATE_TRIGGERS)
|
||||
executeStatements(db, ReactionDatabase.CREATE_TRIGGERS)
|
||||
executeStatements(db, MessageSendLogTables.CREATE_TRIGGERS)
|
||||
executeStatements(db, ReactionTable.CREATE_TRIGGERS)
|
||||
|
||||
DistributionListDatabase.insertInitialDistributionListAtCreationTime(db)
|
||||
DistributionListTables.insertInitialDistributionListAtCreationTime(db)
|
||||
|
||||
if (context.getDatabasePath(ClassicOpenHelper.NAME).exists()) {
|
||||
val legacyHelper = ClassicOpenHelper(context)
|
||||
@@ -269,7 +269,7 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data
|
||||
instance!!.sms.deleteAbandonedMessages()
|
||||
instance!!.mms.deleteAbandonedMessages()
|
||||
instance!!.mms.trimEntriesForExpiredMessages()
|
||||
instance!!.reactionDatabase.deleteAbandonedReactions()
|
||||
instance!!.reactionTable.deleteAbandonedReactions()
|
||||
instance!!.rawWritableDatabase.execSQL("DROP TABLE IF EXISTS key_value")
|
||||
instance!!.rawWritableDatabase.execSQL("DROP TABLE IF EXISTS megaphone")
|
||||
instance!!.rawWritableDatabase.execSQL("DROP TABLE IF EXISTS job_spec")
|
||||
@@ -334,7 +334,7 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("attachments")
|
||||
val attachments: AttachmentDatabase
|
||||
val attachments: AttachmentTable
|
||||
get() = instance!!.attachments
|
||||
|
||||
@get:JvmStatic
|
||||
@@ -344,83 +344,83 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("cds")
|
||||
val cds: CdsDatabase
|
||||
get() = instance!!.cdsDatabase
|
||||
val cds: CdsTable
|
||||
get() = instance!!.cdsTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("chatColors")
|
||||
val chatColors: ChatColorsDatabase
|
||||
get() = instance!!.chatColorsDatabase
|
||||
val chatColors: ChatColorsTable
|
||||
get() = instance!!.chatColorsTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("distributionLists")
|
||||
val distributionLists: DistributionListDatabase
|
||||
get() = instance!!.distributionListDatabase
|
||||
val distributionLists: DistributionListTables
|
||||
get() = instance!!.distributionListTables
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("donationReceipts")
|
||||
val donationReceipts: DonationReceiptDatabase
|
||||
get() = instance!!.donationReceiptDatabase
|
||||
val donationReceipts: DonationReceiptTable
|
||||
get() = instance!!.donationReceiptTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("drafts")
|
||||
val drafts: DraftDatabase
|
||||
get() = instance!!.draftDatabase
|
||||
val drafts: DraftTable
|
||||
get() = instance!!.draftTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("emojiSearch")
|
||||
val emojiSearch: EmojiSearchDatabase
|
||||
get() = instance!!.emojiSearchDatabase
|
||||
val emojiSearch: EmojiSearchTable
|
||||
get() = instance!!.emojiSearchTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("groupCallRings")
|
||||
val groupCallRings: GroupCallRingDatabase
|
||||
get() = instance!!.groupCallRingDatabase
|
||||
val groupCallRings: GroupCallRingTable
|
||||
get() = instance!!.groupCallRingTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("groupReceipts")
|
||||
val groupReceipts: GroupReceiptDatabase
|
||||
get() = instance!!.groupReceiptDatabase
|
||||
val groupReceipts: GroupReceiptTable
|
||||
get() = instance!!.groupReceiptTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("groups")
|
||||
val groups: GroupDatabase
|
||||
get() = instance!!.groupDatabase
|
||||
val groups: GroupTable
|
||||
get() = instance!!.groupTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("identities")
|
||||
val identities: IdentityDatabase
|
||||
get() = instance!!.identityDatabase
|
||||
val identities: IdentityTable
|
||||
get() = instance!!.identityTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("media")
|
||||
val media: MediaDatabase
|
||||
val media: MediaTable
|
||||
get() = instance!!.media
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("mentions")
|
||||
val mentions: MentionDatabase
|
||||
get() = instance!!.mentionDatabase
|
||||
val mentions: MentionTable
|
||||
get() = instance!!.mentionTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("messageSearch")
|
||||
val messageSearch: SearchDatabase
|
||||
get() = instance!!.searchDatabase
|
||||
val messageSearch: SearchTable
|
||||
get() = instance!!.searchTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("messageLog")
|
||||
val messageLog: MessageSendLogDatabase
|
||||
get() = instance!!.messageSendLogDatabase
|
||||
val messageLog: MessageSendLogTables
|
||||
get() = instance!!.messageSendLogTables
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("mms")
|
||||
val mms: MmsDatabase
|
||||
val mms: MmsTable
|
||||
get() = instance!!.mms
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("mmsSms")
|
||||
val mmsSms: MmsSmsDatabase
|
||||
get() = instance!!.mmsSmsDatabase
|
||||
val mmsSms: MmsSmsTable
|
||||
get() = instance!!.mmsSmsTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("notificationProfiles")
|
||||
@@ -429,93 +429,93 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("payments")
|
||||
val payments: PaymentDatabase
|
||||
get() = instance!!.paymentDatabase
|
||||
val payments: PaymentTable
|
||||
get() = instance!!.paymentTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("pendingRetryReceipts")
|
||||
val pendingRetryReceipts: PendingRetryReceiptDatabase
|
||||
get() = instance!!.pendingRetryReceiptDatabase
|
||||
val pendingRetryReceipts: PendingRetryReceiptTable
|
||||
get() = instance!!.pendingRetryReceiptTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("oneTimePreKeys")
|
||||
val oneTimePreKeys: OneTimePreKeyDatabase
|
||||
val oneTimePreKeys: OneTimePreKeyTable
|
||||
get() = instance!!.preKeyDatabase
|
||||
|
||||
@get:Deprecated("This only exists to migrate from legacy storage. There shouldn't be any new usages.")
|
||||
@get:JvmStatic
|
||||
@get:JvmName("push")
|
||||
val push: PushDatabase
|
||||
get() = instance!!.pushDatabase
|
||||
val push: PushTable
|
||||
get() = instance!!.pushTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("recipients")
|
||||
val recipients: RecipientDatabase
|
||||
get() = instance!!.recipientDatabase
|
||||
val recipients: RecipientTable
|
||||
get() = instance!!.recipientTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("signedPreKeys")
|
||||
val signedPreKeys: SignedPreKeyDatabase
|
||||
get() = instance!!.signedPreKeyDatabase
|
||||
val signedPreKeys: SignedPreKeyTable
|
||||
get() = instance!!.signedPreKeyTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("sms")
|
||||
val sms: SmsDatabase
|
||||
val sms: SmsTable
|
||||
get() = instance!!.sms
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("threads")
|
||||
val threads: ThreadDatabase
|
||||
val threads: ThreadTable
|
||||
get() = instance!!.thread
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("reactions")
|
||||
val reactions: ReactionDatabase
|
||||
get() = instance!!.reactionDatabase
|
||||
val reactions: ReactionTable
|
||||
get() = instance!!.reactionTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("remappedRecords")
|
||||
val remappedRecords: RemappedRecordsDatabase
|
||||
get() = instance!!.remappedRecordsDatabase
|
||||
val remappedRecords: RemappedRecordTables
|
||||
get() = instance!!.remappedRecordTables
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("senderKeys")
|
||||
val senderKeys: SenderKeyDatabase
|
||||
get() = instance!!.senderKeyDatabase
|
||||
val senderKeys: SenderKeyTable
|
||||
get() = instance!!.senderKeyTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("senderKeyShared")
|
||||
val senderKeyShared: SenderKeySharedDatabase
|
||||
get() = instance!!.senderKeySharedDatabase
|
||||
val senderKeyShared: SenderKeySharedTable
|
||||
get() = instance!!.senderKeySharedTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("sessions")
|
||||
val sessions: SessionDatabase
|
||||
get() = instance!!.sessionDatabase
|
||||
val sessions: SessionTable
|
||||
get() = instance!!.sessionTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("stickers")
|
||||
val stickers: StickerDatabase
|
||||
get() = instance!!.stickerDatabase
|
||||
val stickers: StickerTable
|
||||
get() = instance!!.stickerTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("storySends")
|
||||
val storySends: StorySendsDatabase
|
||||
get() = instance!!.storySendsDatabase
|
||||
val storySends: StorySendTable
|
||||
get() = instance!!.storySendTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("unknownStorageIds")
|
||||
val unknownStorageIds: UnknownStorageIdDatabase
|
||||
val unknownStorageIds: UnknownStorageIdTable
|
||||
get() = instance!!.storageIdDatabase
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("remoteMegaphones")
|
||||
val remoteMegaphones: RemoteMegaphoneDatabase
|
||||
get() = instance!!.remoteMegaphoneDatabase
|
||||
val remoteMegaphones: RemoteMegaphoneTable
|
||||
get() = instance!!.remoteMegaphoneTable
|
||||
|
||||
@get:JvmStatic
|
||||
@get:JvmName("pendingPniSignatureMessages")
|
||||
val pendingPniSignatureMessages: PendingPniSignatureMessageDatabase
|
||||
get() = instance!!.pendingPniSignatureMessageDatabase
|
||||
val pendingPniSignatureMessages: PendingPniSignatureMessageTable
|
||||
get() = instance!!.pendingPniSignatureMessageTable
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@ import org.whispersystems.signalservice.api.push.ServiceId
|
||||
import java.io.IOException
|
||||
import java.util.LinkedList
|
||||
|
||||
class SignedPreKeyDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class SignedPreKeyTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
companion object {
|
||||
private val TAG = Log.tag(SignedPreKeyDatabase::class.java)
|
||||
private val TAG = Log.tag(SignedPreKeyTable::class.java)
|
||||
|
||||
const val TABLE_NAME = "signed_prekeys"
|
||||
const val ID = "_id"
|
||||
@@ -85,16 +85,16 @@ public class SmsMigrator {
|
||||
int columnIndex = cursor.getColumnIndexOrThrow(key);
|
||||
|
||||
if (cursor.isNull(columnIndex)) {
|
||||
statement.bindLong(index, SmsDatabase.Types.BASE_INBOX_TYPE);
|
||||
statement.bindLong(index, SmsTable.Types.BASE_INBOX_TYPE);
|
||||
} else {
|
||||
long theirType = cursor.getLong(columnIndex);
|
||||
statement.bindLong(index, SmsDatabase.Types.translateFromSystemBaseType(theirType));
|
||||
statement.bindLong(index, SmsTable.Types.translateFromSystemBaseType(theirType));
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isAppropriateTypeForMigration(Cursor cursor, int columnIndex) {
|
||||
long systemType = cursor.getLong(columnIndex);
|
||||
long ourType = SmsDatabase.Types.translateFromSystemBaseType(systemType);
|
||||
long ourType = SmsTable.Types.translateFromSystemBaseType(systemType);
|
||||
|
||||
return ourType == MmsSmsColumns.Types.BASE_INBOX_TYPE ||
|
||||
ourType == MmsSmsColumns.Types.BASE_SENT_TYPE ||
|
||||
@@ -163,8 +163,8 @@ public class SmsMigrator {
|
||||
ProgressDescription progress,
|
||||
long theirThreadId, long ourThreadId)
|
||||
{
|
||||
MessageDatabase ourSmsDatabase = SignalDatabase.sms();
|
||||
Cursor cursor = null;
|
||||
MessageTable ourSmsDatabase = SignalDatabase.sms();
|
||||
Cursor cursor = null;
|
||||
SQLiteStatement statement = null;
|
||||
|
||||
try {
|
||||
@@ -183,7 +183,7 @@ public class SmsMigrator {
|
||||
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
int addressColumn = cursor.getColumnIndexOrThrow(SystemColumns.ADDRESS);
|
||||
int typeColumn = cursor.getColumnIndex(SmsDatabase.TYPE);
|
||||
int typeColumn = cursor.getColumnIndex(SmsTable.TYPE);
|
||||
|
||||
if (!cursor.isNull(addressColumn) && (cursor.isNull(typeColumn) || isAppropriateTypeForMigration(cursor, typeColumn))) {
|
||||
getContentValuesForRow(context, cursor, ourThreadId, statement);
|
||||
@@ -211,8 +211,8 @@ public class SmsMigrator {
|
||||
// if (context.getSharedPreferences("SecureSMS", Context.MODE_PRIVATE).getBoolean("migrated", false))
|
||||
// return;
|
||||
|
||||
ThreadDatabase threadDatabase = SignalDatabase.threads();
|
||||
Cursor cursor = null;
|
||||
ThreadTable threadTable = SignalDatabase.threads();
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
Uri threadListUri = Uri.parse("content://mms-sms/conversations?simple=true");
|
||||
@@ -226,7 +226,7 @@ public class SmsMigrator {
|
||||
|
||||
if (ourRecipients != null) {
|
||||
if (ourRecipients.size() == 1) {
|
||||
long ourThreadId = threadDatabase.getOrCreateThreadIdFor(ourRecipients.iterator().next());
|
||||
long ourThreadId = threadTable.getOrCreateThreadIdFor(ourRecipients.iterator().next());
|
||||
migrateConversation(context, listener, progress, theirThreadId, ourThreadId);
|
||||
} else if (ourRecipients.size() > 1) {
|
||||
ourRecipients.add(Recipient.self());
|
||||
@@ -236,7 +236,7 @@ public class SmsMigrator {
|
||||
GroupId.Mms ourGroupId = SignalDatabase.groups().getOrCreateMmsGroupForMembers(recipientIds);
|
||||
RecipientId ourGroupRecipientId = SignalDatabase.recipients().getOrInsertFromGroupId(ourGroupId);
|
||||
Recipient ourGroupRecipient = Recipient.resolved(ourGroupRecipientId);
|
||||
long ourThreadId = threadDatabase.getOrCreateThreadIdFor(ourGroupRecipient, ThreadDatabase.DistributionTypes.CONVERSATION);
|
||||
long ourThreadId = threadTable.getOrCreateThreadIdFor(ourGroupRecipient, ThreadTable.DistributionTypes.CONVERSATION);
|
||||
|
||||
migrateConversation(context, listener, progress, theirThreadId, ourThreadId);
|
||||
}
|
||||
|
||||
@@ -96,9 +96,9 @@ import static org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_V2_L
|
||||
*
|
||||
* @author Moxie Marlinspike
|
||||
*/
|
||||
public class SmsDatabase extends MessageDatabase {
|
||||
public class SmsTable extends MessageTable {
|
||||
|
||||
private static final String TAG = Log.tag(SmsDatabase.class);
|
||||
private static final String TAG = Log.tag(SmsTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "sms";
|
||||
public static final String PERSON = "person";
|
||||
@@ -171,7 +171,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
private static final EarlyReceiptCache earlyDeliveryReceiptCache = new EarlyReceiptCache("SmsDelivery");
|
||||
|
||||
public SmsDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public SmsTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -669,7 +669,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||
String[] projection = SqlUtil.buildArgs(SmsDatabase.TYPE);
|
||||
String[] projection = SqlUtil.buildArgs(SmsTable.TYPE);
|
||||
String selection = THREAD_ID + " = ? AND " + DATE_RECEIVED + " > ? AND (" + TYPE + " = ? OR " + TYPE + " = ? OR " + TYPE + " = ? OR " + TYPE + " =?)";
|
||||
String[] selectionArgs = SqlUtil.buildArgs(threadId,
|
||||
timestamp,
|
||||
@@ -979,9 +979,9 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
@Override
|
||||
public void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName) {
|
||||
ThreadDatabase threadDatabase = SignalDatabase.threads();
|
||||
List<GroupDatabase.GroupRecord> groupRecords = SignalDatabase.groups().getGroupsContainingMember(recipient.getId(), false);
|
||||
List<Long> threadIdsToUpdate = new LinkedList<>();
|
||||
ThreadTable threadTable = SignalDatabase.threads();
|
||||
List<GroupTable.GroupRecord> groupRecords = SignalDatabase.groups().getGroupsContainingMember(recipient.getId(), false);
|
||||
List<Long> threadIdsToUpdate = new LinkedList<>();
|
||||
|
||||
byte[] profileChangeDetails = ProfileChangeDetails.newBuilder()
|
||||
.setProfileNameChange(ProfileChangeDetails.StringChange.newBuilder()
|
||||
@@ -996,10 +996,10 @@ public class SmsDatabase extends MessageDatabase {
|
||||
db.beginTransaction();
|
||||
|
||||
try {
|
||||
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(recipient.getId()));
|
||||
for (GroupDatabase.GroupRecord groupRecord : groupRecords) {
|
||||
threadIdsToUpdate.add(threadTable.getThreadIdFor(recipient.getId()));
|
||||
for (GroupTable.GroupRecord groupRecord : groupRecords) {
|
||||
if (groupRecord.isActive()) {
|
||||
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(groupRecord.getRecipientId()));
|
||||
threadIdsToUpdate.add(threadTable.getThreadIdFor(groupRecord.getRecipientId()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1072,18 +1072,18 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
@Override
|
||||
public void insertNumberChangeMessages(@NonNull RecipientId recipientId) {
|
||||
ThreadDatabase threadDatabase = SignalDatabase.threads();
|
||||
List<GroupDatabase.GroupRecord> groupRecords = SignalDatabase.groups().getGroupsContainingMember(recipientId, false);
|
||||
List<Long> threadIdsToUpdate = new LinkedList<>();
|
||||
ThreadTable threadTable = SignalDatabase.threads();
|
||||
List<GroupTable.GroupRecord> groupRecords = SignalDatabase.groups().getGroupsContainingMember(recipientId, false);
|
||||
List<Long> threadIdsToUpdate = new LinkedList<>();
|
||||
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
db.beginTransaction();
|
||||
|
||||
try {
|
||||
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(recipientId));
|
||||
for (GroupDatabase.GroupRecord groupRecord : groupRecords) {
|
||||
threadIdsToUpdate.add(threadTable.getThreadIdFor(recipientId));
|
||||
for (GroupTable.GroupRecord groupRecord : groupRecords) {
|
||||
if (groupRecord.isActive()) {
|
||||
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(groupRecord.getRecipientId()));
|
||||
threadIdsToUpdate.add(threadTable.getThreadIdFor(groupRecord.getRecipientId()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1478,17 +1478,17 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getOutgoingStoriesTo(@NonNull RecipientId recipientId) {
|
||||
public @NonNull MessageTable.Reader getOutgoingStoriesTo(@NonNull RecipientId recipientId) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllOutgoingStories(boolean reverse, int limit) {
|
||||
public @NonNull MessageTable.Reader getAllOutgoingStories(boolean reverse, int limit) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllOutgoingStoriesAt(long sentTimestamp) {
|
||||
public @NonNull MessageTable.Reader getAllOutgoingStoriesAt(long sentTimestamp) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@@ -1508,7 +1508,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getAllStoriesFor(@NonNull RecipientId recipientId, int limit) {
|
||||
public @NonNull MessageTable.Reader getAllStoriesFor(@NonNull RecipientId recipientId, int limit) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@@ -1572,7 +1572,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MessageDatabase.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit) {
|
||||
public @NonNull MessageTable.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@@ -1639,7 +1639,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
void deleteAbandonedMessages() {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadDatabase.TABLE_NAME + ")";
|
||||
String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadTable.TABLE_NAME + ")";
|
||||
|
||||
int deletes = db.delete(TABLE_NAME, where, null);
|
||||
if (deletes > 0) {
|
||||
@@ -1851,7 +1851,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageDatabase.Reader getMessages(Collection<Long> messageIds) {
|
||||
public MessageTable.Reader getMessages(Collection<Long> messageIds) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@@ -1909,7 +1909,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
public static class Reader implements MessageDatabase.Reader {
|
||||
public static class Reader implements MessageTable.Reader {
|
||||
|
||||
private final Cursor cursor;
|
||||
private final Context context;
|
||||
@@ -1933,7 +1933,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
@Override
|
||||
public @NonNull MessageExportState getMessageExportStateForCurrentRecord() {
|
||||
byte[] messageExportState = CursorUtil.requireBlob(cursor, SmsDatabase.EXPORT_STATE);
|
||||
byte[] messageExportState = CursorUtil.requireBlob(cursor, SmsTable.EXPORT_STATE);
|
||||
if (messageExportState == null) {
|
||||
return MessageExportState.getDefaultInstance();
|
||||
}
|
||||
@@ -1946,24 +1946,24 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
public SmsMessageRecord getCurrent() {
|
||||
long messageId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.ID));
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.RECIPIENT_ID));
|
||||
int addressDeviceId = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.ADDRESS_DEVICE_ID));
|
||||
long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.TYPE));
|
||||
long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.NORMALIZED_DATE_RECEIVED));
|
||||
long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.NORMALIZED_DATE_SENT));
|
||||
long dateServer = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.DATE_SERVER));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.THREAD_ID));
|
||||
int status = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.STATUS));
|
||||
int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.DELIVERY_RECEIPT_COUNT));
|
||||
int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.READ_RECEIPT_COUNT));
|
||||
String mismatchDocument = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.MISMATCHED_IDENTITIES));
|
||||
int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.SUBSCRIPTION_ID));
|
||||
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.EXPIRES_IN));
|
||||
long expireStarted = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.EXPIRE_STARTED));
|
||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY));
|
||||
boolean unidentified = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.UNIDENTIFIED)) == 1;
|
||||
boolean remoteDelete = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.REMOTE_DELETED)) == 1;
|
||||
long messageId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.ID));
|
||||
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.RECIPIENT_ID));
|
||||
int addressDeviceId = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.ADDRESS_DEVICE_ID));
|
||||
long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.TYPE));
|
||||
long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.NORMALIZED_DATE_RECEIVED));
|
||||
long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.NORMALIZED_DATE_SENT));
|
||||
long dateServer = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.DATE_SERVER));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.THREAD_ID));
|
||||
int status = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.STATUS));
|
||||
int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.DELIVERY_RECEIPT_COUNT));
|
||||
int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.READ_RECEIPT_COUNT));
|
||||
String mismatchDocument = cursor.getString(cursor.getColumnIndexOrThrow(SmsTable.MISMATCHED_IDENTITIES));
|
||||
int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.SUBSCRIPTION_ID));
|
||||
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.EXPIRES_IN));
|
||||
long expireStarted = cursor.getLong(cursor.getColumnIndexOrThrow(SmsTable.EXPIRE_STARTED));
|
||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(SmsTable.BODY));
|
||||
boolean unidentified = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.UNIDENTIFIED)) == 1;
|
||||
boolean remoteDelete = cursor.getInt(cursor.getColumnIndexOrThrow(SmsTable.REMOTE_DELETED)) == 1;
|
||||
long notifiedTimestamp = CursorUtil.requireLong(cursor, NOTIFIED_TIMESTAMP);
|
||||
long receiptTimestamp = CursorUtil.requireLong(cursor, RECEIPT_TIMESTAMP);
|
||||
|
||||
@@ -2053,7 +2053,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
db.beginTransaction();
|
||||
|
||||
try {
|
||||
try (MmsSmsDatabase.Reader reader = MmsSmsDatabase.readerFor(SignalDatabase.mmsSms().getConversation(threadId, 0, 2))) {
|
||||
try (MmsSmsTable.Reader reader = MmsSmsTable.readerFor(SignalDatabase.mmsSms().getConversation(threadId, 0, 2))) {
|
||||
MessageRecord latestMessage = reader.getNext();
|
||||
if (latestMessage != null && latestMessage.isGroupV2()) {
|
||||
Optional<ByteString> changeEditor = message.getChangeEditor();
|
||||
@@ -33,9 +33,9 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class StickerDatabase extends Database {
|
||||
public class StickerTable extends DatabaseTable {
|
||||
|
||||
private static final String TAG = Log.tag(StickerDatabase.class);
|
||||
private static final String TAG = Log.tag(StickerTable.class);
|
||||
|
||||
public static final String TABLE_NAME = "sticker";
|
||||
public static final String _ID = "_id";
|
||||
@@ -80,7 +80,7 @@ public class StickerDatabase extends Database {
|
||||
|
||||
private final AttachmentSecret attachmentSecret;
|
||||
|
||||
public StickerDatabase(Context context, SignalDatabase databaseHelper, AttachmentSecret attachmentSecret) {
|
||||
public StickerTable(Context context, SignalDatabase databaseHelper, AttachmentSecret attachmentSecret) {
|
||||
super(context, databaseHelper);
|
||||
this.attachmentSecret = attachmentSecret;
|
||||
}
|
||||
@@ -249,8 +249,8 @@ public class StickerDatabase extends Database {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
String query = "SELECT " + PACK_ID + " FROM " + TABLE_NAME + " WHERE " + INSTALLED + " = ? AND " +
|
||||
PACK_ID + " NOT IN (" +
|
||||
"SELECT DISTINCT " + AttachmentDatabase.STICKER_PACK_ID + " FROM " + AttachmentDatabase.TABLE_NAME + " " +
|
||||
"WHERE " + AttachmentDatabase.STICKER_PACK_ID + " NOT NULL" +
|
||||
"SELECT DISTINCT " + AttachmentTable.STICKER_PACK_ID + " FROM " + AttachmentTable.TABLE_NAME + " " +
|
||||
"WHERE " + AttachmentTable.STICKER_PACK_ID + " NOT NULL" +
|
||||
")";
|
||||
String[] args = new String[] { "0" };
|
||||
|
||||
@@ -22,7 +22,7 @@ import org.whispersystems.signalservice.api.push.DistributionId
|
||||
* 1. Only send a single copy of each story to a given recipient, while
|
||||
* 2. Knowing which people would have gotten duplicate copies.
|
||||
*/
|
||||
class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
class StorySendTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference {
|
||||
|
||||
companion object {
|
||||
const val TABLE_NAME = "story_sends"
|
||||
@@ -36,11 +36,11 @@ class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Dat
|
||||
val CREATE_TABLE = """
|
||||
CREATE TABLE $TABLE_NAME (
|
||||
$ID INTEGER PRIMARY KEY,
|
||||
$MESSAGE_ID INTEGER NOT NULL REFERENCES ${MmsDatabase.TABLE_NAME} (${MmsDatabase.ID}) ON DELETE CASCADE,
|
||||
$RECIPIENT_ID INTEGER NOT NULL REFERENCES ${RecipientDatabase.TABLE_NAME} (${RecipientDatabase.ID}) ON DELETE CASCADE,
|
||||
$MESSAGE_ID INTEGER NOT NULL REFERENCES ${MmsTable.TABLE_NAME} (${MmsTable.ID}) ON DELETE CASCADE,
|
||||
$RECIPIENT_ID INTEGER NOT NULL REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}) ON DELETE CASCADE,
|
||||
$SENT_TIMESTAMP INTEGER NOT NULL,
|
||||
$ALLOWS_REPLIES INTEGER NOT NULL,
|
||||
$DISTRIBUTION_ID TEXT NOT NULL REFERENCES ${DistributionListDatabase.LIST_TABLE_NAME} (${DistributionListDatabase.DISTRIBUTION_ID}) ON DELETE CASCADE
|
||||
$DISTRIBUTION_ID TEXT NOT NULL REFERENCES ${DistributionListTables.LIST_TABLE_NAME} (${DistributionListTables.DISTRIBUTION_ID}) ON DELETE CASCADE
|
||||
)
|
||||
""".trimIndent()
|
||||
|
||||
@@ -141,9 +141,9 @@ class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Dat
|
||||
WHERE $MESSAGE_ID != $messageId
|
||||
AND $SENT_TIMESTAMP = $sentTimestamp
|
||||
AND $MESSAGE_ID IN (
|
||||
SELECT ${MmsDatabase.ID}
|
||||
FROM ${MmsDatabase.TABLE_NAME}
|
||||
WHERE ${MmsDatabase.REMOTE_DELETED} = 0
|
||||
SELECT ${MmsTable.ID}
|
||||
FROM ${MmsTable.TABLE_NAME}
|
||||
WHERE ${MmsTable.REMOTE_DELETED} = 0
|
||||
)
|
||||
)
|
||||
""".trimIndent()
|
||||
@@ -171,7 +171,7 @@ class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Dat
|
||||
}
|
||||
}
|
||||
|
||||
fun getStoryMessagesFor(syncMessageId: MessageDatabase.SyncMessageId): Set<MessageId> {
|
||||
fun getStoryMessagesFor(syncMessageId: MessageTable.SyncMessageId): Set<MessageId> {
|
||||
val messageIds = mutableSetOf<MessageId>()
|
||||
|
||||
readableDatabase.query(
|
||||
@@ -208,7 +208,7 @@ class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Dat
|
||||
.where(
|
||||
"""
|
||||
$SENT_TIMESTAMP = ? AND
|
||||
(SELECT ${MmsDatabase.REMOTE_DELETED} FROM ${MmsDatabase.TABLE_NAME} WHERE ${MmsDatabase.ID} = $MESSAGE_ID) = 0
|
||||
(SELECT ${MmsTable.REMOTE_DELETED} FROM ${MmsTable.TABLE_NAME} WHERE ${MmsTable.ID} = $MESSAGE_ID) = 0
|
||||
""".trimIndent(),
|
||||
sentTimestamp
|
||||
)
|
||||
@@ -260,17 +260,17 @@ class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Dat
|
||||
val localManifest: SentStorySyncManifest = getLocalManifest(sentTimestamp)
|
||||
|
||||
val query = """
|
||||
SELECT ${MmsDatabase.TABLE_NAME}.${MmsDatabase.ID} as $MESSAGE_ID, ${DistributionListDatabase.DISTRIBUTION_ID}
|
||||
FROM ${MmsDatabase.TABLE_NAME}
|
||||
INNER JOIN ${DistributionListDatabase.LIST_TABLE_NAME} ON ${DistributionListDatabase.RECIPIENT_ID} = ${MmsDatabase.RECIPIENT_ID}
|
||||
WHERE ${MmsDatabase.DATE_SENT} = $sentTimestamp AND ${DistributionListDatabase.DISTRIBUTION_ID} IS NOT NULL
|
||||
SELECT ${MmsTable.TABLE_NAME}.${MmsTable.ID} as $MESSAGE_ID, ${DistributionListTables.DISTRIBUTION_ID}
|
||||
FROM ${MmsTable.TABLE_NAME}
|
||||
INNER JOIN ${DistributionListTables.LIST_TABLE_NAME} ON ${DistributionListTables.RECIPIENT_ID} = ${MmsTable.RECIPIENT_ID}
|
||||
WHERE ${MmsTable.DATE_SENT} = $sentTimestamp AND ${DistributionListTables.DISTRIBUTION_ID} IS NOT NULL
|
||||
""".trimIndent()
|
||||
|
||||
val distributionIdToMessageId = readableDatabase.query(query).use { cursor ->
|
||||
val results: MutableMap<DistributionId, Long> = mutableMapOf()
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
val distributionId = DistributionId.from(CursorUtil.requireString(cursor, DistributionListDatabase.DISTRIBUTION_ID))
|
||||
val distributionId = DistributionId.from(CursorUtil.requireString(cursor, DistributionListTables.DISTRIBUTION_ID))
|
||||
val messageId = CursorUtil.requireLong(cursor, MESSAGE_ID)
|
||||
|
||||
results[distributionId] = messageId
|
||||
@@ -341,9 +341,9 @@ class StorySendsDatabase(context: Context, databaseHelper: SignalDatabase) : Dat
|
||||
$DISTRIBUTION_ID
|
||||
FROM $TABLE_NAME
|
||||
WHERE $TABLE_NAME.$SENT_TIMESTAMP = ? AND (
|
||||
SELECT ${MmsDatabase.REMOTE_DELETED}
|
||||
FROM ${MmsDatabase.TABLE_NAME}
|
||||
WHERE ${MmsDatabase.ID} = $TABLE_NAME.$MESSAGE_ID
|
||||
SELECT ${MmsTable.REMOTE_DELETED}
|
||||
FROM ${MmsTable.TABLE_NAME}
|
||||
WHERE ${MmsTable.ID} = $TABLE_NAME.$MESSAGE_ID
|
||||
) = 0
|
||||
""".trimIndent(),
|
||||
arrayOf(sentTimestamp)
|
||||
@@ -25,7 +25,7 @@ import org.signal.core.util.withinTransaction
|
||||
import org.signal.libsignal.zkgroup.InvalidInputException
|
||||
import org.signal.libsignal.zkgroup.groups.GroupMasterKey
|
||||
import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter
|
||||
import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo
|
||||
import org.thoughtcrime.securesms.database.MessageTable.MarkedMessageInfo
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.attachments
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.drafts
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.groupReceipts
|
||||
@@ -68,10 +68,10 @@ import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
||||
@SuppressLint("RecipientIdDatabaseReferenceUsage", "ThreadIdDatabaseReferenceUsage") // Handles remapping in a unique way
|
||||
class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(ThreadDatabase::class.java)
|
||||
private val TAG = Log.tag(ThreadTable::class.java)
|
||||
|
||||
const val TABLE_NAME = "thread"
|
||||
const val ID = "_id"
|
||||
@@ -167,7 +167,7 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
.map { columnName: String -> "$TABLE_NAME.$columnName" }
|
||||
.toList()
|
||||
|
||||
private val COMBINED_THREAD_RECIPIENT_GROUP_PROJECTION: List<String> = TYPED_THREAD_PROJECTION + RecipientDatabase.TYPED_RECIPIENT_PROJECTION_NO_ID + GroupDatabase.TYPED_GROUP_PROJECTION
|
||||
private val COMBINED_THREAD_RECIPIENT_GROUP_PROJECTION: List<String> = TYPED_THREAD_PROJECTION + RecipientTable.TYPED_RECIPIENT_PROJECTION_NO_ID + GroupTable.TYPED_GROUP_PROJECTION
|
||||
|
||||
const val NO_TRIM_BEFORE_DATE_SET: Long = 0
|
||||
const val NO_TRIM_MESSAGE_COUNT_SET = Int.MAX_VALUE
|
||||
@@ -671,33 +671,33 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
var where = ""
|
||||
|
||||
if (!includeInactiveGroups) {
|
||||
where += "$MEANINGFUL_MESSAGES != 0 AND (${GroupDatabase.TABLE_NAME}.${GroupDatabase.ACTIVE} IS NULL OR ${GroupDatabase.TABLE_NAME}.${GroupDatabase.ACTIVE} = 1)"
|
||||
where += "$MEANINGFUL_MESSAGES != 0 AND (${GroupTable.TABLE_NAME}.${GroupTable.ACTIVE} IS NULL OR ${GroupTable.TABLE_NAME}.${GroupTable.ACTIVE} = 1)"
|
||||
} else {
|
||||
where += "$MEANINGFUL_MESSAGES != 0"
|
||||
}
|
||||
|
||||
if (groupsOnly) {
|
||||
where += " AND ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.GROUP_ID} NOT NULL"
|
||||
where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.GROUP_ID} NOT NULL"
|
||||
}
|
||||
|
||||
if (individualsOnly) {
|
||||
where += " AND ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.GROUP_ID} IS NULL"
|
||||
where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.GROUP_ID} IS NULL"
|
||||
}
|
||||
|
||||
if (hideV1Groups) {
|
||||
where += " AND ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.GROUP_TYPE} != ${RecipientDatabase.GroupType.SIGNAL_V1.id}"
|
||||
where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.GROUP_TYPE} != ${RecipientTable.GroupType.SIGNAL_V1.id}"
|
||||
}
|
||||
|
||||
if (hideSms) {
|
||||
where += """ AND (
|
||||
${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.REGISTERED} = ${RecipientDatabase.RegisteredState.REGISTERED.id}
|
||||
${RecipientTable.TABLE_NAME}.${RecipientTable.REGISTERED} = ${RecipientTable.RegisteredState.REGISTERED.id}
|
||||
OR
|
||||
(
|
||||
${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.GROUP_ID} NOT NULL
|
||||
AND ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.GROUP_TYPE} != ${RecipientDatabase.GroupType.MMS.id}
|
||||
${RecipientTable.TABLE_NAME}.${RecipientTable.GROUP_ID} NOT NULL
|
||||
AND ${RecipientTable.TABLE_NAME}.${RecipientTable.GROUP_TYPE} != ${RecipientTable.GroupType.MMS.id}
|
||||
)
|
||||
)"""
|
||||
where += " AND ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.FORCE_SMS_SELECTION} = 0"
|
||||
where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.FORCE_SMS_SELECTION} = 0"
|
||||
}
|
||||
|
||||
if (hideSelf) {
|
||||
@@ -705,7 +705,7 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
}
|
||||
|
||||
where += " AND $ARCHIVED = 0"
|
||||
where += " AND ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.BLOCKED} = 0"
|
||||
where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.BLOCKED} = 0"
|
||||
|
||||
if (SignalStore.releaseChannelValues().releaseChannelRecipientId != null) {
|
||||
where += " AND $RECIPIENT_ID != ${SignalStore.releaseChannelValues().releaseChannelRecipientId!!.toLong()}"
|
||||
@@ -722,14 +722,14 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
}
|
||||
|
||||
fun getRecentPushConversationList(limit: Int, includeInactiveGroups: Boolean): Cursor {
|
||||
val activeGroupQuery = if (!includeInactiveGroups) " AND " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1" else ""
|
||||
val activeGroupQuery = if (!includeInactiveGroups) " AND " + GroupTable.TABLE_NAME + "." + GroupTable.ACTIVE + " = 1" else ""
|
||||
val where = """
|
||||
$MEANINGFUL_MESSAGES != 0
|
||||
AND (
|
||||
${RecipientDatabase.REGISTERED} = ${RecipientDatabase.RegisteredState.REGISTERED.id}
|
||||
${RecipientTable.REGISTERED} = ${RecipientTable.RegisteredState.REGISTERED.id}
|
||||
OR (
|
||||
${GroupDatabase.TABLE_NAME}.${GroupDatabase.GROUP_ID} NOT NULL
|
||||
AND ${GroupDatabase.TABLE_NAME}.${GroupDatabase.MMS} = 0
|
||||
${GroupTable.TABLE_NAME}.${GroupTable.GROUP_ID} NOT NULL
|
||||
AND ${GroupTable.TABLE_NAME}.${GroupTable.MMS} = 0
|
||||
$activeGroupQuery
|
||||
)
|
||||
)
|
||||
@@ -1363,7 +1363,7 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
return true
|
||||
}
|
||||
|
||||
val drafts: DraftDatabase.Drafts = SignalDatabase.drafts.getDrafts(threadId)
|
||||
val drafts: DraftTable.Drafts = SignalDatabase.drafts.getDrafts(threadId)
|
||||
if (drafts.isNotEmpty()) {
|
||||
val threadRecord: ThreadRecord? = getThreadRecord(threadId)
|
||||
if (threadRecord != null &&
|
||||
@@ -1607,8 +1607,8 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
var query = """
|
||||
SELECT $projection
|
||||
FROM $TABLE_NAME
|
||||
LEFT OUTER JOIN ${RecipientDatabase.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientDatabase.TABLE_NAME}.${RecipientDatabase.ID}
|
||||
LEFT OUTER JOIN ${GroupDatabase.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${GroupDatabase.TABLE_NAME}.${GroupDatabase.RECIPIENT_ID}
|
||||
LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID}
|
||||
LEFT OUTER JOIN ${GroupTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${GroupTable.TABLE_NAME}.${GroupTable.RECIPIENT_ID}
|
||||
WHERE $where
|
||||
ORDER BY $orderBy
|
||||
""".trimIndent()
|
||||
@@ -1674,7 +1674,7 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas
|
||||
val recipientSettings = recipients.getRecord(context, cursor, RECIPIENT_ID)
|
||||
|
||||
val recipient: Recipient = if (recipientSettings.groupId != null) {
|
||||
GroupDatabase.Reader(cursor).current?.let { group ->
|
||||
GroupTable.Reader(cursor).current?.let { group ->
|
||||
val details = RecipientDetails(
|
||||
group.title,
|
||||
null,
|
||||
@@ -23,7 +23,7 @@ import java.util.List;
|
||||
* A list of storage keys whose types we do not currently have syncing logic for. We need to
|
||||
* remember that these keys exist so that we don't blast any data away.
|
||||
*/
|
||||
public class UnknownStorageIdDatabase extends Database {
|
||||
public class UnknownStorageIdTable extends DatabaseTable {
|
||||
|
||||
private static final String TABLE_NAME = "storage_key";
|
||||
private static final String ID = "_id";
|
||||
@@ -38,7 +38,7 @@ public class UnknownStorageIdDatabase extends Database {
|
||||
"CREATE INDEX IF NOT EXISTS storage_key_type_index ON " + TABLE_NAME + " (" + TYPE + ");"
|
||||
};
|
||||
|
||||
public UnknownStorageIdDatabase(Context context, SignalDatabase databaseHelper) {
|
||||
public UnknownStorageIdTable(Context context, SignalDatabase databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -29,16 +29,16 @@ import org.thoughtcrime.securesms.crypto.ClassicDecryptingPartInputStream;
|
||||
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
||||
import org.thoughtcrime.securesms.database.AttachmentDatabase;
|
||||
import org.thoughtcrime.securesms.database.DraftDatabase;
|
||||
import org.thoughtcrime.securesms.database.GroupDatabase;
|
||||
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
|
||||
import org.thoughtcrime.securesms.database.IdentityDatabase;
|
||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.PushDatabase;
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||
import org.thoughtcrime.securesms.database.AttachmentTable;
|
||||
import org.thoughtcrime.securesms.database.DraftTable;
|
||||
import org.thoughtcrime.securesms.database.GroupTable;
|
||||
import org.thoughtcrime.securesms.database.GroupReceiptTable;
|
||||
import org.thoughtcrime.securesms.database.IdentityTable;
|
||||
import org.thoughtcrime.securesms.database.MmsTable;
|
||||
import org.thoughtcrime.securesms.database.PushTable;
|
||||
import org.thoughtcrime.securesms.database.RecipientTable;
|
||||
import org.thoughtcrime.securesms.database.SmsTable;
|
||||
import org.thoughtcrime.securesms.database.ThreadTable;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.groups.GroupId;
|
||||
import org.thoughtcrime.securesms.migrations.LegacyMigrationJob;
|
||||
@@ -128,24 +128,24 @@ public class ClassicOpenHelper extends SQLiteOpenHelper {
|
||||
|
||||
@Override
|
||||
public void onCreate(SQLiteDatabase db) {
|
||||
db.execSQL(SmsDatabase.CREATE_TABLE);
|
||||
db.execSQL(MmsDatabase.CREATE_TABLE);
|
||||
db.execSQL(AttachmentDatabase.CREATE_TABLE);
|
||||
db.execSQL(ThreadDatabase.CREATE_TABLE);
|
||||
db.execSQL(IdentityDatabase.CREATE_TABLE);
|
||||
db.execSQL(DraftDatabase.CREATE_TABLE);
|
||||
db.execSQL(PushDatabase.CREATE_TABLE);
|
||||
db.execSQL(GroupDatabase.CREATE_TABLE);
|
||||
db.execSQL(RecipientDatabase.CREATE_TABLE);
|
||||
db.execSQL(GroupReceiptDatabase.CREATE_TABLE);
|
||||
db.execSQL(SmsTable.CREATE_TABLE);
|
||||
db.execSQL(MmsTable.CREATE_TABLE);
|
||||
db.execSQL(AttachmentTable.CREATE_TABLE);
|
||||
db.execSQL(ThreadTable.CREATE_TABLE);
|
||||
db.execSQL(IdentityTable.CREATE_TABLE);
|
||||
db.execSQL(DraftTable.CREATE_TABLE);
|
||||
db.execSQL(PushTable.CREATE_TABLE);
|
||||
db.execSQL(GroupTable.CREATE_TABLE);
|
||||
db.execSQL(RecipientTable.CREATE_TABLE);
|
||||
db.execSQL(GroupReceiptTable.CREATE_TABLE);
|
||||
|
||||
executeStatements(db, SmsDatabase.CREATE_INDEXS);
|
||||
executeStatements(db, MmsDatabase.CREATE_INDEXS);
|
||||
executeStatements(db, AttachmentDatabase.CREATE_INDEXS);
|
||||
executeStatements(db, ThreadDatabase.CREATE_INDEXS);
|
||||
executeStatements(db, DraftDatabase.CREATE_INDEXS);
|
||||
executeStatements(db, GroupDatabase.CREATE_INDEXS);
|
||||
executeStatements(db, GroupReceiptDatabase.CREATE_INDEXES);
|
||||
executeStatements(db, SmsTable.CREATE_INDEXS);
|
||||
executeStatements(db, MmsTable.CREATE_INDEXS);
|
||||
executeStatements(db, AttachmentTable.CREATE_INDEXS);
|
||||
executeStatements(db, ThreadTable.CREATE_INDEXS);
|
||||
executeStatements(db, DraftTable.CREATE_INDEXS);
|
||||
executeStatements(db, GroupTable.CREATE_INDEXS);
|
||||
executeStatements(db, GroupReceiptTable.CREATE_INDEXES);
|
||||
}
|
||||
|
||||
public void onApplicationLevelUpgrade(Context context, MasterSecret masterSecret, int fromVersion,
|
||||
@@ -404,10 +404,10 @@ public class ClassicOpenHelper extends SQLiteOpenHelper {
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
cursor = db.query(SmsDatabase.TABLE_NAME,
|
||||
new String[] {SmsDatabase.ID, SmsDatabase.BODY, SmsDatabase.TYPE},
|
||||
SmsDatabase.TYPE + " & ? == 0",
|
||||
new String[] {String.valueOf(SmsDatabase.Types.ENCRYPTION_MASK)},
|
||||
cursor = db.query(SmsTable.TABLE_NAME,
|
||||
new String[] { SmsTable.ID, SmsTable.BODY, SmsTable.TYPE},
|
||||
SmsTable.TYPE + " & ? == 0",
|
||||
new String[] {String.valueOf(SmsTable.Types.ENCRYPTION_MASK)},
|
||||
null, null, null);
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
@@ -418,10 +418,10 @@ public class ClassicOpenHelper extends SQLiteOpenHelper {
|
||||
String encryptedBody = masterCipher.encryptBody(body);
|
||||
|
||||
ContentValues update = new ContentValues();
|
||||
update.put(SmsDatabase.BODY, encryptedBody);
|
||||
update.put(SmsDatabase.TYPE, type | 0x80000000); // Inline now deprecated symmetric encryption type
|
||||
update.put(SmsTable.BODY, encryptedBody);
|
||||
update.put(SmsTable.TYPE, type | 0x80000000); // Inline now deprecated symmetric encryption type
|
||||
|
||||
db.update(SmsDatabase.TABLE_NAME, update, SmsDatabase.ID + " = ?",
|
||||
db.update(SmsTable.TABLE_NAME, update, SmsTable.ID + " = ?",
|
||||
new String[] {String.valueOf(id)});
|
||||
}
|
||||
} finally {
|
||||
|
||||
@@ -16,8 +16,8 @@ import org.signal.libsignal.protocol.InvalidKeyException;
|
||||
import org.signal.libsignal.protocol.InvalidMessageException;
|
||||
import org.signal.libsignal.protocol.state.PreKeyRecord;
|
||||
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
|
||||
import org.thoughtcrime.securesms.database.OneTimePreKeyDatabase;
|
||||
import org.thoughtcrime.securesms.database.SignedPreKeyDatabase;
|
||||
import org.thoughtcrime.securesms.database.OneTimePreKeyTable;
|
||||
import org.thoughtcrime.securesms.database.SignedPreKeyTable;
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||
import org.thoughtcrime.securesms.util.Base64;
|
||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||
@@ -48,10 +48,10 @@ public final class PreKeyMigrationHelper {
|
||||
PreKeyRecord preKey = new PreKeyRecord(loadSerializedRecord(preKeyFile));
|
||||
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(OneTimePreKeyDatabase.KEY_ID, preKey.getId());
|
||||
contentValues.put(OneTimePreKeyDatabase.PUBLIC_KEY, Base64.encodeBytes(preKey.getKeyPair().getPublicKey().serialize()));
|
||||
contentValues.put(OneTimePreKeyDatabase.PRIVATE_KEY, Base64.encodeBytes(preKey.getKeyPair().getPrivateKey().serialize()));
|
||||
database.insert(OneTimePreKeyDatabase.TABLE_NAME, null, contentValues);
|
||||
contentValues.put(OneTimePreKeyTable.KEY_ID, preKey.getId());
|
||||
contentValues.put(OneTimePreKeyTable.PUBLIC_KEY, Base64.encodeBytes(preKey.getKeyPair().getPublicKey().serialize()));
|
||||
contentValues.put(OneTimePreKeyTable.PRIVATE_KEY, Base64.encodeBytes(preKey.getKeyPair().getPrivateKey().serialize()));
|
||||
database.insert(OneTimePreKeyTable.TABLE_NAME, null, contentValues);
|
||||
Log.i(TAG, "Migrated one-time prekey: " + preKey.getId());
|
||||
} catch (IOException | InvalidMessageException | InvalidKeyException e) {
|
||||
Log.w(TAG, e);
|
||||
@@ -70,12 +70,12 @@ public final class PreKeyMigrationHelper {
|
||||
SignedPreKeyRecord signedPreKey = new SignedPreKeyRecord(loadSerializedRecord(signedPreKeyFile));
|
||||
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(SignedPreKeyDatabase.KEY_ID, signedPreKey.getId());
|
||||
contentValues.put(SignedPreKeyDatabase.PUBLIC_KEY, Base64.encodeBytes(signedPreKey.getKeyPair().getPublicKey().serialize()));
|
||||
contentValues.put(SignedPreKeyDatabase.PRIVATE_KEY, Base64.encodeBytes(signedPreKey.getKeyPair().getPrivateKey().serialize()));
|
||||
contentValues.put(SignedPreKeyDatabase.SIGNATURE, Base64.encodeBytes(signedPreKey.getSignature()));
|
||||
contentValues.put(SignedPreKeyDatabase.TIMESTAMP, signedPreKey.getTimestamp());
|
||||
database.insert(SignedPreKeyDatabase.TABLE_NAME, null, contentValues);
|
||||
contentValues.put(SignedPreKeyTable.KEY_ID, signedPreKey.getId());
|
||||
contentValues.put(SignedPreKeyTable.PUBLIC_KEY, Base64.encodeBytes(signedPreKey.getKeyPair().getPublicKey().serialize()));
|
||||
contentValues.put(SignedPreKeyTable.PRIVATE_KEY, Base64.encodeBytes(signedPreKey.getKeyPair().getPrivateKey().serialize()));
|
||||
contentValues.put(SignedPreKeyTable.SIGNATURE, Base64.encodeBytes(signedPreKey.getSignature()));
|
||||
contentValues.put(SignedPreKeyTable.TIMESTAMP, signedPreKey.getTimestamp());
|
||||
database.insert(SignedPreKeyTable.TABLE_NAME, null, contentValues);
|
||||
Log.i(TAG, "Migrated signed prekey: " + signedPreKey.getId());
|
||||
} catch (IOException | InvalidMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.signal.core.util.Conversions;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.signal.libsignal.protocol.InvalidMessageException;
|
||||
import org.signal.libsignal.protocol.state.SessionRecord;
|
||||
import org.thoughtcrime.securesms.database.SessionDatabase;
|
||||
import org.thoughtcrime.securesms.database.SessionTable;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
|
||||
import java.io.File;
|
||||
@@ -74,11 +74,11 @@ public final class SessionStoreMigrationHelper {
|
||||
|
||||
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(SessionDatabase.ADDRESS, address);
|
||||
contentValues.put(SessionDatabase.DEVICE, deviceId);
|
||||
contentValues.put(SessionDatabase.RECORD, sessionRecord.serialize());
|
||||
contentValues.put(SessionTable.ADDRESS, address);
|
||||
contentValues.put(SessionTable.DEVICE, deviceId);
|
||||
contentValues.put(SessionTable.RECORD, sessionRecord.serialize());
|
||||
|
||||
database.insert(SessionDatabase.TABLE_NAME, null, contentValues);
|
||||
database.insert(SessionTable.TABLE_NAME, null, contentValues);
|
||||
} catch (NumberFormatException | IOException | InvalidMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ import org.thoughtcrime.securesms.conversation.colors.AvatarColor
|
||||
import org.thoughtcrime.securesms.conversation.colors.ChatColors
|
||||
import org.thoughtcrime.securesms.conversation.colors.ChatColorsMapper
|
||||
import org.thoughtcrime.securesms.database.KeyValueDatabase
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase
|
||||
import org.thoughtcrime.securesms.database.RecipientTable
|
||||
import org.thoughtcrime.securesms.database.helpers.PreKeyMigrationHelper
|
||||
import org.thoughtcrime.securesms.database.helpers.RecipientIdCleanupHelper
|
||||
import org.thoughtcrime.securesms.database.helpers.RecipientIdMigrationHelper
|
||||
@@ -212,7 +212,7 @@ object V149_LegacyMigrations : SignalDatabaseMigration {
|
||||
override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
|
||||
if (oldVersion < RECIPIENT_CALL_RINGTONE_VERSION) {
|
||||
db.execSQL("ALTER TABLE recipient_preferences ADD COLUMN call_ringtone TEXT DEFAULT NULL")
|
||||
db.execSQL("ALTER TABLE recipient_preferences ADD COLUMN call_vibrate INTEGER DEFAULT " + RecipientDatabase.VibrateState.DEFAULT.id)
|
||||
db.execSQL("ALTER TABLE recipient_preferences ADD COLUMN call_vibrate INTEGER DEFAULT " + RecipientTable.VibrateState.DEFAULT.id)
|
||||
}
|
||||
|
||||
if (oldVersion < MIGRATE_PREKEYS_VERSION) {
|
||||
|
||||
@@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.database.identity;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.thoughtcrime.securesms.database.IdentityDatabase.VerifiedStatus;
|
||||
import org.thoughtcrime.securesms.database.IdentityTable.VerifiedStatus;
|
||||
import org.thoughtcrime.securesms.database.model.IdentityRecord;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import org.signal.core.util.ThreadUtil;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.DatabaseObserver;
|
||||
import org.thoughtcrime.securesms.database.MediaDatabase;
|
||||
import org.thoughtcrime.securesms.database.MediaTable;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.util.CalendarDateOnly;
|
||||
|
||||
@@ -27,14 +27,14 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
private static final String TAG = Log.tag(GroupedThreadMediaLoader.class);
|
||||
|
||||
private final DatabaseObserver.Observer observer;
|
||||
private final MediaLoader.MediaType mediaType;
|
||||
private final MediaDatabase.Sorting sorting;
|
||||
private final long threadId;
|
||||
private final MediaLoader.MediaType mediaType;
|
||||
private final MediaTable.Sorting sorting;
|
||||
private final long threadId;
|
||||
|
||||
public GroupedThreadMediaLoader(@NonNull Context context,
|
||||
long threadId,
|
||||
@NonNull MediaLoader.MediaType mediaType,
|
||||
@NonNull MediaDatabase.Sorting sorting)
|
||||
@NonNull MediaTable.Sorting sorting)
|
||||
{
|
||||
super(context);
|
||||
this.threadId = threadId;
|
||||
@@ -75,11 +75,11 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
|
||||
try (Cursor cursor = ThreadMediaLoader.createThreadMediaCursor(context, threadId, mediaType, sorting)) {
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
mediaGrouping.add(MediaDatabase.MediaRecord.from(cursor));
|
||||
mediaGrouping.add(MediaTable.MediaRecord.from(cursor));
|
||||
}
|
||||
}
|
||||
|
||||
if (sorting == MediaDatabase.Sorting.Oldest || sorting == MediaDatabase.Sorting.Largest) {
|
||||
if (sorting == MediaTable.Sorting.Oldest || sorting == MediaTable.Sorting.Largest) {
|
||||
return new ReversedGroupedThreadMedia(mediaGrouping);
|
||||
} else {
|
||||
return mediaGrouping;
|
||||
@@ -88,7 +88,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
|
||||
public interface GroupingMethod {
|
||||
|
||||
int groupForRecord(@NonNull MediaDatabase.MediaRecord mediaRecord);
|
||||
int groupForRecord(@NonNull MediaTable.MediaRecord mediaRecord);
|
||||
|
||||
@NonNull String groupName(int groupNo);
|
||||
}
|
||||
@@ -121,7 +121,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
}
|
||||
|
||||
@Override
|
||||
public int groupForRecord(@NonNull MediaDatabase.MediaRecord mediaRecord) {
|
||||
public int groupForRecord(@NonNull MediaTable.MediaRecord mediaRecord) {
|
||||
long date = mediaRecord.getDate();
|
||||
|
||||
if (date > todayStart) return TODAY;
|
||||
@@ -181,7 +181,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
}
|
||||
|
||||
@Override
|
||||
public int groupForRecord(@NonNull MediaDatabase.MediaRecord mediaRecord) {
|
||||
public int groupForRecord(@NonNull MediaTable.MediaRecord mediaRecord) {
|
||||
long size = mediaRecord.getAttachment().getSize();
|
||||
|
||||
if (size < MB) return SMALL;
|
||||
@@ -207,7 +207,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
|
||||
public abstract int getSectionItemCount(int section);
|
||||
|
||||
public abstract @NonNull MediaDatabase.MediaRecord get(int section, int item);
|
||||
public abstract @NonNull MediaTable.MediaRecord get(int section, int item);
|
||||
|
||||
public abstract @NonNull String getName(int section);
|
||||
|
||||
@@ -226,7 +226,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MediaDatabase.MediaRecord get(int section, int item) {
|
||||
public @NonNull MediaTable.MediaRecord get(int section, int item) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
@@ -255,7 +255,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MediaDatabase.MediaRecord get(int section, int item) {
|
||||
public @NonNull MediaTable.MediaRecord get(int section, int item) {
|
||||
return decorated.get(getReversedSection(section), item);
|
||||
}
|
||||
|
||||
@@ -274,16 +274,16 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
@NonNull
|
||||
private final GroupingMethod groupingMethod;
|
||||
|
||||
private final SparseArray<List<MediaDatabase.MediaRecord>> records = new SparseArray<>();
|
||||
private final SparseArray<List<MediaTable.MediaRecord>> records = new SparseArray<>();
|
||||
|
||||
private PopulatedGroupedThreadMedia(@NonNull GroupingMethod groupingMethod) {
|
||||
this.groupingMethod = groupingMethod;
|
||||
}
|
||||
|
||||
private void add(@NonNull MediaDatabase.MediaRecord mediaRecord) {
|
||||
private void add(@NonNull MediaTable.MediaRecord mediaRecord) {
|
||||
int groupNo = groupingMethod.groupForRecord(mediaRecord);
|
||||
|
||||
List<MediaDatabase.MediaRecord> mediaRecords = records.get(groupNo);
|
||||
List<MediaTable.MediaRecord> mediaRecords = records.get(groupNo);
|
||||
if (mediaRecords == null) {
|
||||
mediaRecords = new LinkedList<>();
|
||||
records.put(groupNo, mediaRecords);
|
||||
@@ -303,7 +303,7 @@ public final class GroupedThreadMediaLoader extends AsyncTaskLoader<GroupedThrea
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull MediaDatabase.MediaRecord get(int section, int item) {
|
||||
public @NonNull MediaTable.MediaRecord get(int section, int item) {
|
||||
return records.get(records.keyAt(section)).get(item);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,10 +11,9 @@ import androidx.core.util.Pair;
|
||||
import org.signal.core.util.ThreadUtil;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.attachments.AttachmentId;
|
||||
import org.thoughtcrime.securesms.database.AttachmentDatabase;
|
||||
import org.thoughtcrime.securesms.database.AttachmentTable;
|
||||
import org.thoughtcrime.securesms.database.DatabaseObserver;
|
||||
import org.thoughtcrime.securesms.database.MediaDatabase;
|
||||
import org.thoughtcrime.securesms.database.MediaDatabase.Sorting;
|
||||
import org.thoughtcrime.securesms.database.MediaTable.Sorting;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.mms.PartAuthority;
|
||||
@@ -49,7 +48,7 @@ public final class PagingMediaLoader extends AsyncLoader<Pair<Cursor, Integer>>
|
||||
Cursor cursor = SignalDatabase.media().getGalleryMediaForThread(threadId, sorting);
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
AttachmentId attachmentId = new AttachmentId(cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentDatabase.ROW_ID)), cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentDatabase.UNIQUE_ID)));
|
||||
AttachmentId attachmentId = new AttachmentId(cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.ROW_ID)), cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.UNIQUE_ID)));
|
||||
Uri attachmentUri = PartAuthority.getAttachmentDataUri(attachmentId);
|
||||
|
||||
if (attachmentUri.equals(uri)) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import android.database.Cursor;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.database.MediaDatabase;
|
||||
import org.thoughtcrime.securesms.database.MediaTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
@@ -17,13 +17,13 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
public final class RecipientMediaLoader extends MediaLoader {
|
||||
|
||||
@Nullable private final RecipientId recipientId;
|
||||
@NonNull private final MediaType mediaType;
|
||||
@NonNull private final MediaDatabase.Sorting sorting;
|
||||
@NonNull private final MediaType mediaType;
|
||||
@NonNull private final MediaTable.Sorting sorting;
|
||||
|
||||
public RecipientMediaLoader(@NonNull Context context,
|
||||
@Nullable RecipientId recipientId,
|
||||
@NonNull MediaType mediaType,
|
||||
@NonNull MediaDatabase.Sorting sorting)
|
||||
@NonNull MediaTable.Sorting sorting)
|
||||
{
|
||||
super(context);
|
||||
this.recipientId = recipientId;
|
||||
|
||||
@@ -5,19 +5,19 @@ import android.database.Cursor;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.thoughtcrime.securesms.database.MediaDatabase;
|
||||
import org.thoughtcrime.securesms.database.MediaTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
|
||||
public final class ThreadMediaLoader extends MediaLoader {
|
||||
|
||||
private final long threadId;
|
||||
@NonNull private final MediaType mediaType;
|
||||
@NonNull private final MediaDatabase.Sorting sorting;
|
||||
@NonNull private final MediaType mediaType;
|
||||
@NonNull private final MediaTable.Sorting sorting;
|
||||
|
||||
public ThreadMediaLoader(@NonNull Context context,
|
||||
long threadId,
|
||||
@NonNull MediaType mediaType,
|
||||
@NonNull MediaDatabase.Sorting sorting)
|
||||
@NonNull MediaTable.Sorting sorting)
|
||||
{
|
||||
super(context);
|
||||
this.threadId = threadId;
|
||||
@@ -33,8 +33,8 @@ public final class ThreadMediaLoader extends MediaLoader {
|
||||
static Cursor createThreadMediaCursor(@NonNull Context context,
|
||||
long threadId,
|
||||
@NonNull MediaType mediaType,
|
||||
@NonNull MediaDatabase.Sorting sorting) {
|
||||
MediaDatabase mediaDatabase = SignalDatabase.media();
|
||||
@NonNull MediaTable.Sorting sorting) {
|
||||
MediaTable mediaDatabase = SignalDatabase.media();
|
||||
|
||||
switch (mediaType) {
|
||||
case GALLERY : return mediaDatabase.getGalleryMediaForThread(threadId, sorting);
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.signal.core.util.CursorUtil
|
||||
import org.signal.core.util.SqlUtil
|
||||
import org.thoughtcrime.securesms.avatar.Avatar
|
||||
import org.thoughtcrime.securesms.avatar.Avatars
|
||||
import org.thoughtcrime.securesms.database.Database
|
||||
import org.thoughtcrime.securesms.database.DatabaseTable
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.CustomAvatar
|
||||
import org.thoughtcrime.securesms.groups.GroupId
|
||||
@@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.groups.GroupId
|
||||
/**
|
||||
* Database which manages the record keeping for custom created avatars.
|
||||
*/
|
||||
class AvatarPickerDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
|
||||
class AvatarPickerDatabase(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) {
|
||||
|
||||
companion object {
|
||||
const val TABLE_NAME = "avatar_picker"
|
||||
|
||||
@@ -23,7 +23,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsTable;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
|
||||
/**
|
||||
@@ -72,7 +72,7 @@ public abstract class DisplayRecord {
|
||||
return
|
||||
MmsSmsColumns.Types.isFailedMessageType(type) ||
|
||||
MmsSmsColumns.Types.isPendingSecureSmsFallbackType(type) ||
|
||||
deliveryStatus >= SmsDatabase.Status.STATUS_FAILED;
|
||||
deliveryStatus >= SmsTable.Status.STATUS_FAILED;
|
||||
}
|
||||
|
||||
public boolean isPending() {
|
||||
@@ -113,23 +113,23 @@ public abstract class DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isKeyExchange() {
|
||||
return SmsDatabase.Types.isKeyExchangeType(type);
|
||||
return SmsTable.Types.isKeyExchangeType(type);
|
||||
}
|
||||
|
||||
public boolean isEndSession() {
|
||||
return SmsDatabase.Types.isEndSessionType(type);
|
||||
return SmsTable.Types.isEndSessionType(type);
|
||||
}
|
||||
|
||||
public boolean isGroupUpdate() {
|
||||
return SmsDatabase.Types.isGroupUpdate(type);
|
||||
return SmsTable.Types.isGroupUpdate(type);
|
||||
}
|
||||
|
||||
public boolean isGroupV2() {
|
||||
return SmsDatabase.Types.isGroupV2(type);
|
||||
return SmsTable.Types.isGroupV2(type);
|
||||
}
|
||||
|
||||
public boolean isGroupQuit() {
|
||||
return SmsDatabase.Types.isGroupQuit(type);
|
||||
return SmsTable.Types.isGroupQuit(type);
|
||||
}
|
||||
|
||||
public boolean isGroupAction() {
|
||||
@@ -137,55 +137,55 @@ public abstract class DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isExpirationTimerUpdate() {
|
||||
return SmsDatabase.Types.isExpirationTimerUpdate(type);
|
||||
return SmsTable.Types.isExpirationTimerUpdate(type);
|
||||
}
|
||||
|
||||
public boolean isCallLog() {
|
||||
return SmsDatabase.Types.isCallLog(type);
|
||||
return SmsTable.Types.isCallLog(type);
|
||||
}
|
||||
|
||||
public boolean isJoined() {
|
||||
return SmsDatabase.Types.isJoinedType(type);
|
||||
return SmsTable.Types.isJoinedType(type);
|
||||
}
|
||||
|
||||
public boolean isIncomingAudioCall() {
|
||||
return SmsDatabase.Types.isIncomingAudioCall(type);
|
||||
return SmsTable.Types.isIncomingAudioCall(type);
|
||||
}
|
||||
|
||||
public boolean isIncomingVideoCall() {
|
||||
return SmsDatabase.Types.isIncomingVideoCall(type);
|
||||
return SmsTable.Types.isIncomingVideoCall(type);
|
||||
}
|
||||
|
||||
public boolean isOutgoingAudioCall() {
|
||||
return SmsDatabase.Types.isOutgoingAudioCall(type);
|
||||
return SmsTable.Types.isOutgoingAudioCall(type);
|
||||
}
|
||||
|
||||
public boolean isOutgoingVideoCall() {
|
||||
return SmsDatabase.Types.isOutgoingVideoCall(type);
|
||||
return SmsTable.Types.isOutgoingVideoCall(type);
|
||||
}
|
||||
|
||||
public final boolean isMissedAudioCall() {
|
||||
return SmsDatabase.Types.isMissedAudioCall(type);
|
||||
return SmsTable.Types.isMissedAudioCall(type);
|
||||
}
|
||||
|
||||
public final boolean isMissedVideoCall() {
|
||||
return SmsDatabase.Types.isMissedVideoCall(type);
|
||||
return SmsTable.Types.isMissedVideoCall(type);
|
||||
}
|
||||
|
||||
public final boolean isGroupCall() {
|
||||
return SmsDatabase.Types.isGroupCall(type);
|
||||
return SmsTable.Types.isGroupCall(type);
|
||||
}
|
||||
|
||||
public boolean isVerificationStatusChange() {
|
||||
return SmsDatabase.Types.isIdentityDefault(type) || SmsDatabase.Types.isIdentityVerified(type);
|
||||
return SmsTable.Types.isIdentityDefault(type) || SmsTable.Types.isIdentityVerified(type);
|
||||
}
|
||||
|
||||
public boolean isProfileChange() {
|
||||
return SmsDatabase.Types.isProfileChange(type);
|
||||
return SmsTable.Types.isProfileChange(type);
|
||||
}
|
||||
|
||||
public boolean isChangeNumber() {
|
||||
return SmsDatabase.Types.isChangeNumber(type);
|
||||
return SmsTable.Types.isChangeNumber(type);
|
||||
}
|
||||
|
||||
public boolean isBoostRequest() {
|
||||
@@ -216,8 +216,8 @@ public abstract class DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isDelivered() {
|
||||
return (deliveryStatus >= SmsDatabase.Status.STATUS_COMPLETE &&
|
||||
deliveryStatus < SmsDatabase.Status.STATUS_PENDING) || deliveryReceiptCount > 0;
|
||||
return (deliveryStatus >= SmsTable.Status.STATUS_COMPLETE &&
|
||||
deliveryStatus < SmsTable.Status.STATUS_PENDING) || deliveryReceiptCount > 0;
|
||||
}
|
||||
|
||||
public boolean isRemoteViewed() {
|
||||
@@ -229,7 +229,7 @@ public abstract class DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isPendingInsecureSmsFallback() {
|
||||
return SmsDatabase.Types.isPendingInsecureSmsFallbackType(type);
|
||||
return SmsTable.Types.isPendingInsecureSmsFallbackType(type);
|
||||
}
|
||||
|
||||
public boolean isPaymentNotification() {
|
||||
|
||||
@@ -4,7 +4,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
import org.whispersystems.signalservice.api.push.DistributionId
|
||||
|
||||
/**
|
||||
* Represents an entry in the [org.thoughtcrime.securesms.database.DistributionListDatabase].
|
||||
* Represents an entry in the [org.thoughtcrime.securesms.database.DistributionListTables].
|
||||
*/
|
||||
data class DistributionListRecord(
|
||||
val id: DistributionListId,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package org.thoughtcrime.securesms.database.model
|
||||
|
||||
import org.signal.libsignal.protocol.IdentityKey
|
||||
import org.thoughtcrime.securesms.database.IdentityDatabase
|
||||
import org.thoughtcrime.securesms.database.IdentityTable
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
|
||||
data class IdentityRecord(
|
||||
val recipientId: RecipientId,
|
||||
val identityKey: IdentityKey,
|
||||
val verifiedStatus: IdentityDatabase.VerifiedStatus,
|
||||
val verifiedStatus: IdentityTable.VerifiedStatus,
|
||||
@get:JvmName("isFirstUse")
|
||||
val firstUse: Boolean,
|
||||
val timestamp: Long,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package org.thoughtcrime.securesms.database.model
|
||||
|
||||
import org.signal.libsignal.protocol.IdentityKey
|
||||
import org.thoughtcrime.securesms.database.IdentityDatabase
|
||||
import org.thoughtcrime.securesms.database.IdentityTable
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
|
||||
data class IdentityStoreRecord(
|
||||
val addressName: String,
|
||||
val identityKey: IdentityKey,
|
||||
val verifiedStatus: IdentityDatabase.VerifiedStatus,
|
||||
val verifiedStatus: IdentityTable.VerifiedStatus,
|
||||
val firstUse: Boolean,
|
||||
val timestamp: Long,
|
||||
val nonblockingApproval: Boolean
|
||||
|
||||
@@ -29,8 +29,8 @@ import org.thoughtcrime.securesms.attachments.Attachment;
|
||||
import org.thoughtcrime.securesms.attachments.AttachmentId;
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||
import org.thoughtcrime.securesms.contactshare.Contact;
|
||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase.Status;
|
||||
import org.thoughtcrime.securesms.database.MmsTable;
|
||||
import org.thoughtcrime.securesms.database.SmsTable.Status;
|
||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||
@@ -125,11 +125,11 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
|
||||
@Override
|
||||
@WorkerThread
|
||||
public SpannableString getDisplayBody(@NonNull Context context) {
|
||||
if (MmsDatabase.Types.isChatSessionRefresh(type)) {
|
||||
if (MmsTable.Types.isChatSessionRefresh(type)) {
|
||||
return emphasisAdded(context.getString(R.string.MmsMessageRecord_bad_encrypted_mms_message));
|
||||
} else if (MmsDatabase.Types.isDuplicateMessageType(type)) {
|
||||
} else if (MmsTable.Types.isDuplicateMessageType(type)) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_duplicate_message));
|
||||
} else if (MmsDatabase.Types.isNoRemoteSessionType(type)) {
|
||||
} else if (MmsTable.Types.isNoRemoteSessionType(type)) {
|
||||
return emphasisAdded(context.getString(R.string.MmsMessageRecord_mms_message_encrypted_for_non_existing_session));
|
||||
} else if (isLegacyMessage()) {
|
||||
return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported));
|
||||
@@ -189,7 +189,7 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
|
||||
Quote quote = updateQuote(context, getQuote(), attachments);
|
||||
|
||||
List<DatabaseAttachment> slideAttachments = attachments.stream().filter(a -> !contactAttachments.contains(a)).filter(a -> !linkPreviewAttachments.contains(a)).collect(Collectors.toList());
|
||||
SlideDeck slideDeck = MmsDatabase.Reader.buildSlideDeck(context, slideAttachments);
|
||||
SlideDeck slideDeck = MmsTable.Reader.buildSlideDeck(context, slideAttachments);
|
||||
|
||||
return new MediaMmsMessageRecord(getId(), getRecipient(), getIndividualRecipient(), getRecipientDeviceId(), getDateSent(), getDateReceived(), getServerTimestamp(), getDeliveryReceiptCount(), getThreadId(), getBody(), slideDeck,
|
||||
getPartCount(), getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(),
|
||||
|
||||
@@ -5,7 +5,7 @@ import org.whispersystems.signalservice.api.crypto.ContentHint
|
||||
import org.whispersystems.signalservice.internal.push.SignalServiceProtos
|
||||
|
||||
/**
|
||||
* Model class for reading from the [org.thoughtcrime.securesms.database.MessageSendLogDatabase].
|
||||
* Model class for reading from the [org.thoughtcrime.securesms.database.MessageSendLogTables].
|
||||
*/
|
||||
data class MessageLogEntry(
|
||||
val recipientId: RecipientId,
|
||||
|
||||
@@ -42,7 +42,7 @@ import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
|
||||
import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser;
|
||||
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsTable;
|
||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||
@@ -494,7 +494,7 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isPush() {
|
||||
return SmsDatabase.Types.isPushType(type) && !SmsDatabase.Types.isForcedSms(type);
|
||||
return SmsTable.Types.isPushType(type) && !SmsTable.Types.isForcedSms(type);
|
||||
}
|
||||
|
||||
public long getTimestamp() {
|
||||
@@ -509,15 +509,15 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isForcedSms() {
|
||||
return SmsDatabase.Types.isForcedSms(type);
|
||||
return SmsTable.Types.isForcedSms(type);
|
||||
}
|
||||
|
||||
public boolean isIdentityVerified() {
|
||||
return SmsDatabase.Types.isIdentityVerified(type);
|
||||
return SmsTable.Types.isIdentityVerified(type);
|
||||
}
|
||||
|
||||
public boolean isIdentityDefault() {
|
||||
return SmsDatabase.Types.isIdentityDefault(type);
|
||||
return SmsTable.Types.isIdentityDefault(type);
|
||||
}
|
||||
|
||||
public boolean isIdentityMismatchFailure() {
|
||||
@@ -525,23 +525,23 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isBundleKeyExchange() {
|
||||
return SmsDatabase.Types.isBundleKeyExchange(type);
|
||||
return SmsTable.Types.isBundleKeyExchange(type);
|
||||
}
|
||||
|
||||
public boolean isContentBundleKeyExchange() {
|
||||
return SmsDatabase.Types.isContentBundleKeyExchange(type);
|
||||
return SmsTable.Types.isContentBundleKeyExchange(type);
|
||||
}
|
||||
|
||||
public boolean isRateLimited() {
|
||||
return SmsDatabase.Types.isRateLimited(type);
|
||||
return SmsTable.Types.isRateLimited(type);
|
||||
}
|
||||
|
||||
public boolean isIdentityUpdate() {
|
||||
return SmsDatabase.Types.isIdentityUpdate(type);
|
||||
return SmsTable.Types.isIdentityUpdate(type);
|
||||
}
|
||||
|
||||
public boolean isCorruptedKeyExchange() {
|
||||
return SmsDatabase.Types.isCorruptedKeyExchange(type);
|
||||
return SmsTable.Types.isCorruptedKeyExchange(type);
|
||||
}
|
||||
|
||||
public boolean isBadDecryptType() {
|
||||
@@ -557,11 +557,11 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||
}
|
||||
|
||||
public boolean isInvalidVersionKeyExchange() {
|
||||
return SmsDatabase.Types.isInvalidVersionKeyExchange(type);
|
||||
return SmsTable.Types.isInvalidVersionKeyExchange(type);
|
||||
}
|
||||
|
||||
public boolean isGroupV1MigrationEvent() {
|
||||
return SmsDatabase.Types.isGroupV1MigrationEvent(type);
|
||||
return SmsTable.Types.isGroupV1MigrationEvent(type);
|
||||
}
|
||||
|
||||
public @NonNull GroupMigrationMembershipChange getGroupV1MigrationMembershipChanges() {
|
||||
|
||||
@@ -23,8 +23,8 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase.Status;
|
||||
import org.thoughtcrime.securesms.database.MmsTable;
|
||||
import org.thoughtcrime.securesms.database.SmsTable.Status;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge;
|
||||
import org.thoughtcrime.securesms.mms.SlideDeck;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
@@ -117,9 +117,9 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord {
|
||||
|
||||
@Override
|
||||
public SpannableString getDisplayBody(@NonNull Context context) {
|
||||
if (status == MmsDatabase.Status.DOWNLOAD_INITIALIZED) {
|
||||
if (status == MmsTable.Status.DOWNLOAD_INITIALIZED) {
|
||||
return emphasisAdded(context.getString(R.string.NotificationMmsMessageRecord_multimedia_message));
|
||||
} else if (status == MmsDatabase.Status.DOWNLOAD_CONNECTING) {
|
||||
} else if (status == MmsTable.Status.DOWNLOAD_CONNECTING) {
|
||||
return emphasisAdded(context.getString(R.string.NotificationMmsMessageRecord_downloading_mms_message));
|
||||
} else {
|
||||
return emphasisAdded(context.getString(R.string.NotificationMmsMessageRecord_error_downloading_mms_message));
|
||||
|
||||
@@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.database.model
|
||||
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||
|
||||
/** A model for [org.thoughtcrime.securesms.database.PendingRetryReceiptDatabase] */
|
||||
/** A model for [org.thoughtcrime.securesms.database.PendingRetryReceiptTable] */
|
||||
data class PendingRetryReceiptModel(
|
||||
val id: Long,
|
||||
val author: RecipientId,
|
||||
|
||||
@@ -6,13 +6,13 @@ import org.signal.libsignal.zkgroup.profiles.ExpiringProfileKeyCredential
|
||||
import org.thoughtcrime.securesms.badges.models.Badge
|
||||
import org.thoughtcrime.securesms.conversation.colors.AvatarColor
|
||||
import org.thoughtcrime.securesms.conversation.colors.ChatColors
|
||||
import org.thoughtcrime.securesms.database.IdentityDatabase.VerifiedStatus
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.InsightsBannerTier
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.MentionSetting
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.RegisteredState
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.UnidentifiedAccessMode
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.VibrateState
|
||||
import org.thoughtcrime.securesms.database.IdentityTable.VerifiedStatus
|
||||
import org.thoughtcrime.securesms.database.RecipientTable
|
||||
import org.thoughtcrime.securesms.database.RecipientTable.InsightsBannerTier
|
||||
import org.thoughtcrime.securesms.database.RecipientTable.MentionSetting
|
||||
import org.thoughtcrime.securesms.database.RecipientTable.RegisteredState
|
||||
import org.thoughtcrime.securesms.database.RecipientTable.UnidentifiedAccessMode
|
||||
import org.thoughtcrime.securesms.database.RecipientTable.VibrateState
|
||||
import org.thoughtcrime.securesms.groups.GroupId
|
||||
import org.thoughtcrime.securesms.profiles.ProfileName
|
||||
import org.thoughtcrime.securesms.recipients.Recipient
|
||||
@@ -23,7 +23,7 @@ import org.whispersystems.signalservice.api.push.ServiceId
|
||||
import java.util.Optional
|
||||
|
||||
/**
|
||||
* Database model for [RecipientDatabase].
|
||||
* Database model for [RecipientTable].
|
||||
*/
|
||||
data class RecipientRecord(
|
||||
val id: RecipientId,
|
||||
@@ -34,7 +34,7 @@ data class RecipientRecord(
|
||||
val email: String?,
|
||||
val groupId: GroupId?,
|
||||
val distributionListId: DistributionListId?,
|
||||
val groupType: RecipientDatabase.GroupType,
|
||||
val groupType: RecipientTable.GroupType,
|
||||
val isBlocked: Boolean,
|
||||
val muteUntil: Long,
|
||||
val messageVibrateState: VibrateState,
|
||||
|
||||
@@ -25,7 +25,7 @@ import androidx.annotation.WorkerThread;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsTable;
|
||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
|
||||
@@ -68,7 +68,7 @@ public class SmsMessageRecord extends MessageRecord {
|
||||
@Override
|
||||
@WorkerThread
|
||||
public SpannableString getDisplayBody(@NonNull Context context) {
|
||||
if (SmsDatabase.Types.isChatSessionRefresh(type)) {
|
||||
if (SmsTable.Types.isChatSessionRefresh(type)) {
|
||||
return emphasisAdded(context.getString(R.string.MessageRecord_chat_session_refreshed));
|
||||
} else if (isCorruptedKeyExchange()) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_received_corrupted_key_exchange_message));
|
||||
@@ -82,17 +82,17 @@ public class SmsMessageRecord extends MessageRecord {
|
||||
return new SpannableString("");
|
||||
} else if (isKeyExchange() && !isOutgoing()) {
|
||||
return emphasisAdded(context.getString(R.string.ConversationItem_received_key_exchange_message_tap_to_process));
|
||||
} else if (SmsDatabase.Types.isDuplicateMessageType(type)) {
|
||||
} else if (SmsTable.Types.isDuplicateMessageType(type)) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_duplicate_message));
|
||||
} else if (SmsDatabase.Types.isNoRemoteSessionType(type)) {
|
||||
} else if (SmsTable.Types.isNoRemoteSessionType(type)) {
|
||||
return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session));
|
||||
} else if (isEndSession() && isOutgoing()) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset));
|
||||
} else if (isEndSession()) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset_s, getIndividualRecipient().getDisplayName(context)));
|
||||
} else if (SmsDatabase.Types.isUnsupportedMessageType(type)) {
|
||||
} else if (SmsTable.Types.isUnsupportedMessageType(type)) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_this_message_could_not_be_processed_because_it_was_sent_from_a_newer_version));
|
||||
} else if (SmsDatabase.Types.isInvalidMessageType(type)) {
|
||||
} else if (SmsTable.Types.isInvalidMessageType(type)) {
|
||||
return emphasisAdded(context.getString(R.string.SmsMessageRecord_error_handling_incoming_message));
|
||||
} else {
|
||||
return super.getDisplayBody(context);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package org.thoughtcrime.securesms.database.model;
|
||||
|
||||
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.SmsTable;
|
||||
|
||||
final class StatusUtil {
|
||||
private StatusUtil() {}
|
||||
|
||||
static boolean isDelivered(long deliveryStatus, int deliveryReceiptCount) {
|
||||
return (deliveryStatus >= SmsDatabase.Status.STATUS_COMPLETE &&
|
||||
deliveryStatus < SmsDatabase.Status.STATUS_PENDING) || deliveryReceiptCount > 0;
|
||||
return (deliveryStatus >= SmsTable.Status.STATUS_COMPLETE &&
|
||||
deliveryStatus < SmsTable.Status.STATUS_PENDING) || deliveryReceiptCount > 0;
|
||||
}
|
||||
|
||||
static boolean isPending(long type) {
|
||||
@@ -20,10 +20,10 @@ final class StatusUtil {
|
||||
static boolean isFailed(long type, long deliveryStatus) {
|
||||
return MmsSmsColumns.Types.isFailedMessageType(type) ||
|
||||
MmsSmsColumns.Types.isPendingSecureSmsFallbackType(type) ||
|
||||
deliveryStatus >= SmsDatabase.Status.STATUS_FAILED;
|
||||
deliveryStatus >= SmsTable.Status.STATUS_FAILED;
|
||||
}
|
||||
|
||||
static boolean isVerificationStatusChange(long type) {
|
||||
return SmsDatabase.Types.isIdentityDefault(type) || SmsDatabase.Types.isIdentityVerified(type);
|
||||
return SmsTable.Types.isIdentityDefault(type) || SmsTable.Types.isIdentityVerified(type);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,13 @@ import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.thoughtcrime.securesms.database.StickerTable;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Represents a record for a sticker pack in the {@link org.thoughtcrime.securesms.database.StickerDatabase}.
|
||||
* Represents a record for a sticker pack in the {@link StickerTable}.
|
||||
*/
|
||||
public final class StickerPackRecord {
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.net.Uri;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.database.StickerTable;
|
||||
import org.thoughtcrime.securesms.mms.PartAuthority;
|
||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -12,7 +13,7 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Represents a record for a sticker pack in the {@link org.thoughtcrime.securesms.database.StickerDatabase}.
|
||||
* Represents a record for a sticker pack in the {@link StickerTable}.
|
||||
*/
|
||||
public final class StickerRecord {
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||
import org.thoughtcrime.securesms.database.ThreadDatabase.Extra;
|
||||
import org.thoughtcrime.securesms.database.SmsTable;
|
||||
import org.thoughtcrime.securesms.database.ThreadTable;
|
||||
import org.thoughtcrime.securesms.database.ThreadTable.Extra;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
@@ -33,7 +33,7 @@ import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Represents an entry in the {@link org.thoughtcrime.securesms.database.ThreadDatabase}.
|
||||
* Represents an entry in the {@link org.thoughtcrime.securesms.database.ThreadTable}.
|
||||
*/
|
||||
public final class ThreadRecord {
|
||||
|
||||
@@ -146,11 +146,11 @@ public final class ThreadRecord {
|
||||
}
|
||||
|
||||
public boolean isOutgoingAudioCall() {
|
||||
return SmsDatabase.Types.isOutgoingAudioCall(type);
|
||||
return SmsTable.Types.isOutgoingAudioCall(type);
|
||||
}
|
||||
|
||||
public boolean isOutgoingVideoCall() {
|
||||
return SmsDatabase.Types.isOutgoingVideoCall(type);
|
||||
return SmsTable.Types.isOutgoingVideoCall(type);
|
||||
}
|
||||
|
||||
public boolean isVerificationStatusChange() {
|
||||
@@ -170,7 +170,7 @@ public final class ThreadRecord {
|
||||
}
|
||||
|
||||
public boolean isPendingInsecureSmsFallback() {
|
||||
return SmsDatabase.Types.isPendingInsecureSmsFallbackType(type);
|
||||
return SmsTable.Types.isPendingInsecureSmsFallbackType(type);
|
||||
}
|
||||
|
||||
public boolean isDelivered() {
|
||||
@@ -396,7 +396,7 @@ public final class ThreadRecord {
|
||||
}
|
||||
|
||||
public ThreadRecord build() {
|
||||
if (distributionType == ThreadDatabase.DistributionTypes.CONVERSATION) {
|
||||
if (distributionType == ThreadTable.DistributionTypes.CONVERSATION) {
|
||||
Preconditions.checkArgument(threadId > 0);
|
||||
Preconditions.checkNotNull(body);
|
||||
Preconditions.checkNotNull(recipient);
|
||||
|
||||
Reference in New Issue
Block a user