Restore pinned chats on archive undo.

fork-5.53.8
Alan Evans 2021-01-27 11:17:54 -04:00
rodzic 7cac0c9a7c
commit b5237848e9
2 zmienionych plików z 71 dodań i 13 usunięć

Wyświetl plik

@ -1026,24 +1026,34 @@ public class ConversationListFragment extends MainFragment implements ActionMode
Snackbar.LENGTH_LONG, Snackbar.LENGTH_LONG,
false) false)
{ {
private final ThreadDatabase threadDatabase= DatabaseFactory.getThreadDatabase(getActivity());
private List<Long> pinnedThreadIds;
@Override @Override
protected void executeAction(@Nullable Long parameter) { protected void executeAction(@Nullable Long parameter) {
DatabaseFactory.getThreadDatabase(getActivity()).archiveConversation(threadId); Context context = requireActivity();
pinnedThreadIds = threadDatabase.getPinnedThreadIds();
threadDatabase.archiveConversation(threadId);
if (unreadCount > 0) { if (unreadCount > 0) {
List<MarkedMessageInfo> messageIds = DatabaseFactory.getThreadDatabase(getActivity()).setRead(threadId, false); List<MarkedMessageInfo> messageIds = threadDatabase.setRead(threadId, false);
ApplicationDependencies.getMessageNotifier().updateNotification(getActivity()); ApplicationDependencies.getMessageNotifier().updateNotification(context);
MarkReadReceiver.process(getActivity(), messageIds); MarkReadReceiver.process(context, messageIds);
} }
} }
@Override @Override
protected void reverseAction(@Nullable Long parameter) { protected void reverseAction(@Nullable Long parameter) {
DatabaseFactory.getThreadDatabase(getActivity()).unarchiveConversation(threadId); Context context = requireActivity();
threadDatabase.unarchiveConversation(threadId);
threadDatabase.restorePins(pinnedThreadIds);
if (unreadCount > 0) { if (unreadCount > 0) {
DatabaseFactory.getThreadDatabase(getActivity()).incrementUnread(threadId, unreadCount); threadDatabase.incrementUnread(threadId, unreadCount);
ApplicationDependencies.getMessageNotifier().updateNotification(getActivity()); ApplicationDependencies.getMessageNotifier().updateNotification(context);
} }
} }
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, threadId); }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, threadId);

Wyświetl plik

@ -70,6 +70,7 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -797,13 +798,10 @@ public class ThreadDatabase extends Database {
* @return Pinned recipients, in order from top to bottom. * @return Pinned recipients, in order from top to bottom.
*/ */
public @NonNull List<RecipientId> getPinnedRecipientIds() { public @NonNull List<RecipientId> getPinnedRecipientIds() {
SQLiteDatabase db = databaseHelper.getReadableDatabase(); String[] projection = new String[]{ID, RECIPIENT_ID};
String[] projection = new String[]{RECIPIENT_ID};
String query = PINNED + " > ?";
String[] args = SqlUtil.buildArgs(0);
List<RecipientId> pinned = new LinkedList<>(); List<RecipientId> pinned = new LinkedList<>();
try (Cursor cursor = db.query(TABLE_NAME, projection, query, args, null, null, PINNED + " ASC")) { try (Cursor cursor = getPinned(projection)) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
pinned.add(RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID))); pinned.add(RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID)));
} }
@ -812,14 +810,64 @@ public class ThreadDatabase extends Database {
return pinned; return pinned;
} }
public void pinConversations(@NonNull Set<Long> threadIds) { /**
* @return Pinned thread ids, in order from top to bottom.
*/
public @NonNull List<Long> getPinnedThreadIds() {
String[] projection = new String[]{ID};
List<Long> pinned = new LinkedList<>();
try (Cursor cursor = getPinned(projection)) {
while (cursor.moveToNext()) {
pinned.add(CursorUtil.requireLong(cursor, ID));
}
}
return pinned;
}
/**
* @return Pinned recipients, in order from top to bottom.
*/
private @NonNull Cursor getPinned(String[] projection) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
String query = PINNED + " > ?";
String[] args = SqlUtil.buildArgs(0);
return db.query(TABLE_NAME, projection, query, args, null, null, PINNED + " ASC");
}
public void restorePins(@NonNull Collection<Long> threadIds) {
Log.d(TAG, "Restoring pinned threads " + StringUtil.join(threadIds, ","));
pinConversations(threadIds, true);
}
public void pinConversations(@NonNull Collection<Long> threadIds) {
Log.d(TAG, "Pinning threads " + StringUtil.join(threadIds, ","));
pinConversations(threadIds, false);
}
private void pinConversations(@NonNull Collection<Long> threadIds, boolean clearFirst) {
SQLiteDatabase db = databaseHelper.getWritableDatabase(); SQLiteDatabase db = databaseHelper.getWritableDatabase();
threadIds = new LinkedHashSet<>(threadIds);
try { try {
db.beginTransaction(); db.beginTransaction();
if (clearFirst) {
ContentValues contentValues = new ContentValues(1);
contentValues.put(PINNED, 0);
String query = PINNED + " > ?";
String[] args = SqlUtil.buildArgs(0);
db.update(TABLE_NAME, contentValues, query, args);
}
int pinnedCount = getPinnedConversationListCount(); int pinnedCount = getPinnedConversationListCount();
if (pinnedCount > 0 && clearFirst) {
throw new AssertionError();
}
for (long threadId : threadIds) { for (long threadId : threadIds) {
ContentValues contentValues = new ContentValues(1); ContentValues contentValues = new ContentValues(1);
contentValues.put(PINNED, ++pinnedCount); contentValues.put(PINNED, ++pinnedCount);