From fb1ba5a13ee139d103d79b0edaf5f6856a3ed35f Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 11 Feb 2022 14:03:51 -0400 Subject: [PATCH] Fragmentize MessageDetails. --- app/src/main/AndroidManifest.xml | 6 -- .../conversation/ConversationFragment.java | 4 +- .../ConversationParentFragment.java | 6 +- .../ui/error/SafetyNumberChangeDialog.java | 7 +- ...ivity.java => MessageDetailsFragment.java} | 91 ++++++++----------- ...ivity.xml => message_details_fragment.xml} | 22 +---- 6 files changed, 50 insertions(+), 86 deletions(-) rename app/src/main/java/org/thoughtcrime/securesms/messagedetails/{MessageDetailsActivity.java => MessageDetailsFragment.java} (63%) rename app/src/main/res/layout/{message_details_activity.xml => message_details_fragment.xml} (62%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 747388f4ec..fb1732b622 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -316,12 +316,6 @@ android:theme="@style/TextSecure.LightTheme.Popup" android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" /> - - diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 3c1300ef91..3bbc159fcf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -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 multiselectParts) { 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 63bbd53ecc..fde50e3e3e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -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); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java index f2d7a0ec26..62e4098f8d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog.java @@ -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 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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java similarity index 63% rename from app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java index 910724a6fe..17d7508e26 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java @@ -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 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 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> convertToRows(MessageDetails details) { List> 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); } } diff --git a/app/src/main/res/layout/message_details_activity.xml b/app/src/main/res/layout/message_details_fragment.xml similarity index 62% rename from app/src/main/res/layout/message_details_activity.xml rename to app/src/main/res/layout/message_details_fragment.xml index 175e47c19b..39b62fe81c 100644 --- a/app/src/main/res/layout/message_details_activity.xml +++ b/app/src/main/res/layout/message_details_fragment.xml @@ -1,24 +1,10 @@ - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file