mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-21 10:17:56 +00:00
Fragmentize MessageDetails.
This commit is contained in:
committed by
Greyson Parrelli
parent
b3f4e0a7fe
commit
fb1ba5a13e
@@ -123,7 +123,7 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceViewOnceOpenJob;
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
|
||||
import org.thoughtcrime.securesms.longmessage.LongMessageFragment;
|
||||
import org.thoughtcrime.securesms.messagedetails.MessageDetailsActivity;
|
||||
import org.thoughtcrime.securesms.messagedetails.MessageDetailsFragment;
|
||||
import org.thoughtcrime.securesms.messagerequests.MessageRequestState;
|
||||
import org.thoughtcrime.securesms.messagerequests.MessageRequestViewModel;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
@@ -1005,7 +1005,7 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
|
||||
}
|
||||
|
||||
private void handleDisplayDetails(ConversationMessage message) {
|
||||
startActivity(MessageDetailsActivity.getIntentForMessageDetails(requireContext(), message.getMessageRecord(), recipient.getId(), threadId));
|
||||
MessageDetailsFragment.create(message.getMessageRecord(), recipient.getId()).show(getChildFragmentManager(), null);
|
||||
}
|
||||
|
||||
private void handleForwardMessageParts(Set<MultiselectPart> multiselectParts) {
|
||||
|
||||
@@ -212,7 +212,7 @@ import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity;
|
||||
import org.thoughtcrime.securesms.mediasend.Media;
|
||||
import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult;
|
||||
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity;
|
||||
import org.thoughtcrime.securesms.messagedetails.MessageDetailsActivity;
|
||||
import org.thoughtcrime.securesms.messagedetails.MessageDetailsFragment;
|
||||
import org.thoughtcrime.securesms.messagerequests.MessageRequestState;
|
||||
import org.thoughtcrime.securesms.messagerequests.MessageRequestViewModel;
|
||||
import org.thoughtcrime.securesms.messagerequests.MessageRequestsBottomView;
|
||||
@@ -3730,7 +3730,7 @@ public class ConversationParentFragment extends Fragment
|
||||
@Override
|
||||
public void onMessageWithErrorClicked(@NonNull MessageRecord messageRecord) {
|
||||
if (messageRecord.isIdentityMismatchFailure()) {
|
||||
SafetyNumberChangeDialog.show(requireActivity(), messageRecord);
|
||||
SafetyNumberChangeDialog.show(requireContext(), getChildFragmentManager(), messageRecord);
|
||||
} else if (messageRecord.hasFailedWithNetworkFailures()) {
|
||||
new AlertDialog.Builder(requireContext())
|
||||
.setMessage(R.string.conversation_activity__message_could_not_be_sent)
|
||||
@@ -3738,7 +3738,7 @@ public class ConversationParentFragment extends Fragment
|
||||
.setPositiveButton(R.string.conversation_activity__send, (dialog, which) -> MessageSender.resend(requireContext(), messageRecord))
|
||||
.show();
|
||||
} else {
|
||||
startActivity(MessageDetailsActivity.getIntentForMessageDetails(requireContext(), messageRecord, messageRecord.getRecipient().getId(), messageRecord.getThreadId()));
|
||||
MessageDetailsFragment.create(messageRecord, recipient.getId()).show(getChildFragmentManager(), null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.conversation.ui.error;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
@@ -77,9 +78,9 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa
|
||||
fragment.show(fragmentManager, SAFETY_NUMBER_DIALOG);
|
||||
}
|
||||
|
||||
public static void show(@NonNull FragmentActivity fragmentActivity, @NonNull MessageRecord messageRecord) {
|
||||
public static void show(@NonNull Context context, @NonNull FragmentManager fragmentManager, @NonNull MessageRecord messageRecord) {
|
||||
List<String> ids = Stream.of(messageRecord.getIdentityKeyMismatches())
|
||||
.map(mismatch -> mismatch.getRecipientId(fragmentActivity).serialize())
|
||||
.map(mismatch -> mismatch.getRecipientId(context).serialize())
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
@@ -90,7 +91,7 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa
|
||||
arguments.putInt(CONTINUE_TEXT_RESOURCE_EXTRA, R.string.safety_number_change_dialog__send_anyway);
|
||||
SafetyNumberChangeDialog fragment = new SafetyNumberChangeDialog();
|
||||
fragment.setArguments(arguments);
|
||||
fragment.show(fragmentActivity.getSupportFragmentManager(), SAFETY_NUMBER_DIALOG);
|
||||
fragment.show(fragmentManager, SAFETY_NUMBER_DIALOG);
|
||||
}
|
||||
|
||||
public static void showForCall(@NonNull FragmentManager fragmentManager, @NonNull RecipientId recipientId) {
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
package org.thoughtcrime.securesms.messagedetails;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.FullScreenDialogFragment;
|
||||
import org.thoughtcrime.securesms.components.recyclerview.ToolbarShadowAnimationHelper;
|
||||
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
|
||||
import org.thoughtcrime.securesms.conversation.colors.RecyclerViewColorizer;
|
||||
@@ -27,17 +26,14 @@ import org.thoughtcrime.securesms.messagedetails.MessageDetailsViewModel.Factory
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
public final class MessageDetailsFragment extends FullScreenDialogFragment {
|
||||
|
||||
private static final String MESSAGE_ID_EXTRA = "message_id";
|
||||
private static final String THREAD_ID_EXTRA = "thread_id";
|
||||
private static final String TYPE_EXTRA = "type";
|
||||
private static final String RECIPIENT_EXTRA = "recipient_id";
|
||||
|
||||
@@ -47,60 +43,53 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
private Colorizer colorizer;
|
||||
private RecyclerViewColorizer recyclerViewColorizer;
|
||||
|
||||
private DynamicTheme dynamicTheme = new DynamicNoActionBarTheme();
|
||||
public static @NonNull DialogFragment create(@NonNull MessageRecord message, @NonNull RecipientId recipientId) {
|
||||
DialogFragment dialogFragment = new MessageDetailsFragment();
|
||||
Bundle args = new Bundle();
|
||||
|
||||
public static @NonNull Intent getIntentForMessageDetails(@NonNull Context context, @NonNull MessageRecord message, @NonNull RecipientId recipientId, long threadId) {
|
||||
Intent intent = new Intent(context, MessageDetailsActivity.class);
|
||||
intent.putExtra(MESSAGE_ID_EXTRA, message.getId());
|
||||
intent.putExtra(THREAD_ID_EXTRA, threadId);
|
||||
intent.putExtra(TYPE_EXTRA, message.isMms() ? MmsSmsDatabase.MMS_TRANSPORT : MmsSmsDatabase.SMS_TRANSPORT);
|
||||
intent.putExtra(RECIPIENT_EXTRA, recipientId);
|
||||
return intent;
|
||||
args.putLong(MESSAGE_ID_EXTRA, message.getId());
|
||||
args.putString(TYPE_EXTRA, message.isMms() ? MmsSmsDatabase.MMS_TRANSPORT : MmsSmsDatabase.SMS_TRANSPORT);
|
||||
args.putParcelable(RECIPIENT_EXTRA, recipientId);
|
||||
|
||||
dialogFragment.setArguments(args);
|
||||
|
||||
return dialogFragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPreCreate() {
|
||||
dynamicTheme.onCreate(this);
|
||||
protected int getTitle() {
|
||||
return R.string.AndroidManifest__message_details;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState, boolean ready) {
|
||||
super.onCreate(savedInstanceState, ready);
|
||||
setContentView(R.layout.message_details_activity);
|
||||
protected int getDialogLayoutResource() {
|
||||
return R.layout.message_details_fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
glideRequests = GlideApp.with(this);
|
||||
|
||||
initializeList();
|
||||
initializeList(view);
|
||||
initializeViewModel();
|
||||
initializeActionBar();
|
||||
initializeVideoPlayer();
|
||||
initializeVideoPlayer(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
dynamicTheme.onResume(this);
|
||||
adapter.resumeMessageExpirationTimer();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
adapter.pauseMessageExpirationTimer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
onBackPressed();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void initializeList() {
|
||||
RecyclerView list = findViewById(R.id.message_details_list);
|
||||
View toolbarShadow = findViewById(R.id.toolbar_shadow);
|
||||
private void initializeList(@NonNull View view) {
|
||||
RecyclerView list = view.findViewById(R.id.message_details_list);
|
||||
View toolbarShadow = view.findViewById(R.id.toolbar_shadow);
|
||||
|
||||
colorizer = new Colorizer();
|
||||
adapter = new MessageDetailsAdapter(this, glideRequests, colorizer, this::onErrorClicked);
|
||||
@@ -112,15 +101,15 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
}
|
||||
|
||||
private void initializeViewModel() {
|
||||
final RecipientId recipientId = getIntent().getParcelableExtra(RECIPIENT_EXTRA);
|
||||
final String type = getIntent().getStringExtra(TYPE_EXTRA);
|
||||
final Long messageId = getIntent().getLongExtra(MESSAGE_ID_EXTRA, -1);
|
||||
final RecipientId recipientId = requireArguments().getParcelable(RECIPIENT_EXTRA);
|
||||
final String type = requireArguments().getString(TYPE_EXTRA);
|
||||
final Long messageId = requireArguments().getLong(MESSAGE_ID_EXTRA, -1);
|
||||
final Factory factory = new Factory(recipientId, type, messageId);
|
||||
|
||||
viewModel = ViewModelProviders.of(this, factory).get(MessageDetailsViewModel.class);
|
||||
viewModel.getMessageDetails().observe(this, details -> {
|
||||
if (details == null) {
|
||||
finish();
|
||||
dismissAllowingStateLoss();
|
||||
} else {
|
||||
adapter.submitList(convertToRows(details));
|
||||
}
|
||||
@@ -128,21 +117,15 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
viewModel.getRecipient().observe(this, recipient -> recyclerViewColorizer.setChatColors(recipient.getChatColors()));
|
||||
}
|
||||
|
||||
private void initializeVideoPlayer() {
|
||||
FrameLayout videoContainer = findViewById(R.id.video_container);
|
||||
RecyclerView recyclerView = findViewById(R.id.message_details_list);
|
||||
List<GiphyMp4ProjectionPlayerHolder> holders = GiphyMp4ProjectionPlayerHolder.injectVideoViews(this, getLifecycle(), videoContainer, 1);
|
||||
private void initializeVideoPlayer(@NonNull View view) {
|
||||
FrameLayout videoContainer = view.findViewById(R.id.video_container);
|
||||
RecyclerView recyclerView = view.findViewById(R.id.message_details_list);
|
||||
List<GiphyMp4ProjectionPlayerHolder> holders = GiphyMp4ProjectionPlayerHolder.injectVideoViews(requireContext(), getLifecycle(), videoContainer, 1);
|
||||
GiphyMp4ProjectionRecycler callback = new GiphyMp4ProjectionRecycler(holders);
|
||||
|
||||
GiphyMp4PlaybackController.attach(recyclerView, callback, 1);
|
||||
}
|
||||
|
||||
private void initializeActionBar() {
|
||||
setSupportActionBar(findViewById(R.id.toolbar));
|
||||
requireSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
requireSupportActionBar().setTitle(R.string.AndroidManifest__message_details);
|
||||
}
|
||||
|
||||
private List<MessageDetailsViewState<?>> convertToRows(MessageDetails details) {
|
||||
List<MessageDetailsViewState<?>> list = new ArrayList<>();
|
||||
|
||||
@@ -175,6 +158,6 @@ public final class MessageDetailsActivity extends PassphraseRequiredActivity {
|
||||
}
|
||||
|
||||
private void onErrorClicked(@NonNull MessageRecord messageRecord) {
|
||||
SafetyNumberChangeDialog.show(this, messageRecord);
|
||||
SafetyNumberChangeDialog.show(requireContext(), getChildFragmentManager(), messageRecord);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user