kopia lustrzana https://github.com/ryukoposting/Signal-Android
Remove LifecycleViewHolder / Adapter.
rodzic
12ec0ca84c
commit
0ab66f81be
|
@ -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();
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 -> {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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())));
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
Ładowanie…
Reference in New Issue