diff --git a/app/build.gradle b/app/build.gradle index 7b742bc2a..0c8554aa6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -116,8 +116,6 @@ dependencies { implementation 'eu.davidea:flexible-adapter:5.0.0-rc4' implementation 'eu.davidea:flexible-adapter-ui:1.0.0-b1' - implementation 'cn.carbs.android:AvatarImageView:1.0.4' - implementation 'com.github.bumptech.glide:glide:4.3.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.3.0' implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.0@aar' diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java new file mode 100644 index 000000000..e398145e0 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java @@ -0,0 +1,150 @@ +/* + * Nextcloud Talk application + * + * @author Mario Danic + * Copyright (C) 2017 Mario Danic (mario@lovelyhq.com) + * + * 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.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.model.GlideUrl; +import com.bumptech.glide.load.model.LazyHeaders; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.bumptech.glide.request.RequestOptions; +import com.nextcloud.talk.R; +import com.nextcloud.talk.api.helpers.api.ApiHelper; +import com.nextcloud.talk.api.models.json.participants.Participant; +import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.persistence.entities.UserEntity; +import com.nextcloud.talk.utils.glide.GlideApp; + +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +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 AdvancedUserItem extends AbstractFlexibleItem implements IFilterable { + + private Participant participant; + private UserEntity userEntity; + + public AdvancedUserItem(Participant participant, UserEntity userEntity) { + this.participant = participant; + this.userEntity = userEntity; + } + + @Override + public boolean equals(Object o) { + if (o instanceof UserItem) { + UserItem inItem = (UserItem) o; + return participant.equals(inItem.getModel()); + } + return false; + } + + @Override + public int hashCode() { + return participant.hashCode(); + } + + /** + * @return the model object + */ + + public Participant getModel() { + return participant; + } + + public UserEntity getEntity() { + return userEntity; + } + + @Override + public int getLayoutRes() { + return R.layout.rv_item_call; + } + + @Override + public UserItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) { + return new UserItemViewHolder(view, adapter); + } + + @Override + public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) { + if (adapter.hasSearchText()) { + FlexibleUtils.highlightText(holder.contactDisplayName, participant.getName(), adapter.getSearchText()); + } else { + holder.contactDisplayName.setText(participant.getName()); + } + + holder.serverUrl.setText(userEntity.getBaseUrl()); + + GlideUrl glideUrl = new GlideUrl(ApiHelper.getUrlForAvatarWithName(userEntity.getBaseUrl(), + participant.getUserId()), new LazyHeaders.Builder() + .setHeader("Accept", "image/*") + .setHeader("User-Agent", ApiHelper.getUserAgent()) + .build()); + + GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext()) + .asBitmap() + .skipMemoryCache(true) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .load(glideUrl) + .centerInside() + .apply(RequestOptions.bitmapTransform(new CircleCrop())) + .into(holder.avatarImageView) + ; + } + + @Override + public boolean filter(String constraint) { + return participant.getName() != null && + StringUtils.containsIgnoreCase(participant.getName().trim(), constraint); + } + + + static class UserItemViewHolder extends FlexibleViewHolder { + + @BindView(R.id.name_text) + public TextView contactDisplayName; + @BindView(R.id.secondary_text) + public TextView serverUrl; + @BindView(R.id.avatar_image) + public ImageView avatarImageView; + + /** + * Default constructor. + */ + UserItemViewHolder(View view, FlexibleAdapter adapter) { + super(view, adapter); + ButterKnife.bind(this, view); + } + } + + +} diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/CallItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/CallItem.java index 015a442d5..d2040bc9e 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/CallItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/CallItem.java @@ -24,18 +24,20 @@ import android.text.TextUtils; import android.text.format.DateUtils; import android.view.View; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.LazyHeaders; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.bumptech.glide.request.RequestOptions; import com.nextcloud.talk.R; import com.nextcloud.talk.api.helpers.api.ApiHelper; import com.nextcloud.talk.api.models.json.rooms.Room; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.events.MoreMenuClickEvent; import com.nextcloud.talk.persistence.entities.UserEntity; -import com.nextcloud.talk.utils.ColorUtils; import com.nextcloud.talk.utils.glide.GlideApp; import org.apache.commons.lang3.StringUtils; @@ -45,7 +47,6 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -import cn.carbs.android.avatarimageview.library.AvatarImageView; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.IFilterable; @@ -119,9 +120,6 @@ public class CallItem extends AbstractFlexibleItem holder.avatarImageView.setVisibility(View.VISIBLE); if (!TextUtils.isEmpty(room.getName())) { - holder.avatarImageView.setTextAndColorSeed(String.valueOf(room.getName(). - toUpperCase().charAt(0)), ColorUtils.colorSeed); - GlideUrl glideUrl = new GlideUrl(ApiHelper.getUrlForAvatarWithName(userEntity.getBaseUrl(), room.getName()), new LazyHeaders.Builder() .setHeader("Accept", "image/*") @@ -133,8 +131,8 @@ public class CallItem extends AbstractFlexibleItem .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .load(glideUrl) - .circleCrop() .centerInside() + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(holder.avatarImageView); } else { @@ -168,10 +166,10 @@ public class CallItem extends AbstractFlexibleItem @BindView(R.id.name_text) public TextView roomDisplayName; - @BindView(R.id.timestamp_text) + @BindView(R.id.secondary_text) public TextView roomLastPing; @BindView(R.id.avatar_image) - public AvatarImageView avatarImageView; + public ImageView avatarImageView; @BindView(R.id.more_menu) public ImageButton moreMenuButton; 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 ada1ae54e..2edb14182 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 @@ -21,17 +21,19 @@ package com.nextcloud.talk.adapters.items; import android.view.View; +import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.LazyHeaders; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.bumptech.glide.request.RequestOptions; import com.nextcloud.talk.R; import com.nextcloud.talk.api.helpers.api.ApiHelper; import com.nextcloud.talk.api.models.json.participants.Participant; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.persistence.entities.UserEntity; -import com.nextcloud.talk.utils.ColorUtils; import com.nextcloud.talk.utils.glide.GlideApp; import org.apache.commons.lang3.StringUtils; @@ -40,7 +42,6 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -import cn.carbs.android.avatarimageview.library.AvatarImageView; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.IFilterable; @@ -101,10 +102,6 @@ public class UserItem extends AbstractFlexibleItem holder.contactDisplayName.setText(participant.getName()); } - // Awful hack - holder.avatarImageView.setTextAndColorSeed(String.valueOf(participant.getName(). - toUpperCase().charAt(0)), ColorUtils.colorSeed); - GlideUrl glideUrl = new GlideUrl(ApiHelper.getUrlForAvatarWithName(userEntity.getBaseUrl(), participant.getUserId()), new LazyHeaders.Builder() .setHeader("Accept", "image/*") @@ -116,8 +113,8 @@ public class UserItem extends AbstractFlexibleItem .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .load(glideUrl) - .circleCrop() .centerInside() + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(holder.avatarImageView); } @@ -133,7 +130,7 @@ public class UserItem extends AbstractFlexibleItem @BindView(R.id.name_text) public TextView contactDisplayName; @BindView(R.id.avatar_image) - public AvatarImageView avatarImageView; + public ImageView avatarImageView; /** * Default constructor. diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java index d2db4d1f2..252a5e460 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java @@ -30,12 +30,15 @@ import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.LazyHeaders; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.bumptech.glide.request.RequestOptions; import com.evernote.android.job.JobRequest; import com.nextcloud.talk.BuildConfig; import com.nextcloud.talk.R; @@ -45,7 +48,6 @@ import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.jobs.AccountRemovalJob; import com.nextcloud.talk.persistence.entities.UserEntity; -import com.nextcloud.talk.utils.ColorUtils; import com.nextcloud.talk.utils.ErrorMessageHolder; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.glide.GlideApp; @@ -70,7 +72,6 @@ import javax.inject.Inject; import autodagger.AutoInjector; import butterknife.BindView; -import cn.carbs.android.avatarimageview.library.AvatarImageView; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; @@ -102,7 +103,7 @@ public class SettingsController extends BaseController { MaterialStandardPreference versionInfo; @BindView(R.id.avatar_image) - AvatarImageView avatarImageView; + ImageView avatarImageView; @BindView(R.id.display_name_text) TextView displayNameTextView; @@ -264,10 +265,7 @@ public class SettingsController extends BaseController { reauthorizeButton.setEnabled(true); }); - // Awful hack if (userEntity.getDisplayName() != null) { - avatarImageView.setTextAndColorSeed(String.valueOf(userEntity.getDisplayName(). - toUpperCase().charAt(0)), ColorUtils.colorSeed); displayNameTextView.setText(userEntity.getDisplayName()); } @@ -279,8 +277,8 @@ public class SettingsController extends BaseController { GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext()) .load(glideUrl) - .circleCrop() .centerInside() + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(avatarImageView); profileQueryDisposable = ncApi.getUserProfile(ApiHelper.getCredentials(userEntity.getUsername(), diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java b/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java index 532a881ed..7bd417e73 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java @@ -30,7 +30,7 @@ import android.view.View; import android.view.ViewGroup; import com.nextcloud.talk.R; -import com.nextcloud.talk.adapters.items.UserItem; +import com.nextcloud.talk.adapters.items.AdvancedUserItem; import com.nextcloud.talk.api.models.json.participants.Participant; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; @@ -47,6 +47,7 @@ import autodagger.AutoInjector; import butterknife.BindView; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; @@ -64,15 +65,15 @@ public class SwitchAccountController extends BaseController { @BindView(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout; - private FlexibleAdapter adapter; - private List userItems = new ArrayList<>(); + private FlexibleAdapter adapter; + private List userItems = new ArrayList<>(); private FlexibleAdapter.OnItemClickListener onItemClickListener = new FlexibleAdapter.OnItemClickListener() { @Override public boolean onItemClick(int position) { if (userItems.size() > position) { - UserEntity userEntity = userItems.get(position).getEntity(); + UserEntity userEntity = ((AdvancedUserItem) userItems.get(position)).getEntity(); userUtils.createOrUpdateUser(userEntity.getUsername(), userEntity.getToken(), userEntity.getBaseUrl(), null, null, true) @@ -128,7 +129,7 @@ public class SwitchAccountController extends BaseController { participant = new Participant(); participant.setName(userEntity.getDisplayName()); participant.setUserId(userEntity.getUsername()); - userItems.add(new UserItem(participant, userEntity)); + userItems.add(new AdvancedUserItem(participant, userEntity)); } } diff --git a/app/src/main/res/layout/controller_settings.xml b/app/src/main/res/layout/controller_settings.xml index 970e2e481..4a94939cf 100644 --- a/app/src/main/res/layout/controller_settings.xml +++ b/app/src/main/res/layout/controller_settings.xml @@ -47,15 +47,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + android:layout_centerHorizontal="true"/> - + android:layout_marginStart="@dimen/activity_horizontal_margin"/> - + android:layout_marginStart="@dimen/activity_horizontal_margin"/>