Support for a "new messages" divider in conversations

// FREEBIE
This commit is contained in:
Moxie Marlinspike
2017-02-13 22:35:47 -08:00
parent 0075940050
commit d9b42c4369
20 changed files with 278 additions and 33 deletions

View File

@@ -73,7 +73,8 @@ public class DatabaseFactory {
private static final int MIGRATED_CONVERSATION_LIST_STATUS_VERSION = 26;
private static final int INTRODUCED_SUBSCRIPTION_ID_VERSION = 27;
private static final int INTRODUCED_EXPIRE_MESSAGES_VERSION = 28;
private static final int DATABASE_VERSION = 28;
private static final int INTRODUCED_LAST_SEEN = 29;
private static final int DATABASE_VERSION = 29;
private static final String DATABASE_NAME = "messages.db";
private static final Object lock = new Object();
@@ -830,6 +831,10 @@ public class DatabaseFactory {
db.execSQL("ALTER TABLE thread ADD COLUMN expires_in INTEGER DEFAULT 0");
}
if (oldVersion < INTRODUCED_LAST_SEEN) {
db.execSQL("ALTER TABLE thread ADD COLUMN last_seen INTEGER DEFAULT 0");
}
db.setTransactionSuccessful();
db.endTransaction();
}

View File

@@ -69,6 +69,7 @@ public class ThreadDatabase extends Database {
public static final String STATUS = "status";
public static final String RECEIPT_COUNT = "delivery_receipt_count";
public static final String EXPIRES_IN = "expires_in";
public static final String LAST_SEEN = "last_seen";
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
ID + " INTEGER PRIMARY KEY, " + DATE + " INTEGER DEFAULT 0, " +
@@ -77,7 +78,8 @@ public class ThreadDatabase extends Database {
TYPE + " INTEGER DEFAULT 0, " + ERROR + " INTEGER DEFAULT 0, " +
SNIPPET_TYPE + " INTEGER DEFAULT 0, " + SNIPPET_URI + " TEXT DEFAULT NULL, " +
ARCHIVED + " INTEGER DEFAULT 0, " + STATUS + " INTEGER DEFAULT 0, " +
RECEIPT_COUNT + " INTEGER DEFAULT 0, " + EXPIRES_IN + " INTEGER DEFAULT 0);";
RECEIPT_COUNT + " INTEGER DEFAULT 0, " + EXPIRES_IN + " INTEGER DEFAULT 0, " +
LAST_SEEN + " INTEGER DEFAULT 0);";
public static final String[] CREATE_INDEXS = {
"CREATE INDEX IF NOT EXISTS thread_recipient_ids_index ON " + TABLE_NAME + " (" + RECIPIENT_IDS + ");",
@@ -391,6 +393,31 @@ public class ThreadDatabase extends Database {
notifyConversationListListeners();
}
public void setLastSeen(long threadId) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues(1);
contentValues.put(LAST_SEEN, System.currentTimeMillis());
db.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(threadId)});
notifyConversationListListeners();
}
public long getLastSeen(long threadId) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, new String[]{LAST_SEEN}, ID_WHERE, new String[]{String.valueOf(threadId)}, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
return cursor.getLong(0);
}
return -1;
} finally {
if (cursor != null) cursor.close();
}
}
public void deleteConversation(long threadId) {
DatabaseFactory.getSmsDatabase(context).deleteThread(threadId);
DatabaseFactory.getMmsDatabase(context).deleteThread(threadId);
@@ -582,11 +609,12 @@ public class ThreadDatabase extends Database {
int status = cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.STATUS));
int receiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.RECEIPT_COUNT));
long expiresIn = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.EXPIRES_IN));
long lastSeen = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.LAST_SEEN));
Uri snippetUri = getSnippetUri(cursor);
return new ThreadRecord(context, body, snippetUri, recipients, date, count, read == 1,
threadId, receiptCount, status, type, distributionType, archived,
expiresIn);
expiresIn, lastSeen);
}
private DisplayRecord.Body getPlaintextBody(Cursor cursor) {

View File

@@ -9,19 +9,29 @@ import org.thoughtcrime.securesms.util.AbstractCursorLoader;
public class ConversationLoader extends AbstractCursorLoader {
private final long threadId;
private long limit;
private long lastSeen;
public ConversationLoader(Context context, long threadId, long limit) {
public ConversationLoader(Context context, long threadId, long limit, long lastSeen) {
super(context);
this.threadId = threadId;
this.limit = limit;
this.limit = limit;
this.lastSeen = lastSeen;
}
public boolean hasLimit() {
return limit > 0;
}
public long getLastSeen() {
return lastSeen;
}
@Override
public Cursor getCursor() {
if (lastSeen == -1) {
this.lastSeen = DatabaseFactory.getThreadDatabase(context).getLastSeen(threadId);
}
return DatabaseFactory.getMmsSmsDatabase(context).getConversation(threadId, limit);
}
}

View File

@@ -48,11 +48,12 @@ public class ThreadRecord extends DisplayRecord {
private final int distributionType;
private final boolean archived;
private final long expiresIn;
private final long lastSeen;
public ThreadRecord(@NonNull Context context, @NonNull Body body, @Nullable Uri snippetUri,
@NonNull Recipients recipients, long date, long count, boolean read,
long threadId, int receiptCount, int status, long snippetType,
int distributionType, boolean archived, long expiresIn)
int distributionType, boolean archived, long expiresIn, long lastSeen)
{
super(context, body, recipients, date, date, threadId, status, receiptCount, snippetType);
this.context = context.getApplicationContext();
@@ -62,6 +63,7 @@ public class ThreadRecord extends DisplayRecord {
this.distributionType = distributionType;
this.archived = archived;
this.expiresIn = expiresIn;
this.lastSeen = lastSeen;
}
public @Nullable Uri getSnippetUri() {
@@ -147,4 +149,8 @@ public class ThreadRecord extends DisplayRecord {
public long getExpiresIn() {
return expiresIn;
}
public long getLastSeen() {
return lastSeen;
}
}