Remove LifecycleViewHolder / Adapter.

fork-5.53.8
Alex Hart 2021-11-17 11:39:12 -04:00 zatwierdzone przez Cody Henthorne
rodzic 12ec0ca84c
commit 0ab66f81be
20 zmienionych plików z 117 dodań i 108 usunięć

Wyświetl plik

@ -35,6 +35,7 @@ public final class GroupMembersDialog {
.show();
GroupMemberListView memberListView = dialog.findViewById(R.id.list_members);
memberListView.initializeAdapter(fragmentActivity);
LiveGroup liveGroup = new LiveGroup(groupRecipient.requireGroupId());
LiveData<List<GroupMemberEntry.FullMember>> fullMembers = liveGroup.getFullMembers();

Wyświetl plik

@ -12,9 +12,6 @@ import androidx.annotation.VisibleForTesting
import androidx.appcompat.widget.AppCompatEditText
import androidx.core.animation.doOnEnd
import androidx.core.text.isDigitsOnly
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.google.android.material.button.MaterialButton
import org.signal.core.util.money.FiatMoney
import org.thoughtcrime.securesms.R
@ -56,7 +53,7 @@ data class Boost(
override fun areItemsTheSame(newItem: LoadingModel): Boolean = true
}
class LoadingViewHolder(itemView: View) : MappingViewHolder<LoadingModel>(itemView), DefaultLifecycleObserver {
class LoadingViewHolder(itemView: View) : MappingViewHolder<LoadingModel>(itemView) {
private val animator: Animator = AnimatorSet().apply {
val fadeTo25Animator = ObjectAnimator.ofFloat(itemView, "alpha", 0.8f, 0.25f).apply {
@ -68,17 +65,17 @@ data class Boost(
}
playSequentially(fadeTo25Animator, fadeTo80Animator)
doOnEnd { start() }
}
init {
lifecycle.addObserver(this)
doOnEnd {
if (itemView.isAttachedToWindow) {
start()
}
}
}
override fun bind(model: LoadingModel) {
}
override fun onResume(owner: LifecycleOwner) {
override fun onAttachedToWindow() {
if (animator.isStarted) {
animator.resume()
} else {
@ -86,7 +83,7 @@ data class Boost(
}
}
override fun onDestroy(owner: LifecycleOwner) {
override fun onDetachedFromWindow() {
animator.pause()
}
}

Wyświetl plik

@ -732,7 +732,7 @@ class ConversationSettingsFragment : DSLSettingsFragment(
}
private fun showGroupInvitesSentDialog(showGroupInvitesSentDialog: ConversationSettingsEvent.ShowGroupInvitesSentDialog) {
GroupInviteSentDialog.showInvitesSent(requireContext(), showGroupInvitesSentDialog.invitesSentTo)
GroupInviteSentDialog.showInvitesSent(requireContext(), viewLifecycleOwner, showGroupInvitesSentDialog.invitesSentTo)
}
private fun showMembersAdded(showMembersAdded: ConversationSettingsEvent.ShowMembersAdded) {

Wyświetl plik

@ -68,6 +68,7 @@ public final class ShowAdminsBottomSheetDialog extends BottomSheetDialogFragment
disposables.bindTo(getViewLifecycleOwner().getLifecycle());
GroupMemberListView list = view.findViewById(R.id.show_admin_list);
list.initializeAdapter(getViewLifecycleOwner());
list.setDisplayOnlyMembers(Collections.emptyList());
list.setRecipientClickListener(recipient -> {

Wyświetl plik

@ -10,6 +10,8 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
@ -18,9 +20,6 @@ import org.thoughtcrime.securesms.badges.BadgeImageView;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.LifecycleRecyclerAdapter;
import org.thoughtcrime.securesms.util.LifecycleViewHolder;
import org.thoughtcrime.securesms.util.Util;
import java.util.ArrayList;
@ -28,7 +27,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberListAdapter.ViewHolder> {
final class GroupMemberListAdapter extends RecyclerView.Adapter<GroupMemberListAdapter.ViewHolder> {
private static final int FULL_MEMBER = 0;
private static final int OWN_INVITE_PENDING = 1;
@ -41,14 +40,16 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
private final SelectionChangeListener selectionChangeListener = new SelectionChangeListener();
private final boolean selectable;
private final LifecycleOwner lifecycleOwner;
@Nullable private AdminActionsListener adminActionsListener;
@Nullable private RecipientClickListener recipientClickListener;
@Nullable private RecipientLongClickListener recipientLongClickListener;
@Nullable private RecipientSelectionChangeListener recipientSelectionChangeListener;
GroupMemberListAdapter(boolean selectable) {
this.selectable = selectable;
GroupMemberListAdapter(boolean selectable, @NonNull LifecycleOwner lifecycleOwner) {
this.selectable = selectable;
this.lifecycleOwner = lifecycleOwner;
}
void updateData(@NonNull List<? extends GroupMemberEntry> recipients) {
@ -78,6 +79,12 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
}
}
@Override
public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
super.onViewDetachedFromWindow(holder);
holder.unbind();
}
@Override
public @NonNull ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
@ -88,7 +95,8 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
recipientLongClickListener,
adminActionsListener,
selectionChangeListener,
selectable);
selectable,
lifecycleOwner);
case OWN_INVITE_PENDING:
return new OwnInvitePendingMemberViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.group_recipient_list_item, parent, false),
@ -96,20 +104,23 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
recipientLongClickListener,
adminActionsListener,
selectionChangeListener,
selectable);
selectable,
lifecycleOwner);
case OTHER_INVITE_PENDING_COUNT:
return new UnknownPendingMemberCountViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.group_recipient_list_item, parent, false),
adminActionsListener,
selectionChangeListener,
selectable);
selectable,
lifecycleOwner);
case NEW_GROUP_CANDIDATE:
return new NewGroupInviteeViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.group_new_candidate_recipient_list_item, parent, false),
recipientClickListener,
recipientLongClickListener,
selectionChangeListener,
selectable);
selectable,
lifecycleOwner);
case REQUESTING_MEMBER:
return new RequestingMemberViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.group_recipient_requesting_list_item, parent, false),
@ -117,7 +128,8 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
recipientLongClickListener,
adminActionsListener,
selectionChangeListener,
selectable);
selectable,
lifecycleOwner);
default:
throw new AssertionError();
@ -170,7 +182,7 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
return data.size();
}
static abstract class ViewHolder extends LifecycleViewHolder {
static abstract class ViewHolder extends RecyclerView.ViewHolder {
final Context context;
final AvatarImageView avatar;
@ -187,13 +199,19 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
@Nullable final AdminActionsListener adminActionsListener;
@Nullable final RecipientLongClickListener recipientLongClickListener;
final boolean selectable;
final LifecycleOwner lifecycleOwner;
final Observer<Boolean> busyObserver;
Runnable startListeningToBusyChanges;
Runnable stopListeningToBusyChanges;
ViewHolder(@NonNull View itemView,
@Nullable RecipientClickListener recipientClickListener,
@Nullable RecipientLongClickListener recipientLongClickListener,
@Nullable AdminActionsListener adminActionsListener,
@NonNull SelectionChangeListener selectionChangeListener,
boolean selectable)
boolean selectable,
@NonNull LifecycleOwner lifecycleOwner)
{
super(itemView);
@ -212,6 +230,19 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
this.adminActionsListener = adminActionsListener;
this.selectionChangeListener = selectionChangeListener;
this.selectable = selectable;
this.lifecycleOwner = lifecycleOwner;
this.busyObserver = this::onBusyChanged;
}
private void onBusyChanged(boolean busy) {
busyProgress.setVisibility(busy ? View.VISIBLE : View.GONE);
popupMenu.setVisibility(busy ? View.GONE : View.VISIBLE);
}
void unbind() {
if (stopListeningToBusyChanges != null) {
stopListeningToBusyChanges.run();
}
}
void bindRecipient(@NonNull Recipient recipient) {
@ -268,10 +299,8 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
itemView.setOnClickListener(null);
memberEntry.getBusy().observe(this, busy -> {
busyProgress.setVisibility(busy ? View.VISIBLE : View.GONE);
popupMenu.setVisibility(busy ? View.GONE : View.VISIBLE);
});
memberEntry.getBusy().observe(lifecycleOwner, busyObserver);
stopListeningToBusyChanges = () -> memberEntry.getBusy().removeObserver(busyObserver);
selected.setChecked(isSelected);
if (!selectable && !isSelected) {
@ -299,9 +328,10 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
@Nullable RecipientLongClickListener recipientLongClickListener,
@Nullable AdminActionsListener adminActionsListener,
@NonNull SelectionChangeListener selectionChangeListener,
boolean selectable)
boolean selectable,
@NonNull LifecycleOwner lifecycleOwner)
{
super(itemView, recipientClickListener, recipientLongClickListener, adminActionsListener, selectionChangeListener, selectable);
super(itemView, recipientClickListener, recipientLongClickListener, adminActionsListener, selectionChangeListener, selectable, lifecycleOwner);
}
@Override
@ -326,9 +356,10 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
@Nullable RecipientClickListener recipientClickListener,
@Nullable RecipientLongClickListener recipientLongClickListener,
@NonNull SelectionChangeListener selectionChangeListener,
boolean selectable)
boolean selectable,
@NonNull LifecycleOwner lifecycleOwner)
{
super(itemView, recipientClickListener, recipientLongClickListener, null, selectionChangeListener, selectable);
super(itemView, recipientClickListener, recipientLongClickListener, null, selectionChangeListener, selectable, lifecycleOwner);
smsContact = itemView.findViewById(R.id.sms_contact);
smsWarning = itemView.findViewById(R.id.sms_warning);
@ -355,9 +386,10 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
@Nullable RecipientLongClickListener recipientLongClickListener,
@Nullable AdminActionsListener adminActionsListener,
@NonNull SelectionChangeListener selectionChangeListener,
boolean selectable)
boolean selectable,
@NonNull LifecycleOwner lifecycleOwner)
{
super(itemView, recipientClickListener, recipientLongClickListener, adminActionsListener, selectionChangeListener, selectable);
super(itemView, recipientClickListener, recipientLongClickListener, adminActionsListener, selectionChangeListener, selectable, lifecycleOwner);
}
@Override
@ -388,9 +420,10 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
UnknownPendingMemberCountViewHolder(@NonNull View itemView,
@Nullable AdminActionsListener adminActionsListener,
@NonNull SelectionChangeListener selectionChangeListener,
boolean selectable)
boolean selectable,
@NonNull LifecycleOwner lifecycleOwner)
{
super(itemView, null, null, adminActionsListener, selectionChangeListener, selectable);
super(itemView, null, null, adminActionsListener, selectionChangeListener, selectable, lifecycleOwner);
}
@Override
@ -438,9 +471,10 @@ final class GroupMemberListAdapter extends LifecycleRecyclerAdapter<GroupMemberL
@Nullable RecipientLongClickListener recipientLongClickListener,
@Nullable AdminActionsListener adminActionsListener,
@NonNull SelectionChangeListener selectionChangeListener,
boolean selectable)
boolean selectable,
@NonNull LifecycleOwner lifecycleOwner)
{
super(itemView, recipientClickListener, recipientLongClickListener, adminActionsListener, selectionChangeListener, selectable);
super(itemView, recipientClickListener, recipientLongClickListener, adminActionsListener, selectionChangeListener, selectable, lifecycleOwner);
approveRequest = itemView.findViewById(R.id.request_approve);
denyRequest = itemView.findViewById(R.id.request_deny);

Wyświetl plik

@ -6,6 +6,7 @@ import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -20,6 +21,7 @@ public final class GroupMemberListView extends RecyclerView {
private GroupMemberListAdapter membersAdapter;
private int maxHeight;
private boolean selectable;
public GroupMemberListView(@NonNull Context context) {
super(context);
@ -41,7 +43,6 @@ public final class GroupMemberListView extends RecyclerView {
setHasFixedSize(true);
}
boolean selectable = false;
if (attrs != null) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.GroupMemberListView, 0, 0);
try {
@ -51,9 +52,11 @@ public final class GroupMemberListView extends RecyclerView {
typedArray.recycle();
}
}
}
membersAdapter = new GroupMemberListAdapter(selectable);
setLayoutManager(new LinearLayoutManager(context));
public void initializeAdapter(@NonNull LifecycleOwner lifecycleOwner) {
membersAdapter = new GroupMemberListAdapter(selectable, lifecycleOwner);
setLayoutManager(new LinearLayoutManager(getContext()));
setAdapter(membersAdapter);
}

Wyświetl plik

@ -74,6 +74,7 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
initializeViewModel();
groupList.initializeAdapter(this);
groupList.setRecipientSelectionChangeListener(selection -> viewModel.setSelection(Stream.of(selection)
.select(GroupMemberEntry.FullMember.class)
.collect(Collectors.toSet())));

Wyświetl plik

@ -66,7 +66,7 @@ public class AddGroupDetailsActivity extends PassphraseRequiredActivity implemen
long threadId,
@NonNull List<Recipient> invitedMembers)
{
Dialog dialog = GroupInviteSentDialog.showInvitesSent(this, invitedMembers);
Dialog dialog = GroupInviteSentDialog.showInvitesSent(this, this, invitedMembers);
if (dialog != null) {
dialog.setOnDismissListener((d) -> goToConversation(recipientId, threadId));
} else {

Wyświetl plik

@ -104,6 +104,7 @@ public class AddGroupDetailsFragment extends LoggingFragment {
View addLater = view.findViewById(R.id.add_later);
TextView disappearingMessageValue = view.findViewById(R.id.group_disappearing_messages_value);
members.initializeAdapter(getViewLifecycleOwner());
avatarPlaceholder = VectorDrawableCompat.create(getResources(), R.drawable.ic_camera_outline_32_ultramarine, requireActivity().getTheme());
if (savedInstanceState == null) {
@ -133,7 +134,7 @@ public class AddGroupDetailsFragment extends LoggingFragment {
gv2Warning.setVisibility(nonGv2CapableMembers.isEmpty() ? View.GONE : View.VISIBLE);
gv2Warning.setText(requireContext().getResources().getQuantityString(R.plurals.AddGroupDetailsFragment__d_members_do_not_support_new_groups_so_this_group_cannot_be_created, nonGv2CapableMembers.size(), nonGv2CapableMembers.size()));
gv2Warning.setLearnMoreVisible(true);
gv2Warning.setOnLinkClickListener(v -> NonGv2MemberDialog.showNonGv2Members(requireContext(), nonGv2CapableMembers));
gv2Warning.setOnLinkClickListener(v -> NonGv2MemberDialog.showNonGv2Members(requireContext(), getViewLifecycleOwner(), nonGv2CapableMembers));
});
viewModel.getAvatar().observe(getViewLifecycleOwner(), avatarBytes -> {
if (avatarBytes == null) {

Wyświetl plik

@ -6,6 +6,7 @@ import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleOwner;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
@ -20,7 +21,7 @@ public final class NonGv2MemberDialog {
private NonGv2MemberDialog() {
}
public static @Nullable Dialog showNonGv2Members(@NonNull Context context, @NonNull List<Recipient> recipients) {
public static @Nullable Dialog showNonGv2Members(@NonNull Context context, @NonNull LifecycleOwner lifecycleOwner, @NonNull List<Recipient> recipients) {
int size = recipients.size();
if (size == 0) {
return null;
@ -42,6 +43,8 @@ public final class NonGv2MemberDialog {
if (size > 1) {
GroupMemberListView nonGv2CapableMembers = dialog.findViewById(R.id.list_non_gv2_members);
nonGv2CapableMembers.initializeAdapter(lifecycleOwner);
List<GroupMemberEntry.NewGroupCandidate> pendingMembers = new ArrayList<>(recipients.size());
for (Recipient r : recipients) {
pendingMembers.add(new GroupMemberEntry.NewGroupCandidate(r));

Wyświetl plik

@ -49,6 +49,9 @@ public class PendingMemberInvitesFragment extends Fragment {
youInvitedEmptyState = view.findViewById(R.id.no_pending_from_you);
othersInvitedEmptyState = view.findViewById(R.id.no_pending_from_others);
youInvited.initializeAdapter(getViewLifecycleOwner());
othersInvited.initializeAdapter(getViewLifecycleOwner());
youInvited.setRecipientClickListener(recipient ->
RecipientBottomSheetDialogFragment.create(recipient.getId(), null)
.show(requireActivity().getSupportFragmentManager(), BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG));

Wyświetl plik

@ -51,6 +51,8 @@ public class RequestingMembersFragment extends Fragment {
noRequestingMessage = view.findViewById(R.id.no_requesting);
requestingExplanation = view.findViewById(R.id.requesting_members_explain);
requestingMembers.initializeAdapter(getViewLifecycleOwner());
requestingMembers.setRecipientClickListener(recipient ->
RecipientBottomSheetDialogFragment.create(recipient.getId(), null)
.show(requireActivity().getSupportFragmentManager(), BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG));

Wyświetl plik

@ -6,6 +6,7 @@ import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleOwner;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
@ -20,7 +21,7 @@ public final class GroupInviteSentDialog {
private GroupInviteSentDialog() {
}
public static @Nullable Dialog showInvitesSent(@NonNull Context context, @NonNull List<Recipient> recipients) {
public static @Nullable Dialog showInvitesSent(@NonNull Context context, @NonNull LifecycleOwner lifecycleOwner, @NonNull List<Recipient> recipients) {
int size = recipients.size();
if (size == 0) {
return null;
@ -43,6 +44,8 @@ public final class GroupInviteSentDialog {
if (size > 1) {
GroupMemberListView invitees = dialog.findViewById(R.id.list_invitees);
invitees.initializeAdapter(lifecycleOwner);
List<GroupMemberEntry.PendingMember> pendingMembers = new ArrayList<>(recipients.size());
for (Recipient r : recipients) {
pendingMembers.add(new GroupMemberEntry.PendingMember(r));

Wyświetl plik

@ -72,6 +72,9 @@ public final class GroupsV1MigrationInfoBottomSheetDialogFragment extends Bottom
this.droppedTitle = view.findViewById(R.id.gv1_learn_more_dropped_title);
this.droppedList = view.findViewById(R.id.gv1_learn_more_dropped_list);
pendingList.initializeAdapter(getViewLifecycleOwner());
droppedList.initializeAdapter(getViewLifecycleOwner());
//noinspection ConstantConditions
GroupMigrationMembershipChange membershipChange = GroupMigrationMembershipChange.deserialize(getArguments().getString(KEY_MEMBERSHIP_CHANGE));

Wyświetl plik

@ -77,6 +77,9 @@ public final class GroupsV1MigrationInitiationBottomSheetDialogFragment extends
this.upgradeButton = view.findViewById(R.id.gv1_migrate_upgrade_button);
this.spinner = view.findViewById(R.id.gv1_migrate_spinner);
inviteList.initializeAdapter(getViewLifecycleOwner());
ineligibleList.initializeAdapter(getViewLifecycleOwner());
inviteList.setNestedScrollingEnabled(false);
ineligibleList.setNestedScrollingEnabled(false);

Wyświetl plik

@ -65,6 +65,7 @@ public final class GroupsV1MigrationSuggestionsDialog {
.show();
GroupMemberListView memberListView = dialog.findViewById(R.id.list_members);
memberListView.initializeAdapter(fragmentActivity);
SimpleTask.run(() -> Recipient.resolvedList(suggestions),
memberListView::setDisplayOnlyMembers);

Wyświetl plik

@ -8,7 +8,6 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.core.animation.doOnEnd
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import org.signal.core.util.money.FiatMoney
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.badges.BadgeImageView
@ -56,17 +55,17 @@ data class Subscription(
}
playSequentially(fadeTo25Animator, fadeTo80Animator)
doOnEnd { start() }
}
init {
lifecycle.addObserver(this)
doOnEnd {
if (itemView.isAttachedToWindow) {
start()
}
}
}
override fun bind(model: LoaderModel) {
}
override fun onResume(owner: LifecycleOwner) {
override fun onAttachedToWindow() {
if (animator.isStarted) {
animator.resume()
} else {
@ -74,7 +73,7 @@ data class Subscription(
}
}
override fun onDestroy(owner: LifecycleOwner) {
override fun onDetachedFromWindow() {
animator.pause()
}
}

Wyświetl plik

@ -1,19 +0,0 @@
package org.thoughtcrime.securesms.util;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public abstract class LifecycleRecyclerAdapter<VH extends LifecycleViewHolder> extends RecyclerView.Adapter<VH> {
@Override
public void onViewAttachedToWindow(@NonNull VH holder) {
super.onViewAttachedToWindow(holder);
holder.onAttachedToWindow();
}
@Override
public void onViewDetachedFromWindow(@NonNull VH holder) {
super.onViewDetachedFromWindow(holder);
holder.onDetachedFromWindow();
}
}

Wyświetl plik

@ -1,33 +0,0 @@
package org.thoughtcrime.securesms.util;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.recyclerview.widget.RecyclerView;
public abstract class LifecycleViewHolder extends RecyclerView.ViewHolder implements LifecycleOwner {
private final LifecycleRegistry lifecycleRegistry;
public LifecycleViewHolder(@NonNull View itemView) {
super(itemView);
lifecycleRegistry = new LifecycleRegistry(this);
}
void onAttachedToWindow() {
lifecycleRegistry.setCurrentState(Lifecycle.State.RESUMED);
}
void onDetachedFromWindow() {
lifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED);
}
@Override
public @NonNull Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}

Wyświetl plik

@ -5,12 +5,12 @@ import android.view.View;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.RecyclerView;
import java.util.LinkedList;
import java.util.List;
public abstract class MappingViewHolder<Model> extends LifecycleViewHolder implements LifecycleOwner {
public abstract class MappingViewHolder<Model> extends RecyclerView.ViewHolder {
protected final Context context;
protected final List<Object> payload;
@ -29,6 +29,12 @@ public abstract class MappingViewHolder<Model> extends LifecycleViewHolder imple
return itemView.getContext();
}
public void onAttachedToWindow() {
}
public void onDetachedFromWindow() {
}
public abstract void bind(@NonNull Model model);
public void setPayload(@NonNull List<Object> payload) {