mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-05-08 09:18:39 +01:00
Use custom config for chat folders.
This commit is contained in:
committed by
Greyson Parrelli
parent
cc5e3fc085
commit
fdeaf77fc0
@@ -6,6 +6,8 @@
|
|||||||
package org.thoughtcrime.securesms.database
|
package org.thoughtcrime.securesms.database
|
||||||
|
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockkStatic
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
@@ -15,6 +17,7 @@ import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFold
|
|||||||
import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter
|
import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.testing.SignalDatabaseRule
|
import org.thoughtcrime.securesms.testing.SignalDatabaseRule
|
||||||
|
import org.thoughtcrime.securesms.util.RemoteConfig
|
||||||
import org.whispersystems.signalservice.api.push.ServiceId.ACI
|
import org.whispersystems.signalservice.api.push.ServiceId.ACI
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
@@ -30,6 +33,10 @@ class ThreadTableTest_active {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
|
mockkStatic(RemoteConfig::class)
|
||||||
|
|
||||||
|
every { RemoteConfig.showChatFolders } returns true
|
||||||
|
|
||||||
recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ACI.from(UUID.randomUUID())))
|
recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ACI.from(UUID.randomUUID())))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.thoughtcrime.securesms.database
|
package org.thoughtcrime.securesms.database
|
||||||
|
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockkStatic
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
@@ -10,6 +12,7 @@ import org.thoughtcrime.securesms.components.settings.app.chats.folders.ChatFold
|
|||||||
import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter
|
import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.testing.SignalDatabaseRule
|
import org.thoughtcrime.securesms.testing.SignalDatabaseRule
|
||||||
|
import org.thoughtcrime.securesms.util.RemoteConfig
|
||||||
import org.whispersystems.signalservice.api.push.ServiceId.ACI
|
import org.whispersystems.signalservice.api.push.ServiceId.ACI
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
@@ -25,6 +28,10 @@ class ThreadTableTest_pinned {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
|
mockkStatic(RemoteConfig::class)
|
||||||
|
|
||||||
|
every { RemoteConfig.showChatFolders } returns true
|
||||||
|
|
||||||
recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ACI.from(UUID.randomUUID())))
|
recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ACI.from(UUID.randomUUID())))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.components.emoji.SimpleEmojiTextView;
|
|||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.util.ContextUtil;
|
import org.thoughtcrime.securesms.util.ContextUtil;
|
||||||
import org.thoughtcrime.securesms.util.DrawableUtil;
|
import org.thoughtcrime.securesms.util.DrawableUtil;
|
||||||
|
import org.thoughtcrime.securesms.util.RemoteConfig;
|
||||||
import org.thoughtcrime.securesms.util.SpanUtil;
|
import org.thoughtcrime.securesms.util.SpanUtil;
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||||
|
|
||||||
@@ -77,9 +78,9 @@ public class FromTextView extends SimpleEmojiTextView {
|
|||||||
|
|
||||||
setText(builder);
|
setText(builder);
|
||||||
|
|
||||||
if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(getBlocked(), null, null, null);
|
if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(getBlocked(), null, null, null);
|
||||||
else if (isPinned) setCompoundDrawablesRelativeWithIntrinsicBounds(getPinned(), null, null, null);
|
else if (RemoteConfig.getShowChatFolders() && isPinned) setCompoundDrawablesRelativeWithIntrinsicBounds(getPinned(), null, null, null);
|
||||||
else setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
|
else setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Drawable getBlocked() {
|
private Drawable getBlocked() {
|
||||||
|
|||||||
+1
-1
@@ -60,7 +60,7 @@ class ChatsSettingsFragment : DSLSettingsFragment(R.string.preferences_chats__ch
|
|||||||
|
|
||||||
dividerPref()
|
dividerPref()
|
||||||
|
|
||||||
if (RemoteConfig.internalUser) {
|
if (RemoteConfig.showChatFolders) {
|
||||||
sectionHeaderPref(R.string.ChatsSettingsFragment__chat_folders)
|
sectionHeaderPref(R.string.ChatsSettingsFragment__chat_folders)
|
||||||
|
|
||||||
clickPref(
|
clickPref(
|
||||||
|
|||||||
+45
-1
@@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.database.model.UpdateDescription;
|
|||||||
import org.thoughtcrime.securesms.dependencies.AppDependencies;
|
import org.thoughtcrime.securesms.dependencies.AppDependencies;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
|
import org.thoughtcrime.securesms.util.RemoteConfig;
|
||||||
import org.thoughtcrime.securesms.util.SignalTrace;
|
import org.thoughtcrime.securesms.util.SignalTrace;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -173,6 +174,7 @@ abstract class ConversationListDataSource implements PagedDataSource<Long, Conve
|
|||||||
private int totalCount;
|
private int totalCount;
|
||||||
private int pinnedCount;
|
private int pinnedCount;
|
||||||
private int archivedCount;
|
private int archivedCount;
|
||||||
|
private int unpinnedCount;
|
||||||
|
|
||||||
UnarchivedConversationListDataSource(@NonNull ChatFolderRecord chatFolder, @NonNull ConversationFilter conversationFilter, boolean showConversationFooterTip) {
|
UnarchivedConversationListDataSource(@NonNull ChatFolderRecord chatFolder, @NonNull ConversationFilter conversationFilter, boolean showConversationFooterTip) {
|
||||||
super(chatFolder, conversationFilter, showConversationFooterTip);
|
super(chatFolder, conversationFilter, showConversationFooterTip);
|
||||||
@@ -184,12 +186,21 @@ abstract class ConversationListDataSource implements PagedDataSource<Long, Conve
|
|||||||
|
|
||||||
pinnedCount = threadTable.getPinnedConversationListCount(conversationFilter, chatFolder);
|
pinnedCount = threadTable.getPinnedConversationListCount(conversationFilter, chatFolder);
|
||||||
archivedCount = threadTable.getArchivedConversationListCount(conversationFilter);
|
archivedCount = threadTable.getArchivedConversationListCount(conversationFilter);
|
||||||
|
unpinnedCount = unarchivedCount - pinnedCount;
|
||||||
totalCount = unarchivedCount;
|
totalCount = unarchivedCount;
|
||||||
|
|
||||||
if (chatFolder.getFolderType() == ChatFolderRecord.FolderType.ALL && archivedCount != 0) {
|
if (chatFolder.getFolderType() == ChatFolderRecord.FolderType.ALL && archivedCount != 0) {
|
||||||
totalCount++;
|
totalCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!RemoteConfig.getShowChatFolders() && pinnedCount != 0) {
|
||||||
|
if (unpinnedCount != 0) {
|
||||||
|
totalCount += 2;
|
||||||
|
} else {
|
||||||
|
totalCount += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return totalCount;
|
return totalCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,11 +209,25 @@ abstract class ConversationListDataSource implements PagedDataSource<Long, Conve
|
|||||||
List<Cursor> cursors = new ArrayList<>(5);
|
List<Cursor> cursors = new ArrayList<>(5);
|
||||||
long originalLimit = limit;
|
long originalLimit = limit;
|
||||||
|
|
||||||
|
if (!RemoteConfig.getShowChatFolders() && offset == 0 && hasPinnedHeader()) {
|
||||||
|
MatrixCursor pinnedHeaderCursor = new MatrixCursor(ConversationReader.HEADER_COLUMN);
|
||||||
|
pinnedHeaderCursor.addRow(ConversationReader.PINNED_HEADER);
|
||||||
|
cursors.add(pinnedHeaderCursor);
|
||||||
|
limit--;
|
||||||
|
}
|
||||||
|
|
||||||
Cursor pinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, true, offset, limit, chatFolder);
|
Cursor pinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, true, offset, limit, chatFolder);
|
||||||
cursors.add(pinnedCursor);
|
cursors.add(pinnedCursor);
|
||||||
limit -= pinnedCursor.getCount();
|
limit -= pinnedCursor.getCount();
|
||||||
|
|
||||||
long unpinnedOffset = Math.max(0, offset - pinnedCount);
|
if (!RemoteConfig.getShowChatFolders() && offset == 0 && hasUnpinnedHeader()) {
|
||||||
|
MatrixCursor unpinnedHeaderCursor = new MatrixCursor(ConversationReader.HEADER_COLUMN);
|
||||||
|
unpinnedHeaderCursor.addRow(ConversationReader.UNPINNED_HEADER);
|
||||||
|
cursors.add(unpinnedHeaderCursor);
|
||||||
|
limit--;
|
||||||
|
}
|
||||||
|
|
||||||
|
long unpinnedOffset = Math.max(0, offset - pinnedCount - getHeaderOffset());
|
||||||
Cursor unpinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, false, unpinnedOffset, limit, chatFolder);
|
Cursor unpinnedCursor = threadTable.getUnarchivedConversationList(conversationFilter, false, unpinnedOffset, limit, chatFolder);
|
||||||
cursors.add(unpinnedCursor);
|
cursors.add(unpinnedCursor);
|
||||||
|
|
||||||
@@ -223,6 +248,25 @@ abstract class ConversationListDataSource implements PagedDataSource<Long, Conve
|
|||||||
return new MergeCursor(cursors.toArray(new Cursor[]{}));
|
return new MergeCursor(cursors.toArray(new Cursor[]{}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
int getHeaderOffset() {
|
||||||
|
if (RemoteConfig.getShowChatFolders()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return (hasPinnedHeader() ? 1 : 0) + (hasUnpinnedHeader() ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
boolean hasPinnedHeader() {
|
||||||
|
return pinnedCount != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
boolean hasUnpinnedHeader() {
|
||||||
|
return hasPinnedHeader() && unpinnedCount != 0;
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean hasArchivedFooter() {
|
boolean hasArchivedFooter() {
|
||||||
return archivedCount != 0 && chatFolder.getFolderType() == ChatFolderRecord.FolderType.ALL;
|
return archivedCount != 0 && chatFolder.getFolderType() == ChatFolderRecord.FolderType.ALL;
|
||||||
|
|||||||
+1
-1
@@ -300,7 +300,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
|
|||||||
|
|
||||||
fab.setVisibility(View.VISIBLE);
|
fab.setVisibility(View.VISIBLE);
|
||||||
cameraFab.setVisibility(View.VISIBLE);
|
cameraFab.setVisibility(View.VISIBLE);
|
||||||
chatFolderList.setVisibility(RemoteConfig.internalUser() ? View.VISIBLE : View.GONE);
|
chatFolderList.setVisibility(RemoteConfig.getShowChatFolders() ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
contactSearchMediator = new ContactSearchMediator(this,
|
contactSearchMediator = new ContactSearchMediator(this,
|
||||||
Collections.emptySet(),
|
Collections.emptySet(),
|
||||||
|
|||||||
@@ -1103,6 +1103,14 @@ object RemoteConfig {
|
|||||||
hotSwappable = true
|
hotSwappable = true
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/** Whether or not to show chat folders. */
|
||||||
|
@JvmStatic
|
||||||
|
val showChatFolders: Boolean by remoteBoolean(
|
||||||
|
key = "android.showChatFolders",
|
||||||
|
defaultValue = false,
|
||||||
|
hotSwappable = true
|
||||||
|
)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@get:JvmName("newCallUi")
|
@get:JvmName("newCallUi")
|
||||||
val newCallUi: Boolean by remoteBoolean(
|
val newCallUi: Boolean by remoteBoolean(
|
||||||
|
|||||||
+5
@@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.database.DatabaseObserver;
|
|||||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||||
import org.thoughtcrime.securesms.database.ThreadTable;
|
import org.thoughtcrime.securesms.database.ThreadTable;
|
||||||
import org.thoughtcrime.securesms.dependencies.AppDependencies;
|
import org.thoughtcrime.securesms.dependencies.AppDependencies;
|
||||||
|
import org.thoughtcrime.securesms.util.RemoteConfig;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -46,6 +47,9 @@ public class UnarchivedConversationListDataSourceTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private MockedStatic<SignalDatabase> signalDatabaseMockedStatic;
|
private MockedStatic<SignalDatabase> signalDatabaseMockedStatic;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private MockedStatic<RemoteConfig> remoteConfigMockedStatic;
|
||||||
|
|
||||||
private ConversationListDataSource.UnarchivedConversationListDataSource testSubject;
|
private ConversationListDataSource.UnarchivedConversationListDataSource testSubject;
|
||||||
|
|
||||||
private ChatFolderRecord allChatsFolder;
|
private ChatFolderRecord allChatsFolder;
|
||||||
@@ -58,6 +62,7 @@ public class UnarchivedConversationListDataSourceTest {
|
|||||||
|
|
||||||
when(SignalDatabase.threads()).thenReturn(threadTable);
|
when(SignalDatabase.threads()).thenReturn(threadTable);
|
||||||
when(AppDependencies.getDatabaseObserver()).thenReturn(mock(DatabaseObserver.class));
|
when(AppDependencies.getDatabaseObserver()).thenReturn(mock(DatabaseObserver.class));
|
||||||
|
when(RemoteConfig.getShowChatFolders()).thenReturn(true);
|
||||||
|
|
||||||
allChatsFolder = setupAllChatsFolder();
|
allChatsFolder = setupAllChatsFolder();
|
||||||
testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(allChatsFolder, ConversationFilter.OFF, false);
|
testSubject = new ConversationListDataSource.UnarchivedConversationListDataSource(allChatsFolder, ConversationFilter.OFF, false);
|
||||||
|
|||||||
Reference in New Issue
Block a user