improved unblock/unmute
This commit is contained in:
parent
af0766748b
commit
8b2694160a
|
@ -235,9 +235,17 @@ public class User extends TwitterResponseObject implements Comparable<User>, 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<User>, Par
|
|||
|
||||
|
||||
public boolean isFollowedBy() {
|
||||
return followedBy;
|
||||
return followedBy || followsYou;
|
||||
}
|
||||
|
||||
|
||||
|
@ -519,16 +527,16 @@ public class User extends TwitterResponseObject implements Comparable<User>, 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() {
|
||||
|
|
|
@ -336,15 +336,18 @@ public class ParcelableUser implements Parcelable, Comparable<ParcelableUser> {
|
|||
@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<ParcelableUser> {
|
|||
", 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 +
|
||||
'}';
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -1,254 +0,0 @@
|
|||
/*
|
||||
* Twidere - Twitter client for Android
|
||||
*
|
||||
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -46,7 +46,7 @@ class ParcelableUsersAdapter(context: Context) : LoadMoreSupportAdapter<Recycler
|
|||
override val isShowAbsoluteTime: Boolean
|
||||
override var userClickListener: IUsersAdapter.UserClickListener? = null
|
||||
override var requestClickListener: IUsersAdapter.RequestClickListener? = null
|
||||
override var followClickListener: IUsersAdapter.FollowClickListener? = null
|
||||
override var followClickListener: IUsersAdapter.FriendshipClickListener? = null
|
||||
|
||||
|
||||
init {
|
||||
|
@ -68,7 +68,7 @@ class ParcelableUsersAdapter(context: Context) : LoadMoreSupportAdapter<Recycler
|
|||
}
|
||||
|
||||
protected fun bindUser(holder: UserViewHolder, position: Int) {
|
||||
holder.displayUser(getUser(position))
|
||||
holder.displayUser(getUser(position)!!)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
|
|
|
@ -33,7 +33,7 @@ interface IUsersAdapter<Data> : IContentCardAdapter {
|
|||
|
||||
val requestClickListener: RequestClickListener?
|
||||
|
||||
val followClickListener: FollowClickListener?
|
||||
val followClickListener: FriendshipClickListener?
|
||||
|
||||
val showAccountsColor: Boolean
|
||||
|
||||
|
@ -58,16 +58,26 @@ interface IUsersAdapter<Data> : 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) {
|
||||
|
||||
}
|
||||
|
|
|
@ -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<ParcelableUsersAdapter>(), LoaderCallbacks<List<ParcelableUser>?>, UserClickListener, KeyboardShortcutCallback, IUsersAdapter.FollowClickListener {
|
||||
abstract class ParcelableUsersFragment protected constructor() : AbsContentListRecyclerViewFragment<ParcelableUsersAdapter>(), LoaderCallbacks<List<ParcelableUser>?>, 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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
* Twidere - Twitter client for Android
|
||||
*
|
||||
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
}
|
|
@ -104,6 +104,17 @@
|
|||
android:orientation="horizontal"
|
||||
tools:visibility="visible">
|
||||
|
||||
|
||||
<org.mariotaku.twidere.view.IconActionButton
|
||||
android:id="@+id/unmute"
|
||||
style="?buttonStyleSmall"
|
||||
android:layout_width="@dimen/button_size_content_card"
|
||||
android:layout_height="@dimen/button_size_content_card"
|
||||
android:contentDescription="@string/follow"
|
||||
android:src="@drawable/ic_action_visibility_off"
|
||||
app:backgroundTint="@color/material_grey"
|
||||
app:iabColor="@android:color/transparent"/>
|
||||
|
||||
<org.mariotaku.twidere.view.IconActionButton
|
||||
android:id="@+id/follow"
|
||||
style="?buttonStyleSmall"
|
||||
|
@ -134,6 +145,15 @@
|
|||
app:backgroundTint="@color/material_red"
|
||||
app:iabColor="@android:color/transparent"/>
|
||||
|
||||
<org.mariotaku.twidere.view.IconActionButton
|
||||
android:id="@+id/unblock"
|
||||
style="?buttonStyleSmall"
|
||||
android:layout_width="@dimen/button_size_content_card"
|
||||
android:layout_height="@dimen/button_size_content_card"
|
||||
android:contentDescription="@string/deny"
|
||||
android:src="@drawable/ic_action_block"
|
||||
app:backgroundTint="@color/material_red"
|
||||
app:iabColor="@android:color/transparent"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -24,11 +24,6 @@
|
|||
android:id="@id/set_nickname"
|
||||
android:icon="@drawable/ic_action_edit"
|
||||
android:title="@string/set_nickname"/>
|
||||
<item
|
||||
android:id="@id/add_to_filter"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_action_speaker_muted"
|
||||
android:title="@string/add_to_filter"/>
|
||||
<item
|
||||
android:id="@+id/incoming_friendships"
|
||||
android:icon="@drawable/ic_action_profile"
|
||||
|
@ -50,10 +45,15 @@
|
|||
android:checkable="true"
|
||||
android:icon="@drawable/ic_action_retweet"
|
||||
android:title="@string/enable_retweets"/>
|
||||
<item
|
||||
android:id="@id/add_to_filter"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_action_speaker_muted"
|
||||
android:title="@string/add_to_filter"/>
|
||||
<item
|
||||
android:id="@id/mute_user"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_action_mic_muted"
|
||||
android:icon="@drawable/ic_action_visibility_off"
|
||||
android:title="@string/twitter_mute_user"/>
|
||||
<item
|
||||
android:id="@id/block"
|
||||
|
@ -65,7 +65,7 @@
|
|||
android:title="@string/report_for_spam"/>
|
||||
<item
|
||||
android:id="@+id/muted_users"
|
||||
android:icon="@drawable/ic_action_mic_muted"
|
||||
android:icon="@drawable/ic_action_visibility_off"
|
||||
android:title="@string/twitter_muted_users"/>
|
||||
<item
|
||||
android:id="@+id/blocked_users"
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>ic_action_invisible-mdpi</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="ic_action_invisible-mdpi">
|
||||
<path d="M4,4 L28,4 L28,28 L4,28 L4,4 Z M4,4 L28,4 L28,28 L4,28 L4,4 Z M4,4 L28,4 L28,28 L4,28 L4,4 Z M4,4 L28,4 L28,28 L4,28 L4,4 Z" id="Shape"></path>
|
||||
<path d="M16,11 C18.76,11 21,13.24 21,16 C21,16.65 20.87,17.26 20.64,17.83 L23.56,20.75 C25.07,19.49 26.26,17.86 26.99,16 C25.26,11.61 20.99,8.5 15.99,8.5 C14.59,8.5 13.25,8.75 12.01,9.2 L14.17,11.36 C14.74,11.13 15.35,11 16,11 L16,11 Z M6,8.27 L8.28,10.55 L8.74,11.01 C7.08,12.3 5.78,14.02 5,16 C6.73,20.39 11,23.5 16,23.5 C17.55,23.5 19.03,23.2 20.38,22.66 L20.8,23.08 L23.73,26 L25,24.73 L7.27,7 L6,8.27 L6,8.27 Z M11.53,13.8 L13.08,15.35 C13.03,15.56 13,15.78 13,16 C13,17.66 14.34,19 16,19 C16.22,19 16.44,18.97 16.65,18.92 L18.2,20.47 C17.53,20.8 16.79,21 16,21 C13.24,21 11,18.76 11,16 C11,15.21 11.2,14.47 11.53,13.8 L11.53,13.8 Z M15.84,13.02 L18.99,16.17 L19.01,16.01 C19.01,14.35 17.67,13.01 16.01,13.01 L15.84,13.02 L15.84,13.02 Z" id="Shape" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>ic_action_visible-mdpi</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="ic_action_visible-mdpi">
|
||||
<polygon id="Shape" points="4 4 28 4 28 28 4 28"></polygon>
|
||||
<path d="M16,8.5 C11,8.5 6.73,11.61 5,16 C6.73,20.39 11,23.5 16,23.5 C21,23.5 25.27,20.39 27,16 C25.27,11.61 21,8.5 16,8.5 L16,8.5 Z M16,21 C13.24,21 11,18.76 11,16 C11,13.24 13.24,11 16,11 C18.76,11 21,13.24 21,16 C21,18.76 18.76,21 16,21 L16,21 Z M16,13 C14.34,13 13,14.34 13,16 C13,17.66 14.34,19 16,19 C17.66,19 19,17.66 19,16 C19,14.34 17.66,13 16,13 L16,13 Z" id="Shape" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1022 B |
Loading…
Reference in New Issue