NekoX/TMessagesProj/src/main/java/org/telegram/ui/ChannelUsersActivity.java

1602 lines
81 KiB
Java
Raw Normal View History

2015-09-24 22:52:02 +02:00
/*
2015-10-29 18:10:07 +01:00
* This is the source code of Telegram for Android v. 3.x.x.
2015-09-24 22:52:02 +02:00
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
2017-03-31 01:58:05 +02:00
* Copyright Nikolai Kudashov, 2013-2017.
2015-09-24 22:52:02 +02:00
*/
package org.telegram.ui;
import android.content.Context;
import android.content.DialogInterface;
2017-07-08 18:32:04 +02:00
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
2017-03-31 01:58:05 +02:00
import android.graphics.drawable.Drawable;
2015-09-24 22:52:02 +02:00
import android.os.Bundle;
2017-07-08 18:32:04 +02:00
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.TypedValue;
import android.view.Gravity;
2015-09-24 22:52:02 +02:00
import android.view.View;
import android.view.ViewGroup;
2017-07-08 18:32:04 +02:00
import android.widget.EditText;
2015-09-24 22:52:02 +02:00
import android.widget.FrameLayout;
2017-07-08 18:32:04 +02:00
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
2015-09-24 22:52:02 +02:00
import org.telegram.messenger.AndroidUtilities;
2017-07-08 18:32:04 +02:00
import org.telegram.messenger.ChatObject;
import org.telegram.messenger.ContactsController;
2015-09-24 22:52:02 +02:00
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
2017-07-08 18:32:04 +02:00
import org.telegram.messenger.UserObject;
2015-09-24 22:52:02 +02:00
import org.telegram.messenger.Utilities;
2017-03-31 01:58:05 +02:00
import org.telegram.messenger.support.widget.LinearLayoutManager;
import org.telegram.messenger.support.widget.RecyclerView;
2015-09-24 22:52:02 +02:00
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;
2017-07-08 18:32:04 +02:00
import org.telegram.ui.ActionBar.ActionBarMenu;
import org.telegram.ui.ActionBar.ActionBarMenuItem;
2017-03-31 01:58:05 +02:00
import org.telegram.ui.ActionBar.AlertDialog;
2015-09-24 22:52:02 +02:00
import org.telegram.ui.ActionBar.BaseFragment;
2017-03-31 01:58:05 +02:00
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ActionBar.ThemeDescription;
2017-07-08 18:32:04 +02:00
import org.telegram.ui.Adapters.SearchAdapterHelper;
import org.telegram.ui.Cells.GraySectionCell;
2016-03-06 02:49:31 +01:00
import org.telegram.ui.Cells.HeaderCell;
2017-07-08 18:32:04 +02:00
import org.telegram.ui.Cells.ManageChatTextCell;
2016-03-06 02:49:31 +01:00
import org.telegram.ui.Cells.RadioCell;
2015-09-24 22:52:02 +02:00
import org.telegram.ui.Cells.ShadowSectionCell;
import org.telegram.ui.Cells.TextInfoPrivacyCell;
import org.telegram.ui.Cells.TextSettingsCell;
2017-07-08 18:32:04 +02:00
import org.telegram.ui.Cells.ManageChatUserCell;
2015-09-24 22:52:02 +02:00
import org.telegram.ui.Components.EmptyTextProgressView;
import org.telegram.ui.Components.LayoutHelper;
2017-03-31 01:58:05 +02:00
import org.telegram.ui.Components.RecyclerListView;
2015-09-24 22:52:02 +02:00
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
2017-07-08 18:32:04 +02:00
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
2015-09-24 22:52:02 +02:00
public class ChannelUsersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
private ListAdapter listViewAdapter;
private EmptyTextProgressView emptyView;
2017-03-31 01:58:05 +02:00
private RecyclerListView listView;
2017-07-08 18:32:04 +02:00
private SearchAdapter searchListViewAdapter;
private ActionBarMenuItem searchItem;
private TLRPC.Chat currentChat;
2015-09-24 22:52:02 +02:00
private ArrayList<TLRPC.ChannelParticipant> participants = new ArrayList<>();
2017-07-08 18:32:04 +02:00
private ArrayList<TLRPC.ChannelParticipant> participants2 = new ArrayList<>();
private HashMap<Integer, TLRPC.ChannelParticipant> participantsMap = new HashMap<>();
2015-09-24 22:52:02 +02:00
private int chatId;
private int type;
private boolean loadingUsers;
2015-11-26 22:04:02 +01:00
private boolean firstLoaded;
2017-07-08 18:32:04 +02:00
private int changeAddHeaderRow;
private int changeAddRadio1Row;
private int changeAddRadio2Row;
private int changeAddSectionRow;
private int addNewRow;
private int addNew2Row;
private int addNewSectionRow;
private int restricted1SectionRow;
2015-09-24 22:52:02 +02:00
private int participantsStartRow;
2017-07-08 18:32:04 +02:00
private int participantsEndRow;
private int participantsDividerRow;
private int restricted2SectionRow;
private int participants2StartRow;
private int participants2EndRow;
private int participantsInfoRow;
private int blockedEmptyRow;
private int rowCount;
private int selectType;
private boolean firstEndReached;
private boolean needOpenSearch;
private boolean searchWas;
private boolean searching;
private final static int search_button = 0;
2015-09-24 22:52:02 +02:00
public ChannelUsersActivity(Bundle args) {
super(args);
chatId = arguments.getInt("chat_id");
type = arguments.getInt("type");
2017-07-08 18:32:04 +02:00
needOpenSearch = arguments.getBoolean("open_search");
selectType = arguments.getInt("selectType");
currentChat = MessagesController.getInstance().getChat(chatId);
}
private void updateRows() {
currentChat = MessagesController.getInstance().getChat(chatId);
if (currentChat == null) {
return;
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
changeAddHeaderRow = -1;
changeAddRadio1Row = -1;
changeAddRadio2Row = -1;
changeAddSectionRow = -1;
addNewRow = -1;
addNew2Row = -1;
addNewSectionRow = -1;
restricted1SectionRow = -1;
participantsStartRow = -1;
participantsDividerRow = -1;
participantsEndRow = -1;
restricted2SectionRow = -1;
participants2StartRow = -1;
participants2EndRow = -1;
participantsInfoRow = -1;
blockedEmptyRow = -1;
rowCount = 0;
2015-09-24 22:52:02 +02:00
if (type == 0) {
2017-07-08 18:32:04 +02:00
if (ChatObject.canBlockUsers(currentChat)) {
addNewRow = rowCount++;
if (!participants.isEmpty() || !participants2.isEmpty()) {
addNewSectionRow = rowCount++;
}
} else {
addNewRow = -1;
addNewSectionRow = -1;
}
if (!participants.isEmpty()) {
restricted1SectionRow = rowCount++;
participantsStartRow = rowCount;
rowCount += participants.size();
participantsEndRow = rowCount;
}
if (!participants2.isEmpty()) {
if (restricted1SectionRow != -1) {
participantsDividerRow = rowCount++;
}
restricted2SectionRow = rowCount++;
participants2StartRow = rowCount;
rowCount += participants2.size();
participants2EndRow = rowCount;
}
if (participantsStartRow != -1 || participants2StartRow != -1) {
if (searchItem != null) {
searchItem.setVisibility(View.VISIBLE);
}
participantsInfoRow = rowCount++;
} else {
if (searchItem != null) {
searchItem.setVisibility(View.INVISIBLE);
}
blockedEmptyRow = rowCount++;
}
2015-09-24 22:52:02 +02:00
} else if (type == 1) {
2017-07-08 18:32:04 +02:00
if (currentChat.creator && currentChat.megagroup) {
changeAddHeaderRow = rowCount++;
changeAddRadio1Row = rowCount++;
changeAddRadio2Row = rowCount++;
changeAddSectionRow = rowCount++;
}
if (ChatObject.canAddAdmins(currentChat)) {
addNewRow = rowCount++;
addNewSectionRow = rowCount++;
} else {
addNewRow = -1;
addNewSectionRow = -1;
}
if (!participants.isEmpty()) {
participantsStartRow = rowCount;
rowCount += participants.size();
participantsEndRow = rowCount;
} else {
participantsStartRow = -1;
participantsEndRow = -1;
}
participantsInfoRow = rowCount++;
2015-09-24 22:52:02 +02:00
} else if (type == 2) {
2017-07-08 18:32:04 +02:00
if (selectType == 0 && !currentChat.megagroup && ChatObject.canAddUsers(currentChat)) {
addNewRow = rowCount++;
if ((currentChat.flags & TLRPC.CHAT_FLAG_IS_PUBLIC) == 0 && ChatObject.canAddViaLink(currentChat)) {
addNew2Row = rowCount++;
}
addNewSectionRow = rowCount++;
}
if (!participants.isEmpty()) {
participantsStartRow = rowCount;
rowCount += participants.size();
participantsEndRow = rowCount;
} else {
participantsStartRow = -1;
participantsEndRow = -1;
}
if (rowCount != 0) {
participantsInfoRow = rowCount++;
}
2015-09-24 22:52:02 +02:00
}
}
@Override
public boolean onFragmentCreate() {
super.onFragmentCreate();
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatInfoDidLoaded);
getChannelParticipants(0, 200);
return true;
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatInfoDidLoaded);
}
@Override
public View createView(Context context) {
2017-07-08 18:32:04 +02:00
searching = false;
searchWas = false;
2015-09-24 22:52:02 +02:00
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
if (type == 0) {
2017-07-08 18:32:04 +02:00
actionBar.setTitle(LocaleController.getString("ChannelBlacklist", R.string.ChannelBlacklist));
2015-09-24 22:52:02 +02:00
} else if (type == 1) {
actionBar.setTitle(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators));
} else if (type == 2) {
2017-07-08 18:32:04 +02:00
if (selectType == 0) {
actionBar.setTitle(LocaleController.getString("ChannelMembers", R.string.ChannelMembers));
} else {
if (selectType == 1) {
actionBar.setTitle(LocaleController.getString("ChannelAddAdmin", R.string.ChannelAddAdmin));
} else if (selectType == 2) {
actionBar.setTitle(LocaleController.getString("ChannelBlockUser", R.string.ChannelBlockUser));
}
}
2015-09-24 22:52:02 +02:00
}
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
@Override
public void onItemClick(int id) {
if (id == -1) {
finishFragment();
}
}
});
2017-07-08 18:32:04 +02:00
if (selectType != 0 || type == 2 || type == 0) {
searchListViewAdapter = new SearchAdapter(context);
ActionBarMenu menu = actionBar.createMenu();
searchItem = menu.addItem(search_button, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() {
@Override
public void onSearchExpand() {
searching = true;
emptyView.setShowAtCenter(true);
}
@Override
public void onSearchCollapse() {
searchListViewAdapter.searchDialogs(null);
searching = false;
searchWas = false;
listView.setAdapter(listViewAdapter);
listViewAdapter.notifyDataSetChanged();
listView.setFastScrollVisible(true);
listView.setVerticalScrollBarEnabled(false);
emptyView.setShowAtCenter(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));
}
2015-09-24 22:52:02 +02:00
fragmentView = new FrameLayout(context);
2017-03-31 01:58:05 +02:00
fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray));
2015-09-24 22:52:02 +02:00
FrameLayout frameLayout = (FrameLayout) fragmentView;
emptyView = new EmptyTextProgressView(context);
2017-07-08 18:32:04 +02:00
if (type == 0 || type == 2) {
emptyView.setText(LocaleController.getString("NoResult", R.string.NoResult));
2015-09-24 22:52:02 +02:00
}
frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
2017-03-31 01:58:05 +02:00
listView = new RecyclerListView(context);
2015-09-24 22:52:02 +02:00
listView.setEmptyView(emptyView);
2017-03-31 01:58:05 +02:00
listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
2015-09-24 22:52:02 +02:00
listView.setAdapter(listViewAdapter = new ListAdapter(context));
2017-03-31 01:58:05 +02:00
listView.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT);
2015-09-24 22:52:02 +02:00
frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
2017-03-31 01:58:05 +02:00
listView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() {
2015-09-24 22:52:02 +02:00
@Override
2017-03-31 01:58:05 +02:00
public void onItemClick(View view, int position) {
2017-07-08 18:32:04 +02:00
if (position == addNewRow) {
if (type == 0) {
Bundle bundle = new Bundle();
bundle.putInt("chat_id", chatId);
bundle.putInt("type", 2);
bundle.putInt("selectType", 2);
presentFragment(new ChannelUsersActivity(bundle));
} else if (type == 1) {
Bundle bundle = new Bundle();
bundle.putInt("chat_id", chatId);
bundle.putInt("type", 2);
bundle.putInt("selectType", 1);
presentFragment(new ChannelUsersActivity(bundle));
} else if (type == 2) {
Bundle args = new Bundle();
args.putBoolean("onlyUsers", true);
args.putBoolean("destroyAfterSelect", true);
args.putBoolean("returnAsResult", true);
args.putBoolean("needForwardCount", false);
args.putString("selectAlertString", LocaleController.getString("ChannelAddTo", R.string.ChannelAddTo));
ContactsActivity fragment = new ContactsActivity(args);
fragment.setDelegate(new ContactsActivity.ContactsActivityDelegate() {
@Override
public void didSelectContact(TLRPC.User user, String param, ContactsActivity activity) {
MessagesController.getInstance().addUserToChat(chatId, user, null, param != null ? Utilities.parseInt(param) : 0, null, ChannelUsersActivity.this);
}
});
presentFragment(fragment);
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
} else if (position == addNew2Row) {
presentFragment(new GroupInviteActivity(chatId));
} else if (position == changeAddRadio1Row || position == changeAddRadio2Row) {
TLRPC.Chat chat = MessagesController.getInstance().getChat(chatId);
if (chat == null) {
return;
}
boolean changed = false;
if (position == 1 && !chat.democracy) {
chat.democracy = true;
changed = true;
} else if (position == 2 && chat.democracy) {
chat.democracy = false;
changed = true;
}
if (changed) {
MessagesController.getInstance().toogleChannelInvites(chatId, chat.democracy);
int count = listView.getChildCount();
for (int a = 0; a < count; a++) {
View child = listView.getChildAt(a);
if (child instanceof RadioCell) {
int num = (Integer) child.getTag();
((RadioCell) child).setChecked(num == 0 && chat.democracy || num == 1 && !chat.democracy, true);
2016-03-06 02:49:31 +01:00
}
2017-07-08 18:32:04 +02:00
}
}
} else {
TLRPC.TL_channelBannedRights banned_rights = null;
TLRPC.TL_channelAdminRights admin_rights = null;
final TLRPC.ChannelParticipant participant;
int user_id = 0;
int promoted_by = 0;
boolean canEditAdmin = false;
if (listView.getAdapter() == listViewAdapter) {
participant = listViewAdapter.getItem(position);
if (participant != null) {
user_id = participant.user_id;
banned_rights = participant.banned_rights;
admin_rights = participant.admin_rights;
canEditAdmin = !(participant instanceof TLRPC.TL_channelParticipantAdmin || participant instanceof TLRPC.TL_channelParticipantCreator) || participant.can_edit;
if (participant instanceof TLRPC.TL_channelParticipantCreator) {
admin_rights = new TLRPC.TL_channelAdminRights();
admin_rights.change_info = admin_rights.post_messages = admin_rights.edit_messages =
admin_rights.delete_messages = admin_rights.ban_users = admin_rights.invite_users =
admin_rights.invite_link = admin_rights.pin_messages = admin_rights.add_admins = true;
2016-03-06 02:49:31 +01:00
}
2017-07-08 18:32:04 +02:00
}
} else {
TLObject object = searchListViewAdapter.getItem(position);
if (object instanceof TLRPC.User) {
TLRPC.User user = (TLRPC.User) object;
MessagesController.getInstance().putUser(user, false);
participant = participantsMap.get(user_id = user.id);
} else if (object instanceof TLRPC.ChannelParticipant) {
participant = (TLRPC.ChannelParticipant) object;
} else {
participant = null;
}
if (participant != null) {
user_id = participant.user_id;
canEditAdmin = !(participant instanceof TLRPC.TL_channelParticipantAdmin || participant instanceof TLRPC.TL_channelParticipantCreator) || participant.can_edit;
banned_rights = participant.banned_rights;
admin_rights = participant.admin_rights;
} else {
canEditAdmin = true;
}
}
if (user_id != 0) {
if (selectType != 0) {
if (currentChat.megagroup || selectType == 1) {
ChannelRightsEditActivity fragment = new ChannelRightsEditActivity(user_id, chatId, admin_rights, banned_rights, selectType == 1 ? 0 : 1, canEditAdmin);
fragment.setDelegate(new ChannelRightsEditActivity.ChannelRightsEditActivityDelegate() {
@Override
public void didSetRights(int rights, TLRPC.TL_channelAdminRights rightsAdmin, TLRPC.TL_channelBannedRights rightsBanned) {
if (participant != null) {
participant.admin_rights = rightsAdmin;
participant.banned_rights = rightsBanned;
}
removeSelfFromStack();
2016-03-06 02:49:31 +01:00
}
2017-07-08 18:32:04 +02:00
});
presentFragment(fragment);
} else {
TLRPC.User user = MessagesController.getInstance().getUser(user_id);
MessagesController.getInstance().deleteUserFromChat(chatId, user, null);
finishFragment();
2016-03-06 02:49:31 +01:00
}
2017-07-08 18:32:04 +02:00
} else {
boolean canEdit = false;
if (type == 1) {
canEdit = currentChat.creator || canEditAdmin;
} else if (type == 0) {
canEdit = ChatObject.canBlockUsers(currentChat);
}
if (type != 1 && !currentChat.megagroup || type == 2 && selectType == 0) {
Bundle args = new Bundle();
args.putInt("user_id", user_id);
presentFragment(new ProfileActivity(args));
} else {
if (banned_rights == null) {
banned_rights = new TLRPC.TL_channelBannedRights();
banned_rights.view_messages = true;
banned_rights.send_stickers = true;
banned_rights.send_media = true;
banned_rights.embed_links = true;
banned_rights.send_messages = true;
banned_rights.send_games = true;
banned_rights.send_inline = true;
banned_rights.send_gifs = true;
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
ChannelRightsEditActivity fragment = new ChannelRightsEditActivity(user_id, chatId, admin_rights, banned_rights, type == 1 ? 0 : 1, canEdit);
fragment.setDelegate(new ChannelRightsEditActivity.ChannelRightsEditActivityDelegate() {
@Override
public void didSetRights(int rights, TLRPC.TL_channelAdminRights rightsAdmin, TLRPC.TL_channelBannedRights rightsBanned) {
if (participant != null) {
participant.admin_rights = rightsAdmin;
participant.banned_rights = rightsBanned;
}
}
});
presentFragment(fragment);
}
2015-09-24 22:52:02 +02:00
}
}
}
}
});
2017-07-08 18:32:04 +02:00
listView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() {
@Override
public boolean onItemClick(View view, int position) {
return !(getParentActivity() == null || listView.getAdapter() != listViewAdapter) && createMenuForParticipant(listViewAdapter.getItem(position), false);
}
});
if (searchItem != null) {
listView.setOnScrollListener(new RecyclerView.OnScrollListener() {
2015-09-24 22:52:02 +02:00
@Override
2017-07-08 18:32:04 +02:00
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_DRAGGING && searching && searchWas) {
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
2015-09-24 22:52:02 +02:00
}
}
2017-07-08 18:32:04 +02:00
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
2015-09-24 22:52:02 +02:00
});
}
if (loadingUsers) {
emptyView.showProgress();
} else {
emptyView.showTextView();
}
2017-07-08 18:32:04 +02:00
updateRows();
2015-09-24 22:52:02 +02:00
return fragmentView;
}
2017-07-08 18:32:04 +02:00
private boolean createMenuForParticipant(final TLRPC.ChannelParticipant participant, boolean resultOnly) {
if (participant == null || selectType != 0) {
return false;
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
if (participant.user_id == UserConfig.getClientUserId()) {
return false;
}
if (type == 2) {
final TLRPC.ChannelParticipant channelParticipant;
final TLRPC.User user = MessagesController.getInstance().getUser(participant.user_id);
boolean allowSetAdmin = participant instanceof TLRPC.TL_channelParticipant || participant instanceof TLRPC.TL_channelParticipantBanned;
boolean canEditAdmin = !(participant instanceof TLRPC.TL_channelParticipantAdmin || participant instanceof TLRPC.TL_channelParticipantCreator) || participant.can_edit;
final ArrayList<String> items;
final ArrayList<Integer> actions;
if (!resultOnly) {
items = new ArrayList<>();
actions = new ArrayList<>();
} else {
items = null;
actions = null;
}
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);
2015-11-26 22:04:02 +01:00
} else {
2017-07-08 18:32:04 +02:00
items.add(LocaleController.getString("ChannelRemoveUser", R.string.ChannelRemoveUser));
actions.add(2);
}
}
if (actions == null || actions.isEmpty()) {
return false;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setItems(items.toArray(new CharSequence[actions.size()]), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, final int i) {
if (actions.get(i) == 2) {
MessagesController.getInstance().deleteUserFromChat(chatId, user, null);
for (int a = 0; a < participants.size(); a++) {
TLRPC.ChannelParticipant p = participants.get(a);
if (p.user_id == participant.user_id) {
participants.remove(a);
updateRows();
listViewAdapter.notifyDataSetChanged();
break;
}
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
} else {
ChannelRightsEditActivity fragment = new ChannelRightsEditActivity(user.id, chatId, participant.admin_rights, participant.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) {
if (actions.get(i) == 0) {
for (int a = 0; a < participants.size(); a++) {
TLRPC.ChannelParticipant p = participants.get(a);
if (p.user_id == participant.user_id) {
TLRPC.ChannelParticipant newPart;
if (rights == 1) {
newPart = new TLRPC.TL_channelParticipantAdmin();
} else {
newPart = new TLRPC.TL_channelParticipant();
}
newPart.admin_rights = rightsAdmin;
newPart.banned_rights = rightsBanned;
newPart.inviter_id = UserConfig.getClientUserId();
newPart.user_id = participant.user_id;
newPart.date = participant.date;
participants.set(a, newPart);
break;
}
}
} else if (actions.get(i) == 1) {
if (rights == 0) {
for (int a = 0; a < participants.size(); a++) {
TLRPC.ChannelParticipant p = participants.get(a);
if (p.user_id == participant.user_id) {
participants.remove(a);
updateRows();
listViewAdapter.notifyDataSetChanged();
break;
}
}
}
}
}
});
presentFragment(fragment);
}
}
});
showDialog(builder.create());
} else {
CharSequence[] items = null;
if (type == 0 && ChatObject.canBlockUsers(currentChat)) {
if (resultOnly) {
return true;
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
items = new CharSequence[]{LocaleController.getString("Unban", R.string.Unban)};
} else if (type == 1 && ChatObject.canAddAdmins(currentChat) && participant.can_edit) {
if (resultOnly) {
return true;
}
items = new CharSequence[]{LocaleController.getString("ChannelRemoveUserAdmin", R.string.ChannelRemoveUserAdmin)};
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
if (items == null) {
return false;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
if (type == 0) {
participants.remove(participant);
updateRows();
listViewAdapter.notifyDataSetChanged();
TLRPC.TL_channels_editBanned req = new TLRPC.TL_channels_editBanned();
req.user_id = MessagesController.getInputUser(participant.user_id);
req.channel = MessagesController.getInputChannel(chatId);
req.banned_rights = new TLRPC.TL_channelBannedRights();
ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (response != null) {
final TLRPC.Updates updates = (TLRPC.Updates) response;
MessagesController.getInstance().processUpdates(updates, false);
if (!updates.chats.isEmpty()) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
TLRPC.Chat chat = updates.chats.get(0);
MessagesController.getInstance().loadFullChat(chat.id, 0, true);
}
}, 1000);
}
}
}
});
} else if (type == 1) {
MessagesController.setUserAdminRole(chatId, MessagesController.getInstance().getUser(participant.user_id), new TLRPC.TL_channelAdminRights(), currentChat.megagroup, ChannelUsersActivity.this);
} else if (type == 2) {
MessagesController.getInstance().deleteUserFromChat(chatId, MessagesController.getInstance().getUser(participant.user_id), null);
}
}
}
});
showDialog(builder.create());
}
return true;
2015-09-24 22:52:02 +02:00
}
@Override
public void didReceivedNotification(int id, Object... args) {
if (id == NotificationCenter.chatInfoDidLoaded) {
TLRPC.ChatFull chatFull = (TLRPC.ChatFull) args[0];
boolean byChannelUsers = (Boolean) args[2];
if (chatFull.id == chatId && !byChannelUsers) {
2015-09-24 22:52:02 +02:00
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
2017-07-08 18:32:04 +02:00
firstEndReached = false;
2015-09-24 22:52:02 +02:00
getChannelParticipants(0, 200);
}
});
}
}
}
private int getChannelAdminParticipantType(TLRPC.ChannelParticipant participant) {
if (participant instanceof TLRPC.TL_channelParticipantCreator || participant instanceof TLRPC.TL_channelParticipantSelf) {
return 0;
2017-07-08 18:32:04 +02:00
} else if (participant instanceof TLRPC.TL_channelParticipantAdmin) {
2015-09-24 22:52:02 +02:00
return 1;
} else {
return 2;
}
}
private void getChannelParticipants(int offset, int count) {
if (loadingUsers) {
return;
}
loadingUsers = true;
2015-11-26 22:04:02 +01:00
if (emptyView != null && !firstLoaded) {
2015-09-24 22:52:02 +02:00
emptyView.showProgress();
}
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
TLRPC.TL_channels_getParticipants req = new TLRPC.TL_channels_getParticipants();
req.channel = MessagesController.getInputChannel(chatId);
final boolean byEndReached = firstEndReached;
2015-09-24 22:52:02 +02:00
if (type == 0) {
if (byEndReached) {
2017-07-08 18:32:04 +02:00
req.filter = new TLRPC.TL_channelParticipantsKicked();
} else {
req.filter = new TLRPC.TL_channelParticipantsBanned();
}
2015-09-24 22:52:02 +02:00
} else if (type == 1) {
req.filter = new TLRPC.TL_channelParticipantsAdmins();
} else if (type == 2) {
req.filter = new TLRPC.TL_channelParticipantsRecent();
}
2017-07-08 18:32:04 +02:00
req.filter.q = "";
2015-09-24 22:52:02 +02:00
req.offset = offset;
req.limit = count;
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() {
2017-07-08 18:32:04 +02:00
boolean changeFirst = !firstLoaded;
loadingUsers = false;
firstLoaded = true;
if (emptyView != null) {
emptyView.showTextView();
}
2015-09-24 22:52:02 +02:00
if (error == null) {
TLRPC.TL_channels_channelParticipants res = (TLRPC.TL_channels_channelParticipants) response;
MessagesController.getInstance().putUsers(res.users, false);
2017-07-08 18:32:04 +02:00
int selfId = UserConfig.getClientUserId();
if (selectType != 0) {
for (int a = 0; a < res.participants.size(); a++) {
if (res.participants.get(a).user_id == selfId) {
res.participants.remove(a);
break;
}
}
}
if (type == 0) {
if (byEndReached) {
2017-07-08 18:32:04 +02:00
participants2 = res.participants;
} else {
participants2 = new ArrayList<>();
2017-07-08 18:32:04 +02:00
participantsMap.clear();
participants = res.participants;
if (changeFirst) {
firstLoaded = false;
}
firstEndReached = true;
getChannelParticipants(0, 200);
}
} else {
participantsMap.clear();
participants = res.participants;
}
for (int a = 0; a < res.participants.size(); a++) {
TLRPC.ChannelParticipant participant = res.participants.get(a);
participantsMap.put(participant.user_id, participant);
}
2015-09-24 22:52:02 +02:00
try {
if (type == 0 || type == 2) {
2017-07-08 18:32:04 +02:00
Collections.sort(res.participants, new Comparator<TLRPC.ChannelParticipant>() {
2015-09-24 22:52:02 +02:00
@Override
public int compare(TLRPC.ChannelParticipant lhs, TLRPC.ChannelParticipant rhs) {
TLRPC.User user1 = MessagesController.getInstance().getUser(rhs.user_id);
TLRPC.User user2 = MessagesController.getInstance().getUser(lhs.user_id);
int status1 = 0;
int status2 = 0;
if (user1 != null && user1.status != null) {
if (user1.id == UserConfig.getClientUserId()) {
status1 = ConnectionsManager.getInstance().getCurrentTime() + 50000;
} else {
status1 = user1.status.expires;
}
}
if (user2 != null && user2.status != null) {
if (user2.id == UserConfig.getClientUserId()) {
status2 = ConnectionsManager.getInstance().getCurrentTime() + 50000;
} else {
status2 = user2.status.expires;
}
}
if (status1 > 0 && status2 > 0) {
if (status1 > status2) {
return 1;
} else if (status1 < status2) {
return -1;
}
return 0;
} else if (status1 < 0 && status2 < 0) {
if (status1 > status2) {
return 1;
} else if (status1 < status2) {
return -1;
}
return 0;
} else if (status1 < 0 && status2 > 0 || status1 == 0 && status2 != 0) {
return -1;
} else if (status2 < 0 && status1 > 0 || status2 == 0 && status1 != 0) {
return 1;
}
return 0;
}
});
} else if (type == 1) {
Collections.sort(res.participants, new Comparator<TLRPC.ChannelParticipant>() {
@Override
public int compare(TLRPC.ChannelParticipant lhs, TLRPC.ChannelParticipant rhs) {
int type1 = getChannelAdminParticipantType(lhs);
int type2 = getChannelAdminParticipantType(rhs);
if (type1 > type2) {
return 1;
} else if (type1 < type2) {
return -1;
}
return 0;
}
});
}
} catch (Exception e) {
2017-03-31 01:58:05 +02:00
FileLog.e(e);
2015-09-24 22:52:02 +02:00
}
}
2017-07-08 18:32:04 +02:00
updateRows();
2015-09-24 22:52:02 +02:00
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
}
});
}
});
ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid);
}
@Override
public void onResume() {
super.onResume();
if (listViewAdapter != null) {
listViewAdapter.notifyDataSetChanged();
}
}
2017-07-08 18:32:04 +02:00
@Override
protected void onTransitionAnimationEnd(boolean isOpen, boolean backward) {
if (isOpen && !backward && needOpenSearch) {
searchItem.openSearch(true);
}
}
private class SearchAdapter extends RecyclerListView.SelectionAdapter {
2017-03-31 01:58:05 +02:00
2015-09-24 22:52:02 +02:00
private Context mContext;
2017-07-08 18:32:04 +02:00
private ArrayList<TLRPC.User> searchResult = new ArrayList<>();
private ArrayList<CharSequence> searchResultNames = new ArrayList<>();
private SearchAdapterHelper searchAdapterHelper;
private Timer searchTimer;
2015-09-24 22:52:02 +02:00
2017-07-08 18:32:04 +02:00
private int groupStartRow;
private int group2StartRow;
private int contactsStartRow;
private int globalStartRow;
private int totalCount;
public SearchAdapter(Context context) {
2015-09-24 22:52:02 +02:00
mContext = context;
2017-07-08 18:32:04 +02:00
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) {
searchResult.clear();
searchResultNames.clear();
searchAdapterHelper.queryServerSearch(null, type != 0, false, true, true, chatId, type == 0);
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, selectType != 0, false, true, true, chatId, type == 0);
if (selectType == 1) {
final ArrayList<TLRPC.TL_contact> contactsCopy = new ArrayList<>();
contactsCopy.addAll(ContactsController.getInstance().contacts);
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
String search1 = query.trim().toLowerCase();
if (search1.length() == 0) {
updateSearchResults(new ArrayList<TLRPC.User>(), new ArrayList<CharSequence>());
return;
}
String search2 = LocaleController.getInstance().getTranslitString(search1);
if (search1.equals(search2) || search2.length() == 0) {
search2 = null;
}
String search[] = new String[1 + (search2 != null ? 1 : 0)];
search[0] = search1;
if (search2 != null) {
search[1] = search2;
}
ArrayList<TLRPC.User> resultArray = new ArrayList<>();
ArrayList<CharSequence> resultArrayNames = new ArrayList<>();
for (int a = 0; a < contactsCopy.size(); a++) {
TLRPC.TL_contact contact = contactsCopy.get(a);
TLRPC.User user = MessagesController.getInstance().getUser(contact.user_id);
if (user.id == UserConfig.getClientUserId()) {
continue;
}
String name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase();
String tName = LocaleController.getInstance().getTranslitString(name);
if (name.equals(tName)) {
tName = null;
}
int found = 0;
for (String q : search) {
if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) {
found = 1;
} else if (user.username != null && user.username.startsWith(q)) {
found = 2;
}
if (found != 0) {
if (found == 1) {
resultArrayNames.add(AndroidUtilities.generateSearchName(user.first_name, user.last_name, q));
} else {
resultArrayNames.add(AndroidUtilities.generateSearchName("@" + user.username, null, "@" + q));
}
resultArray.add(user);
break;
}
}
}
updateSearchResults(resultArray, resultArrayNames);
}
});
}
}
});
}
private void updateSearchResults(final ArrayList<TLRPC.User> users, final ArrayList<CharSequence> names) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
searchResult = users;
searchResultNames = names;
notifyDataSetChanged();
}
});
2015-09-24 22:52:02 +02:00
}
@Override
2017-03-31 01:58:05 +02:00
public boolean isEnabled(RecyclerView.ViewHolder holder) {
2017-07-08 18:32:04 +02:00
return holder.getItemViewType() != 1;
}
@Override
public int getItemCount() {
int contactsCount = searchResult.size();
int globalCount = searchAdapterHelper.getGlobalSearch().size();
int groupsCount = searchAdapterHelper.getGroupSearch().size();
int groupsCount2 = searchAdapterHelper.getGroupSearch2().size();
int count = 0;
if (contactsCount != 0) {
count += contactsCount + 1;
}
if (globalCount != 0) {
count += globalCount + 1;
}
if (groupsCount != 0) {
count += groupsCount + 1;
}
if (groupsCount2 != 0) {
count += groupsCount2 + 1;
}
return count;
}
@Override
public void notifyDataSetChanged() {
totalCount = 0;
int count = searchAdapterHelper.getGroupSearch().size();
if (count != 0) {
groupStartRow = 0;
totalCount += count + 1;
} else {
groupStartRow = -1;
}
count = searchAdapterHelper.getGroupSearch2().size();
if (count != 0) {
group2StartRow = totalCount;
totalCount += count + 1;
} else {
group2StartRow = -1;
}
count = searchResult.size();
if (count != 0) {
contactsStartRow = totalCount;
totalCount += count + 1;
} else {
contactsStartRow = -1;
}
count = searchAdapterHelper.getGlobalSearch().size();
if (count != 0) {
globalStartRow = totalCount;
totalCount += count + 1;
} else {
globalStartRow = -1;
}
super.notifyDataSetChanged();
}
public TLObject getItem(int i) {
int count = searchAdapterHelper.getGroupSearch().size();
if (count != 0) {
if (count + 1 > i) {
if (i == 0) {
return null;
} else {
return searchAdapterHelper.getGroupSearch().get(i - 1);
}
} else {
i -= count + 1;
}
}
count = searchAdapterHelper.getGroupSearch2().size();
if (count != 0) {
if (count + 1 > i) {
if (i == 0) {
return null;
} else {
return searchAdapterHelper.getGroupSearch2().get(i - 1);
}
} else {
i -= count + 1;
}
}
count = searchResult.size();
if (count != 0) {
if (count + 1 > i) {
if (i == 0) {
return null;
} else {
return searchResult.get(i - 1);
}
} else {
i -= count + 1;
}
}
count = searchAdapterHelper.getGlobalSearch().size();
if (count != 0) {
if (count + 1 > i) {
if (i == 0) {
return null;
} else {
return searchAdapterHelper.getGlobalSearch().get(i - 1);
}
}
}
return null;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case 0:
view = new ManageChatUserCell(mContext, 2, selectType == 0);
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
((ManageChatUserCell) view).setDelegate(new ManageChatUserCell.ManageChatUserCellDelegate() {
@Override
public boolean onOptionsButtonCheck(ManageChatUserCell cell, boolean click) {
TLObject object = getItem((Integer) cell.getTag());
if (object instanceof TLRPC.ChannelParticipant) {
TLRPC.ChannelParticipant participant = (TLRPC.ChannelParticipant) getItem((Integer) cell.getTag());
return createMenuForParticipant(participant, !click);
} else {
return false;
}
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
});
break;
case 1:
default:
view = new GraySectionCell(mContext);
break;
}
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;
2015-09-24 22:52:02 +02:00
} else {
2017-07-08 18:32:04 +02:00
user = MessagesController.getInstance().getUser(((TLRPC.ChannelParticipant) object).user_id);
}
String un = user.username;
CharSequence username = null;
CharSequence name = null;
int count = searchAdapterHelper.getGroupSearch().size();
boolean ok = false;
String nameSearch = null;
if (count != 0) {
if (count + 1 > position) {
nameSearch = searchAdapterHelper.getLastFoundChannel();
ok = true;
} else {
position -= count + 1;
}
}
if (!ok) {
count = searchAdapterHelper.getGroupSearch2().size();
if (count != 0) {
if (count + 1 > position) {
nameSearch = searchAdapterHelper.getLastFoundChannel2();
} else {
position -= count + 1;
}
}
}
if (!ok) {
count = searchResult.size();
if (count != 0) {
if (count + 1 > position) {
ok = true;
name = searchResultNames.get(position - 1);
if (name != null && un != null && un.length() > 0) {
if (name.toString().startsWith("@" + un)) {
username = name;
name = null;
}
}
} else {
position -= count + 1;
}
}
}
if (!ok) {
count = searchAdapterHelper.getGlobalSearch().size();
if (count != 0) {
if (count + 1 > position) {
String foundUserName = searchAdapterHelper.getLastFoundUsername();
if (foundUserName.startsWith("@")) {
foundUserName = foundUserName.substring(1);
}
try {
username = new SpannableStringBuilder(un);
((SpannableStringBuilder) username).setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4)), 0, foundUserName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {
username = un;
FileLog.e(e);
}
}
}
}
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);
2015-09-24 22:52:02 +02:00
}
}
2017-07-08 18:32:04 +02:00
ManageChatUserCell userCell = (ManageChatUserCell) holder.itemView;
userCell.setTag(position);
userCell.setData(user, name, username);
break;
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
case 1: {
GraySectionCell sectionCell = (GraySectionCell) holder.itemView;
if (position == groupStartRow) {
if (type == 0) {
sectionCell.setText(LocaleController.getString("ChannelRestrictedUsers", R.string.ChannelRestrictedUsers).toUpperCase());
} else {
sectionCell.setText(LocaleController.getString("ChannelMembers", R.string.ChannelMembers).toUpperCase());
}
} else if (position == group2StartRow) {
sectionCell.setText(LocaleController.getString("ChannelBlockedUsers", R.string.ChannelBlockedUsers).toUpperCase());
} else if (position == globalStartRow) {
sectionCell.setText(LocaleController.getString("GlobalSearch", R.string.GlobalSearch).toUpperCase());
} else if (position == contactsStartRow) {
sectionCell.setText(LocaleController.getString("Contacts", R.string.Contacts).toUpperCase());
}
break;
2015-09-24 22:52:02 +02:00
}
}
2017-07-08 18:32:04 +02:00
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
if (holder.itemView instanceof ManageChatUserCell) {
((ManageChatUserCell) holder.itemView).recycle();
}
}
@Override
public int getItemViewType(int i) {
if (i == globalStartRow || i == groupStartRow || i == contactsStartRow || i == group2StartRow) {
return 1;
}
return 0;
}
}
private class ListAdapter extends RecyclerListView.SelectionAdapter {
private Context mContext;
public ListAdapter(Context context) {
mContext = context;
}
@Override
public boolean isEnabled(RecyclerView.ViewHolder holder) {
int type = holder.getItemViewType();
return type == 0 || type == 2 || type == 6;
2015-09-24 22:52:02 +02:00
}
@Override
2017-03-31 01:58:05 +02:00
public int getItemCount() {
2017-07-08 18:32:04 +02:00
if (loadingUsers && !firstLoaded) {
2015-09-24 22:52:02 +02:00
return 0;
}
2017-07-08 18:32:04 +02:00
return rowCount;
2015-09-24 22:52:02 +02:00
}
@Override
2017-03-31 01:58:05 +02:00
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case 0:
2017-07-08 18:32:04 +02:00
view = new ManageChatUserCell(mContext, type == 0 ? 8 : 1, selectType == 0);
2017-03-31 01:58:05 +02:00
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
2017-07-08 18:32:04 +02:00
((ManageChatUserCell) view).setDelegate(new ManageChatUserCell.ManageChatUserCellDelegate() {
@Override
public boolean onOptionsButtonCheck(ManageChatUserCell cell, boolean click) {
TLRPC.ChannelParticipant participant = listViewAdapter.getItem((Integer) cell.getTag());
return createMenuForParticipant(participant, !click);
}
});
2017-03-31 01:58:05 +02:00
break;
case 1:
view = new TextInfoPrivacyCell(mContext);
break;
case 2:
2017-07-08 18:32:04 +02:00
view = new ManageChatTextCell(mContext);
2017-03-31 01:58:05 +02:00
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
break;
case 3:
view = new ShadowSectionCell(mContext);
break;
case 4:
2017-07-08 18:32:04 +02:00
view = new FrameLayout(mContext) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - AndroidUtilities.dp(56), MeasureSpec.EXACTLY));
}
};
FrameLayout frameLayout = (FrameLayout) view;
frameLayout.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
LinearLayout linearLayout = new LinearLayout(mContext);
linearLayout.setOrientation(LinearLayout.VERTICAL);
frameLayout.addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 20, 0, 20, 0));
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(R.drawable.group_ban_empty);
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_emptyListPlaceholder), PorterDuff.Mode.MULTIPLY));
linearLayout.addView(imageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL));
TextView textView = new TextView(mContext);
textView.setText(LocaleController.getString("NoBlockedUsers", R.string.NoBlockedUsers));
textView.setTextColor(Theme.getColor(Theme.key_emptyListPlaceholder));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
linearLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 10, 0, 0));
textView = new TextView(mContext);
if (currentChat.megagroup) {
textView.setText(LocaleController.getString("NoBlockedGroup", R.string.NoBlockedGroup));
} else {
textView.setText(LocaleController.getString("NoBlockedChannel", R.string.NoBlockedChannel));
}
textView.setTextColor(Theme.getColor(Theme.key_emptyListPlaceholder));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
linearLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 10, 0, 0));
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
2017-03-31 01:58:05 +02:00
break;
case 5:
view = new HeaderCell(mContext);
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
break;
case 6:
default:
view = new RadioCell(mContext);
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
break;
}
return new RecyclerListView.Holder(view);
2015-09-24 22:52:02 +02:00
}
@Override
2017-03-31 01:58:05 +02:00
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case 0:
2017-07-08 18:32:04 +02:00
ManageChatUserCell userCell = (ManageChatUserCell) holder.itemView;
userCell.setTag(position);
TLRPC.ChannelParticipant participant = getItem(position);
2017-03-31 01:58:05 +02:00
TLRPC.User user = MessagesController.getInstance().getUser(participant.user_id);
if (user != null) {
if (type == 0) {
2017-07-08 18:32:04 +02:00
String role = null;
if (participant instanceof TLRPC.TL_channelParticipantBanned) {
TLRPC.User user1 = MessagesController.getInstance().getUser(participant.kicked_by);
if (user1 != null) {
role = LocaleController.formatString("UserRestrictionsBy", R.string.UserRestrictionsBy, ContactsController.formatName(user1.first_name, user1.last_name));
}
}
userCell.setData(user, null, role);
2017-03-31 01:58:05 +02:00
} else if (type == 1) {
String role = null;
if (participant instanceof TLRPC.TL_channelParticipantCreator || participant instanceof TLRPC.TL_channelParticipantSelf) {
role = LocaleController.getString("ChannelCreator", R.string.ChannelCreator);
2017-07-08 18:32:04 +02:00
} else if (participant instanceof TLRPC.TL_channelParticipantAdmin) {
TLRPC.User user1 = MessagesController.getInstance().getUser(participant.promoted_by);
if (user1 != null) {
role = LocaleController.formatString("EditAdminPromotedBy", R.string.EditAdminPromotedBy, ContactsController.formatName(user1.first_name, user1.last_name));
}
2017-03-31 01:58:05 +02:00
}
2017-07-08 18:32:04 +02:00
userCell.setData(user, null, role);
2017-03-31 01:58:05 +02:00
} else if (type == 2) {
2017-07-08 18:32:04 +02:00
userCell.setData(user, null, null);
2017-03-31 01:58:05 +02:00
}
}
break;
case 1:
TextInfoPrivacyCell privacyCell = (TextInfoPrivacyCell) holder.itemView;
2017-07-08 18:32:04 +02:00
if (position == participantsInfoRow) {
if (type == 0) {
if (ChatObject.canBlockUsers(currentChat)) {
if (currentChat.megagroup) {
privacyCell.setText(String.format("%1$s\n\n%2$s", LocaleController.getString("NoBlockedGroup", R.string.NoBlockedGroup), LocaleController.getString("UnbanText", R.string.UnbanText)));
} else {
privacyCell.setText(String.format("%1$s\n\n%2$s", LocaleController.getString("NoBlockedChannel", R.string.NoBlockedChannel), LocaleController.getString("UnbanText", R.string.UnbanText)));
}
2017-03-31 01:58:05 +02:00
} else {
2017-07-08 18:32:04 +02:00
if (currentChat.megagroup) {
privacyCell.setText(LocaleController.getString("NoBlockedGroup", R.string.NoBlockedGroup));
} else {
privacyCell.setText(LocaleController.getString("NoBlockedChannel", R.string.NoBlockedChannel));
}
2017-03-31 01:58:05 +02:00
}
privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
2017-07-08 18:32:04 +02:00
} else if (type == 1) {
if (addNewRow != -1) {
if (currentChat.megagroup) {
privacyCell.setText(LocaleController.getString("MegaAdminsInfo", R.string.MegaAdminsInfo));
} else {
privacyCell.setText(LocaleController.getString("ChannelAdminsInfo", R.string.ChannelAdminsInfo));
}
privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
} else {
privacyCell.setText("");
privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
}
} else if (type == 2) {
if (currentChat.megagroup || selectType != 0) {
2017-03-31 01:58:05 +02:00
privacyCell.setText("");
} else {
privacyCell.setText(LocaleController.getString("ChannelMembersInfo", R.string.ChannelMembersInfo));
}
privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
2015-11-26 22:04:02 +01:00
}
2015-09-24 22:52:02 +02:00
}
2017-03-31 01:58:05 +02:00
break;
case 2:
2017-07-08 18:32:04 +02:00
ManageChatTextCell actionCell = (ManageChatTextCell) holder.itemView;
if (position == addNewRow) {
if (type == 0) {
actionCell.setText(LocaleController.getString("ChannelBlockUser", R.string.ChannelBlockUser), null, R.drawable.group_ban_new, false);
} else if (type == 1) {
actionCell.setText(LocaleController.getString("ChannelAddAdmin", R.string.ChannelAddAdmin), null, R.drawable.group_admin_new, false);
} else if (type == 2) {
actionCell.setText(LocaleController.getString("AddMember", R.string.AddMember), null, R.drawable.menu_invite, true);
2015-11-26 22:04:02 +01:00
}
2017-07-08 18:32:04 +02:00
} else if (position == addNew2Row) {
actionCell.setText(LocaleController.getString("ChannelInviteViaLink", R.string.ChannelInviteViaLink), null, R.drawable.msg_panel_link, false);
2015-09-24 22:52:02 +02:00
}
2017-03-31 01:58:05 +02:00
break;
case 5:
2017-07-08 18:32:04 +02:00
HeaderCell headerCell = (HeaderCell) holder.itemView;
if (position == restricted1SectionRow) {
headerCell.setText(LocaleController.getString("ChannelRestrictedUsers", R.string.ChannelRestrictedUsers));
} else if (position == restricted2SectionRow) {
headerCell.setText(LocaleController.getString("ChannelBlockedUsers", R.string.ChannelBlockedUsers));
} else if (position == changeAddHeaderRow) {
headerCell.setText(LocaleController.getString("WhoCanAddMembers", R.string.WhoCanAddMembers));
}
2017-03-31 01:58:05 +02:00
break;
case 6:
RadioCell radioCell = (RadioCell) holder.itemView;
TLRPC.Chat chat = MessagesController.getInstance().getChat(chatId);
2017-07-08 18:32:04 +02:00
if (position == changeAddRadio1Row) {
2017-03-31 01:58:05 +02:00
radioCell.setTag(0);
radioCell.setText(LocaleController.getString("WhoCanAddMembersAllMembers", R.string.WhoCanAddMembersAllMembers), chat != null && chat.democracy, true);
2017-07-08 18:32:04 +02:00
} else if (position == changeAddRadio2Row) {
2017-03-31 01:58:05 +02:00
radioCell.setTag(1);
radioCell.setText(LocaleController.getString("WhoCanAddMembersAdmins", R.string.WhoCanAddMembersAdmins), chat != null && !chat.democracy, false);
2015-09-24 22:52:02 +02:00
}
2017-03-31 01:58:05 +02:00
break;
2015-09-24 22:52:02 +02:00
}
}
@Override
2017-07-08 18:32:04 +02:00
public void onViewRecycled(RecyclerView.ViewHolder holder) {
if (holder.itemView instanceof ManageChatUserCell) {
((ManageChatUserCell) holder.itemView).recycle();
2015-09-24 22:52:02 +02:00
}
2017-07-08 18:32:04 +02:00
}
@Override
public int getItemViewType(int position) {
if (position == addNewRow || position == addNew2Row) {
return 2;
} else if (position >= participantsStartRow && position < participantsEndRow || position >= participants2StartRow && position < participants2EndRow) {
return 0;
} else if (position == addNewSectionRow || position == changeAddSectionRow || position == participantsDividerRow) {
return 3;
} else if (position == participantsInfoRow) {
2015-09-24 22:52:02 +02:00
return 1;
2017-07-08 18:32:04 +02:00
} else if (position == changeAddHeaderRow || position == restricted1SectionRow || position == restricted2SectionRow) {
return 5;
} else if (position == changeAddRadio1Row || position == changeAddRadio2Row) {
return 6;
} else if (position == blockedEmptyRow) {
return 4;
2015-09-24 22:52:02 +02:00
}
return 0;
}
2017-07-08 18:32:04 +02:00
public TLRPC.ChannelParticipant getItem(int position) {
if (participantsStartRow != -1 && position >= participantsStartRow && position < participantsEndRow) {
return participants.get(position - participantsStartRow);
} else if (participants2StartRow != -1 && position >= participants2StartRow && position < participants2EndRow) {
return participants2.get(position - participants2StartRow);
}
return null;
}
2017-03-31 01:58:05 +02:00
}
2015-09-24 22:52:02 +02:00
2017-03-31 01:58:05 +02:00
@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);
2017-07-08 18:32:04 +02:00
if (child instanceof ManageChatUserCell) {
((ManageChatUserCell) child).update(0);
2017-03-31 01:58:05 +02:00
}
}
}
};
2015-09-24 22:52:02 +02:00
2017-03-31 01:58:05 +02:00
return new ThemeDescription[]{
2017-07-08 18:32:04 +02:00
new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{ManageChatUserCell.class, TextSettingsCell.class, ManageChatTextCell.class, RadioCell.class}, null, null, null, Theme.key_windowBackgroundWhite),
2017-03-31 01:58:05 +02:00
new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray),
new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault),
new ThemeDescription(listView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault),
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon),
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle),
new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector),
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[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow),
new ThemeDescription(listView, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4),
new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteValueText),
new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueImageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon),
new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow),
new ThemeDescription(listView, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader),
new ThemeDescription(listView, 0, new Class[]{RadioCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
new ThemeDescription(listView, ThemeDescription.FLAG_CHECKBOX, new Class[]{RadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackground),
new ThemeDescription(listView, ThemeDescription.FLAG_CHECKBOXCHECK, new Class[]{RadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackgroundChecked),
2017-07-08 18:32:04 +02:00
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),
2017-03-31 01:58:05 +02:00
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),
2017-07-08 18:32:04 +02:00
new ThemeDescription(listView, 0, new Class[]{ManageChatTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
new ThemeDescription(listView, 0, new Class[]{ManageChatTextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon),
2017-03-31 01:58:05 +02:00
};
2015-09-24 22:52:02 +02:00
}
}