Display LongMessage in dialog fragment.

fork-5.53.8
Alex Hart 2022-02-11 11:48:58 -04:00 zatwierdzone przez GitHub
rodzic ac3196bbb3
commit aa6fa45949
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
6 zmienionych plików z 52 dodań i 73 usunięć

Wyświetl plik

@ -308,8 +308,6 @@
android:allowEmbedded="true" android:allowEmbedded="true"
android:resizeableActivity="true" /> android:resizeableActivity="true" />
<activity android:name=".longmessage.LongMessageActivity" />
<activity android:name=".conversation.ConversationPopupActivity" <activity android:name=".conversation.ConversationPopupActivity"
android:windowSoftInputMode="stateVisible" android:windowSoftInputMode="stateVisible"
android:launchMode="singleTask" android:launchMode="singleTask"

Wyświetl plik

@ -35,7 +35,11 @@ public abstract class FullScreenDialogFragment extends DialogFragment {
View view = inflater.inflate(R.layout.full_screen_dialog_fragment, container, false); View view = inflater.inflate(R.layout.full_screen_dialog_fragment, container, false);
inflater.inflate(getDialogLayoutResource(), view.findViewById(R.id.full_screen_dialog_content), true); inflater.inflate(getDialogLayoutResource(), view.findViewById(R.id.full_screen_dialog_content), true);
toolbar = view.findViewById(R.id.full_screen_dialog_toolbar); toolbar = view.findViewById(R.id.full_screen_dialog_toolbar);
toolbar.setTitle(getTitle());
if (getTitle() != -1) {
toolbar.setTitle(getTitle());
}
toolbar.setNavigationOnClickListener(v -> onNavigateUp()); toolbar.setNavigationOnClickListener(v -> onNavigateUp());
return view; return view;
} }

Wyświetl plik

@ -122,7 +122,7 @@ import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
import org.thoughtcrime.securesms.jobs.MultiDeviceViewOnceOpenJob; import org.thoughtcrime.securesms.jobs.MultiDeviceViewOnceOpenJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.longmessage.LongMessageActivity; import org.thoughtcrime.securesms.longmessage.LongMessageFragment;
import org.thoughtcrime.securesms.messagedetails.MessageDetailsActivity; import org.thoughtcrime.securesms.messagedetails.MessageDetailsActivity;
import org.thoughtcrime.securesms.messagerequests.MessageRequestState; import org.thoughtcrime.securesms.messagerequests.MessageRequestState;
import org.thoughtcrime.securesms.messagerequests.MessageRequestViewModel; import org.thoughtcrime.securesms.messagerequests.MessageRequestViewModel;
@ -1575,7 +1575,7 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
@Override @Override
public void onMoreTextClicked(@NonNull RecipientId conversationRecipientId, long messageId, boolean isMms) { public void onMoreTextClicked(@NonNull RecipientId conversationRecipientId, long messageId, boolean isMms) {
if (getContext() != null && getActivity() != null) { if (getContext() != null && getActivity() != null) {
startActivity(LongMessageActivity.getIntent(getContext(), conversationRecipientId, messageId, isMms)); LongMessageFragment.create(messageId, isMms).show(getChildFragmentManager(), null);
} }
} }

Wyświetl plik

@ -1,7 +1,5 @@
package org.thoughtcrime.securesms.longmessage; package org.thoughtcrime.securesms.longmessage;
import android.content.Context;
import android.content.Intent;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.text.SpannableString;
@ -9,48 +7,41 @@ import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan; import android.text.style.URLSpan;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.text.util.LinkifyCompat; import androidx.core.text.util.LinkifyCompat;
import androidx.lifecycle.ViewModelProviders; import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.ConversationItemFooter; import org.thoughtcrime.securesms.components.ConversationItemFooter;
import org.thoughtcrime.securesms.components.FullScreenDialogFragment;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView; import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.conversation.colors.ChatColors;
import org.thoughtcrime.securesms.conversation.colors.ColorizerView; import org.thoughtcrime.securesms.conversation.colors.ColorizerView;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil; import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.Projection;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.views.Stub; import org.thoughtcrime.securesms.util.views.Stub;
import java.util.Collections; import java.util.Collections;
import java.util.Locale;
import static org.thoughtcrime.securesms.util.ThemeUtil.isDarkTheme; public class LongMessageFragment extends FullScreenDialogFragment {
public class LongMessageActivity extends PassphraseRequiredActivity {
private static final String KEY_CONVERSATION_RECIPIENT = "recipient_id";
private static final String KEY_MESSAGE_ID = "message_id"; private static final String KEY_MESSAGE_ID = "message_id";
private static final String KEY_IS_MMS = "is_mms"; private static final String KEY_IS_MMS = "is_mms";
private static final int MAX_DISPLAY_LENGTH = 64 * 1024; private static final int MAX_DISPLAY_LENGTH = 64 * 1024;
private final DynamicLanguage dynamicLanguage = new DynamicLanguage();
private final DynamicTheme dynamicTheme = new DynamicTheme();
private Stub<ViewGroup> sentBubble; private Stub<ViewGroup> sentBubble;
private Stub<ViewGroup> receivedBubble; private Stub<ViewGroup> receivedBubble;
private ColorizerView colorizerView; private ColorizerView colorizerView;
@ -58,77 +49,63 @@ public class LongMessageActivity extends PassphraseRequiredActivity {
private LongMessageViewModel viewModel; private LongMessageViewModel viewModel;
public static Intent getIntent(@NonNull Context context, @NonNull RecipientId conversationRecipient, long messageId, boolean isMms) { public static DialogFragment create(long messageId, boolean isMms) {
Intent intent = new Intent(context, LongMessageActivity.class); DialogFragment fragment = new LongMessageFragment();
intent.putExtra(KEY_CONVERSATION_RECIPIENT, conversationRecipient); Bundle args = new Bundle();
intent.putExtra(KEY_MESSAGE_ID, messageId);
intent.putExtra(KEY_IS_MMS, isMms); args.putLong(KEY_MESSAGE_ID, messageId);
return intent; args.putBoolean(KEY_IS_MMS, isMms);
fragment.setArguments(args);
return fragment;
}
@Override
protected int getTitle() {
return -1;
} }
@Override @Override
protected void onPreCreate() { protected int getDialogLayoutResource() {
super.onPreCreate(); return R.layout.longmessage_fragment;
dynamicLanguage.onCreate(this);
dynamicTheme.onCreate(this);
} }
@Override @Override
protected void onCreate(Bundle savedInstanceState, boolean ready) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState, ready); sentBubble = new Stub<>(view.findViewById(R.id.longmessage_sent_stub));
setContentView(R.layout.longmessage_activity); receivedBubble = new Stub<>(view.findViewById(R.id.longmessage_received_stub));
colorizerView = view.findViewById(R.id.colorizer);
sentBubble = new Stub<>(findViewById(R.id.longmessage_sent_stub));
receivedBubble = new Stub<>(findViewById(R.id.longmessage_received_stub));
colorizerView = findViewById(R.id.colorizer);
bubbleLayoutListener = new BubbleLayoutListener(); bubbleLayoutListener = new BubbleLayoutListener();
initViewModel(getIntent().getLongExtra(KEY_MESSAGE_ID, -1), getIntent().getBooleanExtra(KEY_IS_MMS, false)); initViewModel(requireArguments().getLong(KEY_MESSAGE_ID, -1), requireArguments().getBoolean(KEY_IS_MMS, false));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
protected void onResume() {
super.onResume();
dynamicLanguage.onResume(this);
dynamicTheme.onResume(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return false;
} }
private void initViewModel(long messageId, boolean isMms) { private void initViewModel(long messageId, boolean isMms) {
viewModel = ViewModelProviders.of(this, new LongMessageViewModel.Factory(getApplication(), new LongMessageRepository(this), messageId, isMms)) viewModel = new ViewModelProvider(this,
new LongMessageViewModel.Factory(requireActivity().getApplication(),
new LongMessageRepository(), messageId, isMms))
.get(LongMessageViewModel.class); .get(LongMessageViewModel.class);
viewModel.getMessage().observe(this, message -> { viewModel.getMessage().observe(this, message -> {
if (message == null) return; if (message == null) return;
if (!message.isPresent()) { if (!message.isPresent()) {
Toast.makeText(this, R.string.LongMessageActivity_unable_to_find_message, Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), R.string.LongMessageActivity_unable_to_find_message, Toast.LENGTH_SHORT).show();
finish(); dismissAllowingStateLoss();
return; return;
} }
if (message.get().getMessageRecord().isOutgoing()) { if (message.get().getMessageRecord().isOutgoing()) {
getSupportActionBar().setTitle(getString(R.string.LongMessageActivity_your_message)); toolbar.setTitle(getString(R.string.LongMessageActivity_your_message));
} else { } else {
Recipient recipient = message.get().getMessageRecord().getRecipient(); Recipient recipient = message.get().getMessageRecord().getRecipient();
String name = recipient.getDisplayName(this); String name = recipient.getDisplayName(requireContext());
getSupportActionBar().setTitle(getString(R.string.LongMessageActivity_message_from_s, name));
toolbar.setTitle(getString(R.string.LongMessageActivity_message_from_s, name));
} }
ViewGroup bubble; ViewGroup bubble;
@ -142,13 +119,13 @@ public class LongMessageActivity extends PassphraseRequiredActivity {
bubbleLayoutListener.onLayoutChange(bubble, 0, 0, 0, 0, 0, 0, 0, 0); bubbleLayoutListener.onLayoutChange(bubble, 0, 0, 0, 0, 0, 0, 0, 0);
} else { } else {
bubble = receivedBubble.get(); bubble = receivedBubble.get();
bubble.getBackground().setColorFilter(ContextCompat.getColor(this, R.color.signal_background_secondary), PorterDuff.Mode.MULTIPLY); bubble.getBackground().setColorFilter(ContextCompat.getColor(requireContext(), R.color.signal_background_secondary), PorterDuff.Mode.MULTIPLY);
} }
EmojiTextView text = bubble.findViewById(R.id.longmessage_text); EmojiTextView text = bubble.findViewById(R.id.longmessage_text);
ConversationItemFooter footer = bubble.findViewById(R.id.longmessage_footer); ConversationItemFooter footer = bubble.findViewById(R.id.longmessage_footer);
CharSequence trimmedBody = getTrimmedBody(message.get().getFullBody(this)); CharSequence trimmedBody = getTrimmedBody(message.get().getFullBody(requireContext()));
SpannableString styledBody = linkifyMessageBody(new SpannableString(trimmedBody)); SpannableString styledBody = linkifyMessageBody(new SpannableString(trimmedBody));
bubble.setVisibility(View.VISIBLE); bubble.setVisibility(View.VISIBLE);
@ -156,11 +133,11 @@ public class LongMessageActivity extends PassphraseRequiredActivity {
text.setMovementMethod(LinkMovementMethod.getInstance()); text.setMovementMethod(LinkMovementMethod.getInstance());
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, SignalStore.settings().getMessageFontSize()); text.setTextSize(TypedValue.COMPLEX_UNIT_SP, SignalStore.settings().getMessageFontSize());
if (!message.get().getMessageRecord().isOutgoing()) { if (!message.get().getMessageRecord().isOutgoing()) {
text.setMentionBackgroundTint(ContextCompat.getColor(this, isDarkTheme(this) ? R.color.core_grey_60 : R.color.core_grey_20)); text.setMentionBackgroundTint(ContextCompat.getColor(requireContext(), ThemeUtil.isDarkTheme(requireActivity()) ? R.color.core_grey_60 : R.color.core_grey_20));
} else { } else {
text.setMentionBackgroundTint(ContextCompat.getColor(this, R.color.transparent_black_40)); text.setMentionBackgroundTint(ContextCompat.getColor(requireContext(), R.color.transparent_black_40));
} }
footer.setMessageRecord(message.get().getMessageRecord(), dynamicLanguage.getCurrentLocale()); footer.setMessageRecord(message.get().getMessageRecord(), Locale.getDefault());
}); });
} }

Wyświetl plik

@ -31,7 +31,7 @@ class LongMessageRepository {
private final MessageDatabase mmsDatabase; private final MessageDatabase mmsDatabase;
private final MessageDatabase smsDatabase; private final MessageDatabase smsDatabase;
LongMessageRepository(@NonNull Context context) { LongMessageRepository() {
this.mmsDatabase = SignalDatabase.mms(); this.mmsDatabase = SignalDatabase.mms();
this.smsDatabase = SignalDatabase.sms(); this.smsDatabase = SignalDatabase.sms();
} }