Fix display of quotes in 'All Media' view.

master
Greyson Parrelli 2020-06-26 12:33:08 -07:00 committed by GitHub
parent 42e2576813
commit ad84997ce0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 6 deletions

View File

@ -122,7 +122,7 @@ public class AttachmentDatabase extends Database {
static final String WIDTH = "width";
static final String HEIGHT = "height";
static final String CAPTION = "caption";
private static final String DATA_HASH = "data_hash";
static final String DATA_HASH = "data_hash";
static final String VISUAL_HASH = "blur_hash";
static final String TRANSFORM_PROPERTIES = "transform_properties";
static final String DISPLAY_ORDER = "display_order";
@ -496,14 +496,20 @@ public class AttachmentDatabase extends Database {
database.beginTransaction();
try {
for (AttachmentId weakReference : removableWeakReferences) {
Log.i(TAG, String.format("[deleteAttachmentOnDisk] Deleting weak reference for %s %s", data, weakReference));
deletedCount += database.delete(TABLE_NAME, PART_ID_WHERE, weakReference.toStrings());
Log.i(TAG, String.format("[deleteAttachmentOnDisk] Clearing weak reference for %s %s", data, weakReference));
ContentValues values = new ContentValues();
values.putNull(DATA);
values.putNull(DATA_RANDOM);
values.putNull(DATA_HASH);
values.putNull(THUMBNAIL);
values.putNull(THUMBNAIL_RANDOM);
deletedCount += database.update(TABLE_NAME, values, PART_ID_WHERE, weakReference.toStrings());
}
database.setTransactionSuccessful();
} finally {
database.endTransaction();
}
String logMessage = String.format(Locale.US, "[deleteAttachmentOnDisk] Deleted %d/%d weak references for %s", deletedCount, removableWeakReferences.size(), data);
String logMessage = String.format(Locale.US, "[deleteAttachmentOnDisk] Cleared %d/%d weak references for %s", deletedCount, removableWeakReferences.size(), data);
if (deletedCount != removableWeakReferences.size()) {
Log.w(TAG, logMessage);
} else {

View File

@ -65,7 +65,7 @@ public class MediaDatabase extends Database {
+ " WHERE " + MmsDatabase.THREAD_ID + " __EQUALITY__ ?) AND (%s) AND "
+ MmsDatabase.VIEW_ONCE + " = 0 AND "
+ AttachmentDatabase.DATA + " IS NOT NULL AND "
+ AttachmentDatabase.QUOTE + " = 0 AND "
+ "(" + AttachmentDatabase.QUOTE + " = 0 OR (" + AttachmentDatabase.QUOTE + " = 1 AND " + AttachmentDatabase.DATA_HASH + " IS NULL)) AND "
+ AttachmentDatabase.STICKER_PACK_ID + " IS NULL ";
private static final String UNIQUE_MEDIA_QUERY = "SELECT "

View File

@ -137,8 +137,9 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
private static final int LAST_SCROLLED = 62;
private static final int LAST_PROFILE_FETCH = 63;
private static final int SERVER_DELIVERED_TIMESTAMP = 64;
private static final int QUOTE_CLEANUP = 65;
private static final int DATABASE_VERSION = 64;
private static final int DATABASE_VERSION = 65;
private static final String DATABASE_NAME = "signal.db";
private final Context context;
@ -921,6 +922,39 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE push ADD COLUMN server_delivered_timestamp INTEGER DEFAULT 0");
}
if (oldVersion < QUOTE_CLEANUP) {
String query = "SELECT _data " +
"FROM (SELECT _data, MIN(quote) AS all_quotes " +
"FROM part " +
"WHERE _data NOT NULL AND data_hash NOT NULL " +
"GROUP BY _data) " +
"WHERE all_quotes = 1";
int count = 0;
try (Cursor cursor = db.rawQuery(query, null)) {
while (cursor != null && cursor.moveToNext()) {
String data = cursor.getString(cursor.getColumnIndexOrThrow("_data"));
if (new File(data).delete()) {
ContentValues values = new ContentValues();
values.putNull("_data");
values.putNull("data_random");
values.putNull("thumbnail");
values.putNull("thumbnail_random");
values.putNull("data_hash");
db.update("part", values, "_data = ?", new String[] { data });
count++;
} else {
Log.w(TAG, "[QuoteCleanup] Failed to delete " + data);
}
}
}
Log.i(TAG, "[QuoteCleanup] Cleaned up " + count + " quotes.");
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();