Stop storing state in ConversationParentFragment.

fork-5.53.8
Alex Hart 2022-07-22 10:47:40 -03:00 zatwierdzone przez Cody Henthorne
rodzic b9a225f6c6
commit 1d6b62d8ca
2 zmienionych plików z 48 dodań i 44 usunięć

Wyświetl plik

@ -453,10 +453,7 @@ public class ConversationParentFragment extends Fragment
private LiveRecipient recipient; private LiveRecipient recipient;
private long threadId; private long threadId;
private int distributionType; private int distributionType;
private boolean isSecureText;
private boolean isDefaultSms;
private int reactWithAnyEmojiStartPage = -1; private int reactWithAnyEmojiStartPage = -1;
private boolean isSecurityInitialized = false;
private boolean isSearchRequested = false; private boolean isSearchRequested = false;
private boolean hasProcessedShareData = false; private boolean hasProcessedShareData = false;
@ -503,7 +500,6 @@ public class ConversationParentFragment extends Fragment
return; return;
} }
isDefaultSms = Util.isDefaultSmsProvider(requireContext());
voiceNoteMediaController = new VoiceNoteMediaController(requireActivity()); voiceNoteMediaController = new VoiceNoteMediaController(requireActivity());
voiceRecorderWakeLock = new VoiceRecorderWakeLock(requireActivity()); voiceRecorderWakeLock = new VoiceRecorderWakeLock(requireActivity());
@ -549,12 +545,10 @@ public class ConversationParentFragment extends Fragment
initializePendingRequestsBanner(); initializePendingRequestsBanner();
initializeGroupV1MigrationsBanners(); initializeGroupV1MigrationsBanners();
Flowable<ConversationSecurityInfo> observableSecurityInfo = viewModel.getConversationState() Flowable<ConversationSecurityInfo> observableSecurityInfo = viewModel.getConversationSecurityInfo(args.getRecipientId());
.map(ConversationState::getSecurityInfo)
.filter(ConversationSecurityInfo::isInitialized);
disposables.add(observableSecurityInfo.subscribe(securityInfo -> handleSecurityChange(securityInfo.isPushAvailable(), securityInfo.isDefaultSmsApplication()))); disposables.add(observableSecurityInfo.subscribe(this::handleSecurityChange));
disposables.add(viewModel.getConversationSecurityInfo(args.getRecipientId()).firstOrError().subscribe(unused -> onInitialSecurityConfigurationLoaded())); disposables.add(observableSecurityInfo.firstOrError().subscribe(unused -> onInitialSecurityConfigurationLoaded()));
initializeInsightObserver(); initializeInsightObserver();
initializeActionBar(); initializeActionBar();
@ -591,7 +585,7 @@ public class ConversationParentFragment extends Fragment
Recipient recipientSnapshot = recipient.get(); Recipient recipientSnapshot = recipient.get();
titleView.setTitle(glideRequests, recipientSnapshot); titleView.setTitle(glideRequests, recipientSnapshot);
setBlockedUserState(recipientSnapshot, isSecureText, isDefaultSms); setBlockedUserState(recipientSnapshot, viewModel.getConversationStateSnapshot().getSecurityInfo());
calculateCharactersRemaining(); calculateCharactersRemaining();
if (recipientSnapshot.getGroupId().isPresent() && recipientSnapshot.getGroupId().get().isV2() && !recipientSnapshot.isBlocked()) { if (recipientSnapshot.getGroupId().isPresent() && recipientSnapshot.getGroupId().get().isV2() && !recipientSnapshot.isBlocked()) {
@ -690,7 +684,7 @@ public class ConversationParentFragment extends Fragment
setMedia(data.getData(), MediaType.AUDIO); setMedia(data.getData(), MediaType.AUDIO);
break; break;
case PICK_CONTACT: case PICK_CONTACT:
if (isSecureText && !isSmsForced()) { if (viewModel.isPushAvailable() && !isSmsForced()) {
openContactShareEditor(data.getData()); openContactShareEditor(data.getData());
} else { } else {
addAttachmentContactInfo(data.getData()); addAttachmentContactInfo(data.getData());
@ -705,7 +699,7 @@ public class ConversationParentFragment extends Fragment
onRecipientChanged(recipientSnapshot); onRecipientChanged(recipientSnapshot);
titleView.setTitle(glideRequests, recipientSnapshot); titleView.setTitle(glideRequests, recipientSnapshot);
NotificationChannels.updateContactChannelName(requireContext(), recipientSnapshot); NotificationChannels.updateContactChannelName(requireContext(), recipientSnapshot);
setBlockedUserState(recipientSnapshot, isSecureText, isDefaultSms); setBlockedUserState(recipientSnapshot, viewModel.getConversationStateSnapshot().getSecurityInfo());
invalidateOptionsMenu(); invalidateOptionsMenu();
break; break;
case TAKE_PHOTO: case TAKE_PHOTO:
@ -914,7 +908,7 @@ public class ConversationParentFragment extends Fragment
super.onCreateOptionsMenu(menu, inflater); super.onCreateOptionsMenu(menu, inflater);
} }
if (isSecureText) { if (viewModel.isPushAvailable()) {
if (recipient.get().getExpiresInSeconds() > 0) { if (recipient.get().getExpiresInSeconds() > 0) {
if (!isInActiveGroup) { if (!isInActiveGroup) {
inflater.inflate(R.menu.conversation_expiring_on, menu); inflater.inflate(R.menu.conversation_expiring_on, menu);
@ -929,7 +923,7 @@ public class ConversationParentFragment extends Fragment
} }
if (isSingleConversation()) { if (isSingleConversation()) {
if (isSecureText) inflater.inflate(R.menu.conversation_callable_secure, menu); if (viewModel.isPushAvailable()) inflater.inflate(R.menu.conversation_callable_secure, menu);
else if (!recipient.get().isReleaseNotes()) inflater.inflate(R.menu.conversation_callable_insecure, menu); else if (!recipient.get().isReleaseNotes()) inflater.inflate(R.menu.conversation_callable_insecure, menu);
} else if (isGroupConversation()) { } else if (isGroupConversation()) {
if (isActiveV2Group && Build.VERSION.SDK_INT > 19) { if (isActiveV2Group && Build.VERSION.SDK_INT > 19) {
@ -960,7 +954,7 @@ public class ConversationParentFragment extends Fragment
hideMenuItem(menu, R.id.menu_conversation_settings); hideMenuItem(menu, R.id.menu_conversation_settings);
} }
if (isSingleConversation() && !isSecureText && !recipient.get().isReleaseNotes()) { if (isSingleConversation() && !viewModel.isPushAvailable() && !recipient.get().isReleaseNotes()) {
inflater.inflate(R.menu.conversation_insecure, menu); inflater.inflate(R.menu.conversation_insecure, menu);
} }
@ -972,7 +966,7 @@ public class ConversationParentFragment extends Fragment
} }
if (recipient != null && recipient.get().isSelf()) { if (recipient != null && recipient.get().isSelf()) {
if (isSecureText) { if (viewModel.isPushAvailable()) {
hideMenuItem(menu, R.id.menu_call_secure); hideMenuItem(menu, R.id.menu_call_secure);
hideMenuItem(menu, R.id.menu_video_secure); hideMenuItem(menu, R.id.menu_video_secure);
} else { } else {
@ -983,7 +977,7 @@ public class ConversationParentFragment extends Fragment
} }
if (recipient != null && recipient.get().isBlocked()) { if (recipient != null && recipient.get().isBlocked()) {
if (isSecureText) { if (viewModel.isPushAvailable()) {
hideMenuItem(menu, R.id.menu_call_secure); hideMenuItem(menu, R.id.menu_call_secure);
hideMenuItem(menu, R.id.menu_video_secure); hideMenuItem(menu, R.id.menu_video_secure);
hideMenuItem(menu, R.id.menu_expiring_messages); hideMenuItem(menu, R.id.menu_expiring_messages);
@ -1068,7 +1062,7 @@ public class ConversationParentFragment extends Fragment
searchNav.setVisibility(View.GONE); searchNav.setVisibility(View.GONE);
inputPanel.setHideForSearch(false); inputPanel.setHideForSearch(false);
viewModel.setSearchQuery(null); viewModel.setSearchQuery(null);
setBlockedUserState(recipient.get(), isSecureText, isDefaultSms); setBlockedUserState(recipient.get(), viewModel.getConversationStateSnapshot().getSecurityInfo());
invalidateOptionsMenu(); invalidateOptionsMenu();
return true; return true;
} }
@ -1306,7 +1300,7 @@ public class ConversationParentFragment extends Fragment
private void handleInviteLink() { private void handleInviteLink() {
String inviteText = getString(R.string.ConversationActivity_lets_switch_to_signal, getString(R.string.install_url)); String inviteText = getString(R.string.ConversationActivity_lets_switch_to_signal, getString(R.string.install_url));
if (isDefaultSms) { if (viewModel.isDefaultSmsApplication()) {
composeText.appendInvite(inviteText); composeText.appendInvite(inviteText);
} else { } else {
Intent intent = new Intent(Intent.ACTION_SENDTO); Intent intent = new Intent(Intent.ACTION_SENDTO);
@ -1496,7 +1490,7 @@ public class ConversationParentFragment extends Fragment
} }
private void handleAddAttachment() { private void handleAddAttachment() {
if (viewModel.getConversationStateSnapshot().isMmsEnabled() || isSecureText) { if (viewModel.getConversationStateSnapshot().isMmsEnabled() || viewModel.isPushAvailable()) {
viewModel.getRecentMedia().removeObservers(this); viewModel.getRecentMedia().removeObservers(this);
if (attachmentKeyboardStub.resolved() && container.isInputOpen() && container.getCurrentInput() == attachmentKeyboardStub.get()) { if (attachmentKeyboardStub.resolved() && container.isInputOpen() && container.getCurrentInput() == attachmentKeyboardStub.get()) {
@ -1570,14 +1564,11 @@ public class ConversationParentFragment extends Fragment
@Override @Override
public void onCanceled() { } public void onCanceled() { }
private void handleSecurityChange(boolean isSecureText, boolean isDefaultSms) { private void handleSecurityChange(@NonNull ConversationSecurityInfo conversationSecurityInfo) {
Log.i(TAG, "handleSecurityChange(" + isSecureText + ", " + isDefaultSms + ")"); Log.i(TAG, "handleSecurityChange(" + conversationSecurityInfo + ")");
this.isSecureText = isSecureText; boolean isPushAvailable = conversationSecurityInfo.isPushAvailable();
this.isDefaultSms = isDefaultSms; boolean isMediaMessage = recipient.get().isMmsGroup() || attachmentManager.isAttachmentPresent();
this.isSecurityInitialized = true;
boolean isMediaMessage = recipient.get().isMmsGroup() || attachmentManager.isAttachmentPresent();
sendButton.resetAvailableTransports(isMediaMessage); sendButton.resetAvailableTransports(isMediaMessage);
@ -1588,14 +1579,14 @@ public class ConversationParentFragment extends Fragment
smsEnabled = false; smsEnabled = false;
} }
if (!isSecureText && !isPushGroupConversation() && !recipient.get().isServiceIdOnly() && !recipient.get().isReleaseNotes() && smsEnabled) { if (!isPushAvailable && !isPushGroupConversation() && !recipient.get().isServiceIdOnly() && !recipient.get().isReleaseNotes() && smsEnabled) {
sendButton.disableTransportType(MessageSendType.TransportType.SIGNAL); sendButton.disableTransportType(MessageSendType.TransportType.SIGNAL);
} }
if (!recipient.get().isPushGroup() && recipient.get().isForceSmsSelection() && smsEnabled) { if (!recipient.get().isPushGroup() && recipient.get().isForceSmsSelection() && smsEnabled) {
sendButton.setDefaultTransport(MessageSendType.TransportType.SMS); sendButton.setDefaultTransport(MessageSendType.TransportType.SMS);
} else { } else {
if (isSecureText || isPushGroupConversation() || recipient.get().isServiceIdOnly() || recipient.get().isReleaseNotes() || !smsEnabled) { if (isPushAvailable || isPushGroupConversation() || recipient.get().isServiceIdOnly() || recipient.get().isReleaseNotes() || !smsEnabled) {
sendButton.setDefaultTransport(MessageSendType.TransportType.SIGNAL); sendButton.setDefaultTransport(MessageSendType.TransportType.SIGNAL);
} else { } else {
sendButton.setDefaultTransport(MessageSendType.TransportType.SMS); sendButton.setDefaultTransport(MessageSendType.TransportType.SMS);
@ -1604,7 +1595,7 @@ public class ConversationParentFragment extends Fragment
calculateCharactersRemaining(); calculateCharactersRemaining();
invalidateOptionsMenu(); invalidateOptionsMenu();
setBlockedUserState(recipient.get(), isSecureText, isDefaultSms); setBlockedUserState(recipient.get(), conversationSecurityInfo);
onSecurityUpdated(); onSecurityUpdated();
} }
@ -1885,7 +1876,7 @@ public class ConversationParentFragment extends Fragment
reminderView.get().showReminder(new ServiceOutageReminder(context)); reminderView.get().showReminder(new ServiceOutageReminder(context));
} else if (SignalStore.account().isRegistered() && } else if (SignalStore.account().isRegistered() &&
TextSecurePreferences.isShowInviteReminders(context) && TextSecurePreferences.isShowInviteReminders(context) &&
!isSecureText && !viewModel.isPushAvailable() &&
inviteReminder.isPresent() && inviteReminder.isPresent() &&
!recipient.get().isGroup()) { !recipient.get().isGroup()) {
reminderView.get().setOnActionClickListener(this::handleReminderAction); reminderView.get().setOnActionClickListener(this::handleReminderAction);
@ -1995,7 +1986,7 @@ public class ConversationParentFragment extends Fragment
unverifiedBannerView.get().hide(); unverifiedBannerView.get().hide();
} }
titleView.setVerified(isSecureText && identityRecords.isVerified() && !recipient.get().isSelf()); titleView.setVerified(viewModel.isPushAvailable() && identityRecords.isVerified() && !recipient.get().isSelf());
future.set(true); future.set(true);
} }
@ -2508,7 +2499,7 @@ public class ConversationParentFragment extends Fragment
} }
private void initializeProfiles() { private void initializeProfiles() {
if (!isSecureText) { if (!viewModel.isPushAvailable()) {
Log.i(TAG, "SMS contact, no profile fetch needed."); Log.i(TAG, "SMS contact, no profile fetch needed.");
return; return;
} }
@ -2529,7 +2520,7 @@ public class ConversationParentFragment extends Fragment
Log.i(TAG, "onModified(" + recipient.getId() + ") " + recipient.getRegistered()); Log.i(TAG, "onModified(" + recipient.getId() + ") " + recipient.getRegistered());
titleView.setTitle(glideRequests, recipient); titleView.setTitle(glideRequests, recipient);
titleView.setVerified(identityRecords.isVerified() && !recipient.isSelf()); titleView.setVerified(identityRecords.isVerified() && !recipient.isSelf());
setBlockedUserState(recipient, isSecureText, isDefaultSms); setBlockedUserState(recipient, viewModel.getConversationStateSnapshot().getSecurityInfo());
updateReminders(); updateReminders();
updateDefaultSubscriptionId(recipient.getDefaultSubscriptionId()); updateDefaultSubscriptionId(recipient.getDefaultSubscriptionId());
updatePaymentsAvailable(); updatePaymentsAvailable();
@ -2618,7 +2609,7 @@ public class ConversationParentFragment extends Fragment
return new SettableFuture<>(false); return new SettableFuture<>(false);
} }
if (MediaType.VCARD.equals(mediaType) && isSecureText) { if (MediaType.VCARD.equals(mediaType) && viewModel.isPushAvailable()) {
openContactShareEditor(uri); openContactShareEditor(uri);
return new SettableFuture<>(false); return new SettableFuture<>(false);
} else if (MediaType.IMAGE.equals(mediaType) || MediaType.GIF.equals(mediaType) || MediaType.VIDEO.equals(mediaType)) { } else if (MediaType.IMAGE.equals(mediaType) || MediaType.GIF.equals(mediaType) || MediaType.VIDEO.equals(mediaType)) {
@ -2768,13 +2759,18 @@ public class ConversationParentFragment extends Fragment
return future; return future;
} }
private void setBlockedUserState(Recipient recipient, boolean isSecureText, boolean isDefaultSms) { private void setBlockedUserState(Recipient recipient, @NonNull ConversationSecurityInfo conversationSecurityInfo) {
if (!isSecureText && isPushGroupConversation()) { if (!conversationSecurityInfo.isInitialized()) {
Log.i(TAG, "Ignoring blocked state update for uninitialized security info.");
return;
}
if (!conversationSecurityInfo.isPushAvailable() && isPushGroupConversation()) {
unblockButton.setVisibility(View.GONE); unblockButton.setVisibility(View.GONE);
inputPanel.setHideForBlockedState(true); inputPanel.setHideForBlockedState(true);
makeDefaultSmsButton.setVisibility(View.GONE); makeDefaultSmsButton.setVisibility(View.GONE);
registerButton.setVisibility(View.VISIBLE); registerButton.setVisibility(View.VISIBLE);
} else if (!isSecureText && !isDefaultSms && recipient.hasSmsAddress()) { } else if (!conversationSecurityInfo.isPushAvailable() && !conversationSecurityInfo.isDefaultSmsApplication() && recipient.hasSmsAddress()) {
unblockButton.setVisibility(View.GONE); unblockButton.setVisibility(View.GONE);
inputPanel.setHideForBlockedState(true); inputPanel.setHideForBlockedState(true);
makeDefaultSmsButton.setVisibility(View.VISIBLE); makeDefaultSmsButton.setVisibility(View.VISIBLE);
@ -3046,7 +3042,7 @@ public class ConversationParentFragment extends Fragment
final boolean clearComposeBox, final boolean clearComposeBox,
final @Nullable String metricId) final @Nullable String metricId)
{ {
if (!isDefaultSms && sendType.usesSmsTransport() && recipient.get().hasSmsAddress()) { if (!viewModel.isDefaultSmsApplication() && sendType.usesSmsTransport() && recipient.get().hasSmsAddress()) {
showDefaultSmsPrompt(); showDefaultSmsPrompt();
return new SettableFuture<>(null); return new SettableFuture<>(null);
} }
@ -3106,7 +3102,7 @@ public class ConversationParentFragment extends Fragment
private void sendTextMessage(@NonNull MessageSendType sendType, final long expiresIn, final boolean initiating, final @Nullable String metricId) private void sendTextMessage(@NonNull MessageSendType sendType, final long expiresIn, final boolean initiating, final @Nullable String metricId)
throws InvalidMessageException throws InvalidMessageException
{ {
if (!isDefaultSms && sendType.usesSmsTransport() && recipient.get().hasSmsAddress()) { if (!viewModel.isDefaultSmsApplication() && sendType.usesSmsTransport() && recipient.get().hasSmsAddress()) {
showDefaultSmsPrompt(); showDefaultSmsPrompt();
return; return;
} }
@ -3189,7 +3185,7 @@ public class ConversationParentFragment extends Fragment
} }
private void updateLinkPreviewState() { private void updateLinkPreviewState() {
if (SignalStore.settings().isLinkPreviewsEnabled() && isSecureText && !sendButton.getSelectedSendType().usesSmsTransport() && !attachmentManager.isAttachmentPresent() && getContext() != null) { if (SignalStore.settings().isLinkPreviewsEnabled() && viewModel.isPushAvailable() && !sendButton.getSelectedSendType().usesSmsTransport() && !attachmentManager.isAttachmentPresent() && getContext() != null) {
linkPreviewViewModel.onEnabled(); linkPreviewViewModel.onEnabled();
linkPreviewViewModel.onTextChanged(requireContext(), composeText.getTextTrimmed().toString(), composeText.getSelectionStart(), composeText.getSelectionEnd()); linkPreviewViewModel.onTextChanged(requireContext(), composeText.getTextTrimmed().toString(), composeText.getSelectionStart(), composeText.getSelectionEnd());
} else { } else {
@ -3464,7 +3460,7 @@ public class ConversationParentFragment extends Fragment
@Override @Override
public boolean isMms() { public boolean isMms() {
return !isSecureText; return !viewModel.isPushAvailable();
} }
@Override @Override
@ -3651,7 +3647,7 @@ public class ConversationParentFragment extends Fragment
@Override @Override
public void onTextChanged(String text) { public void onTextChanged(String text) {
if (enabled && threadId > 0 && isSecureText && !isSmsForced() && !recipient.get().isBlocked() && !recipient.get().isSelf()) { if (enabled && threadId > 0 && viewModel.isPushAvailable() && !isSmsForced() && !recipient.get().isBlocked() && !recipient.get().isSelf()) {
TypingStatusSender typingStatusSender = ApplicationDependencies.getTypingStatusSender(); TypingStatusSender typingStatusSender = ApplicationDependencies.getTypingStatusSender();
if (text.length() == 0) { if (text.length() == 0) {
@ -3974,7 +3970,7 @@ public class ConversationParentFragment extends Fragment
@Override @Override
public void onAttachmentChanged() { public void onAttachmentChanged() {
handleSecurityChange(isSecureText, isDefaultSms); handleSecurityChange(viewModel.getConversationStateSnapshot().getSecurityInfo());
updateToggleButtonState(); updateToggleButtonState();
updateLinkPreviewState(); updateLinkPreviewState();
} }

Wyświetl plik

@ -329,6 +329,14 @@ public class ConversationViewModel extends ViewModel {
conversationStateTick.onNext(Unit.INSTANCE); conversationStateTick.onNext(Unit.INSTANCE);
} }
boolean isDefaultSmsApplication() {
return conversationStateStore.getState().getSecurityInfo().isDefaultSmsApplication();
}
boolean isPushAvailable() {
return conversationStateStore.getState().getSecurityInfo().isPushAvailable();
}
@NonNull ConversationState getConversationStateSnapshot() { @NonNull ConversationState getConversationStateSnapshot() {
return conversationStateStore.getState(); return conversationStateStore.getState();
} }