From 2dace38d438139897d25c73b94ba8c2987ae9835 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 12 Nov 2020 12:32:10 -0500 Subject: [PATCH] Add support for GV1->GV2 forced migration. --- .../securesms/contacts/ContactAccessor.java | 2 +- .../contacts/ContactsCursorLoader.java | 9 ++- .../conversation/ConversationActivity.java | 1 + .../securesms/database/GroupDatabase.java | 6 +- .../securesms/database/RecipientDatabase.java | 2 +- .../securesms/database/ThreadDatabase.java | 10 +++- .../securesms/jobs/PushGroupSendJob.java | 4 ++ .../mediasend/CameraContactsRepository.java | 3 +- .../MessageRequestRepository.java | 4 ++ .../MessageRequestViewModel.java | 12 +++- .../MessageRequestsBottomView.java | 58 +++++++++++++------ .../securesms/service/DirectShareService.java | 3 +- .../securesms/sharing/ShareActivity.java | 5 ++ .../res/layout/message_request_bottom_bar.xml | 28 ++++++++- app/src/main/res/values/strings.xml | 2 + 15 files changed, 117 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java index 973561cc95..aa104dc4d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java @@ -199,7 +199,7 @@ public class ContactAccessor { GroupRecord record; try { - reader = DatabaseFactory.getGroupDatabase(context).getGroupsFilteredByTitle(constraint, true); + reader = DatabaseFactory.getGroupDatabase(context).getGroupsFilteredByTitle(constraint, true, false); while ((record = reader.getNext()) != null) { numberList.add(record.getId().toString()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java index 294aa1a3a6..20be197807 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java @@ -61,6 +61,7 @@ public class ContactsCursorLoader extends CursorLoader { public static final int FLAG_INACTIVE_GROUPS = 1 << 3; public static final int FLAG_SELF = 1 << 4; public static final int FLAG_BLOCK = 1 << 5; + public static final int FLAG_HIDE_GROUPS_V1 = 1 << 5; public static final int FLAG_ALL = FLAG_PUSH | FLAG_SMS | FLAG_ACTIVE_GROUPS | FLAG_INACTIVE_GROUPS | FLAG_SELF; } @@ -267,7 +268,7 @@ public class ContactsCursorLoader extends CursorLoader { ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(getContext()); MatrixCursor recentConversations = new MatrixCursor(CONTACT_PROJECTION, RECENT_CONVERSATION_MAX); - try (Cursor rawConversations = threadDatabase.getRecentConversationList(RECENT_CONVERSATION_MAX, flagSet(mode, DisplayMode.FLAG_INACTIVE_GROUPS), groupsOnly)) { + try (Cursor rawConversations = threadDatabase.getRecentConversationList(RECENT_CONVERSATION_MAX, flagSet(mode, DisplayMode.FLAG_INACTIVE_GROUPS), groupsOnly, hideGroupsV1(mode))) { ThreadDatabase.Reader reader = threadDatabase.readerFor(rawConversations); ThreadRecord threadRecord; while ((threadRecord = reader.getNext()) != null) { @@ -306,7 +307,7 @@ public class ContactsCursorLoader extends CursorLoader { private Cursor getGroupsCursor() { MatrixCursor groupContacts = new MatrixCursor(CONTACT_PROJECTION); - try (GroupDatabase.Reader reader = DatabaseFactory.getGroupDatabase(getContext()).getGroupsFilteredByTitle(filter, flagSet(mode, DisplayMode.FLAG_INACTIVE_GROUPS))) { + try (GroupDatabase.Reader reader = DatabaseFactory.getGroupDatabase(getContext()).getGroupsFilteredByTitle(filter, flagSet(mode, DisplayMode.FLAG_INACTIVE_GROUPS), hideGroupsV1(mode))) { GroupDatabase.GroupRecord groupRecord; while ((groupRecord = reader.getNext()) != null) { groupContacts.addRow(new Object[] { groupRecord.getRecipientId().serialize(), @@ -412,6 +413,10 @@ public class ContactsCursorLoader extends CursorLoader { return mode == DisplayMode.FLAG_ACTIVE_GROUPS; } + private static boolean hideGroupsV1(int mode) { + return flagSet(mode, DisplayMode.FLAG_HIDE_GROUPS_V1); + } + private static boolean flagSet(int mode, int flag) { return (mode & flag) > 0; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index a223e32200..50439c002c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -3116,6 +3116,7 @@ public class ConversationActivity extends PassphraseRequiredActivity messageRequestBottomView.setDeleteOnClickListener(v -> onMessageRequestDeleteClicked(viewModel)); messageRequestBottomView.setBlockOnClickListener(v -> onMessageRequestBlockClicked(viewModel)); messageRequestBottomView.setUnblockOnClickListener(v -> onMessageRequestUnblockClicked(viewModel)); + messageRequestBottomView.setGroupV1MigrationContinueListener(v -> GroupsV1MigrationInitiationBottomSheetDialogFragment.showForInitiation(getSupportFragmentManager(), recipient.getId())); viewModel.getRequestReviewDisplayState().observe(this, this::presentRequestReviewBanner); viewModel.getMessageData().observe(this, this::presentMessageRequestBottomViewTo); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index a78a6ac384..ec4c145c84 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -220,7 +220,7 @@ public final class GroupDatabase extends Database { return noMetadata && noMembers; } - public Reader getGroupsFilteredByTitle(String constraint, boolean includeInactive) { + public Reader getGroupsFilteredByTitle(String constraint, boolean includeInactive, boolean excludeV1) { String query; String[] queryArgs; @@ -232,6 +232,10 @@ public final class GroupDatabase extends Database { queryArgs = new String[]{"%" + constraint + "%", "1"}; } + if (excludeV1) { + query += " AND " + EXPECTED_V2_ID + " IS NULL"; + } + Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, query, queryArgs, null, null, TITLE + " COLLATE NOCASE ASC"); return new Reader(cursor); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java index 74d5c95ba8..58d4017b32 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -93,7 +93,7 @@ public class RecipientDatabase extends Database { public static final String PHONE = "phone"; public static final String EMAIL = "email"; static final String GROUP_ID = "group_id"; - private static final String GROUP_TYPE = "group_type"; + static final String GROUP_TYPE = "group_type"; private static final String BLOCKED = "blocked"; private static final String MESSAGE_RINGTONE = "message_ringtone"; private static final String MESSAGE_VIBRATE = "message_vibrate"; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index dcd7794216..7c6e41b0cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -545,11 +545,11 @@ public class ThreadDatabase extends Database { return cursor; } - public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups) { - return getRecentConversationList(limit, includeInactiveGroups, false); + public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups, boolean hideV1Groups) { + return getRecentConversationList(limit, includeInactiveGroups, false, hideV1Groups); } - public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups, boolean groupsOnly) { + public Cursor getRecentConversationList(int limit, boolean includeInactiveGroups, boolean groupsOnly, boolean hideV1Groups) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); String query = !includeInactiveGroups ? MESSAGE_COUNT + " != 0 AND (" + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " IS NULL OR " + GroupDatabase.TABLE_NAME + "." + GroupDatabase.ACTIVE + " = 1)" : MESSAGE_COUNT + " != 0"; @@ -558,6 +558,10 @@ public class ThreadDatabase extends Database { query += " AND " + RecipientDatabase.TABLE_NAME + "." + RecipientDatabase.GROUP_ID + " NOT NULL"; } + if (hideV1Groups) { + query += " AND " + RecipientDatabase.TABLE_NAME + "." + RecipientDatabase.GROUP_TYPE + " != " + RecipientDatabase.GroupType.SIGNAL_V1.getId(); + } + return db.rawQuery(createQuery(query, 0, limit, true), null); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index 347470097e..f5c1e98d5f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -175,6 +175,10 @@ public final class PushGroupSendJob extends PushSendJob { throw new MmsException("Message recipient isn't a group!"); } + if (groupRecipient.isPushV1Group() && FeatureFlags.groupsV1ForcedMigration()) { + throw new MmsException("No GV1 messages can be sent anymore!"); + } + try { log(TAG, String.valueOf(message.getSentTimeMillis()), "Sending message: " + messageId); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactsRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactsRepository.java index 08b41cef1a..c833afb7c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactsRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactsRepository.java @@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.ringrtc.Camera; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import java.util.ArrayList; @@ -120,7 +121,7 @@ class CameraContactsRepository { List recipients = new ArrayList<>(); - try (GroupDatabase.Reader reader = groupDatabase.getGroupsFilteredByTitle(query, false)) { + try (GroupDatabase.Reader reader = groupDatabase.getGroupsFilteredByTitle(query, false, FeatureFlags.groupsV1ForcedMigration())) { GroupDatabase.GroupRecord groupRecord; while ((groupRecord = reader.getNext()) != null) { RecipientId recipientId = recipientDatabase.getOrInsertFromGroupId(groupRecord.getId()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index efb01c2f3d..2d14253d3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -86,6 +86,10 @@ final class MessageRequestRepository { } } + if (recipient.isPushV1Group() && FeatureFlags.groupsV1ForcedMigration()) { + return MessageRequestState.REQUIRED; + } + if (!RecipientUtil.isMessageRequestAccepted(context, threadId)) { if (recipient.isGroup()) { GroupDatabase.MemberLevel memberLevel = DatabaseFactory.getGroupDatabase(context) diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java index d472667395..b3623fcdc2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java @@ -197,6 +197,12 @@ public class MessageRequestViewModel extends ViewModel { } else { return new MessageData(recipient, MessageClass.GROUP_V2_ADD); } + } else if (recipient.isPushV1Group() && FeatureFlags.groupsV1ForcedMigration()) { + if (recipient.getParticipants().size() > FeatureFlags.groupLimits().getHardLimit()) { + return new MessageData(recipient, MessageClass.DEPRECATED_GROUP_V1_TOO_LARGE); + } else { + return new MessageData(recipient, MessageClass.DEPRECATED_GROUP_V1); + } } else if (isLegacyThread(recipient)) { if (recipient.isGroup()) { return new MessageData(recipient, MessageClass.LEGACY_GROUP_V1); @@ -289,6 +295,10 @@ public class MessageRequestViewModel extends ViewModel { LEGACY_INDIVIDUAL, /** A V1 group conversation that existed pre-message-requests but doesn't have profile sharing enabled */ LEGACY_GROUP_V1, + /** A V1 group conversation that is no longer allowed, because we've forced GV2 on. */ + DEPRECATED_GROUP_V1, + /** A V1 group conversation that is no longer allowed, because we've forced GV2 on, but it's also too large to migrate. Nothing we can do. */ + DEPRECATED_GROUP_V1_TOO_LARGE, GROUP_V1, GROUP_V2_INVITE, GROUP_V2_ADD, @@ -324,7 +334,7 @@ public class MessageRequestViewModel extends ViewModel { private final DisplayState displayState; private MessageDataDisplayStateHolder(@NonNull MessageData messageData, @NonNull DisplayState displayState) { - this.messageData = messageData; + this.messageData = messageData; this.displayState = displayState; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java index 6f101868cb..68211fe1e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.Debouncer; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.HtmlUtil; import org.thoughtcrime.securesms.util.views.LearnMoreTextView; @@ -24,6 +25,7 @@ public class MessageRequestsBottomView extends ConstraintLayout { private LearnMoreTextView question; private Button accept; + private Button gv1Continue; private View block; private View delete; private View bigDelete; @@ -32,6 +34,7 @@ public class MessageRequestsBottomView extends ConstraintLayout { private Group normalButtons; private Group blockedButtons; + private Group gv1MigrationButtons; private Group activeGroup; public MessageRequestsBottomView(Context context) { @@ -52,15 +55,17 @@ public class MessageRequestsBottomView extends ConstraintLayout { inflate(getContext(), R.layout.message_request_bottom_bar, this); - question = findViewById(R.id.message_request_question); - accept = findViewById(R.id.message_request_accept); - block = findViewById(R.id.message_request_block); - delete = findViewById(R.id.message_request_delete); - bigDelete = findViewById(R.id.message_request_big_delete); - bigUnblock = findViewById(R.id.message_request_big_unblock); - normalButtons = findViewById(R.id.message_request_normal_buttons); - blockedButtons = findViewById(R.id.message_request_blocked_buttons); - busyIndicator = findViewById(R.id.message_request_busy_indicator); + question = findViewById(R.id.message_request_question); + accept = findViewById(R.id.message_request_accept); + block = findViewById(R.id.message_request_block); + delete = findViewById(R.id.message_request_delete); + bigDelete = findViewById(R.id.message_request_big_delete); + bigUnblock = findViewById(R.id.message_request_big_unblock); + gv1Continue = findViewById(R.id.message_request_gv1_migration); + normalButtons = findViewById(R.id.message_request_normal_buttons); + blockedButtons = findViewById(R.id.message_request_blocked_buttons); + gv1MigrationButtons = findViewById(R.id.message_request_gv1_migration_buttons); + busyIndicator = findViewById(R.id.message_request_busy_indicator); } public void setMessageData(@NonNull MessageRequestViewModel.MessageData messageData) { @@ -73,52 +78,65 @@ public class MessageRequestsBottomView extends ConstraintLayout { case BLOCKED_INDIVIDUAL: question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them, HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); - setActiveInactiveGroups(blockedButtons, normalButtons); + setActiveInactiveGroups(blockedButtons, normalButtons, gv1MigrationButtons); break; case BLOCKED_GROUP: question.setText(R.string.MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members); - setActiveInactiveGroups(blockedButtons, normalButtons); + setActiveInactiveGroups(blockedButtons, normalButtons, gv1MigrationButtons); break; case LEGACY_INDIVIDUAL: question.setText(getContext().getString(R.string.MessageRequestBottomView_continue_your_conversation_with_s_and_share_your_name_and_photo, recipient.getShortDisplayName(getContext()))); question.setLearnMoreVisible(true); question.setOnLinkClickListener(v -> CommunicationActions.openBrowserLink(getContext(), getContext().getString(R.string.MessageRequestBottomView_legacy_learn_more_url))); - setActiveInactiveGroups(normalButtons, blockedButtons); + setActiveInactiveGroups(normalButtons, blockedButtons, gv1MigrationButtons); accept.setText(R.string.MessageRequestBottomView_continue); break; case LEGACY_GROUP_V1: question.setText(R.string.MessageRequestBottomView_continue_your_conversation_with_this_group_and_share_your_name_and_photo); question.setLearnMoreVisible(true); question.setOnLinkClickListener(v -> CommunicationActions.openBrowserLink(getContext(), getContext().getString(R.string.MessageRequestBottomView_legacy_learn_more_url))); - setActiveInactiveGroups(normalButtons, blockedButtons); + setActiveInactiveGroups(normalButtons, blockedButtons, gv1MigrationButtons); accept.setText(R.string.MessageRequestBottomView_continue); break; + case DEPRECATED_GROUP_V1: + question.setText(R.string.MessageRequestBottomView_upgrade_this_group_to_activate_new_features); + setActiveInactiveGroups(gv1MigrationButtons, normalButtons, blockedButtons); + gv1Continue.setVisibility(VISIBLE); + break; + case DEPRECATED_GROUP_V1_TOO_LARGE: + question.setText(getContext().getString(R.string.MessageRequestBottomView_this_legacy_group_can_no_longer_be_used, FeatureFlags.groupLimits().getHardLimit() - 1)); + setActiveInactiveGroups(gv1MigrationButtons, normalButtons, blockedButtons); + gv1Continue.setVisibility(GONE); + break; case GROUP_V1: case GROUP_V2_INVITE: question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); - setActiveInactiveGroups(normalButtons, blockedButtons); + setActiveInactiveGroups(normalButtons, blockedButtons, gv1MigrationButtons); accept.setText(R.string.MessageRequestBottomView_accept); break; case GROUP_V2_ADD: question.setText(R.string.MessageRequestBottomView_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); - setActiveInactiveGroups(normalButtons, blockedButtons); + setActiveInactiveGroups(normalButtons, blockedButtons, gv1MigrationButtons); accept.setText(R.string.MessageRequestBottomView_accept); break; case INDIVIDUAL: question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); - setActiveInactiveGroups(normalButtons, blockedButtons); + setActiveInactiveGroups(normalButtons, blockedButtons, gv1MigrationButtons); accept.setText(R.string.MessageRequestBottomView_accept); break; } } - private void setActiveInactiveGroups(@NonNull Group activeGroup, @NonNull Group inActiveGroup) { + private void setActiveInactiveGroups(@NonNull Group activeGroup, @NonNull Group... inActiveGroups) { int initialVisibility = this.activeGroup != null ? this.activeGroup.getVisibility() : VISIBLE; this.activeGroup = activeGroup; - inActiveGroup.setVisibility(GONE); + for (Group inactive : inActiveGroups) { + inactive.setVisibility(GONE); + } + activeGroup.setVisibility(initialVisibility); } @@ -153,4 +171,8 @@ public class MessageRequestsBottomView extends ConstraintLayout { public void setUnblockOnClickListener(OnClickListener unblockOnClickListener) { bigUnblock.setOnClickListener(unblockOnClickListener); } + + public void setGroupV1MigrationContinueListener(OnClickListener acceptOnClickListener) { + gv1Continue.setOnClickListener(acceptOnClickListener); + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java b/app/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java index 331508ae4d..96665623be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.BitmapUtil; +import org.thoughtcrime.securesms.util.FeatureFlags; import java.util.LinkedList; import java.util.List; @@ -41,7 +42,7 @@ public class DirectShareService extends ChooserTargetService { List results = new LinkedList<>(); ComponentName componentName = new ComponentName(this, ShareActivity.class); ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(this); - Cursor cursor = threadDatabase.getRecentConversationList(10, false); + Cursor cursor = threadDatabase.getRecentConversationList(10, false, FeatureFlags.groupsV1ForcedMigration()); try { ThreadDatabase.Reader reader = threadDatabase.readerFor(cursor); diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java index ea031e2fd4..3e20e94227 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java @@ -49,6 +49,7 @@ import org.thoughtcrime.securesms.stickers.StickerLocator; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; @@ -98,6 +99,10 @@ public class ShareActivity extends PassphraseRequiredActivity mode |= DisplayMode.FLAG_SMS; } + if (FeatureFlags.groupsV1ForcedMigration()) { + mode |= DisplayMode.FLAG_HIDE_GROUPS_V1; + } + getIntent().putExtra(ContactSelectionListFragment.DISPLAY_MODE, mode); } diff --git a/app/src/main/res/layout/message_request_bottom_bar.xml b/app/src/main/res/layout/message_request_bottom_bar.xml index d2f21e79a8..aba6d8539a 100644 --- a/app/src/main/res/layout/message_request_bottom_bar.xml +++ b/app/src/main/res/layout/message_request_bottom_bar.xml @@ -58,6 +58,19 @@ app:layout_constraintStart_toEndOf="@+id/message_request_delete" app:layout_constraintTop_toTopOf="@id/message_request_block" /> + +