The block list is now its own functional piece, instead of just being a copy of the following/follows lists on account profiles.
parent
9b6f5e63d3
commit
c4114b6be2
@ -0,0 +1,141 @@ |
||||
/* Copyright 2017 Andrew Dawson |
||||
* |
||||
* This file is part of Tusky. |
||||
* |
||||
* Tusky 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. |
||||
* |
||||
* Tusky 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 Tusky. If not, see |
||||
* <http://www.gnu.org/licenses/>. */
|
||||
|
||||
package com.keylesspalace.tusky; |
||||
|
||||
import android.support.v7.widget.RecyclerView; |
||||
import android.view.LayoutInflater; |
||||
import android.view.View; |
||||
import android.view.ViewGroup; |
||||
import android.widget.Button; |
||||
import android.widget.TextView; |
||||
|
||||
import com.android.volley.toolbox.NetworkImageView; |
||||
|
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
class BlocksAdapter extends AccountAdapter { |
||||
private static final int VIEW_TYPE_BLOCKED_USER = 0; |
||||
private static final int VIEW_TYPE_FOOTER = 1; |
||||
|
||||
private Set<Integer> unblockedAccountPositions; |
||||
|
||||
BlocksAdapter(AccountActionListener accountActionListener, |
||||
FooterActionListener footerActionListener) { |
||||
super(accountActionListener, footerActionListener); |
||||
unblockedAccountPositions = new HashSet<>(); |
||||
} |
||||
|
||||
@Override |
||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
||||
switch (viewType) { |
||||
default: |
||||
case VIEW_TYPE_BLOCKED_USER: { |
||||
View view = LayoutInflater.from(parent.getContext()) |
||||
.inflate(R.layout.item_blocked_user, parent, false); |
||||
return new BlockedUserViewHolder(view); |
||||
} |
||||
case VIEW_TYPE_FOOTER: { |
||||
View view = LayoutInflater.from(parent.getContext()) |
||||
.inflate(R.layout.item_footer, parent, false); |
||||
return new FooterViewHolder(view); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { |
||||
if (position < accountList.size()) { |
||||
BlockedUserViewHolder holder = (BlockedUserViewHolder) viewHolder; |
||||
holder.setupWithAccount(accountList.get(position)); |
||||
boolean blocked = !unblockedAccountPositions.contains(position); |
||||
holder.setupActionListener(accountActionListener, blocked, position); |
||||
} else { |
||||
FooterViewHolder holder = (FooterViewHolder) viewHolder; |
||||
holder.setState(footerState); |
||||
holder.setupButton(footerActionListener); |
||||
holder.setRetryMessage(R.string.footer_retry_accounts); |
||||
holder.setEndOfTimelineMessage(R.string.footer_end_of_accounts); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public int getItemViewType(int position) { |
||||
if (position == accountList.size()) { |
||||
return VIEW_TYPE_FOOTER; |
||||
} else { |
||||
return VIEW_TYPE_BLOCKED_USER; |
||||
} |
||||
} |
||||
|
||||
public void setBlocked(boolean blocked, int position) { |
||||
if (blocked) { |
||||
unblockedAccountPositions.remove(position); |
||||
} else { |
||||
unblockedAccountPositions.add(position); |
||||
} |
||||
notifyItemChanged(position); |
||||
} |
||||
|
||||
private static class BlockedUserViewHolder extends RecyclerView.ViewHolder { |
||||
private NetworkImageView avatar; |
||||
private TextView username; |
||||
private TextView displayName; |
||||
private Button unblock; |
||||
private String id; |
||||
|
||||
BlockedUserViewHolder(View itemView) { |
||||
super(itemView); |
||||
avatar = (NetworkImageView) itemView.findViewById(R.id.blocked_user_avatar); |
||||
displayName = (TextView) itemView.findViewById(R.id.blocked_user_display_name); |
||||
username = (TextView) itemView.findViewById(R.id.blocked_user_username); |
||||
unblock = (Button) itemView.findViewById(R.id.blocked_user_unblock); |
||||
} |
||||
|
||||
void setupWithAccount(Account account) { |
||||
id = account.id; |
||||
displayName.setText(account.displayName); |
||||
String format = username.getContext().getString(R.string.status_username_format); |
||||
String formattedUsername = String.format(format, account.username); |
||||
username.setText(formattedUsername); |
||||
avatar.setImageUrl(account.avatar, |
||||
VolleySingleton.getInstance(avatar.getContext()).getImageLoader()); |
||||
} |
||||
|
||||
void setupActionListener(final AccountActionListener listener, final boolean blocked, |
||||
final int position) { |
||||
int unblockTextId; |
||||
if (blocked) { |
||||
unblockTextId = R.string.action_unblock; |
||||
} else { |
||||
unblockTextId = R.string.action_block; |
||||
} |
||||
unblock.setText(unblock.getContext().getString(unblockTextId)); |
||||
unblock.setOnClickListener(new View.OnClickListener() { |
||||
@Override |
||||
public void onClick(View v) { |
||||
listener.onBlock(!blocked, id, position); |
||||
} |
||||
}); |
||||
avatar.setOnClickListener(new View.OnClickListener() { |
||||
@Override |
||||
public void onClick(View v) { |
||||
listener.onViewAccount(id); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,119 @@ |
||||
/* Copyright 2017 Andrew Dawson |
||||
* |
||||
* This file is part of Tusky. |
||||
* |
||||
* Tusky 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. |
||||
* |
||||
* Tusky 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 Tusky. If not, see |
||||
* <http://www.gnu.org/licenses/>. */
|
||||
|
||||
package com.keylesspalace.tusky; |
||||
|
||||
import android.content.Context; |
||||
import android.support.v7.widget.RecyclerView; |
||||
import android.view.LayoutInflater; |
||||
import android.view.View; |
||||
import android.view.ViewGroup; |
||||
import android.widget.TextView; |
||||
|
||||
import com.android.volley.toolbox.ImageLoader; |
||||
import com.android.volley.toolbox.NetworkImageView; |
||||
|
||||
/** Both for follows and following lists. */ |
||||
class FollowAdapter extends AccountAdapter { |
||||
private static final int VIEW_TYPE_ACCOUNT = 0; |
||||
private static final int VIEW_TYPE_FOOTER = 1; |
||||
|
||||
FollowAdapter(AccountActionListener accountActionListener, |
||||
FooterActionListener footerActionListener) { |
||||
super(accountActionListener, footerActionListener); |
||||
} |
||||
|
||||
@Override |
||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
||||
switch (viewType) { |
||||
default: |
||||
case VIEW_TYPE_ACCOUNT: { |
||||
View view = LayoutInflater.from(parent.getContext()) |
||||
.inflate(R.layout.item_account, parent, false); |
||||
return new AccountViewHolder(view); |
||||
} |
||||
case VIEW_TYPE_FOOTER: { |
||||
View view = LayoutInflater.from(parent.getContext()) |
||||
.inflate(R.layout.item_footer, parent, false); |
||||
return new FooterViewHolder(view); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { |
||||
if (position < accountList.size()) { |
||||
AccountViewHolder holder = (AccountViewHolder) viewHolder; |
||||
holder.setupWithAccount(accountList.get(position)); |
||||
holder.setupActionListener(accountActionListener); |
||||
} else { |
||||
FooterViewHolder holder = (FooterViewHolder) viewHolder; |
||||
holder.setState(footerState); |
||||
holder.setupButton(footerActionListener); |
||||
holder.setRetryMessage(R.string.footer_retry_accounts); |
||||
holder.setEndOfTimelineMessage(R.string.footer_end_of_accounts); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public int getItemViewType(int position) { |
||||
if (position == accountList.size()) { |
||||
return VIEW_TYPE_FOOTER; |
||||
} else { |
||||
return VIEW_TYPE_ACCOUNT; |
||||
} |
||||
} |
||||
|
||||
private static class AccountViewHolder extends RecyclerView.ViewHolder { |
||||
private View container; |
||||
private TextView username; |
||||
private TextView displayName; |
||||
private TextView note; |
||||
private NetworkImageView avatar; |
||||
private String id; |
||||
|
||||
AccountViewHolder(View itemView) { |
||||
super(itemView); |
||||
container = itemView.findViewById(R.id.account_container); |
||||
username = (TextView) itemView.findViewById(R.id.account_username); |
||||
displayName = (TextView) itemView.findViewById(R.id.account_display_name); |
||||
note = (TextView) itemView.findViewById(R.id.account_note); |
||||
avatar = (NetworkImageView) itemView.findViewById(R.id.account_avatar); |
||||
avatar.setDefaultImageResId(R.drawable.avatar_default); |
||||
avatar.setErrorImageResId(R.drawable.avatar_error); |
||||
} |
||||
|
||||
void setupWithAccount(Account account) { |
||||
id = account.id; |
||||
String format = username.getContext().getString(R.string.status_username_format); |
||||
String formattedUsername = String.format(format, account.username); |
||||
username.setText(formattedUsername); |
||||
displayName.setText(account.displayName); |
||||
note.setText(account.note); |
||||
Context context = avatar.getContext(); |
||||
ImageLoader imageLoader = VolleySingleton.getInstance(context).getImageLoader(); |
||||
avatar.setImageUrl(account.avatar, imageLoader); |
||||
} |
||||
|
||||
void setupActionListener(final AccountActionListener listener) { |
||||
container.setOnClickListener(new View.OnClickListener() { |
||||
@Override |
||||
public void onClick(View v) { |
||||
listener.onViewAccount(id); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,57 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content"> |
||||
|
||||
<com.android.volley.toolbox.NetworkImageView |
||||
android:layout_width="64dp" |
||||
android:layout_height="64dp" |
||||
android:scaleType="fitCenter" |
||||
android:id="@+id/blocked_user_avatar" |
||||
android:padding="@dimen/status_avatar_padding" |
||||
android:layout_alignParentLeft="true" /> |
||||
|
||||
<LinearLayout |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="64dp" |
||||
android:orientation="vertical" |
||||
android:layout_toRightOf="@id/blocked_user_avatar"> |
||||
|
||||
<Space |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="0dp" |
||||
android:layout_weight="1" /> |
||||
|
||||
<TextView |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:id="@+id/blocked_user_display_name" |
||||
android:text="Display Name" /> |
||||
|
||||
<Space |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="0dp" |
||||
android:layout_weight="1" /> |
||||
|
||||
<TextView |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:id="@+id/blocked_user_username" |
||||
android:text="\@username\@example.com" /> |
||||
|
||||
<Space |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="0dp" |
||||
android:layout_weight="1" /> |
||||
|
||||
</LinearLayout> |
||||
|
||||
<Button |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:id="@+id/blocked_user_unblock" |
||||
android:layout_alignParentRight="true" |
||||
android:layout_centerVertical="true" |
||||
android:text="@string/action_unblock" /> |
||||
|
||||
</RelativeLayout> |
Loading…
Reference in new issue