diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java index 4795851e7..394b54191 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java @@ -1,10 +1,12 @@ /* * Nextcloud Talk application * - * @author Marcel Hibbe * @author Mario Danic - * Copyright (C) 2022 Marcel Hibbe (dev@mhibbe.de) - * Copyright (C) 2017-2018 Mario Danic + * @author Marcel Hibbe + * @author Andy Scherzinger + * Copyright (C) 2021 Andy Scherzinger + * Copyright (C) 2022 Marcel Hibbe + * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,8 +51,8 @@ import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFlexible; import eu.davidea.flexibleadapter.utils.FlexibleUtils; -public class MentionAutocompleteItem extends AbstractFlexibleItem - implements IFilterable { +public class MentionAutocompleteItem extends AbstractFlexibleItem + implements IFilterable { private static final float STATUS_SIZE_IN_DP = 9f; private static final String NO_ICON = ""; @@ -67,9 +69,9 @@ public class MentionAutocompleteItem extends AbstractFlexibleItem adapter) { - return new UserItem.UserItemViewHolder(view, adapter); + public ParticipantItem.ParticipantItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) { + return new ParticipantItem.ParticipantItemViewHolder(view, adapter); } - @SuppressLint("SetTextI18n") @Override - public void bindViewHolder( - FlexibleAdapter adapter, - UserItem.UserItemViewHolder holder, - int position, - List payloads) { + public void bindViewHolder(FlexibleAdapter adapter, + ParticipantItem.ParticipantItemViewHolder holder, + int position, + List payloads) { - holder.contactDisplayName.setTextColor(ResourcesCompat.getColor(context.getResources(), - R.color.conversation_item_header, - null)); + holder.binding.nameText.setTextColor( + ResourcesCompat.getColor(context.getResources(), + R.color.conversation_item_header, + null)); if (adapter.hasFilter()) { - FlexibleUtils.highlightText(holder.contactDisplayName, + FlexibleUtils.highlightText(holder.binding.nameText, displayName, String.valueOf(adapter.getFilter(String.class)), - Objects.requireNonNull(NextcloudTalkApplication.Companion.getSharedApplication()) + Objects.requireNonNull(NextcloudTalkApplication + .Companion + .getSharedApplication()) .getResources().getColor(R.color.colorPrimary)); - if (holder.contactMentionId != null) { - FlexibleUtils.highlightText(holder.contactMentionId, + if (holder.binding.secondaryText != null) { + FlexibleUtils.highlightText(holder.binding.secondaryText, "@" + objectId, String.valueOf(adapter.getFilter(String.class)), NextcloudTalkApplication.Companion.getSharedApplication() .getResources().getColor(R.color.colorPrimary)); } } else { - holder.contactDisplayName.setText(displayName); - if (holder.contactMentionId != null) { - holder.contactMentionId.setText("@" + objectId); + holder.binding.nameText.setText(displayName); + if (holder.binding.secondaryText != null) { + holder.binding.secondaryText.setText("@" + objectId); } } if (SOURCE_CALLS.equals(source)) { - if (holder.participantAvatar != null){ - holder.participantAvatar.setImageResource(R.drawable.ic_circular_group); + if (holder.binding.avatarDraweeView != null) { + holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_group); } } else { String avatarId = objectId; @@ -165,25 +168,27 @@ public class MentionAutocompleteItem extends AbstractFlexibleItem + * Copyright (C) 2022 Marcel Hibbe + * Copyright (C) 2017 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.adapters.items; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Resources; +import android.text.TextUtils; +import android.view.View; + +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.interfaces.DraweeController; +import com.nextcloud.talk.R; +import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.databinding.RvItemConversationInfoParticipantBinding; +import com.nextcloud.talk.models.database.UserEntity; +import com.nextcloud.talk.models.json.converters.EnumParticipantTypeConverter; +import com.nextcloud.talk.models.json.participants.Participant; +import com.nextcloud.talk.models.json.participants.Participant.InCallFlags; +import com.nextcloud.talk.models.json.status.StatusType; +import com.nextcloud.talk.ui.StatusDrawable; +import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.DisplayUtils; + +import java.util.List; +import java.util.regex.Pattern; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.res.ResourcesCompat; +import eu.davidea.flexibleadapter.FlexibleAdapter; +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; +import eu.davidea.flexibleadapter.items.IFilterable; +import eu.davidea.flexibleadapter.utils.FlexibleUtils; +import eu.davidea.viewholders.FlexibleViewHolder; + +public class ParticipantItem extends AbstractFlexibleItem implements + IFilterable { + + private static final float STATUS_SIZE_IN_DP = 9f; + private static final String NO_ICON = ""; + + private Context context; + private Participant participant; + private UserEntity userEntity; + public boolean isOnline = true; + + public ParticipantItem(Context activityContext, + Participant participant, + UserEntity userEntity) { + this.context = activityContext; + this.participant = participant; + this.userEntity = userEntity; + } + + public Participant getModel() { + return participant; + } + + @Override + public boolean equals(Object o) { + if (o instanceof UserItem) { + UserItem inItem = (UserItem) o; + return participant.getActorType() == inItem.getModel().getActorType() && + participant.getActorId().equals(inItem.getModel().getActorId()); + } + return false; + } + + @Override + public int hashCode() { + return participant.hashCode(); + } + + @Override + public int getLayoutRes() { + return R.layout.rv_item_conversation_info_participant; + } + + @Override + public ParticipantItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) { + return new ParticipantItemViewHolder(view, adapter); + } + + @SuppressLint("SetTextI18n") + @Override + public void bindViewHolder(FlexibleAdapter adapter, ParticipantItemViewHolder holder, int position, List payloads) { + + holder.binding.avatarDraweeView.setController(null); + + drawStatus(holder); + + if (!isOnline) { + holder.binding.nameText.setTextColor(ResourcesCompat.getColor( + holder.binding.nameText.getContext().getResources(), + R.color.medium_emphasis_text, + null) + ); + holder.binding.avatarDraweeView.setAlpha(0.38f); + } else { + holder.binding.nameText.setTextColor(ResourcesCompat.getColor( + holder.binding.nameText.getContext().getResources(), + R.color.high_emphasis_text, + null) + ); + holder.binding.avatarDraweeView.setAlpha(1.0f); + } + + if (adapter.hasFilter()) { + FlexibleUtils.highlightText(holder.binding.nameText, participant.getDisplayName(), + String.valueOf(adapter.getFilter(String.class)), + NextcloudTalkApplication.Companion.getSharedApplication() + .getResources() + .getColor(R.color.colorPrimary)); + } + + holder.binding.nameText.setText(participant.getDisplayName()); + + if (TextUtils.isEmpty(participant.getDisplayName()) && + (participant.getType().equals(Participant.ParticipantType.GUEST) || + participant.getType().equals(Participant.ParticipantType.USER_FOLLOWING_LINK))) { + holder.binding.nameText.setText(NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_guest)); + } + + if (participant.getActorType() == Participant.ActorType.GROUPS || + "groups".equals(participant.getSource()) || + participant.getActorType() == Participant.ActorType.CIRCLES || + "circles".equals(participant.getSource())) { + holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_group); + } else if (participant.getActorType() == Participant.ActorType.EMAILS) { + holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_mail); + } else if (participant.getActorType() == Participant.ActorType.GUESTS || + Participant.ParticipantType.GUEST.equals(participant.getType()) || + Participant.ParticipantType.GUEST_MODERATOR.equals(participant.getType())) { + + String displayName = NextcloudTalkApplication.Companion.getSharedApplication() + .getResources().getString(R.string.nc_guest); + + if (!TextUtils.isEmpty(participant.getDisplayName())) { + displayName = participant.getDisplayName(); + } + + DraweeController draweeController = Fresco.newDraweeControllerBuilder() + .setOldController(holder.binding.avatarDraweeView.getController()) + .setAutoPlayAnimations(true) + .setImageRequest(DisplayUtils.getImageRequestForUrl( + ApiUtils.getUrlForAvatarWithNameForGuests(userEntity.getBaseUrl(), + displayName, R.dimen.avatar_size), null)) + .build(); + holder.binding.avatarDraweeView.setController(draweeController); + + } else if (participant.getActorType() == Participant.ActorType.USERS || + participant.getSource().equals("users")) { + DraweeController draweeController = Fresco.newDraweeControllerBuilder() + .setOldController(holder.binding.avatarDraweeView.getController()) + .setAutoPlayAnimations(true) + .setImageRequest(DisplayUtils.getImageRequestForUrl( + ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(), + participant.getActorId(), R.dimen.avatar_size), null)) + .build(); + holder.binding.avatarDraweeView.setController(draweeController); + } + + Resources resources = NextcloudTalkApplication.Companion.getSharedApplication().getResources(); + + Long inCallFlag = participant.getInCall(); + if ((inCallFlag & InCallFlags.WITH_PHONE) > 0) { + holder.binding.videoCallIcon.setImageResource(R.drawable.ic_call_grey_600_24dp); + holder.binding.videoCallIcon.setVisibility(View.VISIBLE); + holder.binding.videoCallIcon.setContentDescription( + resources.getString(R.string.nc_call_state_with_phone, participant.displayName)); + } else if ((inCallFlag & InCallFlags.WITH_VIDEO) > 0) { + holder.binding.videoCallIcon.setImageResource(R.drawable.ic_videocam_grey_600_24dp); + holder.binding.videoCallIcon.setVisibility(View.VISIBLE); + holder.binding.videoCallIcon.setContentDescription( + resources.getString(R.string.nc_call_state_with_video, participant.displayName)); + } else if (inCallFlag > InCallFlags.DISCONNECTED) { + holder.binding.videoCallIcon.setImageResource(R.drawable.ic_mic_grey_600_24dp); + holder.binding.videoCallIcon.setVisibility(View.VISIBLE); + holder.binding.videoCallIcon.setContentDescription( + resources.getString(R.string.nc_call_state_in_call, participant.displayName)); + } else { + holder.binding.videoCallIcon.setVisibility(View.GONE); + } + + if (holder.binding.secondaryText != null) { + String userType = ""; + + switch (new EnumParticipantTypeConverter().convertToInt(participant.getType())) { + case 1: + //userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_owner); + //break; + case 2: + case 6: // Guest moderator + userType = NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_moderator); + break; + case 3: + userType = NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_user); + if (participant.getActorType() == Participant.ActorType.GROUPS) { + userType = NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_group); + } + if (participant.getActorType() == Participant.ActorType.CIRCLES) { + userType = NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_circle); + } + break; + case 4: + userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_guest); + if (participant.getActorType() == Participant.ActorType.EMAILS) { + userType = NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_email); + } + break; + case 5: + userType = NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_following_link); + break; + default: + break; + } + + if (!userType.equals(NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_user))) { + holder.binding.secondaryText.setText("(" + userType + ")"); + } + } + } + + private void drawStatus(ParticipantItemViewHolder holder) { + if (holder.binding.conversationInfoStatusMessage != null && + holder.binding.participantStatusEmoji != null && + holder.binding.userStatusImage != null) { + float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, context); + holder.binding.userStatusImage.setImageDrawable(new StatusDrawable( + participant.status, + NO_ICON, + size, + context.getResources().getColor(R.color.bg_default), + context)); + + if (participant.statusMessage != null) { + holder.binding.conversationInfoStatusMessage.setText(participant.statusMessage); + alignUsernameVertical(holder, 0); + } else { + holder.binding.conversationInfoStatusMessage.setText(""); + alignUsernameVertical(holder, 10); + } + + if (participant.statusIcon != null && !participant.statusIcon.isEmpty()) { + holder.binding.participantStatusEmoji.setText(participant.statusIcon); + } else { + holder.binding.participantStatusEmoji.setVisibility(View.GONE); + } + + if (participant.status != null && participant.status.equals(StatusType.DND.getString())) { + if (participant.statusMessage == null || participant.statusMessage.isEmpty()) { + holder.binding.conversationInfoStatusMessage.setText(R.string.dnd); + } + } else if (participant.status != null && participant.status.equals(StatusType.AWAY.getString())) { + if (participant.statusMessage == null || participant.statusMessage.isEmpty()) { + holder.binding.conversationInfoStatusMessage.setText(R.string.away); + } + } + } + } + + private void alignUsernameVertical(ParticipantItem.ParticipantItemViewHolder holder, float densityPixelsFromTop) { + ConstraintLayout.LayoutParams layoutParams = + (ConstraintLayout.LayoutParams) holder.binding.nameText.getLayoutParams(); + layoutParams.topMargin = (int) DisplayUtils.convertDpToPixel(densityPixelsFromTop, context); + holder.binding.nameText.setLayoutParams(layoutParams); + } + + @Override + public boolean filter(String constraint) { + return participant.getDisplayName() != null && + (Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL) + .matcher(participant.getDisplayName().trim()).find() || + Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL) + .matcher(participant.getActorId().trim()).find()); + } + + static class ParticipantItemViewHolder extends FlexibleViewHolder { + + RvItemConversationInfoParticipantBinding binding; + + /** + * Default constructor. + */ + ParticipantItemViewHolder(View view, FlexibleAdapter adapter) { + super(view, adapter); + binding = RvItemConversationInfoParticipantBinding.bind(view); + } + } +} diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java index 78ce884c5..af1f6842a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java @@ -3,8 +3,10 @@ * * @author Mario Danic * @author Marcel Hibbe - * Copyright (C) 2017 Mario Danic (mario@lovelyhq.com) - * Copyright (C) 2022 Marcel Hibbe (dev@mhibbe.de) + * @author Andy Scherzinger + * Copyright (C) 2021 Andy Scherzinger + * Copyright (C) 2022 Marcel Hibbe + * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,35 +25,23 @@ package com.nextcloud.talk.adapters.items; import android.annotation.SuppressLint; -import android.content.Context; -import android.content.res.Resources; import android.text.TextUtils; import android.view.View; -import android.widget.ImageView; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; -import com.facebook.drawee.view.SimpleDraweeView; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.databinding.RvItemContactBinding; import com.nextcloud.talk.models.database.UserEntity; -import com.nextcloud.talk.models.json.converters.EnumParticipantTypeConverter; import com.nextcloud.talk.models.json.participants.Participant; -import com.nextcloud.talk.models.json.participants.Participant.InCallFlags; -import com.nextcloud.talk.models.json.status.StatusType; -import com.nextcloud.talk.ui.StatusDrawable; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; import java.util.List; import java.util.regex.Pattern; -import androidx.annotation.Nullable; -import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.res.ResourcesCompat; -import androidx.emoji.widget.EmojiTextView; -import butterknife.BindView; -import butterknife.ButterKnife; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.IFilterable; @@ -62,20 +52,18 @@ import eu.davidea.viewholders.FlexibleViewHolder; public class UserItem extends AbstractFlexibleItem implements ISectionable, IFilterable { - private static final float STATUS_SIZE_IN_DP = 9f; - private static final String NO_ICON = ""; + public static final String PARTICIPANT_SOURCE_CIRCLES = "circles"; + public static final String PARTICIPANT_SOURCE_GROUPS = "groups"; + public static final String PARTICIPANT_SOURCE_USERS = "users"; - private Context context; - private Participant participant; - private UserEntity userEntity; + private final Participant participant; + private final UserEntity userEntity; private GenericTextHeaderItem header; public boolean isOnline = true; - public UserItem(Context activityContext, - Participant participant, + public UserItem(Participant participant, UserEntity userEntity, GenericTextHeaderItem genericTextHeaderItem) { - this.context = activityContext; this.participant = participant; this.userEntity = userEntity; this.header = genericTextHeaderItem; @@ -99,23 +87,14 @@ public class UserItem extends AbstractFlexibleItem /** * @return the model object */ - public Participant getModel() { return participant; } - public UserEntity getEntity() { - return userEntity; - } - @Override public int getLayoutRes() { - if (header != null) { - return R.layout.rv_item_contact; - } else { - return R.layout.rv_item_conversation_info_participant; - } + return R.layout.rv_item_contact; } @Override @@ -127,59 +106,72 @@ public class UserItem extends AbstractFlexibleItem @Override public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) { - if (holder.participantAvatar != null) { - holder.participantAvatar.setController(null); + if (holder.binding.avatarDraweeView != null) { + holder.binding.avatarDraweeView.setController(null); } - if (holder.checkedImageView != null) { + if (holder.binding.checkedImageView != null) { if (participant.isSelected()) { - holder.checkedImageView.setVisibility(View.VISIBLE); + holder.binding.checkedImageView.setVisibility(View.VISIBLE); } else { - holder.checkedImageView.setVisibility(View.GONE); + holder.binding.checkedImageView.setVisibility(View.GONE); } } - drawStatus(holder); - if (!isOnline) { - holder.contactDisplayName.setTextColor(ResourcesCompat.getColor( - holder.contactDisplayName.getContext().getResources(), + holder.binding.nameText.setTextColor(ResourcesCompat.getColor( + holder.binding.nameText.getContext().getResources(), R.color.medium_emphasis_text, null) - ); - holder.participantAvatar.setAlpha(0.38f); + ); + holder.binding.avatarDraweeView.setAlpha(0.38f); } else { - holder.contactDisplayName.setTextColor(ResourcesCompat.getColor( - holder.contactDisplayName.getContext().getResources(), + holder.binding.nameText.setTextColor(ResourcesCompat.getColor( + holder.binding.nameText.getContext().getResources(), R.color.high_emphasis_text, null) - ); - holder.participantAvatar.setAlpha(1.0f); + ); + holder.binding.avatarDraweeView.setAlpha(1.0f); } if (adapter.hasFilter()) { - FlexibleUtils.highlightText(holder.contactDisplayName, participant.getDisplayName(), - String.valueOf(adapter.getFilter(String.class)), NextcloudTalkApplication.Companion.getSharedApplication() - .getResources().getColor(R.color.colorPrimary)); + FlexibleUtils.highlightText(holder.binding.nameText, + participant.getDisplayName(), + String.valueOf(adapter.getFilter(String.class)), + NextcloudTalkApplication + .Companion + .getSharedApplication() + .getResources() + .getColor(R.color.colorPrimary)); } - holder.contactDisplayName.setText(participant.getDisplayName()); + holder.binding.nameText.setText(participant.getDisplayName()); if (TextUtils.isEmpty(participant.getDisplayName()) && - (participant.getType().equals(Participant.ParticipantType.GUEST) || participant.getType().equals(Participant.ParticipantType.USER_FOLLOWING_LINK))) { - holder.contactDisplayName.setText(NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_guest)); + (participant.getType().equals(Participant.ParticipantType.GUEST) || + participant.getType().equals(Participant.ParticipantType.USER_FOLLOWING_LINK))) { + holder.binding.nameText.setText(NextcloudTalkApplication + .Companion + .getSharedApplication() + .getString(R.string.nc_guest)); } - if (participant.getActorType() == Participant.ActorType.GROUPS || - "groups".equals(participant.getSource()) || - participant.getActorType() == Participant.ActorType.CIRCLES || - "circles".equals(participant.getSource())) { - holder.participantAvatar.setImageResource(R.drawable.ic_circular_group); + if ( + participant.getActorType() == Participant.ActorType.GROUPS || + PARTICIPANT_SOURCE_GROUPS.equals(participant.getSource()) || + participant.getActorType() == Participant.ActorType.CIRCLES || + PARTICIPANT_SOURCE_CIRCLES.equals(participant.getSource())) { + + holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_group); + } else if (participant.getActorType() == Participant.ActorType.EMAILS) { - holder.participantAvatar.setImageResource(R.drawable.ic_circular_mail); - } else if (participant.getActorType() == Participant.ActorType.GUESTS || - Participant.ParticipantType.GUEST.equals(participant.getType()) || - Participant.ParticipantType.GUEST_MODERATOR.equals(participant.getType())) { + + holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_mail); + + } else if ( + participant.getActorType() == Participant.ActorType.GUESTS || + Participant.ParticipantType.GUEST.equals(participant.getType()) || + Participant.ParticipantType.GUEST_MODERATOR.equals(participant.getType())) { String displayName = NextcloudTalkApplication.Companion.getSharedApplication() .getResources().getString(R.string.nc_guest); @@ -189,134 +181,40 @@ public class UserItem extends AbstractFlexibleItem } DraweeController draweeController = Fresco.newDraweeControllerBuilder() - .setOldController(holder.participantAvatar.getController()) + .setOldController(holder.binding.avatarDraweeView.getController()) .setAutoPlayAnimations(true) - .setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithNameForGuests(userEntity.getBaseUrl(), - displayName, R.dimen.avatar_size), null)) + .setImageRequest(DisplayUtils.getImageRequestForUrl( + ApiUtils.getUrlForAvatarWithNameForGuests(userEntity.getBaseUrl(), + displayName, + R.dimen.avatar_size), + null)) .build(); - holder.participantAvatar.setController(draweeController); + holder.binding.avatarDraweeView.setController(draweeController); - } else if (participant.getActorType() == Participant.ActorType.USERS || participant.getSource().equals("users")) { + } else if (participant.getActorType() == Participant.ActorType.USERS || + PARTICIPANT_SOURCE_USERS.equals(participant.getSource())) { DraweeController draweeController = Fresco.newDraweeControllerBuilder() - .setOldController(holder.participantAvatar.getController()) + .setOldController(holder.binding.avatarDraweeView.getController()) .setAutoPlayAnimations(true) - .setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(), - participant.getActorId(), R.dimen.avatar_size), null)) + .setImageRequest(DisplayUtils.getImageRequestForUrl( + ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(), + participant.getActorId(), + R.dimen.avatar_size), + null)) .build(); - holder.participantAvatar.setController(draweeController); + holder.binding.avatarDraweeView.setController(draweeController); } - - Resources resources = NextcloudTalkApplication.Companion.getSharedApplication().getResources(); - - if (header == null) { - Long inCallFlag = participant.getInCall(); - if ((inCallFlag & InCallFlags.WITH_PHONE) > 0) { - holder.videoCallIconView.setImageResource(R.drawable.ic_call_grey_600_24dp); - holder.videoCallIconView.setVisibility(View.VISIBLE); - holder.videoCallIconView.setContentDescription( - resources.getString(R.string.nc_call_state_with_phone, participant.displayName)); - } else if ((inCallFlag & InCallFlags.WITH_VIDEO) > 0) { - holder.videoCallIconView.setImageResource(R.drawable.ic_videocam_grey_600_24dp); - holder.videoCallIconView.setVisibility(View.VISIBLE); - holder.videoCallIconView.setContentDescription( - resources.getString(R.string.nc_call_state_with_video, participant.displayName)); - } else if (inCallFlag > InCallFlags.DISCONNECTED) { - holder.videoCallIconView.setImageResource(R.drawable.ic_mic_grey_600_24dp); - holder.videoCallIconView.setVisibility(View.VISIBLE); - holder.videoCallIconView.setContentDescription( - resources.getString(R.string.nc_call_state_in_call, participant.displayName)); - } else { - holder.videoCallIconView.setVisibility(View.GONE); - } - - if (holder.contactMentionId != null) { - String userType = ""; - - switch (new EnumParticipantTypeConverter().convertToInt(participant.getType())) { - case 1: - //userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_owner); - //break; - case 2: - case 6: // Guest moderator - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_moderator); - break; - case 3: - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_user); - if (participant.getActorType() == Participant.ActorType.GROUPS) { - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_group); - } - if (participant.getActorType() == Participant.ActorType.CIRCLES) { - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_circle); - } - break; - case 4: - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_guest); - if (participant.getActorType() == Participant.ActorType.EMAILS) { - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_email); - } - break; - case 5: - userType = NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_following_link); - break; - default: - break; - } - - if (!userType.equals(NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_user))) { - holder.contactMentionId.setText("(" + userType + ")"); - } - } - } - } - - private void drawStatus(UserItemViewHolder holder) { - if (holder.statusMessage != null && holder.participantEmoji != null && holder.userStatusImage != null) { - float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, context); - holder.userStatusImage.setImageDrawable(new StatusDrawable( - participant.status, - NO_ICON, - size, - context.getResources().getColor(R.color.bg_default), - context)); - - if (participant.statusMessage != null) { - holder.statusMessage.setText(participant.statusMessage); - alignUsernameVertical(holder, 0); - } else { - holder.statusMessage.setText(""); - alignUsernameVertical(holder, 10); - } - - if (participant.statusIcon != null && !participant.statusIcon.isEmpty()) { - holder.participantEmoji.setText(participant.statusIcon); - } else { - holder.participantEmoji.setVisibility(View.GONE); - } - - if (participant.status != null && participant.status.equals(StatusType.DND.getString())) { - if (participant.statusMessage == null || participant.statusMessage.isEmpty()) { - holder.statusMessage.setText(R.string.dnd); - } - } else if (participant.status != null && participant.status.equals(StatusType.AWAY.getString())) { - if (participant.statusMessage == null || participant.statusMessage.isEmpty()) { - holder.statusMessage.setText(R.string.away); - } - } - } - } - - private void alignUsernameVertical(UserItem.UserItemViewHolder holder, float densityPixelsFromTop) { - ConstraintLayout.LayoutParams layoutParams = - (ConstraintLayout.LayoutParams) holder.contactDisplayName.getLayoutParams(); - layoutParams.topMargin = (int) DisplayUtils.convertDpToPixel(densityPixelsFromTop, context); - holder.contactDisplayName.setLayoutParams(layoutParams); } @Override public boolean filter(String constraint) { return participant.getDisplayName() != null && - (Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(participant.getDisplayName().trim()).find() || - Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(participant.getActorId().trim()).find()); + (Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL) + .matcher(participant.getDisplayName().trim()) + .find() || + Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL) + .matcher(participant.getActorId().trim()) + .find()); } @Override @@ -331,36 +229,14 @@ public class UserItem extends AbstractFlexibleItem static class UserItemViewHolder extends FlexibleViewHolder { - @BindView(R.id.name_text) - public EmojiTextView contactDisplayName; - @Nullable - @BindView(R.id.avatar_drawee_view) - public SimpleDraweeView participantAvatar; - @Nullable - @BindView(R.id.secondary_text) - public EmojiTextView contactMentionId; - @Nullable - @BindView(R.id.videoCallIcon) - ImageView videoCallIconView; - @Nullable - @BindView(R.id.checkedImageView) - ImageView checkedImageView; - @Nullable - @BindView(R.id.participant_status_emoji) - com.vanniktech.emoji.EmojiEditText participantEmoji; - @Nullable - @BindView(R.id.user_status_image) - ImageView userStatusImage; - @Nullable - @BindView(R.id.conversation_info_status_message) - EmojiTextView statusMessage; + RvItemContactBinding binding; /** * Default constructor. */ UserItemViewHolder(View view, FlexibleAdapter adapter) { super(view, adapter); - ButterKnife.bind(this, view); + binding = RvItemContactBinding.bind(view); } } } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java index 1ca545dfc..3adbb0903 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java @@ -551,7 +551,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ } UserItem newContactItem = new UserItem( - getApplicationContext(), participant, currentUser, userHeaderItems.get(headerTitle) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index 5c0f77a60..c1ca994d3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -49,7 +49,7 @@ import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.facebook.drawee.backends.pipeline.Fresco import com.nextcloud.talk.R -import com.nextcloud.talk.adapters.items.UserItem +import com.nextcloud.talk.adapters.items.ParticipantItem import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.controllers.base.NewBaseController @@ -87,6 +87,7 @@ import io.reactivex.schedulers.Schedulers import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import java.util.ArrayList import java.util.Calendar import java.util.Collections import java.util.Comparator @@ -122,8 +123,8 @@ class ConversationInfoController(args: Bundle) : private var databaseStorageModule: DatabaseStorageModule? = null private var conversation: Conversation? = null - private var adapter: FlexibleAdapter? = null - private var userItems: MutableList = ArrayList() + private var adapter: FlexibleAdapter? = null + private var userItems: MutableList = ArrayList() private var saveStateHandler: LovelySaveStateHandler? = null @@ -378,15 +379,15 @@ class ConversationInfoController(args: Bundle) : } private fun handleParticipants(participants: List) { - var userItem: UserItem + var userItem: ParticipantItem var participant: Participant userItems = ArrayList() - var ownUserItem: UserItem? = null + var ownUserItem: ParticipantItem? = null for (i in participants.indices) { participant = participants[i] - userItem = UserItem(router.activity, participant, conversationUser, null) + userItem = ParticipantItem(router.activity, participant, conversationUser) if (participant.sessionId != null) { userItem.isOnline = !participant.sessionId.equals("0") } else { @@ -402,7 +403,7 @@ class ConversationInfoController(args: Bundle) : } } - Collections.sort(userItems, UserItemComparator()) + Collections.sort(userItems, ParticipantItemComparator()) if (ownUserItem != null) { userItems.add(0, ownUserItem) @@ -956,7 +957,7 @@ class ConversationInfoController(args: Bundle) : return true } - val userItem = adapter?.getItem(position) as UserItem + val userItem = adapter?.getItem(position) as ParticipantItem val participant = userItem.model val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) @@ -1108,8 +1109,8 @@ class ConversationInfoController(args: Bundle) : /** * Comparator for participants, sorts by online-status, moderator-status and display name. */ - class UserItemComparator : Comparator { - override fun compare(left: UserItem, right: UserItem): Int { + class ParticipantItemComparator : Comparator { + override fun compare(left: ParticipantItem, right: ParticipantItem): Int { val leftIsGroup = left.model.actorType == GROUPS || left.model.actorType == CIRCLES val rightIsGroup = right.model.actorType == GROUPS || right.model.actorType == CIRCLES if (leftIsGroup != rightIsGroup) { diff --git a/app/src/main/res/layout/rv_item_conversation_info_participant.xml b/app/src/main/res/layout/rv_item_conversation_info_participant.xml index 974cc00aa..c72f1b1d3 100644 --- a/app/src/main/res/layout/rv_item_conversation_info_participant.xml +++ b/app/src/main/res/layout/rv_item_conversation_info_participant.xml @@ -26,7 +26,6 @@ android:layout_marginBottom="@dimen/standard_half_margin" android:layout_marginTop="@dimen/standard_margin"> -