migrate FlexibleItems to native view bindings

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
Andy Scherzinger 2022-02-25 11:19:17 +01:00 committed by Marcel Hibbe
parent d4f9f996c3
commit 0677607dc4
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
2 changed files with 68 additions and 82 deletions

View File

@ -2,6 +2,8 @@
* Nextcloud Talk application * Nextcloud Talk application
* *
* @author Mario Danic * @author Mario Danic
* @author Andy Scherzinger
* Copyright (C) 2022 Andy Scherzinger <info@andy-scherzinger.de>
* Copyright (C) 2017 Mario Danic (mario@lovelyhq.com) * Copyright (C) 2017 Mario Danic (mario@lovelyhq.com)
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -24,17 +26,12 @@ import android.accounts.Account;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.databinding.AccountItemBinding;
import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.database.UserEntity;
import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.participants.Participant;
import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.ApiUtils;
@ -44,9 +41,6 @@ import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.emoji.widget.EmojiTextView;
import butterknife.BindView;
import butterknife.ButterKnife;
import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFilterable;
@ -56,10 +50,10 @@ import eu.davidea.viewholders.FlexibleViewHolder;
public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.UserItemViewHolder> implements public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.UserItemViewHolder> implements
IFilterable<String> { IFilterable<String> {
private Participant participant; private final Participant participant;
private UserEntity userEntity; private final UserEntity userEntity;
@Nullable @Nullable
private Account account; private final Account account;
public AdvancedUserItem(Participant participant, UserEntity userEntity, @Nullable Account account) { public AdvancedUserItem(Participant participant, UserEntity userEntity, @Nullable Account account) {
this.participant = participant; this.participant = participant;
@ -110,68 +104,70 @@ public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.User
@Override @Override
public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) { public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) {
holder.avatarImageView.setController(null); holder.binding.userIcon.setController(null);
if (adapter.hasFilter()) { if (adapter.hasFilter()) {
FlexibleUtils.highlightText( FlexibleUtils.highlightText(
holder.contactDisplayName, holder.binding.userName,
participant.getDisplayName(), participant.getDisplayName(),
String.valueOf(adapter.getFilter(String.class)), String.valueOf(adapter.getFilter(String.class)),
NextcloudTalkApplication.Companion.getSharedApplication() NextcloudTalkApplication.Companion.getSharedApplication()
.getResources() .getResources()
.getColor(R.color.colorPrimary)); .getColor(R.color.colorPrimary));
} else { } else {
holder.contactDisplayName.setText(participant.getDisplayName()); holder.binding.userName.setText(participant.getDisplayName());
} }
if (userEntity != null && !TextUtils.isEmpty(userEntity.getBaseUrl())) { if (userEntity != null && !TextUtils.isEmpty(userEntity.getBaseUrl())) {
String host = Uri.parse(userEntity.getBaseUrl()).getHost(); String host = Uri.parse(userEntity.getBaseUrl()).getHost();
if (!TextUtils.isEmpty(host)) { if (!TextUtils.isEmpty(host)) {
holder.serverUrl.setText(Uri.parse(userEntity.getBaseUrl()).getHost()); holder.binding.account.setText(Uri.parse(userEntity.getBaseUrl()).getHost());
} else { } else {
holder.serverUrl.setText(userEntity.getBaseUrl()); holder.binding.account.setText(userEntity.getBaseUrl());
} }
} }
holder.avatarImageView.getHierarchy().setPlaceholderImage(R.drawable.account_circle_48dp); holder.binding.userIcon.getHierarchy().setPlaceholderImage(R.drawable.account_circle_48dp);
holder.avatarImageView.getHierarchy().setFailureImage(R.drawable.account_circle_48dp); holder.binding.userIcon.getHierarchy().setFailureImage(R.drawable.account_circle_48dp);
if (userEntity != null && userEntity.getBaseUrl() != null && if (userEntity != null && userEntity.getBaseUrl() != null &&
userEntity.getBaseUrl().startsWith("http://") || userEntity.getBaseUrl().startsWith("http://") ||
userEntity.getBaseUrl().startsWith("https://")) { userEntity.getBaseUrl().startsWith("https://")) {
DraweeController draweeController = Fresco.newDraweeControllerBuilder() DraweeController draweeController = Fresco.newDraweeControllerBuilder()
.setOldController(holder.avatarImageView.getController()) .setOldController(holder.binding.userIcon.getController())
.setAutoPlayAnimations(true) .setAutoPlayAnimations(true)
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(), .setImageRequest(
participant.getActorId(), R.dimen.small_item_height), null)) DisplayUtils.getImageRequestForUrl(
ApiUtils.getUrlForAvatarWithName(
userEntity.getBaseUrl(),
participant.getActorId(),
R.dimen.small_item_height),
null))
.build(); .build();
holder.avatarImageView.setController(draweeController); holder.binding.userIcon.setController(draweeController);
} }
} }
@Override @Override
public boolean filter(String constraint) { public boolean filter(String constraint) {
return participant.getDisplayName() != null && 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.getDisplayName().trim())
.find();
} }
static class UserItemViewHolder extends FlexibleViewHolder { static class UserItemViewHolder extends FlexibleViewHolder {
@BindView(R.id.user_name) public AccountItemBinding binding;
public EmojiTextView contactDisplayName;
@BindView(R.id.account)
public TextView serverUrl;
@BindView(R.id.user_icon)
public SimpleDraweeView avatarImageView;
/** /**
* Default constructor. * Default constructor.
*/ */
UserItemViewHolder(View view, FlexibleAdapter adapter) { UserItemViewHolder(View view, FlexibleAdapter adapter) {
super(view, adapter); super(view, adapter);
ButterKnife.bind(this, view); binding = AccountItemBinding.bind(view);
} }
} }
} }

View File

@ -2,6 +2,8 @@
* Nextcloud Talk application * Nextcloud Talk application
* *
* @author Mario Danic * @author Mario Danic
* @author Andy Scherzinger
* Copyright (C) 2022 Andy Scherzinger <info@andy-scherzinger.de>
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com> * Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -24,20 +26,14 @@ import android.content.Context;
import android.text.format.Formatter; import android.text.format.Formatter;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.content.res.AppCompatResources;
import autodagger.AutoInjector;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.components.filebrowser.models.BrowserFile; import com.nextcloud.talk.components.filebrowser.models.BrowserFile;
import com.nextcloud.talk.databinding.RvItemBrowserFileBinding;
import com.nextcloud.talk.interfaces.SelectionInterface; import com.nextcloud.talk.interfaces.SelectionInterface;
import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.database.UserEntity;
import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.ApiUtils;
@ -49,9 +45,8 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import androidx.appcompat.content.res.AppCompatResources;
import autodagger.AutoInjector; import autodagger.AutoInjector;
import butterknife.BindView;
import butterknife.ButterKnife;
import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFilterable;
@ -59,12 +54,12 @@ import eu.davidea.flexibleadapter.items.IFlexible;
import eu.davidea.viewholders.FlexibleViewHolder; import eu.davidea.viewholders.FlexibleViewHolder;
@AutoInjector(NextcloudTalkApplication.class) @AutoInjector(NextcloudTalkApplication.class)
public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHolder> implements IFilterable<String> { public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.BrowserFileItemViewHolder> implements IFilterable<String> {
@Inject @Inject
Context context; Context context;
private BrowserFile browserFile; private final BrowserFile browserFile;
private UserEntity activeUser; private final UserEntity activeUser;
private SelectionInterface selectionInterface; private final SelectionInterface selectionInterface;
private boolean selected; private boolean selected;
public BrowserFileItem(BrowserFile browserFile, UserEntity activeUser, SelectionInterface selectionInterface) { public BrowserFileItem(BrowserFile browserFile, UserEntity activeUser, SelectionInterface selectionInterface) {
@ -94,9 +89,8 @@ public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHo
} }
@Override @Override
public ViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) { public BrowserFileItemViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
return new ViewHolder(view, adapter); return new BrowserFileItemViewHolder(view, adapter);
} }
private boolean isSelected() { private boolean isSelected() {
@ -108,8 +102,11 @@ public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHo
} }
@Override @Override
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ViewHolder holder, int position, List<Object> payloads) { public void bindViewHolder(FlexibleAdapter<IFlexible> adapter,
holder.fileIconImageView.setController(null); BrowserFileItemViewHolder holder,
int position,
List<Object> payloads) {
holder.binding.fileIcon.setController(null);
if (!browserFile.isAllowedToReShare() || browserFile.isEncrypted()) { if (!browserFile.isAllowedToReShare() || browserFile.isEncrypted()) {
holder.itemView.setEnabled(false); holder.itemView.setEnabled(false);
holder.itemView.setAlpha(0.38f); holder.itemView.setAlpha(0.38f);
@ -119,31 +116,32 @@ public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHo
} }
if (browserFile.isEncrypted()) { if (browserFile.isEncrypted()) {
holder.fileEncryptedImageView.setVisibility(View.VISIBLE); holder.binding.fileEncryptedImageView.setVisibility(View.VISIBLE);
} else { } else {
holder.fileEncryptedImageView.setVisibility(View.GONE); holder.binding.fileEncryptedImageView.setVisibility(View.GONE);
} }
if (browserFile.isFavorite()) { if (browserFile.isFavorite()) {
holder.fileFavoriteImageView.setVisibility(View.VISIBLE); holder.binding.fileFavoriteImageView.setVisibility(View.VISIBLE);
} else { } else {
holder.fileFavoriteImageView.setVisibility(View.GONE); holder.binding.fileFavoriteImageView.setVisibility(View.GONE);
} }
if (selectionInterface.shouldOnlySelectOneImageFile()) { if (selectionInterface.shouldOnlySelectOneImageFile()) {
if (browserFile.isFile && browserFile.mimeType.startsWith("image/")) { if (browserFile.isFile && browserFile.mimeType.startsWith("image/")) {
holder.selectFileCheckbox.setVisibility(View.VISIBLE); holder.binding.selectFileCheckbox.setVisibility(View.VISIBLE);
} else { } else {
holder.selectFileCheckbox.setVisibility(View.GONE); holder.binding.selectFileCheckbox.setVisibility(View.GONE);
} }
} else { } else {
holder.selectFileCheckbox.setVisibility(View.VISIBLE); holder.binding.selectFileCheckbox.setVisibility(View.VISIBLE);
} }
if (context != null) { if (context != null) {
holder holder
.fileIconImageView .binding
.fileIcon
.getHierarchy() .getHierarchy()
.setPlaceholderImage( .setPlaceholderImage(
AppCompatResources.getDrawable( AppCompatResources.getDrawable(
@ -160,25 +158,28 @@ public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHo
.setAutoPlayAnimations(true) .setAutoPlayAnimations(true)
.setImageRequest(DisplayUtils.getImageRequestForUrl(path, null)) .setImageRequest(DisplayUtils.getImageRequestForUrl(path, null))
.build(); .build();
holder.fileIconImageView.setController(draweeController); holder.binding.fileIcon.setController(draweeController);
} }
} }
holder.filenameTextView.setText(browserFile.getDisplayName()); holder.binding.filenameTextView.setText(browserFile.getDisplayName());
holder.fileModifiedTextView.setText(String.format(context.getString(R.string.nc_last_modified), holder.binding.fileModifiedInfo.setText(String.format(context.getString(R.string.nc_last_modified),
Formatter.formatShortFileSize(context, browserFile.getSize()), Formatter.formatShortFileSize(context, browserFile.getSize()),
DateUtils.INSTANCE.getLocalDateTimeStringFromTimestamp(browserFile.getModifiedTimestamp()))); DateUtils.INSTANCE.getLocalDateTimeStringFromTimestamp(browserFile.getModifiedTimestamp())));
setSelected(selectionInterface.isPathSelected(browserFile.getPath())); setSelected(selectionInterface.isPathSelected(browserFile.getPath()));
holder.selectFileCheckbox.setChecked(isSelected()); holder.binding.selectFileCheckbox.setChecked(isSelected());
if (!browserFile.isEncrypted()) { if (!browserFile.isEncrypted()) {
holder.selectFileCheckbox.setOnClickListener(new View.OnClickListener() { holder.binding.selectFileCheckbox.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (!browserFile.isAllowedToReShare()) { if (!browserFile.isAllowedToReShare()) {
((CheckBox) v).setChecked(false); ((CheckBox) v).setChecked(false);
Toast.makeText(context, context.getResources().getString(R.string.nc_file_browser_reshare_forbidden), Toast.makeText(
Toast.LENGTH_LONG).show(); context,
context.getResources().getString(R.string.nc_file_browser_reshare_forbidden),
Toast.LENGTH_LONG)
.show();
} else if (((CheckBox) v).isChecked() != isSelected()) { } else if (((CheckBox) v).isChecked() != isSelected()) {
setSelected(((CheckBox) v).isChecked()); setSelected(((CheckBox) v).isChecked());
selectionInterface.toggleBrowserItemSelection(browserFile.getPath()); selectionInterface.toggleBrowserItemSelection(browserFile.getPath());
@ -187,8 +188,8 @@ public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHo
}); });
} }
holder.filenameTextView.setSelected(true); holder.binding.filenameTextView.setSelected(true);
holder.fileModifiedTextView.setSelected(true); holder.binding.fileModifiedInfo.setSelected(true);
} }
@Override @Override
@ -196,24 +197,13 @@ public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHo
return false; return false;
} }
static class ViewHolder extends FlexibleViewHolder { static class BrowserFileItemViewHolder extends FlexibleViewHolder {
@BindView(R.id.file_icon) RvItemBrowserFileBinding binding;
public SimpleDraweeView fileIconImageView;
@BindView(R.id.file_modified_info)
public TextView fileModifiedTextView;
@BindView(R.id.filename_text_view)
public TextView filenameTextView;
@BindView(R.id.select_file_checkbox)
public CheckBox selectFileCheckbox;
@BindView(R.id.fileEncryptedImageView)
public ImageView fileEncryptedImageView;
@BindView(R.id.fileFavoriteImageView)
public ImageView fileFavoriteImageView;
ViewHolder(View view, FlexibleAdapter adapter) { BrowserFileItemViewHolder(View view, FlexibleAdapter adapter) {
super(view, adapter); super(view, adapter);
ButterKnife.bind(this, view); binding = RvItemBrowserFileBinding.bind(view);
} }
} }
} }