Add chat filter support behind a flag.

This commit is contained in:
Alex Hart
2022-11-08 15:09:21 -04:00
parent 3e2ecdaaa9
commit bba1315906
26 changed files with 681 additions and 237 deletions

View File

@@ -13,6 +13,7 @@ import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter;
import org.thoughtcrime.securesms.conversationlist.model.ConversationReader;
import org.thoughtcrime.securesms.database.DatabaseObserver;
import org.thoughtcrime.securesms.database.SignalDatabase;
@@ -22,6 +23,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -52,7 +54,7 @@ public class UnarchivedConversationListDataSourceTest {
when(SignalDatabase.threads()).thenReturn(threadDatabase);
when(ApplicationDependencies.getDatabaseObserver()).thenReturn(mock(DatabaseObserver.class));
testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(mock(Application.class));
testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(ConversationFilter.OFF);
}
@Test
@@ -65,13 +67,14 @@ public class UnarchivedConversationListDataSourceTest {
assertEquals(0, testSubject.getHeaderOffset());
assertFalse(testSubject.hasPinnedHeader());
assertFalse(testSubject.hasUnpinnedHeader());
assertFalse(testSubject.hasConversationFilterFooter());
assertFalse(testSubject.hasArchivedFooter());
}
@Test
public void givenArchivedConversations_whenIGetTotalCount_thenIExpectOne() {
// GIVEN
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
// WHEN
int result = testSubject.getTotalCount();
@@ -81,15 +84,16 @@ public class UnarchivedConversationListDataSourceTest {
assertEquals(0, testSubject.getHeaderOffset());
assertFalse(testSubject.hasPinnedHeader());
assertFalse(testSubject.hasUnpinnedHeader());
assertFalse(testSubject.hasConversationFilterFooter());
assertTrue(testSubject.hasArchivedFooter());
}
@Test
public void givenSinglePinnedAndArchivedConversations_whenIGetTotalCount_thenIExpectThree() {
// GIVEN
when(threadDatabase.getPinnedConversationListCount()).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
// WHEN
int result = testSubject.getTotalCount();
@@ -99,14 +103,15 @@ public class UnarchivedConversationListDataSourceTest {
assertEquals(1, testSubject.getHeaderOffset());
assertTrue(testSubject.hasPinnedHeader());
assertFalse(testSubject.hasUnpinnedHeader());
assertFalse(testSubject.hasConversationFilterFooter());
assertTrue(testSubject.hasArchivedFooter());
}
@Test
public void givenSingleUnpinnedAndArchivedConversations_whenIGetTotalCount_thenIExpectTwo() {
// GIVEN
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
// WHEN
int result = testSubject.getTotalCount();
@@ -116,14 +121,15 @@ public class UnarchivedConversationListDataSourceTest {
assertEquals(0, testSubject.getHeaderOffset());
assertFalse(testSubject.hasPinnedHeader());
assertFalse(testSubject.hasUnpinnedHeader());
assertFalse(testSubject.hasConversationFilterFooter());
assertTrue(testSubject.hasArchivedFooter());
}
@Test
public void givenSinglePinnedAndSingleUnpinned_whenIGetTotalCount_thenIExpectFour() {
// GIVEN
when(threadDatabase.getPinnedConversationListCount()).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(2);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(2);
// WHEN
int result = testSubject.getTotalCount();
@@ -133,6 +139,7 @@ public class UnarchivedConversationListDataSourceTest {
assertEquals(2, testSubject.getHeaderOffset());
assertTrue(testSubject.hasPinnedHeader());
assertTrue(testSubject.hasUnpinnedHeader());
assertFalse(testSubject.hasConversationFilterFooter());
assertFalse(testSubject.hasArchivedFooter());
}
@@ -145,8 +152,8 @@ public class UnarchivedConversationListDataSourceTest {
Cursor cursor = testSubject.getCursor(0, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(false, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100);
assertEquals(0, cursor.getCount());
}
@@ -154,15 +161,15 @@ public class UnarchivedConversationListDataSourceTest {
public void givenArchivedConversations_whenIGetCursor_thenIExpectOne() {
// GIVEN
setupThreadDatabaseCursors(0, 0);
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(0, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(false, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100);
assertEquals(1, cursor.getCount());
}
@@ -170,17 +177,17 @@ public class UnarchivedConversationListDataSourceTest {
public void givenSinglePinnedAndArchivedConversations_whenIGetCursor_thenIExpectThree() {
// GIVEN
setupThreadDatabaseCursors(1, 0);
when(threadDatabase.getPinnedConversationListCount()).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(0, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 0, 99);
verify(threadDatabase).getUnarchivedConversationList(false, 0, 98);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 99);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 98);
assertEquals(3, cursor.getCount());
}
@@ -188,16 +195,16 @@ public class UnarchivedConversationListDataSourceTest {
public void givenSingleUnpinnedAndArchivedConversations_whenIGetCursor_thenIExpectTwo() {
// GIVEN
setupThreadDatabaseCursors(0, 1);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(0, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(false, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 100);
assertEquals(2, cursor.getCount());
}
@@ -205,16 +212,16 @@ public class UnarchivedConversationListDataSourceTest {
public void givenSinglePinnedAndSingleUnpinned_whenIGetCursor_thenIExpectFour() {
// GIVEN
setupThreadDatabaseCursors(1, 1);
when(threadDatabase.getPinnedConversationListCount()).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(2);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(1);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(2);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(0, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 0, 99);
verify(threadDatabase).getUnarchivedConversationList(false, 0, 97);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 0, 99);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 0, 97);
assertEquals(4, cursor.getCount());
}
@@ -222,16 +229,16 @@ public class UnarchivedConversationListDataSourceTest {
public void givenLoadingSecondPage_whenIGetCursor_thenIExpectProperOffsetAndCursorCount() {
// GIVEN
setupThreadDatabaseCursors(0, 100);
when(threadDatabase.getPinnedConversationListCount()).thenReturn(4);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(104);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(4);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(104);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(50, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 50, 100);
verify(threadDatabase).getUnarchivedConversationList(false, 44, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 50, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 44, 100);
assertEquals(100, cursor.getCount());
}
@@ -239,23 +246,44 @@ public class UnarchivedConversationListDataSourceTest {
public void givenHasArchivedAndLoadingLastPage_whenIGetCursor_thenIExpectProperOffsetAndCursorCount() {
// GIVEN
setupThreadDatabaseCursors(0, 99);
when(threadDatabase.getPinnedConversationListCount()).thenReturn(4);
when(threadDatabase.getUnarchivedConversationListCount()).thenReturn(103);
when(threadDatabase.getArchivedConversationListCount()).thenReturn(12);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.OFF)).thenReturn(4);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.OFF)).thenReturn(103);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.OFF)).thenReturn(12);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(50, 100);
// THEN
verify(threadDatabase).getUnarchivedConversationList(true, 50, 100);
verify(threadDatabase).getUnarchivedConversationList(false, 44, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, true, 50, 100);
verify(threadDatabase).getUnarchivedConversationList(ConversationFilter.OFF, false, 44, 100);
assertEquals(100, cursor.getCount());
cursor.moveToLast();
assertEquals(0, cursor.getColumnIndex(ConversationReader.HEADER_COLUMN[0]));
}
@Test
public void givenHasNoArchivedAndIsFiltered_whenIGetCursor_thenIExpectConversationFilterFooter() {
// GIVEN
ConversationListDataSource.UnarchivedConversationListDataSource testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(ConversationFilter.UNREAD);
setupThreadDatabaseCursors(0, 3);
when(threadDatabase.getPinnedConversationListCount(ConversationFilter.UNREAD)).thenReturn(0);
when(threadDatabase.getUnarchivedConversationListCount(ConversationFilter.UNREAD)).thenReturn(3);
when(threadDatabase.getArchivedConversationListCount(ConversationFilter.UNREAD)).thenReturn(0);
testSubject.getTotalCount();
// WHEN
Cursor cursor = testSubject.getCursor(0, 5);
// THEN
assertEquals(4, cursor.getCount());
assertTrue(testSubject.hasConversationFilterFooter());
cursor.moveToLast();
assertEquals(0, cursor.getColumnIndex(ConversationReader.HEADER_COLUMN[0]));
}
private void setupThreadDatabaseCursors(int pinned, int unpinned) {
Cursor pinnedCursor = mock(Cursor.class);
@@ -264,7 +292,7 @@ public class UnarchivedConversationListDataSourceTest {
Cursor unpinnedCursor = mock(Cursor.class);
when(unpinnedCursor.getCount()).thenReturn(unpinned);
when(threadDatabase.getUnarchivedConversationList(eq(true), anyLong(), anyLong())).thenReturn(pinnedCursor);
when(threadDatabase.getUnarchivedConversationList(eq(false), anyLong(), anyLong())).thenReturn(unpinnedCursor);
when(threadDatabase.getUnarchivedConversationList(any(), eq(true), anyLong(), anyLong())).thenReturn(pinnedCursor);
when(threadDatabase.getUnarchivedConversationList(any(), eq(false), anyLong(), anyLong())).thenReturn(unpinnedCursor);
}
}