From 37f85d6deb6e9fa747511165e35e7a08e1d9f041 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 31 Jan 2020 10:26:12 -0500 Subject: [PATCH] Delete unused megaphones from the database. --- .../securesms/database/MegaphoneDatabase.java | 52 +++++++++++++++---- .../megaphone/MegaphoneRepository.java | 4 +- .../securesms/megaphone/Megaphones.java | 9 ++++ 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java index 947fe6a03e..ae7cfb5fdb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java @@ -10,17 +10,22 @@ import net.sqlcipher.database.SQLiteDatabase; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MegaphoneRecord; +import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.megaphone.Megaphones.Event; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * IMPORTANT: Writes should only be made through {@link org.thoughtcrime.securesms.megaphone.MegaphoneRepository}. */ public class MegaphoneDatabase extends Database { + private static final String TAG = Log.tag(MegaphoneDatabase.class); + private static final String TABLE_NAME = "megaphone"; private static final String ID = "_id"; @@ -59,19 +64,41 @@ public class MegaphoneDatabase extends Database { } } - public @NonNull List getAll() { + public @NonNull List getAllAndDeleteMissing() { + SQLiteDatabase db = databaseHelper.getWritableDatabase(); List records = new ArrayList<>(); - try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null)) { - while (cursor != null && cursor.moveToNext()) { - String event = cursor.getString(cursor.getColumnIndexOrThrow(EVENT)); - int seenCount = cursor.getInt(cursor.getColumnIndexOrThrow(SEEN_COUNT)); - long lastSeen = cursor.getLong(cursor.getColumnIndexOrThrow(LAST_SEEN)); - long firstVisible = cursor.getLong(cursor.getColumnIndexOrThrow(FIRST_VISIBLE)); - boolean finished = cursor.getInt(cursor.getColumnIndexOrThrow(FINISHED)) == 1; + db.beginTransaction(); + try { + Set missingKeys = new HashSet<>(); - records.add(new MegaphoneRecord(Event.fromKey(event), seenCount, lastSeen, firstVisible, finished)); + try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null)) { + while (cursor != null && cursor.moveToNext()) { + String event = cursor.getString(cursor.getColumnIndexOrThrow(EVENT)); + int seenCount = cursor.getInt(cursor.getColumnIndexOrThrow(SEEN_COUNT)); + long lastSeen = cursor.getLong(cursor.getColumnIndexOrThrow(LAST_SEEN)); + long firstVisible = cursor.getLong(cursor.getColumnIndexOrThrow(FIRST_VISIBLE)); + boolean finished = cursor.getInt(cursor.getColumnIndexOrThrow(FINISHED)) == 1; + + if (Event.hasKey(event)) { + records.add(new MegaphoneRecord(Event.fromKey(event), seenCount, lastSeen, firstVisible, finished)); + } else { + Log.w(TAG, "No in-app handing for event '" + event + "'! Deleting it from the database."); + missingKeys.add(event); + } + } } + + for (String missing : missingKeys) { + String query = EVENT + " = ?"; + String[] args = new String[]{missing}; + + databaseHelper.getWritableDatabase().delete(TABLE_NAME, query, args); + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); } return records; @@ -107,4 +134,11 @@ public class MegaphoneDatabase extends Database { databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args); } + + public void delete(@NonNull Event event) { + String query = EVENT + " = ?"; + String[] args = new String[]{event.getKey()}; + + databaseHelper.getWritableDatabase().delete(TABLE_NAME, query, args); + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java index c523c2b4c3..c10b806901 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java @@ -103,7 +103,7 @@ public class MegaphoneRepository { @WorkerThread private void init() { - List records = database.getAll(); + List records = database.getAllAndDeleteMissing(); Set events = Stream.of(records).map(MegaphoneRecord::getEvent).collect(Collectors.toSet()); Set missing = Stream.of(Megaphones.Event.values()).filterNot(events::contains).collect(Collectors.toSet()); @@ -120,7 +120,7 @@ public class MegaphoneRepository { @WorkerThread private void resetDatabaseCache() { databaseCache.clear(); - databaseCache.putAll(Stream.of(database.getAll()).collect(Collectors.toMap(MegaphoneRecord::getEvent, m -> m))); + databaseCache.putAll(Stream.of(database.getAllAndDeleteMissing()).collect(Collectors.toMap(MegaphoneRecord::getEvent, m -> m))); } public interface Callback { diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index a102087940..af50888e74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -170,5 +170,14 @@ public final class Megaphones { } throw new IllegalArgumentException("No event for key: " + key); } + + public static boolean hasKey(@NonNull String key) { + for (Event event : values()) { + if (event.getKey().equals(key)) { + return true; + } + } + return false; + } } }