From 8b2694160a41d5d3f367f2d3bd84f888f67f643a Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Wed, 10 Aug 2016 14:48:10 +0800 Subject: [PATCH] improved unblock/unmute --- .../microblog/library/twitter/model/User.java | 22 +- .../twidere/model/ParcelableUser.java | 22 +- .../model/util/ParcelableUserUtils.java | 7 +- .../twidere/view/holder/UserViewHolder.java | 254 ------------------ .../twidere/adapter/DummyItemAdapter.kt | 2 +- .../twidere/adapter/ParcelableUsersAdapter.kt | 4 +- .../twidere/adapter/iface/IUsersAdapter.kt | 16 +- .../fragment/ParcelableUsersFragment.kt | 14 +- .../twidere/fragment/UserFragment.kt | 8 +- .../twidere/view/holder/UserViewHolder.kt | 251 +++++++++++++++++ .../res/layout/card_item_user_compact.xml | 20 ++ .../src/main/res/menu/menu_user_profile.xml | 14 +- .../ic_action_visibility_off-mdpi.svg | 13 + .../drawable/ic_action_visibility_on-mdpi.svg | 13 + 14 files changed, 369 insertions(+), 291 deletions(-) delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/view/holder/UserViewHolder.java create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt create mode 100644 twidere/src/main/svg/drawable/ic_action_visibility_off-mdpi.svg create mode 100644 twidere/src/main/svg/drawable/ic_action_visibility_on-mdpi.svg diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java index 2c0c342e5..98ffdecf2 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java @@ -235,9 +235,17 @@ public class User extends TwitterResponseObject implements Comparable, Par @JsonField(name = "blocks_you") boolean blocksYou; + @JsonField(name = "blocked_by") + boolean blockedBy; + @JsonField(name = "statusnet_blocking") boolean statusnetBlocking; + @JsonField(name = "blocking") + boolean blocking; + @JsonField(name = "muting") + boolean muting; + @JsonField(name = "pinned_tweet_ids") String[] pinnedTweetIds; @@ -278,7 +286,7 @@ public class User extends TwitterResponseObject implements Comparable, Par public boolean isFollowedBy() { - return followedBy; + return followedBy || followsYou; } @@ -519,16 +527,16 @@ public class User extends TwitterResponseObject implements Comparable, Par return uniqueId; } - public boolean isStatusnetBlocking() { - return statusnetBlocking; + public boolean isBlocking() { + return blocking || statusnetBlocking; } - public boolean isBlocksYou() { - return blocksYou; + public boolean isBlockedBy() { + return blockedBy || blocksYou; } - public boolean isFollowsYou() { - return followsYou; + public boolean isMuting() { + return muting; } public String[] getPinnedTweetIds() { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableUser.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableUser.java index a20e04245..a40149cba 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableUser.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableUser.java @@ -336,15 +336,18 @@ public class ParcelableUser implements Parcelable, Comparable { @JsonField(name = "unique_id") @ParcelableThisPlease public String unique_id; - @JsonField(name = "statusnet_blocking") + @JsonField(name = "blocking") @ParcelableThisPlease - public boolean statusnet_blocking; - @JsonField(name = "statusnet_blocked_by") + public boolean blocking; + @JsonField(name = "blocked_by") @ParcelableThisPlease - public boolean statusnet_blocked_by; - @JsonField(name = "statusnet_followed_by") + public boolean blocked_by; + @JsonField(name = "followed_by") @ParcelableThisPlease - public boolean statusnet_followed_by; + public boolean followed_by; + @JsonField(name = "muting") + @ParcelableThisPlease + public boolean muting; @Override @@ -366,9 +369,10 @@ public class ParcelableUser implements Parcelable, Comparable { ", profile_image_url_profile_size='" + profile_image_url_profile_size + '\'' + ", groups_count=" + groups_count + ", unique_id='" + unique_id + '\'' + - ", statusnet_blocking=" + statusnet_blocking + - ", statusnet_blocked_by=" + statusnet_blocked_by + - ", statusnet_followed_by=" + statusnet_followed_by + + ", blocking=" + blocking + + ", blocked_by=" + blocked_by + + ", followed_by=" + followed_by + + ", muting=" + muting + '}'; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableUserUtils.java b/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableUserUtils.java index b8b0851c0..b0b5e4495 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableUserUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableUserUtils.java @@ -76,9 +76,10 @@ public class ParcelableUserUtils implements TwidereConstants { ParcelableUser.Extras extras = new ParcelableUser.Extras(); extras.ostatus_uri = user.getOstatusUri(); - extras.statusnet_blocking = user.isStatusnetBlocking(); - extras.statusnet_blocked_by = user.isBlocksYou(); - extras.statusnet_followed_by = user.isFollowsYou(); + extras.blocking = user.isBlocking(); + extras.blocked_by = user.isBlockedBy(); + extras.followed_by = user.isFollowedBy(); + extras.muting = user.isMuting(); extras.statusnet_profile_url = user.getStatusnetProfileUrl(); extras.profile_image_url_original = user.getProfileImageUrlOriginal(); extras.profile_image_url_profile_size = user.getProfileImageUrlProfileSize(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/UserViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/UserViewHolder.java deleted file mode 100644 index 04d27ca83..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/UserViewHolder.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * 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 org.mariotaku.twidere.view.holder; - -import android.content.Context; -import android.support.v7.widget.RecyclerView.ViewHolder; -import android.text.TextUtils; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnLongClickListener; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.TextView; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.adapter.iface.IUsersAdapter; -import org.mariotaku.twidere.adapter.iface.IUsersAdapter.FollowClickListener; -import org.mariotaku.twidere.adapter.iface.IUsersAdapter.RequestClickListener; -import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserClickListener; -import org.mariotaku.twidere.model.ParcelableUser; -import org.mariotaku.twidere.model.util.UserKeyUtils; -import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.MediaLoaderWrapper; -import org.mariotaku.twidere.util.UserColorNameManager; -import org.mariotaku.twidere.view.NameView; -import org.mariotaku.twidere.view.iface.IColorLabelView; - -import java.util.Locale; - -import static org.mariotaku.twidere.util.Utils.getLocalizedNumber; -import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes; - -public class UserViewHolder extends ViewHolder implements OnClickListener, OnLongClickListener { - - private final IUsersAdapter adapter; - - private final IColorLabelView itemContent; - private final ImageView profileImageView; - private final ImageView profileTypeView; - private final NameView nameView; - private final TextView externalIndicator; - private final TextView descriptionView, locationView, urlView, - statusesCountView, followersCountView, friendsCountView; - - private final ImageButton acceptRequestButton, denyRequestButton, followButton; - private final View actionsProgressContainer; - private final View actionsContainer; - private final View processingRequestProgress; - - private UserClickListener userClickListener; - private RequestClickListener requestClickListener; - private FollowClickListener followClickListener; - - public UserViewHolder(final IUsersAdapter adapter, final View itemView) { - super(itemView); - this.adapter = adapter; - itemContent = (IColorLabelView) itemView.findViewById(R.id.itemContent); - profileImageView = (ImageView) itemView.findViewById(R.id.profileImage); - profileTypeView = (ImageView) itemView.findViewById(R.id.profileType); - nameView = (NameView) itemView.findViewById(R.id.name); - externalIndicator = (TextView) itemView.findViewById(R.id.externalIndicator); - descriptionView = (TextView) itemView.findViewById(R.id.description); - locationView = (TextView) itemView.findViewById(R.id.location); - urlView = (TextView) itemView.findViewById(R.id.url); - statusesCountView = (TextView) itemView.findViewById(R.id.statusesCount); - followersCountView = (TextView) itemView.findViewById(R.id.followersCount); - friendsCountView = (TextView) itemView.findViewById(R.id.friendsCount); - actionsProgressContainer = itemView.findViewById(R.id.actionsProgressContainer); - actionsContainer = itemView.findViewById(R.id.actionsContainer); - acceptRequestButton = (ImageButton) itemView.findViewById(R.id.acceptRequest); - denyRequestButton = (ImageButton) itemView.findViewById(R.id.denyRequest); - followButton = (ImageButton) itemView.findViewById(R.id.follow); - processingRequestProgress = itemView.findViewById(R.id.processingRequest); - } - - public void displayUser(ParcelableUser user) { - - final Context context = adapter.getContext(); - final MediaLoaderWrapper loader = adapter.getMediaLoader(); - final UserColorNameManager manager = adapter.getUserColorNameManager(); - final AsyncTwitterWrapper twitter = adapter.getTwitterWrapper(); - - - itemContent.drawStart(manager.getUserColor(user.key)); - - final int userTypeRes = getUserTypeIconRes(user.is_verified, user.is_protected); - if (userTypeRes != 0) { - profileTypeView.setImageResource(userTypeRes); - } else { - profileTypeView.setImageDrawable(null); - } - nameView.setName(manager.getUserNickname(user.key, user.name)); - nameView.setScreenName("@" + user.screen_name); - nameView.updateText(adapter.getBidiFormatter()); - descriptionView.setVisibility(TextUtils.isEmpty(user.description_unescaped) ? View.GONE : View.VISIBLE); - descriptionView.setText(user.description_unescaped); - locationView.setVisibility(TextUtils.isEmpty(user.location) ? View.GONE : View.VISIBLE); - locationView.setText(user.location); - urlView.setVisibility(TextUtils.isEmpty(user.url_expanded) ? View.GONE : View.VISIBLE); - urlView.setText(user.url_expanded); - final Locale locale = Locale.getDefault(); - statusesCountView.setText(getLocalizedNumber(locale, user.statuses_count)); - followersCountView.setText(getLocalizedNumber(locale, user.followers_count)); - friendsCountView.setText(getLocalizedNumber(locale, user.friends_count)); - if (adapter.getProfileImageEnabled()) { - profileImageView.setVisibility(View.VISIBLE); - loader.displayProfileImage(profileImageView, user); - } else { - profileImageView.setVisibility(View.GONE); - loader.cancelDisplayTask(profileImageView); - } - - if (twitter.isUpdatingRelationship(user.account_key, user.key)) { - processingRequestProgress.setVisibility(View.VISIBLE); - actionsContainer.setVisibility(View.GONE); - } else { - processingRequestProgress.setVisibility(View.GONE); - actionsContainer.setVisibility(View.VISIBLE); - } - if (UserKeyUtils.isSameHost(user.account_key, user.key)) { - externalIndicator.setVisibility(View.GONE); - } else { - externalIndicator.setVisibility(View.VISIBLE); - externalIndicator.setText(context.getString(R.string.external_user_host_format, user - .key.getHost())); - } - - followButton.setImageResource(user.is_following ? R.drawable.ic_action_confirm : - R.drawable.ic_action_add); - followButton.setActivated(user.is_following); - - final boolean isMySelf = user.account_key.equals(user.key); - - if (requestClickListener != null && !isMySelf) { - acceptRequestButton.setVisibility(View.VISIBLE); - denyRequestButton.setVisibility(View.VISIBLE); - } else { - acceptRequestButton.setVisibility(View.GONE); - denyRequestButton.setVisibility(View.GONE); - } - if (followClickListener != null && !isMySelf) { - followButton.setVisibility(View.VISIBLE); - } else { - followButton.setVisibility(View.GONE); - } - } - - public ImageView getProfileImageView() { - return profileImageView; - } - - public ImageView getProfileTypeView() { - return profileTypeView; - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.itemContent: { - if (userClickListener == null) return; - userClickListener.onUserClick(this, getLayoutPosition()); - break; - } - case R.id.acceptRequest: { - if (requestClickListener == null) return; - requestClickListener.onAcceptClicked(this, getLayoutPosition()); - break; - } - case R.id.denyRequest: { - if (requestClickListener == null) return; - requestClickListener.onDenyClicked(this, getLayoutPosition()); - break; - } - case R.id.follow: { - if (followClickListener == null) return; - followClickListener.onFollowClicked(this, getLayoutPosition()); - break; - } - } - } - - @Override - public boolean onLongClick(View v) { - if (userClickListener == null) return false; - switch (v.getId()) { - case R.id.itemContent: { - return userClickListener.onUserLongClick(this, getLayoutPosition()); - } - } - return false; - } - - public void setOnClickListeners() { - setUserClickListener(adapter.getUserClickListener()); - setActionClickListeners(adapter.getRequestClickListener(), adapter.getFollowClickListener()); - } - - private void setActionClickListeners(RequestClickListener requestClickListener, - FollowClickListener followClickListener) { - this.requestClickListener = requestClickListener; - this.followClickListener = followClickListener; - if (requestClickListener != null || followClickListener != null) { - nameView.setTwoLine(true); - actionsProgressContainer.setVisibility(View.VISIBLE); - } else { - nameView.setTwoLine(false); - actionsProgressContainer.setVisibility(View.GONE); - } - nameView.updateText(); - acceptRequestButton.setOnClickListener(this); - denyRequestButton.setOnClickListener(this); - followButton.setOnClickListener(this); - } - - public void setTextSize(final float textSize) { - descriptionView.setTextSize(textSize); - externalIndicator.setTextSize(textSize); - nameView.setPrimaryTextSize(textSize); - nameView.setSecondaryTextSize(textSize * 0.75f); - locationView.setTextSize(textSize); - urlView.setTextSize(textSize); - statusesCountView.setTextSize(textSize); - followersCountView.setTextSize(textSize); - friendsCountView.setTextSize(textSize); - } - - public void setUserClickListener(UserClickListener listener) { - userClickListener = listener; - ((View) itemContent).setOnClickListener(this); - ((View) itemContent).setOnLongClickListener(this); - } - - public void setupViewOptions() { - setTextSize(adapter.getTextSize()); - } - -} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt index d9b8e09ef..5c6dd6003 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt @@ -46,7 +46,7 @@ class DummyItemAdapter @JvmOverloads constructor( override var sensitiveContentEnabled: Boolean = false override var mediaPreviewEnabled: Boolean = false override var isShowAbsoluteTime: Boolean = false - override var followClickListener: IUsersAdapter.FollowClickListener? = null + override var followClickListener: IUsersAdapter.FriendshipClickListener? = null override var requestClickListener: IUsersAdapter.RequestClickListener? = null override var statusClickListener: IStatusViewHolder.StatusClickListener? = null override var userClickListener: IUsersAdapter.UserClickListener? = null diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt index abbeee90b..e1c5db548 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt @@ -46,7 +46,7 @@ class ParcelableUsersAdapter(context: Context) : LoadMoreSupportAdapter : IContentCardAdapter { val requestClickListener: RequestClickListener? - val followClickListener: FollowClickListener? + val followClickListener: FriendshipClickListener? val showAccountsColor: Boolean @@ -58,16 +58,26 @@ interface IUsersAdapter : IContentCardAdapter { fun onDenyClicked(holder: UserViewHolder, position: Int) } - interface FollowClickListener { + interface FriendshipClickListener { fun onFollowClicked(holder: UserViewHolder, position: Int) + fun onUnblockClicked(holder: UserViewHolder, position: Int) + fun onUnmuteClicked(holder: UserViewHolder, position: Int) } - abstract class SimpleUserClickListener : UserClickListener, RequestClickListener, FollowClickListener { + abstract class SimpleUserClickListener : UserClickListener, RequestClickListener, FriendshipClickListener { override fun onFollowClicked(holder: UserViewHolder, position: Int) { } + override fun onUnblockClicked(holder: UserViewHolder, position: Int) { + + } + + override fun onUnmuteClicked(holder: UserViewHolder, position: Int) { + + } + override fun onAcceptClicked(holder: UserViewHolder, position: Int) { } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt index a5db80be7..579e89863 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt @@ -48,7 +48,7 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallb import org.mariotaku.twidere.util.RecyclerViewNavigationHelper import org.mariotaku.twidere.view.holder.UserViewHolder -abstract class ParcelableUsersFragment protected constructor() : AbsContentListRecyclerViewFragment(), LoaderCallbacks?>, UserClickListener, KeyboardShortcutCallback, IUsersAdapter.FollowClickListener { +abstract class ParcelableUsersFragment protected constructor() : AbsContentListRecyclerViewFragment(), LoaderCallbacks?>, UserClickListener, KeyboardShortcutCallback, IUsersAdapter.FriendshipClickListener { private val usersBusCallback: Any @@ -151,6 +151,18 @@ abstract class ParcelableUsersFragment protected constructor() : AbsContentListR } } + override fun onUnblockClicked(holder: UserViewHolder, position: Int) { + val user = adapter?.getUser(position) ?: return + if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return + twitterWrapper.destroyBlockAsync(user.account_key, user.key) + } + + override fun onUnmuteClicked(holder: UserViewHolder, position: Int) { + val user = adapter?.getUser(position) ?: return + if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return + twitterWrapper.destroyMuteAsync(user.account_key, user.key) + } + protected open val userReferral: String? @Referral get() = null diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt index e137bb600..2dc6cd221 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt @@ -1515,10 +1515,10 @@ class UserFragment : BaseSupportFragment(), OnClickListener, OnLinkClickListener this.filtering = filtering if (user.extras != null) { this.following = user.is_following - this.followed_by = user.extras.statusnet_followed_by - this.blocking = user.extras.statusnet_blocking - this.blocked_by = user.extras.statusnet_blocked_by - this.can_dm = user.extras.statusnet_followed_by + this.followed_by = user.extras.followed_by + this.blocking = user.extras.blocking + this.blocked_by = user.extras.blocked_by + this.can_dm = user.extras.followed_by } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt new file mode 100644 index 000000000..59a069814 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt @@ -0,0 +1,251 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * 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 org.mariotaku.twidere.view.holder + +import android.support.v7.widget.RecyclerView.ViewHolder +import android.text.TextUtils +import android.view.View +import android.view.View.OnClickListener +import android.view.View.OnLongClickListener +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.TextView +import kotlinx.android.synthetic.main.card_item_user_compact.view.* +import org.mariotaku.twidere.R +import org.mariotaku.twidere.adapter.iface.IUsersAdapter +import org.mariotaku.twidere.adapter.iface.IUsersAdapter.* +import org.mariotaku.twidere.model.ParcelableUser +import org.mariotaku.twidere.model.util.UserKeyUtils +import org.mariotaku.twidere.util.Utils.getLocalizedNumber +import org.mariotaku.twidere.util.Utils.getUserTypeIconRes +import org.mariotaku.twidere.view.NameView +import org.mariotaku.twidere.view.iface.IColorLabelView +import java.util.* + +class UserViewHolder( + private val adapter: IUsersAdapter<*>, + itemView: View +) : ViewHolder(itemView), OnClickListener, OnLongClickListener { + + private val itemContent: IColorLabelView + val profileImageView: ImageView + val profileTypeView: ImageView + private val nameView: NameView + private val externalIndicator: TextView + private val descriptionView: TextView + private val locationView: TextView + private val urlView: TextView + private val statusesCountView: TextView + private val followersCountView: TextView + private val friendsCountView: TextView + + private val acceptRequestButton: ImageButton + private val denyRequestButton: ImageButton + private val unblockButton: ImageButton + private val unmuteButton: ImageButton + private val followButton: ImageButton + private val actionsProgressContainer: View + private val actionsContainer: View + private val processingRequestProgress: View + + private var userClickListener: UserClickListener? = null + private var requestClickListener: RequestClickListener? = null + private var friendshipClickListener: FriendshipClickListener? = null + + init { + itemContent = itemView.findViewById(R.id.itemContent) as IColorLabelView + profileImageView = itemView.findViewById(R.id.profileImage) as ImageView + profileTypeView = itemView.findViewById(R.id.profileType) as ImageView + nameView = itemView.findViewById(R.id.name) as NameView + externalIndicator = itemView.findViewById(R.id.externalIndicator) as TextView + descriptionView = itemView.findViewById(R.id.description) as TextView + locationView = itemView.findViewById(R.id.location) as TextView + urlView = itemView.findViewById(R.id.url) as TextView + statusesCountView = itemView.findViewById(R.id.statusesCount) as TextView + followersCountView = itemView.findViewById(R.id.followersCount) as TextView + friendsCountView = itemView.findViewById(R.id.friendsCount) as TextView + actionsProgressContainer = itemView.findViewById(R.id.actionsProgressContainer) + actionsContainer = itemView.findViewById(R.id.actionsContainer) + acceptRequestButton = itemView.acceptRequest + denyRequestButton = itemView.denyRequest + unblockButton = itemView.unblock + unmuteButton = itemView.unmute + followButton = itemView.follow + processingRequestProgress = itemView.findViewById(R.id.processingRequest) + } + + fun displayUser(user: ParcelableUser) { + + val context = adapter.context + val loader = adapter.mediaLoader + val manager = adapter.userColorNameManager + val twitter = adapter.twitterWrapper + + + itemContent.drawStart(manager.getUserColor(user.key)) + + val userTypeRes = getUserTypeIconRes(user.is_verified, user.is_protected) + if (userTypeRes != 0) { + profileTypeView.setImageResource(userTypeRes) + } else { + profileTypeView.setImageDrawable(null) + } + nameView.setName(manager.getUserNickname(user.key, user.name)) + nameView.setScreenName("@${user.screen_name}") + nameView.updateText(adapter.bidiFormatter) + descriptionView.visibility = if (TextUtils.isEmpty(user.description_unescaped)) View.GONE else View.VISIBLE + descriptionView.text = user.description_unescaped + locationView.visibility = if (TextUtils.isEmpty(user.location)) View.GONE else View.VISIBLE + locationView.text = user.location + urlView.visibility = if (TextUtils.isEmpty(user.url_expanded)) View.GONE else View.VISIBLE + urlView.text = user.url_expanded + val locale = Locale.getDefault() + statusesCountView.text = getLocalizedNumber(locale, user.statuses_count) + followersCountView.text = getLocalizedNumber(locale, user.followers_count) + friendsCountView.text = getLocalizedNumber(locale, user.friends_count) + if (adapter.profileImageEnabled) { + profileImageView.visibility = View.VISIBLE + loader.displayProfileImage(profileImageView, user) + } else { + profileImageView.visibility = View.GONE + loader.cancelDisplayTask(profileImageView) + } + + if (twitter.isUpdatingRelationship(user.account_key, user.key)) { + processingRequestProgress.visibility = View.VISIBLE + actionsContainer.visibility = View.GONE + } else { + processingRequestProgress.visibility = View.GONE + actionsContainer.visibility = View.VISIBLE + } + if (UserKeyUtils.isSameHost(user.account_key, user.key)) { + externalIndicator.visibility = View.GONE + } else { + externalIndicator.visibility = View.VISIBLE + externalIndicator.text = context.getString(R.string.external_user_host_format, user.key.host) + } + + followButton.setImageResource(if (user.is_following) + R.drawable.ic_action_confirm + else + R.drawable.ic_action_add) + followButton.isActivated = user.is_following + + val isMySelf = user.account_key == user.key + + if (requestClickListener != null && !isMySelf) { + acceptRequestButton.visibility = View.VISIBLE + denyRequestButton.visibility = View.VISIBLE + } else { + acceptRequestButton.visibility = View.GONE + denyRequestButton.visibility = View.GONE + } + if (friendshipClickListener != null && !isMySelf) { + if (user.extras?.blocking ?: false) { + followButton.visibility = View.GONE + unblockButton.visibility = View.VISIBLE + } else { + followButton.visibility = View.VISIBLE + unblockButton.visibility = View.GONE + } + unmuteButton.visibility = if (user.extras?.muting ?: false) View.VISIBLE else View.GONE + } else { + followButton.visibility = View.GONE + unblockButton.visibility = View.GONE + unmuteButton.visibility = View.GONE + } + } + + override fun onClick(v: View) { + when (v.id) { + R.id.itemContent -> { + userClickListener?.onUserClick(this, layoutPosition) + } + R.id.acceptRequest -> { + requestClickListener?.onAcceptClicked(this, layoutPosition) + } + R.id.denyRequest -> { + requestClickListener?.onDenyClicked(this, layoutPosition) + } + R.id.follow -> { + friendshipClickListener?.onFollowClicked(this, layoutPosition) + } + R.id.unblock -> { + friendshipClickListener?.onUnblockClicked(this, layoutPosition) + } + } + } + + override fun onLongClick(v: View): Boolean { + when (v.id) { + R.id.itemContent -> { + return userClickListener?.onUserLongClick(this, layoutPosition) ?: false + } + } + return false + } + + fun setOnClickListeners() { + setUserClickListener(adapter.userClickListener) + setActionClickListeners(adapter.requestClickListener, adapter.followClickListener) + } + + private fun setActionClickListeners(requestClickListener: RequestClickListener?, + friendshipClickListener: FriendshipClickListener?) { + this.requestClickListener = requestClickListener + this.friendshipClickListener = friendshipClickListener + if (requestClickListener != null || friendshipClickListener != null) { + nameView.setTwoLine(true) + actionsProgressContainer.visibility = View.VISIBLE + } else { + nameView.setTwoLine(false) + actionsProgressContainer.visibility = View.GONE + } + nameView.updateText() + acceptRequestButton.setOnClickListener(this) + denyRequestButton.setOnClickListener(this) + followButton.setOnClickListener(this) + unblockButton.setOnClickListener(this) + unmuteButton.setOnClickListener(this) + } + + fun setTextSize(textSize: Float) { + descriptionView.textSize = textSize + externalIndicator.textSize = textSize + nameView.setPrimaryTextSize(textSize) + nameView.setSecondaryTextSize(textSize * 0.75f) + locationView.textSize = textSize + urlView.textSize = textSize + statusesCountView.textSize = textSize + followersCountView.textSize = textSize + friendsCountView.textSize = textSize + } + + fun setUserClickListener(listener: UserClickListener?) { + userClickListener = listener + (itemContent as View).setOnClickListener(this) + itemContent.setOnLongClickListener(this) + } + + fun setupViewOptions() { + setTextSize(adapter.textSize) + } + +} diff --git a/twidere/src/main/res/layout/card_item_user_compact.xml b/twidere/src/main/res/layout/card_item_user_compact.xml index efb4fb094..4b23a0d6e 100644 --- a/twidere/src/main/res/layout/card_item_user_compact.xml +++ b/twidere/src/main/res/layout/card_item_user_compact.xml @@ -104,6 +104,17 @@ android:orientation="horizontal" tools:visibility="visible"> + + + + diff --git a/twidere/src/main/res/menu/menu_user_profile.xml b/twidere/src/main/res/menu/menu_user_profile.xml index 0632ae8f3..16106b9ab 100644 --- a/twidere/src/main/res/menu/menu_user_profile.xml +++ b/twidere/src/main/res/menu/menu_user_profile.xml @@ -24,11 +24,6 @@ android:id="@id/set_nickname" android:icon="@drawable/ic_action_edit" android:title="@string/set_nickname"/> - + + + + ic_action_invisible-mdpi + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/svg/drawable/ic_action_visibility_on-mdpi.svg b/twidere/src/main/svg/drawable/ic_action_visibility_on-mdpi.svg new file mode 100644 index 000000000..7b6c42425 --- /dev/null +++ b/twidere/src/main/svg/drawable/ic_action_visibility_on-mdpi.svg @@ -0,0 +1,13 @@ + + + + ic_action_visible-mdpi + Created with Sketch. + + + + + + + + \ No newline at end of file