Fragmentize MessageDetails.

This commit is contained in:
Alex Hart
2022-02-11 14:03:51 -04:00
committed by Greyson Parrelli
parent b3f4e0a7fe
commit fb1ba5a13e
6 changed files with 50 additions and 86 deletions

View File

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