From 2a43ffad4fa82f4464fedcf7f558d03e1e6a7230 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 20 Mar 2023 13:29:25 -0300 Subject: [PATCH] Extract ConversationParentFragment Options Menu into a MenuProvider. --- .../conversation/ConversationOptionsMenu.kt | 238 ++++++++++++++ .../ConversationParentFragment.java | 294 ++++++------------ 2 files changed, 325 insertions(+), 207 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationOptionsMenu.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationOptionsMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationOptionsMenu.kt new file mode 100644 index 0000000000..de7a5710de --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationOptionsMenu.kt @@ -0,0 +1,238 @@ +package org.thoughtcrime.securesms.conversation + +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import androidx.annotation.IdRes +import androidx.core.view.MenuProvider +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.conversation.ConversationGroupViewModel.GroupActiveState +import org.thoughtcrime.securesms.conversation.ui.groupcall.GroupCallViewModel +import org.thoughtcrime.securesms.database.ThreadTable +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.recipients.LiveRecipient +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.util.LifecycleDisposable + +/** + * Delegate object for managing the conversation options menu + */ +internal object ConversationOptionsMenu { + + /** + * MenuProvider implementation for the conversation options menu. + */ + class Provider( + private val dependencies: Dependencies, + private val optionsMenuProviderCallback: Callback, + private val lifecycleDisposable: LifecycleDisposable + ) : MenuProvider, Dependencies by dependencies { + + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menu.clear() + + val recipient: Recipient? = liveRecipient?.get() + val groupActiveState: GroupActiveState? = groupViewModel.groupActiveState.value + val isActiveGroup = groupActiveState != null && groupActiveState.isActiveGroup + val isActiveV2Group = groupActiveState != null && groupActiveState.isActiveV2Group + val isInActiveGroup = groupActiveState != null && !groupActiveState.isActiveGroup + + if (isInMessageRequest() && (recipient != null) && !recipient.isBlocked) { + if (isActiveGroup) { + menuInflater.inflate(R.menu.conversation_message_requests_group, menu) + } + } + + if (viewModel.isPushAvailable) { + if (recipient!!.expiresInSeconds > 0) { + if (!isInActiveGroup) { + menuInflater.inflate(R.menu.conversation_expiring_on, menu) + } + titleView.showExpiring(liveRecipient!!) + } else { + if (!isInActiveGroup) { + menuInflater.inflate(R.menu.conversation_expiring_off, menu) + } + titleView.clearExpiring() + } + } + + if (isSingleConversation()) { + if (viewModel.isPushAvailable) { + menuInflater.inflate(R.menu.conversation_callable_secure, menu) + } else if (!recipient!!.isReleaseNotes && SignalStore.misc().smsExportPhase.allowSmsFeatures()) { + menuInflater.inflate(R.menu.conversation_callable_insecure, menu) + } + } else if (isGroupConversation()) { + if (isActiveV2Group) { + menuInflater.inflate(R.menu.conversation_callable_groupv2, menu) + if (groupCallViewModel != null && java.lang.Boolean.TRUE == groupCallViewModel.hasActiveGroupCall().getValue()) { + hideMenuItem(menu, R.id.menu_video_secure) + } + showGroupCallingTooltip() + } + menuInflater.inflate(R.menu.conversation_group_options, menu) + if (!isPushGroupConversation()) { + menuInflater.inflate(R.menu.conversation_mms_group_options, menu) + if (distributionType == ThreadTable.DistributionTypes.BROADCAST) { + menu.findItem(R.id.menu_distribution_broadcast).isChecked = true + } else { + menu.findItem(R.id.menu_distribution_conversation).isChecked = true + } + } + menuInflater.inflate(R.menu.conversation_active_group_options, menu) + } + + menuInflater.inflate(R.menu.conversation, menu) + + if (isInMessageRequest() && !recipient!!.isBlocked) { + hideMenuItem(menu, R.id.menu_conversation_settings) + } + + if (isSingleConversation() && !viewModel.isPushAvailable && !recipient!!.isReleaseNotes) { + menuInflater.inflate(R.menu.conversation_insecure, menu) + } + + if (recipient != null && recipient.isMuted) menuInflater.inflate(R.menu.conversation_muted, menu) else menuInflater.inflate(R.menu.conversation_unmuted, menu) + + if (isSingleConversation() && getRecipient()!!.contactUri == null && !recipient!!.isReleaseNotes && !recipient.isSelf && recipient.hasE164()) { + menuInflater.inflate(R.menu.conversation_add_to_contacts, menu) + } + + if (recipient != null && recipient.isSelf) { + if (viewModel.isPushAvailable) { + hideMenuItem(menu, R.id.menu_call_secure) + hideMenuItem(menu, R.id.menu_video_secure) + } else { + hideMenuItem(menu, R.id.menu_call_insecure) + } + hideMenuItem(menu, R.id.menu_mute_notifications) + } + + if (recipient != null && recipient.isBlocked) { + if (viewModel.isPushAvailable) { + hideMenuItem(menu, R.id.menu_call_secure) + hideMenuItem(menu, R.id.menu_video_secure) + hideMenuItem(menu, R.id.menu_expiring_messages) + hideMenuItem(menu, R.id.menu_expiring_messages_off) + } else { + hideMenuItem(menu, R.id.menu_call_insecure) + } + hideMenuItem(menu, R.id.menu_mute_notifications) + } + + if (recipient != null && recipient.isReleaseNotes) { + hideMenuItem(menu, R.id.menu_add_shortcut) + } + + hideMenuItem(menu, R.id.menu_group_recipients) + + if (isActiveV2Group) { + hideMenuItem(menu, R.id.menu_mute_notifications) + hideMenuItem(menu, R.id.menu_conversation_settings) + } else if (isGroupConversation()) { + hideMenuItem(menu, R.id.menu_conversation_settings) + } + + hideMenuItem(menu, R.id.menu_create_bubble) + lifecycleDisposable += viewModel.canShowAsBubble().subscribeBy(onNext = { canShowAsBubble: Boolean -> + val item = menu.findItem(R.id.menu_create_bubble) + if (item != null) { + item.isVisible = canShowAsBubble && !isInBubble() + } + }) + + if (threadId == -1L) { + hideMenuItem(menu, R.id.menu_view_media) + } + + optionsMenuProviderCallback.onOptionsMenuCreated(menu) + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + when (menuItem.itemId) { + R.id.menu_call_secure -> optionsMenuProviderCallback.handleDial(getRecipient(), true) + R.id.menu_video_secure -> optionsMenuProviderCallback.handleVideo(getRecipient()) + R.id.menu_call_insecure -> optionsMenuProviderCallback.handleDial(getRecipient(), false) + R.id.menu_view_media -> optionsMenuProviderCallback.handleViewMedia() + R.id.menu_add_shortcut -> optionsMenuProviderCallback.handleAddShortcut() + R.id.menu_search -> optionsMenuProviderCallback.handleSearch() + R.id.menu_add_to_contacts -> optionsMenuProviderCallback.handleAddToContacts() + R.id.menu_group_recipients -> optionsMenuProviderCallback.handleDisplayGroupRecipients() + R.id.menu_distribution_broadcast -> optionsMenuProviderCallback.handleDistributionBroadcastEnabled(menuItem) + R.id.menu_distribution_conversation -> optionsMenuProviderCallback.handleDistributionConversationEnabled(menuItem) + R.id.menu_group_settings -> optionsMenuProviderCallback.handleManageGroup() + R.id.menu_leave -> optionsMenuProviderCallback.handleLeavePushGroup() + R.id.menu_invite -> optionsMenuProviderCallback.handleInviteLink() + R.id.menu_mute_notifications -> optionsMenuProviderCallback.handleMuteNotifications() + R.id.menu_unmute_notifications -> optionsMenuProviderCallback.handleUnmuteNotifications() + R.id.menu_conversation_settings -> optionsMenuProviderCallback.handleConversationSettings() + R.id.menu_expiring_messages_off, R.id.menu_expiring_messages -> optionsMenuProviderCallback.handleSelectMessageExpiration() + R.id.menu_create_bubble -> optionsMenuProviderCallback.handleCreateBubble() + R.id.home -> optionsMenuProviderCallback.handleGoHome() + else -> return false + } + + return true + } + + private fun getRecipient(): Recipient? { + return liveRecipient?.get() + } + + private fun hideMenuItem(menu: Menu, @IdRes menuItem: Int) { + if (menu.findItem(menuItem) != null) { + menu.findItem(menuItem).isVisible = false + } + } + + private fun isSingleConversation(): Boolean = getRecipient()?.isGroup == false + + private fun isGroupConversation(): Boolean = getRecipient()?.isGroup == true + + private fun isPushGroupConversation(): Boolean = getRecipient()?.isPushGroup == true + } + + /** + * Dependencies abstraction for the conversation options menu + */ + interface Dependencies { + val liveRecipient: LiveRecipient? + val viewModel: ConversationViewModel + val groupViewModel: ConversationGroupViewModel + val groupCallViewModel: GroupCallViewModel? + val titleView: ConversationTitleView + val distributionType: Int + val threadId: Long + fun isInMessageRequest(): Boolean + fun showGroupCallingTooltip() + fun isInBubble(): Boolean + } + + /** + * Callbacks abstraction for the converstaion options menu + */ + interface Callback { + fun onOptionsMenuCreated(menu: Menu) + + fun handleVideo(recipient: Recipient?) + fun handleDial(recipient: Recipient?, isSecure: Boolean) + fun handleViewMedia() + fun handleAddShortcut() + fun handleSearch() + fun handleAddToContacts() + fun handleDisplayGroupRecipients() + fun handleDistributionBroadcastEnabled(menuItem: MenuItem) + fun handleDistributionConversationEnabled(menuItem: MenuItem) + fun handleManageGroup() + fun handleLeavePushGroup() + fun handleInviteLink() + fun handleMuteNotifications() + fun handleUnmuteNotifications() + fun handleConversationSettings() + fun handleSelectMessageExpiration() + fun handleCreateBubble() + fun handleGoHome() + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 09ead35f5b..b4945d94e4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -48,7 +48,6 @@ import android.text.method.LinkMovementMethod; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; @@ -156,7 +155,6 @@ import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.contactshare.ContactShareEditActivity; import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher; -import org.thoughtcrime.securesms.conversation.ConversationGroupViewModel.GroupActiveState; import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory; import org.thoughtcrime.securesms.conversation.drafts.DraftViewModel; import org.thoughtcrime.securesms.conversation.ui.groupcall.GroupCallViewModel; @@ -366,7 +364,9 @@ public class ConversationParentFragment extends Fragment MessageDetailsFragment.Callback, ScheduleMessageTimePickerBottomSheet.ScheduleCallback, ConversationBottomSheetCallback, - ScheduleMessageDialogCallback + ScheduleMessageDialogCallback, + ConversationOptionsMenu.Callback, + ConversationOptionsMenu.Dependencies { private static final int SHORTCUT_ICON_SIZE = Build.VERSION.SDK_INT >= 26 ? ViewUtil.dpToPx(72) : ViewUtil.dpToPx(48 + 16 * 2); @@ -475,6 +475,8 @@ public class ConversationParentFragment extends Fragment private Callback callback; private RecentEmojiPageModel recentEmojis; + private ConversationOptionsMenu.Provider menuProvider; + public static ConversationParentFragment create(Intent intent) { ConversationParentFragment fragment = new ConversationParentFragment(); Bundle bundle = new Bundle(); @@ -493,6 +495,7 @@ public class ConversationParentFragment extends Fragment @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { disposables.bindTo(getViewLifecycleOwner()); + menuProvider = new ConversationOptionsMenu.Provider(this, this, disposables); if (requireActivity() instanceof Callback) { callback = (Callback) requireActivity(); @@ -572,7 +575,7 @@ public class ConversationParentFragment extends Fragment requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), backPressedCallback); if (isSearchRequested && savedInstanceState == null) { - onCreateOptionsMenu(toolbar.getMenu(), requireActivity().getMenuInflater()); + menuProvider.onCreateMenu(toolbar.getMenu(), requireActivity().getMenuInflater()); } sendButton.post(() -> sendButton.triggerSelectedChangedEvent()); @@ -910,130 +913,7 @@ public class ConversationParentFragment extends Fragment } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - menu.clear(); - - GroupActiveState groupActiveState = groupViewModel.getGroupActiveState().getValue(); - boolean isActiveGroup = groupActiveState != null && groupActiveState.isActiveGroup(); - boolean isActiveV2Group = groupActiveState != null && groupActiveState.isActiveV2Group(); - boolean isInActiveGroup = groupActiveState != null && !groupActiveState.isActiveGroup(); - - if (isInMessageRequest() && recipient != null && !recipient.get().isBlocked()) { - if (isActiveGroup) { - inflater.inflate(R.menu.conversation_message_requests_group, menu); - } - } - - if (viewModel.isPushAvailable()) { - if (recipient.get().getExpiresInSeconds() > 0) { - if (!isInActiveGroup) { - inflater.inflate(R.menu.conversation_expiring_on, menu); - } - titleView.showExpiring(recipient); - } else { - if (!isInActiveGroup) { - inflater.inflate(R.menu.conversation_expiring_off, menu); - } - titleView.clearExpiring(); - } - } - - if (isSingleConversation()) { - if (viewModel.isPushAvailable()) { - inflater.inflate(R.menu.conversation_callable_secure, menu); - } else if (!recipient.get().isReleaseNotes() && SignalStore.misc().getSmsExportPhase().allowSmsFeatures()) { - inflater.inflate(R.menu.conversation_callable_insecure, menu); - } - } else if (isGroupConversation()) { - if (isActiveV2Group) { - inflater.inflate(R.menu.conversation_callable_groupv2, menu); - if (groupCallViewModel != null && Boolean.TRUE.equals(groupCallViewModel.hasActiveGroupCall().getValue())) { - hideMenuItem(menu, R.id.menu_video_secure); - } - showGroupCallingTooltip(); - } - - inflater.inflate(R.menu.conversation_group_options, menu); - - if (!isPushGroupConversation()) { - inflater.inflate(R.menu.conversation_mms_group_options, menu); - if (distributionType == ThreadTable.DistributionTypes.BROADCAST) { - menu.findItem(R.id.menu_distribution_broadcast).setChecked(true); - } else { - menu.findItem(R.id.menu_distribution_conversation).setChecked(true); - } - } - - inflater.inflate(R.menu.conversation_active_group_options, menu); - } - - inflater.inflate(R.menu.conversation, menu); - - if (isInMessageRequest() && !recipient.get().isBlocked()) { - hideMenuItem(menu, R.id.menu_conversation_settings); - } - - if (isSingleConversation() && !viewModel.isPushAvailable() && !recipient.get().isReleaseNotes()) { - inflater.inflate(R.menu.conversation_insecure, menu); - } - - if (recipient != null && recipient.get().isMuted()) inflater.inflate(R.menu.conversation_muted, menu); - else inflater.inflate(R.menu.conversation_unmuted, menu); - - if (isSingleConversation() && getRecipient().getContactUri() == null && !recipient.get().isReleaseNotes() && !recipient.get().isSelf() && recipient.get().hasE164()) { - inflater.inflate(R.menu.conversation_add_to_contacts, menu); - } - - if (recipient != null && recipient.get().isSelf()) { - if (viewModel.isPushAvailable()) { - hideMenuItem(menu, R.id.menu_call_secure); - hideMenuItem(menu, R.id.menu_video_secure); - } else { - hideMenuItem(menu, R.id.menu_call_insecure); - } - - hideMenuItem(menu, R.id.menu_mute_notifications); - } - - if (recipient != null && recipient.get().isBlocked()) { - if (viewModel.isPushAvailable()) { - hideMenuItem(menu, R.id.menu_call_secure); - hideMenuItem(menu, R.id.menu_video_secure); - hideMenuItem(menu, R.id.menu_expiring_messages); - hideMenuItem(menu, R.id.menu_expiring_messages_off); - } else { - hideMenuItem(menu, R.id.menu_call_insecure); - } - - hideMenuItem(menu, R.id.menu_mute_notifications); - } - - if (recipient != null && recipient.get().isReleaseNotes()) { - hideMenuItem(menu, R.id.menu_add_shortcut); - } - - hideMenuItem(menu, R.id.menu_group_recipients); - - if (isActiveV2Group) { - hideMenuItem(menu, R.id.menu_mute_notifications); - hideMenuItem(menu, R.id.menu_conversation_settings); - } else if (isGroupConversation()) { - hideMenuItem(menu, R.id.menu_conversation_settings); - } - - hideMenuItem(menu, R.id.menu_create_bubble); - disposables.add(viewModel.canShowAsBubble().subscribe(canShowAsBubble -> { - MenuItem item = menu.findItem(R.id.menu_create_bubble); - - if (item != null) { - item.setVisible(canShowAsBubble && !isInBubble()); - } - })); - - if (threadId == -1L) { - hideMenuItem(menu, R.id.menu_view_media); - } - + public void onOptionsMenuCreated(@NonNull Menu menu) { searchViewItem = menu.findItem(R.id.menu_search); SearchView searchView = (SearchView) searchViewItem.getActionView(); @@ -1091,8 +971,8 @@ public class ConversationParentFragment extends Fragment if (isSearchRequested) { if (searchViewItem.expandActionView()) { - searchViewModel.onSearchOpened(); - } + searchViewModel.onSearchOpened(); + } } int toolbarTextAndIconColor = getResources().getColor(wallpaper.getDrawable() != null ? R.color.signal_colorNeutralInverse : R.color.signal_colorOnSurface); @@ -1103,61 +983,12 @@ public class ConversationParentFragment extends Fragment if (!isSearchRequested && getActivity() != null) { optionsMenuDebouncer.publish(() -> { if (getActivity() != null) { - onCreateOptionsMenu(toolbar.getMenu(), requireActivity().getMenuInflater()); + menuProvider.onCreateMenu(toolbar.getMenu(), requireActivity().getMenuInflater()); } }); } } - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - int itemId = item.getItemId(); - - if (itemId == R.id.menu_call_secure) { - handleDial(getRecipient(), true); - } else if (itemId == R.id.menu_video_secure) { - handleVideo(getRecipient()); - } else if (itemId == R.id.menu_call_insecure) { - handleDial(getRecipient(), false); - } else if (itemId == R.id.menu_view_media) { - handleViewMedia(); - } else if (itemId == R.id.menu_add_shortcut) { - handleAddShortcut(); - } else if (itemId == R.id.menu_search) { - handleSearch(); - } else if (itemId == R.id.menu_add_to_contacts) { - handleAddToContacts(); - } else if (itemId == R.id.menu_group_recipients) { - handleDisplayGroupRecipients(); - } else if (itemId == R.id.menu_distribution_broadcast) { - handleDistributionBroadcastEnabled(item); - } else if (itemId == R.id.menu_distribution_conversation) { - handleDistributionConversationEnabled(item); - } else if (itemId == R.id.menu_group_settings) { - handleManageGroup(); - } else if (itemId == R.id.menu_leave) { - handleLeavePushGroup(); - } else if (itemId == R.id.menu_invite) { - handleInviteLink(); - } else if (itemId == R.id.menu_mute_notifications) { - handleMuteNotifications(); - } else if (itemId == R.id.menu_unmute_notifications) { - handleUnmuteNotifications(); - } else if (itemId == R.id.menu_conversation_settings) { - handleConversationSettings(); - } else if (itemId == R.id.menu_expiring_messages_off || itemId == R.id.menu_expiring_messages) { - handleSelectMessageExpiration(); - } else if (itemId == R.id.menu_create_bubble) { - handleCreateBubble(); - } else if (itemId == android.R.id.home) { - requireActivity().finish(); - } else { - return false; - } - - return true; - } - public void onBackPressed() { Log.d(TAG, "onBackPressed()"); if (reactionDelegate.isShowing()) { @@ -1246,7 +1077,8 @@ public class ConversationParentFragment extends Fragment //////// Event Handlers - private void handleSelectMessageExpiration() { + @Override + public void handleSelectMessageExpiration() { if (isPushGroupConversation() && !isActiveGroup()) { return; } @@ -1254,7 +1086,8 @@ public class ConversationParentFragment extends Fragment startActivity(RecipientDisappearingMessagesActivity.forRecipient(requireContext(), recipient.getId())); } - private void handleMuteNotifications() { + @Override + public void handleMuteNotifications() { MuteDialog.show(requireActivity(), until -> { new AsyncTask() { @Override @@ -1275,7 +1108,8 @@ public class ConversationParentFragment extends Fragment .build())); } - private void handleConversationSettings() { + @Override + public void handleConversationSettings() { if (isGroupConversation()) { handleManageGroup(); return; @@ -1289,7 +1123,8 @@ public class ConversationParentFragment extends Fragment ActivityCompat.startActivity(requireActivity(), intent, bundle); } - private void handleUnmuteNotifications() { + @Override + public void handleUnmuteNotifications() { new AsyncTask() { @Override protected Void doInBackground(Void... params) { @@ -1316,7 +1151,8 @@ public class ConversationParentFragment extends Fragment startActivity(RegistrationNavigationActivity.newIntentForReRegistration(requireContext())); } - private void handleInviteLink() { + @Override + public void handleInviteLink() { String inviteText = getString(R.string.ConversationActivity_lets_switch_to_signal, getString(R.string.install_url)); if (viewModel.isDefaultSmsApplication() && SignalStore.misc().getSmsExportPhase().isSmsSupported()) { @@ -1340,11 +1176,13 @@ public class ConversationParentFragment extends Fragment } } - private void handleViewMedia() { + @Override + public void handleViewMedia() { startActivity(MediaOverviewActivity.forThread(requireContext(), threadId)); } - private void handleAddShortcut() { + @Override + public void handleAddShortcut() { Log.i(TAG, "Creating home screen shortcut for recipient " + recipient.get().getId()); final Context context = requireContext().getApplicationContext(); @@ -1389,7 +1227,8 @@ public class ConversationParentFragment extends Fragment } - private void handleCreateBubble() { + @Override + public void handleCreateBubble() { ConversationIntents.Args args = viewModel.getArgs(); BubbleUtil.displayAsBubble(requireContext(), args.getRecipientId(), args.getThreadId()); @@ -1418,11 +1257,13 @@ public class ConversationParentFragment extends Fragment bitmap.recycle(); } - private void handleSearch() { + @Override + public void handleSearch() { searchViewModel.onSearchOpened(); } - private void handleLeavePushGroup() { + @Override + public void handleLeavePushGroup() { if (getRecipient() == null) { Toast.makeText(requireContext(), getString(R.string.ConversationActivity_invalid_recipient), Toast.LENGTH_LONG).show(); @@ -1432,14 +1273,16 @@ public class ConversationParentFragment extends Fragment LeaveGroupDialog.handleLeavePushGroup(requireActivity(), getRecipient().requireGroupId().requirePush(), () -> requireActivity().finish()); } - private void handleManageGroup() { + @Override + public void handleManageGroup() { Intent intent = ConversationSettingsActivity.forGroup(requireContext(), recipient.get().requireGroupId()); Bundle bundle = ConversationSettingsActivity.createTransitionBundle(requireContext(), titleView.findViewById(R.id.contact_photo_image), toolbar); ActivityCompat.startActivity(requireContext(), intent, bundle); } - private void handleDistributionBroadcastEnabled(MenuItem item) { + @Override + public void handleDistributionBroadcastEnabled(MenuItem item) { distributionType = ThreadTable.DistributionTypes.BROADCAST; draftViewModel.setDistributionType(distributionType); item.setChecked(true); @@ -1455,7 +1298,8 @@ public class ConversationParentFragment extends Fragment } } - private void handleDistributionConversationEnabled(MenuItem item) { + @Override + public void handleDistributionConversationEnabled(MenuItem item) { distributionType = ThreadTable.DistributionTypes.CONVERSATION; draftViewModel.setDistributionType(distributionType); item.setChecked(true); @@ -1471,7 +1315,8 @@ public class ConversationParentFragment extends Fragment } } - private void handleDial(final Recipient recipient, boolean isSecure) { + @Override + public void handleDial(final Recipient recipient, boolean isSecure) { if (recipient == null) return; if (isSecure) { @@ -1481,7 +1326,8 @@ public class ConversationParentFragment extends Fragment } } - private void handleVideo(final Recipient recipient) { + @Override + public void handleVideo(final Recipient recipient) { if (recipient == null) return; if (recipient.isPushV2Group() && groupCallViewModel.hasActiveGroupCall().getValue() == Boolean.FALSE && groupViewModel.isNonAdminInAnnouncementGroup()) { @@ -1494,11 +1340,13 @@ public class ConversationParentFragment extends Fragment } } - private void handleDisplayGroupRecipients() { + @Override + public void handleDisplayGroupRecipients() { new GroupMembersDialog(requireActivity(), getRecipient()).display(); } - private void handleAddToContacts() { + @Override + public void handleAddToContacts() { if (recipient.get().isGroup()) return; try { @@ -2251,7 +2099,7 @@ public class ConversationParentFragment extends Fragment protected void initializeActionBar() { invalidateOptionsMenu(); - toolbar.setOnMenuItemClickListener(this::onOptionsItemSelected); + toolbar.setOnMenuItemClickListener(menuProvider::onMenuItemSelected); if (isInBubble()) { toolbar.setNavigationIcon(DrawableUtil.tint(ContextUtil.requireDrawable(requireContext(), R.drawable.ic_notification), @@ -2489,7 +2337,8 @@ public class ConversationParentFragment extends Fragment ); } - private void showGroupCallingTooltip() { + @Override + public void showGroupCallingTooltip() { if (!SignalStore.tooltips().shouldShowGroupCallingTooltip() || callingTooltipShown) { return; } @@ -2854,7 +2703,8 @@ public class ConversationParentFragment extends Fragment } } - private boolean isInMessageRequest() { + @Override + public boolean isInMessageRequest() { return messageRequestBottomView.getVisibility() == View.VISIBLE; } @@ -2885,11 +2735,17 @@ public class ConversationParentFragment extends Fragment return sendButton.isManualSelection() && sendButton.getSelectedSendType().usesSmsTransport(); } + @Override + public @Nullable LiveRecipient getLiveRecipient() { + return recipient; + } + protected Recipient getRecipient() { return this.recipient.get(); } - protected long getThreadId() { + @Override + public long getThreadId() { return this.threadId; } @@ -3703,6 +3559,36 @@ public class ConversationParentFragment extends Fragment sendMessage(metricId, scheduledDate); } + @Override + public void handleGoHome() { + requireActivity().finish(); + } + + @Override + public @NonNull ConversationViewModel getViewModel() { + return viewModel; + } + + @Override + public @NonNull ConversationGroupViewModel getGroupViewModel() { + return groupViewModel; + } + + @Override + public @Nullable GroupCallViewModel getGroupCallViewModel() { + return groupCallViewModel; + } + + @Override + public @NonNull ConversationTitleView getTitleView() { + return titleView; + } + + @Override + public int getDistributionType() { + return distributionType; + } + // Listeners private class RecordingSession implements SingleObserver, Disposable { @@ -4292,12 +4178,6 @@ public class ConversationParentFragment extends Fragment BlockUnblockDialog.showUnblockFor(requireContext(), getLifecycle(), recipient, requestModel::onUnblock); } - private static void hideMenuItem(@NonNull Menu menu, @IdRes int menuItem) { - if (menu.findItem(menuItem) != null) { - menu.findItem(menuItem).setVisible(false); - } - } - @WorkerThread private @Nullable KeyboardImageDetails getKeyboardImageDetails(@NonNull Uri uri) { try {