/*
* This is the source code of Telegram for Android v. 3.x.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2017.
*/
package org.telegram.ui;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.FrameLayout;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ChatObject;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.UserObject;
import org.telegram.messenger.support.widget.LinearLayoutManager;
import org.telegram.messenger.support.widget.RecyclerView;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.RequestDelegate;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.ActionBarMenuItem;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ActionBar.ThemeDescription;
import org.telegram.ui.Adapters.SearchAdapterHelper;
import org.telegram.ui.Cells.LoadingCell;
import org.telegram.ui.Cells.ManageChatTextCell;
import org.telegram.ui.Cells.ManageChatUserCell;
import org.telegram.ui.Cells.ShadowSectionCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Components.EmptyTextProgressView;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RecyclerListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Semaphore;
public class ChannelEditActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
private RecyclerListView listView;
private ListAdapter listViewAdapter;
private SearchAdapter searchListViewAdapter;
private int chat_id;
private boolean loadingUsers;
private HashMap<Integer, TLRPC.ChatParticipant> participantsMap = new HashMap<>();
private boolean usersEndReached;
private TLRPC.ChatFull info;
private ArrayList<Integer> sortedUsers;
private TLRPC.Chat currentChat;
private final static int search_button = 1;
private boolean searchWas;
private boolean searching;
private int infoRow;
private int eventLogRow;
private int blockedUsersRow;
private int managementRow;
private int membersSectionRow;
private int membersStartRow;
private int membersEndRow;
private int membersSection2Row;
private int loadMoreMembersRow;
private int rowCount = 0;
public ChannelEditActivity(Bundle args) {
super(args);
}
@Override
public boolean onFragmentCreate() {
chat_id = getArguments().getInt("chat_id", 0);
currentChat = MessagesController.getInstance().getChat(chat_id);
if (currentChat == null) {
final Semaphore semaphore = new Semaphore(0);
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
currentChat = MessagesStorage.getInstance().getChat(chat_id);
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e(e);
}
if (currentChat != null) {
MessagesController.getInstance().putChat(currentChat, true);
} else {
return false;
}
}
getChannelParticipants(true);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatInfoDidLoaded);
sortedUsers = new ArrayList<>();
updateRowsIds();
return true;
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatInfoDidLoaded);
}
@Override
public View createView(Context context) {
Theme.createProfileResources(context);
searching = false;
searchWas = false;
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
if (currentChat.megagroup) {
actionBar.setTitle(LocaleController.getString("ManageGroup", R.string.ManageGroup));
} else {
actionBar.setTitle(LocaleController.getString("ManageChannel", R.string.ManageChannel));
}
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
@Override
public void onItemClick(final int id) {
if (getParentActivity() == null) {
return;
}
if (id == -1) {
finishFragment();
}
}
});
searchListViewAdapter = new SearchAdapter(context);
ActionBarMenu menu = actionBar.createMenu();
ActionBarMenuItem searchItem = menu.addItem(search_button, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() {
@Override
public void onSearchExpand() {
searching = true;
}
@Override
public void onSearchCollapse() {
searchListViewAdapter.searchDialogs(null);
searching = false;
searchWas = false;
listView.setAdapter(listViewAdapter);
listViewAdapter.notifyDataSetChanged();
listView.setFastScrollVisible(true);
listView.setVerticalScrollBarEnabled(false);
}
@Override
public void onTextChanged(EditText editText) {
if (searchListViewAdapter == null) {
return;
}
String text = editText.getText().toString();
if (text.length() != 0) {
searchWas = true;
if (listView != null) {
listView.setAdapter(searchListViewAdapter);
searchListViewAdapter.notifyDataSetChanged();
listView.setFastScrollVisible(false);
listView.setVerticalScrollBarEnabled(true);
}
}
searchListViewAdapter.searchDialogs(text);
}
});
searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search));
listViewAdapter = new ListAdapter(context);
fragmentView = new FrameLayout(context);
fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray));
FrameLayout frameLayout = (FrameLayout) fragmentView;
EmptyTextProgressView emptyView = new EmptyTextProgressView(context);
emptyView.setShowAtCenter(true);
emptyView.setText(LocaleController.getString("NoResult", R.string.NoResult));
emptyView.showTextView();
frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
listView = new RecyclerListView(context) {
@Override
public boolean hasOverlappingRendering() {
return false;
}
};
listView.setVerticalScrollBarEnabled(false);
listView.setEmptyView(emptyView);
listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT));
listView.setAdapter(listViewAdapter);
listView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() {
@Override
public void onItemClick(View view, final int position) {
if (getParentActivity() == null) {
return;
}
if (listView.getAdapter() == searchListViewAdapter) {
Bundle args = new Bundle();
args.putInt("user_id", searchListViewAdapter.getItem(position).user_id);
presentFragment(new ProfileActivity(args));
} else {
if (position >= membersStartRow && position < membersEndRow) {
int user_id;
if (!sortedUsers.isEmpty()) {
user_id = info.participants.participants.get(sortedUsers.get(position - membersStartRow)).user_id;
} else {
user_id = info.participants.participants.get(position - membersStartRow).user_id;
}
Bundle args = new Bundle();
args.putInt("user_id", user_id);
presentFragment(new ProfileActivity(args));
} else if (position == blockedUsersRow || position == managementRow) {
Bundle args = new Bundle();
args.putInt("chat_id", chat_id);
if (position == blockedUsersRow) {
args.putInt("type", 0);
} else if (position == managementRow) {
args.putInt("type", 1);
}
presentFragment(new ChannelUsersActivity(args));
} else if (position == eventLogRow) {
presentFragment(new ChannelAdminLogActivity(currentChat));
} else if (position == infoRow) {
Bundle args = new Bundle();
args.putInt("chat_id", chat_id);
ChannelEditInfoActivity fragment = new ChannelEditInfoActivity(args);
fragment.setInfo(info);
presentFragment(fragment);
}
}
}
});
listView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() {
@Override
public boolean onItemClick(View view, int position) {
if (position >= membersStartRow && position < membersEndRow) {
if (getParentActivity() == null) {
return false;
}
final TLRPC.TL_chatChannelParticipant user;
if (!sortedUsers.isEmpty()) {
user = (TLRPC.TL_chatChannelParticipant) info.participants.participants.get(sortedUsers.get(position - membersStartRow));
} else {
user = (TLRPC.TL_chatChannelParticipant) info.participants.participants.get(position - membersStartRow);
}
return createMenuForParticipant(user, null, false);
}
return false;
}
});
return fragmentView;
}
@SuppressWarnings("unchecked")
@Override
public void didReceivedNotification(int id, final Object... args) {
if (id == NotificationCenter.chatInfoDidLoaded) {
TLRPC.ChatFull chatFull = (TLRPC.ChatFull) args[0];
if (chatFull.id == chat_id) {
boolean byChannelUsers = (Boolean) args[2];
if (info instanceof TLRPC.TL_channelFull) {
if (chatFull.participants == null && info != null) {
chatFull.participants = info.participants;
}
}
boolean loadChannelParticipants = info == null && chatFull instanceof TLRPC.TL_channelFull;
info = chatFull;
fetchUsersFromChannelInfo();
updateRowsIds();
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
TLRPC.Chat newChat = MessagesController.getInstance().getChat(chat_id);
if (newChat != null) {
currentChat = newChat;
}
if (loadChannelParticipants || !byChannelUsers) {
getChannelParticipants(true);
}
}
}
}
@Override
public void onResume() {
super.onResume();
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
}
private void getChannelParticipants(boolean reload) {
if (loadingUsers || participantsMap == null || info == null) {
return;
}
loadingUsers = true;
final int delay = !participantsMap.isEmpty() && reload ? 300 : 0;
final TLRPC.TL_channels_getParticipants req = new TLRPC.TL_channels_getParticipants();
req.channel = MessagesController.getInputChannel(chat_id);
req.filter = new TLRPC.TL_channelParticipantsRecent();
req.offset = reload ? 0 : participantsMap.size();
req.limit = 200;
int reqId = ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(final TLObject response, final TLRPC.TL_error error) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
if (error == null) {
TLRPC.TL_channels_channelParticipants res = (TLRPC.TL_channels_channelParticipants) response;
MessagesController.getInstance().putUsers(res.users, false);
if (res.users.size() != 200) {
usersEndReached = true;
}
if (req.offset == 0) {
participantsMap.clear();
info.participants = new TLRPC.TL_chatParticipants();
MessagesStorage.getInstance().putUsersAndChats(res.users, null, true, true);
MessagesStorage.getInstance().updateChannelUsers(chat_id, res.participants);
}
for (int a = 0; a < res.participants.size(); a++) {
TLRPC.TL_chatChannelParticipant participant = new TLRPC.TL_chatChannelParticipant();
participant.channelParticipant = res.participants.get(a);
participant.inviter_id = participant.channelParticipant.inviter_id;
participant.user_id = participant.channelParticipant.user_id;
participant.date = participant.channelParticipant.date;
if (!participantsMap.containsKey(participant.user_id)) {
info.participants.participants.add(participant);
participantsMap.put(participant.user_id, participant);
}
}
}
loadingUsers = false;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatInfoDidLoaded, info, 0, true, null);
}
}, delay);
}
});
ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid);
}
public void setInfo(TLRPC.ChatFull chatInfo) {
info = chatInfo;
fetchUsersFromChannelInfo();
}
private void fetchUsersFromChannelInfo() {
if (info instanceof TLRPC.TL_channelFull && info.participants != null) {
for (int a = 0; a < info.participants.participants.size(); a++) {
TLRPC.ChatParticipant chatParticipant = info.participants.participants.get(a);
participantsMap.put(chatParticipant.user_id, chatParticipant);
}
}
}
private void updateRowsIds() {
rowCount = 0;
if (ChatObject.canEditInfo(currentChat)) {
infoRow = rowCount++;
} else {
infoRow = -1;
}
eventLogRow = rowCount++;
managementRow = rowCount++;
if (currentChat.megagroup) {
blockedUsersRow = rowCount++;
} else {
blockedUsersRow = -1;
}
membersSectionRow = rowCount++;
if (info != null && info.participants != null && !info.participants.participants.isEmpty()) {
membersStartRow = rowCount;
rowCount += info.participants.participants.size();
membersEndRow = rowCount;
membersSection2Row = rowCount++;
if (!usersEndReached) {
loadMoreMembersRow = rowCount++;
} else {
loadMoreMembersRow = -1;
}
} else {
membersStartRow = -1;
membersEndRow = -1;
loadMoreMembersRow = -1;
membersSection2Row = -1;
}
/*
if (!ChatObject.isNotInChat(currentChat) && !currentChat.megagroup && (currentChat.creator || currentChat.admin_rights != null && currentChat.admin_rights.add_admins)) {
managementRow = rowCount++;
}
if (!ChatObject.isNotInChat(currentChat) && currentChat.megagroup && (currentChat.creator || currentChat.admin_rights != null && currentChat.admin_rights.ban_users)) {
blockedUsersRow = rowCount++;
}*/
}
private boolean createMenuForParticipant(TLRPC.TL_chatChannelParticipant user, TLRPC.ChannelParticipant channelParticipant, boolean resultOnly) {
if (user == null && channelParticipant == null) {
return false;
}
int currentUserId = UserConfig.getClientUserId();
final int uid;
if (channelParticipant != null) {
if (currentUserId == channelParticipant.user_id) {
return false;
}
uid = channelParticipant.user_id;
user = (TLRPC.TL_chatChannelParticipant) participantsMap.get(channelParticipant.user_id);
if (user != null) {
channelParticipant = user.channelParticipant;
}
} else {
if (user.user_id == UserConfig.getClientUserId()) {
return false;
}
uid = user.user_id;
channelParticipant = user.channelParticipant;
}
TLRPC.User u = MessagesController.getInstance().getUser(uid);
boolean allowSetAdmin = channelParticipant instanceof TLRPC.TL_channelParticipant || channelParticipant instanceof TLRPC.TL_channelParticipantBanned;
boolean canEditAdmin = !(channelParticipant instanceof TLRPC.TL_channelParticipantAdmin || channelParticipant instanceof TLRPC.TL_channelParticipantCreator) || channelParticipant.can_edit;
ArrayList<String> items;
final ArrayList<Integer> actions;
if (resultOnly) {
items = null;
actions = null;
} else {
items = new ArrayList<>();
actions = new ArrayList<>();
}
if (allowSetAdmin && ChatObject.canAddAdmins(currentChat)) {
if (resultOnly) {
return true;
}
items.add(LocaleController.getString("SetAsAdmin", R.string.SetAsAdmin));
actions.add(0);
}
if (ChatObject.canBlockUsers(currentChat) && canEditAdmin) {
if (resultOnly) {
return true;
}
if (currentChat.megagroup) {
items.add(LocaleController.getString("KickFromSupergroup", R.string.KickFromSupergroup));
actions.add(1);
items.add(LocaleController.getString("KickFromGroup", R.string.KickFromGroup));
actions.add(2);
} else {
items.add(LocaleController.getString("ChannelRemoveUser", R.string.ChannelRemoveUser));
actions.add(2);
}
}
if (items == null || items.isEmpty()) {
return false;
}
final TLRPC.ChannelParticipant channelParticipantFinal = channelParticipant;
final TLRPC.TL_chatChannelParticipant userFinal = user;
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setItems(items.toArray(new CharSequence[items.size()]), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, final int i) {
if (actions.get(i) == 2) {
MessagesController.getInstance().deleteUserFromChat(chat_id, MessagesController.getInstance().getUser(uid), info);
} else {
ChannelRightsEditActivity fragment = new ChannelRightsEditActivity(channelParticipantFinal.user_id, chat_id, channelParticipantFinal.admin_rights, channelParticipantFinal.banned_rights, actions.get(i), true);
fragment.setDelegate(new ChannelRightsEditActivity.ChannelRightsEditActivityDelegate() {
@Override
public void didSetRights(int rights, TLRPC.TL_channelAdminRights rightsAdmin, TLRPC.TL_channelBannedRights rightsBanned) {
channelParticipantFinal.admin_rights = rightsAdmin;
channelParticipantFinal.banned_rights = rightsBanned;
if (actions.get(i) == 0) {
if (userFinal != null) {
if (rights == 1) {
userFinal.channelParticipant = new TLRPC.TL_channelParticipantAdmin();
} else {
userFinal.channelParticipant = new TLRPC.TL_channelParticipant();
}
userFinal.channelParticipant.inviter_id = UserConfig.getClientUserId();
userFinal.channelParticipant.user_id = userFinal.user_id;
userFinal.channelParticipant.date = userFinal.date;
}
} else if (actions.get(i) == 1) {
if (rights == 0) {
if (currentChat.megagroup && info != null && info.participants != null) {
boolean changed = false;
for (int a = 0; a < info.participants.participants.size(); a++) {
TLRPC.ChannelParticipant p = ((TLRPC.TL_chatChannelParticipant) info.participants.participants.get(a)).channelParticipant;
if (p.user_id == uid) {
if (info != null) {
info.participants_count--;
}
info.participants.participants.remove(a);
changed = true;
break;
}
}
if (info != null && info.participants != null) {
for (int a = 0; a < info.participants.participants.size(); a++) {
TLRPC.ChatParticipant p = info.participants.participants.get(a);
if (p.user_id == uid) {
info.participants.participants.remove(a);
changed = true;
break;
}
}
}
if (changed) {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatInfoDidLoaded, info, 0, true, null);
}
}
}
}
}
});
presentFragment(fragment);
}
}
});
showDialog(builder.create());
return true;
}
private class SearchAdapter extends RecyclerListView.SelectionAdapter {
private Context mContext;
private SearchAdapterHelper searchAdapterHelper;
private Timer searchTimer;
public SearchAdapter(Context context) {
mContext = context;
searchAdapterHelper = new SearchAdapterHelper();
searchAdapterHelper.setDelegate(new SearchAdapterHelper.SearchAdapterHelperDelegate() {
@Override
public void onDataSetChanged() {
notifyDataSetChanged();
}
@Override
public void onSetHashtags(ArrayList<SearchAdapterHelper.HashtagObject> arrayList, HashMap<String, SearchAdapterHelper.HashtagObject> hashMap) {
}
});
}
public void searchDialogs(final String query) {
try {
if (searchTimer != null) {
searchTimer.cancel();
}
} catch (Exception e) {
FileLog.e(e);
}
if (query == null) {
searchAdapterHelper.queryServerSearch(null, false, false, true, true, chat_id, false);
notifyDataSetChanged();
} else {
searchTimer = new Timer();
searchTimer.schedule(new TimerTask() {
@Override
public void run() {
try {
searchTimer.cancel();
searchTimer = null;
} catch (Exception e) {
FileLog.e(e);
}
processSearch(query);
}
}, 200, 300);
}
}
private void processSearch(final String query) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
searchAdapterHelper.queryServerSearch(query, false, false, true, true, chat_id, false);
}
});
}
@Override
public boolean isEnabled(RecyclerView.ViewHolder holder) {
return holder.getItemViewType() != 1;
}
@Override
public int getItemCount() {
return searchAdapterHelper.getGroupSearch().size();
}
public TLRPC.ChannelParticipant getItem(int i) {
return searchAdapterHelper.getGroupSearch().get(i);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = new ManageChatUserCell(mContext, 8, true);
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
((ManageChatUserCell) view).setDelegate(new ManageChatUserCell.ManageChatUserCellDelegate() {
@Override
public boolean onOptionsButtonCheck(ManageChatUserCell cell, boolean click) {
return createMenuForParticipant(null, getItem((Integer) cell.getTag()), !click);
}
});
return new RecyclerListView.Holder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case 0: {
TLObject object = getItem(position);
TLRPC.User user;
if (object instanceof TLRPC.User) {
user = (TLRPC.User) object;
} else {
user = MessagesController.getInstance().getUser(((TLRPC.ChannelParticipant) object).user_id);
}
String un = user.username;
CharSequence username = null;
CharSequence name = null;
String nameSearch = searchAdapterHelper.getLastFoundChannel();
if (nameSearch != null) {
String u = UserObject.getUserName(user);
name = new SpannableStringBuilder(u);
int idx = u.toLowerCase().indexOf(nameSearch);
if (idx != -1) {
((SpannableStringBuilder) name).setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4)), idx, idx + nameSearch.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
ManageChatUserCell userCell = (ManageChatUserCell) holder.itemView;
userCell.setTag(position);
userCell.setData(user, name, username);
break;
}
}
}
@Override
public int getItemViewType(int i) {
return 0;
}
}
private class ListAdapter extends RecyclerListView.SelectionAdapter {
private Context mContext;
public ListAdapter(Context context) {
mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
switch (viewType) {
case 0:
view = new ManageChatTextCell(mContext);
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
break;
case 1:
view = new ManageChatUserCell(mContext, 8, true);
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
((ManageChatUserCell) view).setDelegate(new ManageChatUserCell.ManageChatUserCellDelegate() {
@Override
public boolean onOptionsButtonCheck(ManageChatUserCell cell, boolean click) {
int i = (Integer) cell.getTag();
TLRPC.ChatParticipant part;
if (!sortedUsers.isEmpty()) {
part = info.participants.participants.get(sortedUsers.get(i - membersStartRow));
} else {
part = info.participants.participants.get(i - membersStartRow);
}
return createMenuForParticipant((TLRPC.TL_chatChannelParticipant) part, null, !click);
}
});
break;
case 2:
view = new ShadowSectionCell(mContext);
break;
case 3:
view = new LoadingCell(mContext);
break;
}
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
return new RecyclerListView.Holder(view);
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
if (holder.itemView instanceof ManageChatUserCell) {
((ManageChatUserCell) holder.itemView).recycle();
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) {
boolean checkBackground = true;
switch (holder.getItemViewType()) {
case 0:
ManageChatTextCell textCell = (ManageChatTextCell) holder.itemView;
textCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
textCell.setTag(Theme.key_windowBackgroundWhiteBlackText);
if (i == managementRow) {
textCell.setText(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), info != null ? String.format("%d", info.admins_count) : null, R.drawable.group_admin, blockedUsersRow != -1);
} else if (i == blockedUsersRow) {
textCell.setText(LocaleController.getString("ChannelBlacklist", R.string.ChannelBlacklist), info != null ? String.format("%d", info.kicked_count + info.banned_count) : null, R.drawable.group_banned, false);
} else if (i == eventLogRow) {
textCell.setText(LocaleController.getString("EventLog", R.string.EventLog), null, R.drawable.group_log, true);
} else if (i == infoRow) {
textCell.setText(currentChat.megagroup ? LocaleController.getString("EventLogFilterGroupInfo", R.string.EventLogFilterGroupInfo) : LocaleController.getString("EventLogFilterChannelInfo", R.string.EventLogFilterChannelInfo), null, R.drawable.group_edit, true);
}
break;
case 1:
ManageChatUserCell userCell = ((ManageChatUserCell) holder.itemView);
userCell.setTag(i);
TLRPC.ChatParticipant part;
if (!sortedUsers.isEmpty()) {
part = info.participants.participants.get(sortedUsers.get(i - membersStartRow));
} else {
part = info.participants.participants.get(i - membersStartRow);
}
if (part != null) {
userCell.setData(MessagesController.getInstance().getUser(part.user_id), null, null);
}
break;
case 2:
if (i == membersSectionRow && membersStartRow != -1) {
holder.itemView.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
} else {
holder.itemView.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
}
break;
}
}
@Override
public boolean isEnabled(RecyclerView.ViewHolder holder) {
int type = holder.getItemViewType();
return type == 0 || type == 1;
}
@Override
public int getItemCount() {
return rowCount;
}
@Override
public int getItemViewType(int i) {
if (i == managementRow || i == blockedUsersRow || i == infoRow || i == eventLogRow) {
return 0;
} else if (i >= membersStartRow && i < membersEndRow) {
return 1;
} else if (i == membersSectionRow || i == membersSection2Row) {
return 2;
} else if (i == loadMoreMembersRow) {
return 3;
}
return 0;
}
}
@Override
public ThemeDescription[] getThemeDescriptions() {
ThemeDescription.ThemeDescriptionDelegate сellDelegate = new ThemeDescription.ThemeDescriptionDelegate() {
@Override
public void didSetColor(int color) {
int count = listView.getChildCount();
for (int a = 0; a < count; a++) {
View child = listView.getChildAt(a);
if (child instanceof ManageChatUserCell) {
((ManageChatUserCell) child).update(0);
}
}
}
};
return new ThemeDescription[]{
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite),
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SUBMENUBACKGROUND, null, null, null, null, Theme.key_actionBarDefaultSubmenuBackground),
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SUBMENUITEM, null, null, null, null, Theme.key_actionBarDefaultSubmenuItem),
new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_avatar_backgroundActionBarBlue),
new ThemeDescription(listView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_avatar_backgroundActionBarBlue),
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_avatar_actionBarSelectorBlue),
new ThemeDescription(listView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector),
new ThemeDescription(listView, 0, new Class[]{View.class}, Theme.dividerPaint, null, null, Theme.key_divider),
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow),
new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGreenText2),
new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteRedText5),
new ThemeDescription(listView, 0, new Class[]{ManageChatTextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon),
new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, new String[]{"statusColor"}, null, null, сellDelegate, Theme.key_windowBackgroundWhiteGrayText),
new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, new String[]{"statusOnlineColor"}, null, null, сellDelegate, Theme.key_windowBackgroundWhiteBlueText),
new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, null, new Drawable[]{Theme.avatar_photoDrawable, Theme.avatar_broadcastDrawable}, null, Theme.key_avatar_text),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundRed),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundOrange),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundViolet),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundGreen),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundCyan),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundBlue),
new ThemeDescription(null, 0, null, null, null, сellDelegate, Theme.key_avatar_backgroundPink),
new ThemeDescription(listView, 0, new Class[]{LoadingCell.class}, new String[]{"progressBar"}, null, null, null, Theme.key_progressCircle),
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow),
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGray),
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow),
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGray),
new ThemeDescription(listView, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4),
};
}
}