Extract ConversationParentFragment Options Menu into a MenuProvider.

This commit is contained in:
Alex Hart 2023-03-20 13:29:25 -03:00 committed by Greyson Parrelli
parent f9ed5c4d03
commit 2a43ffad4f
2 changed files with 325 additions and 207 deletions

View file

@ -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()
}
}

View file

@ -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();
@ -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<Void, Void, Void>() {
@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<Void, Void, Void>() {
@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<VoiceNoteDraft>, 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 {