improved unblock/unmute

This commit is contained in:
Mariotaku Lee 2016-08-10 14:48:10 +08:00
parent af0766748b
commit 8b2694160a
14 changed files with 369 additions and 291 deletions

View File

@ -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() {

View File

@ -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 +
'}';
}

View File

@ -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();

View File

@ -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());
}
}

View File

@ -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

View File

@ -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 {

View File

@ -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) {
}

View File

@ -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

View File

@ -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
}
}

View File

@ -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)
}
}

View File

@ -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>

View File

@ -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"

View File

@ -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

View File

@ -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