/* * This is the source code of Telegram for Android v. 5.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-2018. */ package org.telegram.ui; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.os.Build; import android.os.Bundle; import android.os.Vibrator; import android.text.Editable; import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.DatePicker; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; 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.R; import org.telegram.messenger.UserObject; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Cells.DialogRadioCell; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.PollEditTextCell; import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Cells.TextCheckCell2; import org.telegram.ui.Cells.TextDetailCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Cells.UserCell2; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; import java.util.Calendar; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; public class ChatRightsEditActivity extends BaseFragment { private ListAdapter listViewAdapter; private RecyclerListView listView; private int chatId; private TLRPC.User currentUser; private TLRPC.Chat currentChat; private int currentType; private boolean isChannel; private boolean canEdit; private TLRPC.TL_chatAdminRights adminRights; private TLRPC.TL_chatAdminRights myAdminRights; private TLRPC.TL_chatBannedRights bannedRights; private TLRPC.TL_chatBannedRights defaultBannedRights; private String currentBannedRights = ""; private String currentRank; private String initialRank; private int rowCount; private int changeInfoRow; private int postMessagesRow; private int editMesagesRow; private int deleteMessagesRow; private int addAdminsRow; private int anonymousRow; private int banUsersRow; private int addUsersRow; private int pinMessagesRow; private int rightsShadowRow; private int removeAdminRow; private int removeAdminShadowRow; private int cantEditInfoRow; private int transferOwnerShadowRow; private int transferOwnerRow; private int rankHeaderRow; private int rankRow; private int rankInfoRow; private int sendMessagesRow; private int sendMediaRow; private int sendStickersRow; private int sendPollsRow; private int embedLinksRow; private int startVoiceChatRow; private int untilSectionRow; private int untilDateRow; private ChatRightsEditActivityDelegate delegate; private boolean isAddingNew; private boolean initialIsSet; public static final int TYPE_ADMIN = 0; public static final int TYPE_BANNED = 1; public interface ChatRightsEditActivityDelegate { void didSetRights(int rights, TLRPC.TL_chatAdminRights rightsAdmin, TLRPC.TL_chatBannedRights rightsBanned, String rank); void didChangeOwner(TLRPC.User user); } private final static int done_button = 1; public ChatRightsEditActivity(int userId, int channelId, TLRPC.TL_chatAdminRights rightsAdmin, TLRPC.TL_chatBannedRights rightsBannedDefault, TLRPC.TL_chatBannedRights rightsBanned, String rank, int type, boolean edit, boolean addingNew) { super(); isAddingNew = addingNew; chatId = channelId; currentUser = MessagesController.getInstance(currentAccount).getUser(userId); currentType = type; canEdit = edit; currentChat = MessagesController.getInstance(currentAccount).getChat(chatId); if (rank == null) { rank = ""; } initialRank = currentRank = rank; if (currentChat != null) { isChannel = ChatObject.isChannel(currentChat) && !currentChat.megagroup; myAdminRights = currentChat.admin_rights; } if (myAdminRights == null) { myAdminRights = new TLRPC.TL_chatAdminRights(); myAdminRights.change_info = myAdminRights.post_messages = myAdminRights.edit_messages = myAdminRights.delete_messages = myAdminRights.ban_users = myAdminRights.invite_users = myAdminRights.pin_messages = myAdminRights.add_admins = myAdminRights.manage_call = true; } if (type == TYPE_ADMIN) { adminRights = new TLRPC.TL_chatAdminRights(); if (rightsAdmin == null) { adminRights.change_info = myAdminRights.change_info; adminRights.post_messages = myAdminRights.post_messages; adminRights.edit_messages = myAdminRights.edit_messages; adminRights.delete_messages = myAdminRights.delete_messages; adminRights.manage_call = myAdminRights.manage_call; adminRights.ban_users = myAdminRights.ban_users; adminRights.invite_users = myAdminRights.invite_users; adminRights.pin_messages = myAdminRights.pin_messages; initialIsSet = false; } else { adminRights.change_info = rightsAdmin.change_info; adminRights.post_messages = rightsAdmin.post_messages; adminRights.edit_messages = rightsAdmin.edit_messages; adminRights.delete_messages = rightsAdmin.delete_messages; adminRights.manage_call = rightsAdmin.manage_call; adminRights.ban_users = rightsAdmin.ban_users; adminRights.invite_users = rightsAdmin.invite_users; adminRights.pin_messages = rightsAdmin.pin_messages; adminRights.add_admins = rightsAdmin.add_admins; adminRights.anonymous = rightsAdmin.anonymous; initialIsSet = adminRights.change_info || adminRights.post_messages || adminRights.edit_messages || adminRights.delete_messages || adminRights.ban_users || adminRights.invite_users || adminRights.pin_messages || adminRights.add_admins || adminRights.manage_call || adminRights.anonymous; } } else { defaultBannedRights = rightsBannedDefault; if (defaultBannedRights == null) { defaultBannedRights = new TLRPC.TL_chatBannedRights(); defaultBannedRights.view_messages = defaultBannedRights.send_media = defaultBannedRights.send_messages = defaultBannedRights.embed_links = defaultBannedRights.send_stickers = defaultBannedRights.send_gifs = defaultBannedRights.send_games = defaultBannedRights.send_inline = defaultBannedRights.send_polls = defaultBannedRights.invite_users = defaultBannedRights.change_info = defaultBannedRights.pin_messages = false; } bannedRights = new TLRPC.TL_chatBannedRights(); if (rightsBanned == null) { bannedRights.view_messages = bannedRights.send_media = bannedRights.send_messages = bannedRights.embed_links = bannedRights.send_stickers = bannedRights.send_gifs = bannedRights.send_games = bannedRights.send_inline = bannedRights.send_polls = bannedRights.invite_users = bannedRights.change_info = bannedRights.pin_messages = false; } else { bannedRights.view_messages = rightsBanned.view_messages; bannedRights.send_messages = rightsBanned.send_messages; bannedRights.send_media = rightsBanned.send_media; bannedRights.send_stickers = rightsBanned.send_stickers; bannedRights.send_gifs = rightsBanned.send_gifs; bannedRights.send_games = rightsBanned.send_games; bannedRights.send_inline = rightsBanned.send_inline; bannedRights.embed_links = rightsBanned.embed_links; bannedRights.send_polls = rightsBanned.send_polls; bannedRights.invite_users = rightsBanned.invite_users; bannedRights.change_info = rightsBanned.change_info; bannedRights.pin_messages = rightsBanned.pin_messages; bannedRights.until_date = rightsBanned.until_date; } if (defaultBannedRights.view_messages) { bannedRights.view_messages = true; } if (defaultBannedRights.send_messages) { bannedRights.send_messages = true; } if (defaultBannedRights.send_media) { bannedRights.send_media = true; } if (defaultBannedRights.send_stickers) { bannedRights.send_stickers = true; } if (defaultBannedRights.send_gifs) { bannedRights.send_gifs = true; } if (defaultBannedRights.send_games) { bannedRights.send_games = true; } if (defaultBannedRights.send_inline) { bannedRights.send_inline = true; } if (defaultBannedRights.embed_links) { bannedRights.embed_links = true; } if (defaultBannedRights.send_polls) { bannedRights.send_polls = true; } if (defaultBannedRights.invite_users) { bannedRights.invite_users = true; } if (defaultBannedRights.change_info) { bannedRights.change_info = true; } if (defaultBannedRights.pin_messages) { bannedRights.pin_messages = true; } currentBannedRights = ChatObject.getBannedRightsString(bannedRights); initialIsSet = rightsBanned == null || !rightsBanned.view_messages; } updateRows(false); } @Override public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (currentType == TYPE_ADMIN) { actionBar.setTitle(LocaleController.getString("EditAdmin", R.string.EditAdmin)); } else { actionBar.setTitle(LocaleController.getString("UserRestrictions", R.string.UserRestrictions)); } actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { if (id == -1) { if (checkDiscard()) { finishFragment(); } } else if (id == done_button) { onDonePressed(); } } }); if (canEdit || !isChannel && currentChat.creator && UserObject.isUserSelf(currentUser)) { ActionBarMenu menu = actionBar.createMenu(); menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56), LocaleController.getString("Done", R.string.Done)); } fragmentView = new FrameLayout(context); fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); FrameLayout frameLayout = (FrameLayout) fragmentView; fragmentView.setFocusableInTouchMode(true); listView = new RecyclerListView(context); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); ((DefaultItemAnimator) listView.getItemAnimator()).setDelayAnimations(false); listView.setLayoutManager(linearLayoutManager); listView.setAdapter(listViewAdapter = new ListAdapter(context)); listView.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT); frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); } } }); listView.setOnItemClickListener((view, position) -> { if (!canEdit && (!currentChat.creator || currentType != TYPE_ADMIN || position != anonymousRow)) { return; } if (position == 0) { Bundle args = new Bundle(); args.putInt("user_id", currentUser.id); presentFragment(new ProfileActivity(args)); } else if (position == removeAdminRow) { if (currentType == TYPE_ADMIN) { MessagesController.getInstance(currentAccount).setUserAdminRole(chatId, currentUser, new TLRPC.TL_chatAdminRights(), currentRank, isChannel, getFragmentForAlert(0), isAddingNew); if (delegate != null) { delegate.didSetRights(0, adminRights, bannedRights, currentRank); } finishFragment(); } else if (currentType == TYPE_BANNED) { bannedRights = new TLRPC.TL_chatBannedRights(); bannedRights.view_messages = true; bannedRights.send_media = true; bannedRights.send_messages = true; bannedRights.send_stickers = true; bannedRights.send_gifs = true; bannedRights.send_games = true; bannedRights.send_inline = true; bannedRights.embed_links = true; bannedRights.pin_messages = true; bannedRights.send_polls = true; bannedRights.invite_users = true; bannedRights.change_info = true; bannedRights.until_date = 0; onDonePressed(); } } else if (position == transferOwnerRow) { initTransfer(null, null); } else if (position == untilDateRow) { if (getParentActivity() == null) { return; } BottomSheet.Builder builder = new BottomSheet.Builder(context); builder.setApplyTopPadding(false); LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); HeaderCell headerCell = new HeaderCell(context, Theme.key_dialogTextBlue2, 23, 15, false); headerCell.setHeight(47); headerCell.setText(LocaleController.getString("UserRestrictionsDuration", R.string.UserRestrictionsDuration)); linearLayout.addView(headerCell); LinearLayout linearLayoutInviteContainer = new LinearLayout(context); linearLayoutInviteContainer.setOrientation(LinearLayout.VERTICAL); linearLayout.addView(linearLayoutInviteContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); BottomSheet.BottomSheetCell[] buttons = new BottomSheet.BottomSheetCell[5]; for (int a = 0; a < buttons.length; a++) { buttons[a] = new BottomSheet.BottomSheetCell(context, 0); buttons[a].setPadding(AndroidUtilities.dp(7), 0, AndroidUtilities.dp(7), 0); buttons[a].setTag(a); buttons[a].setBackgroundDrawable(Theme.getSelectorDrawable(false)); String text; switch (a) { case 0: text = LocaleController.getString("UserRestrictionsUntilForever", R.string.UserRestrictionsUntilForever); break; case 1: text = LocaleController.formatPluralString("Days", 1); break; case 2: text = LocaleController.formatPluralString("Weeks", 1); break; case 3: text = LocaleController.formatPluralString("Months", 1); break; case 4: default: text = LocaleController.getString("UserRestrictionsCustom", R.string.UserRestrictionsCustom); break; } buttons[a].setTextAndIcon(text, 0); linearLayoutInviteContainer.addView(buttons[a], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); buttons[a].setOnClickListener(v2 -> { Integer tag = (Integer) v2.getTag(); switch (tag) { case 0: bannedRights.until_date = 0; listViewAdapter.notifyItemChanged(untilDateRow); break; case 1: bannedRights.until_date = ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60 * 60 * 24; listViewAdapter.notifyItemChanged(untilDateRow); break; case 2: bannedRights.until_date = ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60 * 60 * 24 * 7; listViewAdapter.notifyItemChanged(untilDateRow); break; case 3: bannedRights.until_date = ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60 * 60 * 24 * 30; listViewAdapter.notifyItemChanged(untilDateRow); break; case 4: { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int monthOfYear = calendar.get(Calendar.MONTH); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); try { DatePickerDialog dialog = new DatePickerDialog(getParentActivity(), (view1, year1, month, dayOfMonth1) -> { Calendar calendar1 = Calendar.getInstance(); calendar1.clear(); calendar1.set(year1, month, dayOfMonth1); final int time = (int) (calendar1.getTime().getTime() / 1000); try { TimePickerDialog dialog13 = new TimePickerDialog(getParentActivity(), (view11, hourOfDay, minute) -> { bannedRights.until_date = time + hourOfDay * 3600 + minute * 60; listViewAdapter.notifyItemChanged(untilDateRow); }, 0, 0, true); dialog13.setButton(DialogInterface.BUTTON_POSITIVE, LocaleController.getString("Set", R.string.Set), dialog13); dialog13.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), (dialog131, which) -> { }); showDialog(dialog13); } catch (Exception e) { FileLog.e(e); } }, year, monthOfYear, dayOfMonth); final DatePicker datePicker = dialog.getDatePicker(); Calendar date = Calendar.getInstance(); date.setTimeInMillis(System.currentTimeMillis()); date.set(Calendar.HOUR_OF_DAY, date.getMinimum(Calendar.HOUR_OF_DAY)); date.set(Calendar.MINUTE, date.getMinimum(Calendar.MINUTE)); date.set(Calendar.SECOND, date.getMinimum(Calendar.SECOND)); date.set(Calendar.MILLISECOND, date.getMinimum(Calendar.MILLISECOND)); datePicker.setMinDate(date.getTimeInMillis()); date.setTimeInMillis(System.currentTimeMillis() + 31536000000L); date.set(Calendar.HOUR_OF_DAY, date.getMaximum(Calendar.HOUR_OF_DAY)); date.set(Calendar.MINUTE, date.getMaximum(Calendar.MINUTE)); date.set(Calendar.SECOND, date.getMaximum(Calendar.SECOND)); date.set(Calendar.MILLISECOND, date.getMaximum(Calendar.MILLISECOND)); datePicker.setMaxDate(date.getTimeInMillis()); dialog.setButton(DialogInterface.BUTTON_POSITIVE, LocaleController.getString("Set", R.string.Set), dialog); dialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), (dialog1, which) -> { }); if (Build.VERSION.SDK_INT >= 21) { dialog.setOnShowListener(dialog12 -> { int count = datePicker.getChildCount(); for (int b = 0; b < count; b++) { View child = datePicker.getChildAt(b); ViewGroup.LayoutParams layoutParams = child.getLayoutParams(); layoutParams.width = LayoutHelper.MATCH_PARENT; child.setLayoutParams(layoutParams); } }); } showDialog(dialog); } catch (Exception e) { FileLog.e(e); } break; } } builder.getDismissRunnable().run(); }); } builder.setCustomView(linearLayout); showDialog(builder.create()); } else if (view instanceof TextCheckCell2) { TextCheckCell2 checkCell = (TextCheckCell2) view; if (checkCell.hasIcon()) { Toast.makeText(getParentActivity(), LocaleController.getString("UserRestrictionsDisabled", R.string.UserRestrictionsDisabled), Toast.LENGTH_SHORT).show(); return; } if (!checkCell.isEnabled()) { return; } checkCell.setChecked(!checkCell.isChecked()); if (position == changeInfoRow) { if (currentType == TYPE_ADMIN) { adminRights.change_info = !adminRights.change_info; } else { bannedRights.change_info = !bannedRights.change_info; } } else if (position == postMessagesRow) { adminRights.post_messages = !adminRights.post_messages; } else if (position == editMesagesRow) { adminRights.edit_messages = !adminRights.edit_messages; } else if (position == deleteMessagesRow) { adminRights.delete_messages = !adminRights.delete_messages; } else if (position == addAdminsRow) { adminRights.add_admins = !adminRights.add_admins; } else if (position == anonymousRow) { adminRights.anonymous = !adminRights.anonymous; } else if (position == banUsersRow) { adminRights.ban_users = !adminRights.ban_users; } else if (position == startVoiceChatRow) { adminRights.manage_call = !adminRights.manage_call; } else if (position == addUsersRow) { if (currentType == TYPE_ADMIN) { adminRights.invite_users = !adminRights.invite_users; } else { bannedRights.invite_users = !bannedRights.invite_users; } } else if (position == pinMessagesRow) { if (currentType == TYPE_ADMIN) { adminRights.pin_messages = !adminRights.pin_messages; } else { bannedRights.pin_messages = !bannedRights.pin_messages; } } else if (bannedRights != null) { boolean disabled = !checkCell.isChecked(); if (position == sendMessagesRow) { bannedRights.send_messages = !bannedRights.send_messages; } else if (position == sendMediaRow) { bannedRights.send_media = !bannedRights.send_media; } else if (position == sendStickersRow) { bannedRights.send_stickers = bannedRights.send_games = bannedRights.send_gifs = bannedRights.send_inline = !bannedRights.send_stickers; } else if (position == embedLinksRow) { bannedRights.embed_links = !bannedRights.embed_links; } else if (position == sendPollsRow) { bannedRights.send_polls = !bannedRights.send_polls; } if (disabled) { if (bannedRights.view_messages && !bannedRights.send_messages) { bannedRights.send_messages = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendMessagesRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_messages) && !bannedRights.send_media) { bannedRights.send_media = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendMediaRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_messages) && !bannedRights.send_polls) { bannedRights.send_polls = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendPollsRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_messages) && !bannedRights.send_stickers) { bannedRights.send_stickers = bannedRights.send_games = bannedRights.send_gifs = bannedRights.send_inline = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendStickersRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_messages) && !bannedRights.embed_links) { bannedRights.embed_links = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(embedLinksRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } } else { if ((!bannedRights.send_messages || !bannedRights.embed_links || !bannedRights.send_inline || !bannedRights.send_media || !bannedRights.send_polls) && bannedRights.view_messages) { bannedRights.view_messages = false; } if ((!bannedRights.embed_links || !bannedRights.send_inline || !bannedRights.send_media || !bannedRights.send_polls) && bannedRights.send_messages) { bannedRights.send_messages = false; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendMessagesRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(true); } } } } updateRows(true); } }); return fragmentView; } @Override public void onResume() { super.onResume(); if (listViewAdapter != null) { listViewAdapter.notifyDataSetChanged(); } AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); } private boolean isDefaultAdminRights() { return adminRights.change_info && adminRights.delete_messages && adminRights.ban_users && adminRights.invite_users && adminRights.pin_messages && adminRights.manage_call && !adminRights.add_admins && !adminRights.anonymous || !adminRights.change_info && !adminRights.delete_messages && !adminRights.ban_users && !adminRights.invite_users && !adminRights.pin_messages && !adminRights.manage_call && !adminRights.add_admins && !adminRights.anonymous; } private boolean hasAllAdminRights() { if (isChannel) { return adminRights.change_info && adminRights.post_messages && adminRights.edit_messages && adminRights.delete_messages && adminRights.invite_users && adminRights.add_admins && adminRights.manage_call; } else { return adminRights.change_info && adminRights.delete_messages && adminRights.ban_users && adminRights.invite_users && adminRights.pin_messages && adminRights.add_admins && adminRights.manage_call; } } private void initTransfer(TLRPC.InputCheckPasswordSRP srp, TwoStepVerificationActivity passwordFragment) { if (getParentActivity() == null) { return; } if (srp != null && !ChatObject.isChannel(currentChat)) { MessagesController.getInstance(currentAccount).convertToMegaGroup(getParentActivity(), chatId, this, param -> { if (param != 0) { chatId = param; currentChat = MessagesController.getInstance(currentAccount).getChat(param); initTransfer(srp, passwordFragment); } }); return; } TLRPC.TL_channels_editCreator req = new TLRPC.TL_channels_editCreator(); if (ChatObject.isChannel(currentChat)) { req.channel = new TLRPC.TL_inputChannel(); req.channel.channel_id = currentChat.id; req.channel.access_hash = currentChat.access_hash; } else { req.channel = new TLRPC.TL_inputChannelEmpty(); } req.password = srp != null ? srp : new TLRPC.TL_inputCheckPasswordEmpty(); req.user_id = getMessagesController().getInputUser(currentUser); getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error != null) { if (getParentActivity() == null) { return; } if ("PASSWORD_HASH_INVALID".equals(error.text)) { if (srp == null) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); if (isChannel) { builder.setTitle(LocaleController.getString("EditAdminChannelTransfer", R.string.EditAdminChannelTransfer)); } else { builder.setTitle(LocaleController.getString("EditAdminGroupTransfer", R.string.EditAdminGroupTransfer)); } builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("EditAdminTransferReadyAlertText", R.string.EditAdminTransferReadyAlertText, currentChat.title, UserObject.getFirstName(currentUser)))); builder.setPositiveButton(LocaleController.getString("EditAdminTransferChangeOwner", R.string.EditAdminTransferChangeOwner), (dialogInterface, i) -> { TwoStepVerificationActivity fragment = new TwoStepVerificationActivity(); fragment.setDelegate(password -> initTransfer(password, fragment)); presentFragment(fragment); }); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); showDialog(builder.create()); } } else if ("PASSWORD_MISSING".equals(error.text) || error.text.startsWith("PASSWORD_TOO_FRESH_") || error.text.startsWith("SESSION_TOO_FRESH_")) { if (passwordFragment != null) { passwordFragment.needHideProgress(); } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("EditAdminTransferAlertTitle", R.string.EditAdminTransferAlertTitle)); LinearLayout linearLayout = new LinearLayout(getParentActivity()); linearLayout.setPadding(AndroidUtilities.dp(24), AndroidUtilities.dp(2), AndroidUtilities.dp(24), 0); linearLayout.setOrientation(LinearLayout.VERTICAL); builder.setView(linearLayout); TextView messageTextView = new TextView(getParentActivity()); messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); if (isChannel) { messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("EditChannelAdminTransferAlertText", R.string.EditChannelAdminTransferAlertText, UserObject.getFirstName(currentUser)))); } else { messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("EditAdminTransferAlertText", R.string.EditAdminTransferAlertText, UserObject.getFirstName(currentUser)))); } linearLayout.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); LinearLayout linearLayout2 = new LinearLayout(getParentActivity()); linearLayout2.setOrientation(LinearLayout.HORIZONTAL); linearLayout.addView(linearLayout2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 0, 0)); ImageView dotImageView = new ImageView(getParentActivity()); dotImageView.setImageResource(R.drawable.list_circle); dotImageView.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(11) : 0, AndroidUtilities.dp(9), LocaleController.isRTL ? 0 : AndroidUtilities.dp(11), 0); dotImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogTextBlack), PorterDuff.Mode.MULTIPLY)); messageTextView = new TextView(getParentActivity()); messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("EditAdminTransferAlertText1", R.string.EditAdminTransferAlertText1))); if (LocaleController.isRTL) { linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT)); } else { linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); } linearLayout2 = new LinearLayout(getParentActivity()); linearLayout2.setOrientation(LinearLayout.HORIZONTAL); linearLayout.addView(linearLayout2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 0, 0)); dotImageView = new ImageView(getParentActivity()); dotImageView.setImageResource(R.drawable.list_circle); dotImageView.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(11) : 0, AndroidUtilities.dp(9), LocaleController.isRTL ? 0 : AndroidUtilities.dp(11), 0); dotImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogTextBlack), PorterDuff.Mode.MULTIPLY)); messageTextView = new TextView(getParentActivity()); messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("EditAdminTransferAlertText2", R.string.EditAdminTransferAlertText2))); if (LocaleController.isRTL) { linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT)); } else { linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); } if ("PASSWORD_MISSING".equals(error.text)) { builder.setPositiveButton(LocaleController.getString("EditAdminTransferSetPassword", R.string.EditAdminTransferSetPassword), (dialogInterface, i) -> presentFragment(new TwoStepVerificationSetupActivity(TwoStepVerificationSetupActivity.TYPE_INTRO, null))); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); } else { messageTextView = new TextView(getParentActivity()); messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); messageTextView.setText(LocaleController.getString("EditAdminTransferAlertText3", R.string.EditAdminTransferAlertText3)); linearLayout.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 0, 0)); builder.setNegativeButton(LocaleController.getString("OK", R.string.OK), null); } showDialog(builder.create()); } else if ("SRP_ID_INVALID".equals(error.text)) { TLRPC.TL_account_getPassword getPasswordReq = new TLRPC.TL_account_getPassword(); ConnectionsManager.getInstance(currentAccount).sendRequest(getPasswordReq, (response2, error2) -> AndroidUtilities.runOnUIThread(() -> { if (error2 == null) { TLRPC.TL_account_password currentPassword = (TLRPC.TL_account_password) response2; passwordFragment.setCurrentPasswordInfo(null, currentPassword); TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword); initTransfer(passwordFragment.getNewSrpPassword(), passwordFragment); } }), ConnectionsManager.RequestFlagWithoutLogin); } else if (error.text.equals("CHANNELS_TOO_MUCH")) { presentFragment(new TooManyCommunitiesActivity(TooManyCommunitiesActivity.TYPE_EDIT)); } else { if (passwordFragment != null) { passwordFragment.needHideProgress(); passwordFragment.finishFragment(); } AlertsCreator.showAddUserAlert(error.text, ChatRightsEditActivity.this, isChannel, req); } } else { if (srp != null) { delegate.didChangeOwner(currentUser); removeSelfFromStack(); passwordFragment.needHideProgress(); passwordFragment.finishFragment(); } } })); } private void updateRows(boolean update) { int transferOwnerShadowRowPrev = Math.min(transferOwnerShadowRow, transferOwnerRow); changeInfoRow = -1; postMessagesRow = -1; editMesagesRow = -1; deleteMessagesRow = -1; addAdminsRow = -1; anonymousRow = -1; banUsersRow = -1; addUsersRow = -1; pinMessagesRow = -1; rightsShadowRow = -1; removeAdminRow = -1; removeAdminShadowRow = -1; cantEditInfoRow = -1; transferOwnerShadowRow = -1; transferOwnerRow = -1; rankHeaderRow = -1; rankRow = -1; rankInfoRow = -1; sendMessagesRow = -1; sendMediaRow = -1; sendStickersRow = -1; sendPollsRow = -1; embedLinksRow = -1; startVoiceChatRow = -1; untilSectionRow = -1; untilDateRow = -1; rowCount = 3; if (currentType == TYPE_ADMIN) { if (isChannel) { changeInfoRow = rowCount++; postMessagesRow = rowCount++; editMesagesRow = rowCount++; deleteMessagesRow = rowCount++; addUsersRow = rowCount++; startVoiceChatRow = rowCount++; addAdminsRow = rowCount++; } else { changeInfoRow = rowCount++; deleteMessagesRow = rowCount++; banUsersRow = rowCount++; addUsersRow = rowCount++; pinMessagesRow = rowCount++; startVoiceChatRow = rowCount++; addAdminsRow = rowCount++; anonymousRow = rowCount++; } } else if (currentType == TYPE_BANNED) { sendMessagesRow = rowCount++; sendMediaRow = rowCount++; sendStickersRow = rowCount++; sendPollsRow = rowCount++; embedLinksRow = rowCount++; addUsersRow = rowCount++; pinMessagesRow = rowCount++; changeInfoRow = rowCount++; untilSectionRow = rowCount++; untilDateRow = rowCount++; } if (canEdit) { if (!isChannel && currentType == TYPE_ADMIN) { rightsShadowRow = rowCount++; rankHeaderRow = rowCount++; rankRow = rowCount++; rankInfoRow = rowCount++; } if (currentChat != null && currentChat.creator && currentType == TYPE_ADMIN && hasAllAdminRights() && !currentUser.bot) { if (rightsShadowRow == -1) { transferOwnerShadowRow = rowCount++; } transferOwnerRow = rowCount++; if (rightsShadowRow != -1) { transferOwnerShadowRow = rowCount++; } } if (initialIsSet) { if (rightsShadowRow == -1) { rightsShadowRow = rowCount++; } removeAdminRow = rowCount++; removeAdminShadowRow = rowCount++; } } else { if (currentType == TYPE_ADMIN) { if (!isChannel && currentType == TYPE_ADMIN && (!currentRank.isEmpty() || currentChat.creator && UserObject.isUserSelf(currentUser))) { rightsShadowRow = rowCount++; rankHeaderRow = rowCount++; rankRow = rowCount++; if (currentChat.creator && UserObject.isUserSelf(currentUser)) { rankInfoRow = rowCount++; } else { cantEditInfoRow = rowCount++; } } else { cantEditInfoRow = rowCount++; } } else { rightsShadowRow = rowCount++; } } if (update) { if (transferOwnerShadowRowPrev == -1 && transferOwnerShadowRow != -1) { listViewAdapter.notifyItemRangeInserted(Math.min(transferOwnerShadowRow, transferOwnerRow), 2); } else if (transferOwnerShadowRowPrev != -1 && transferOwnerShadowRow == -1) { listViewAdapter.notifyItemRangeRemoved(transferOwnerShadowRowPrev, 2); } } } private void onDonePressed() { if (!ChatObject.isChannel(currentChat) && (currentType == TYPE_BANNED || currentType == TYPE_ADMIN && (!isDefaultAdminRights() || rankRow != -1 && currentRank.codePointCount(0, currentRank.length()) > MAX_RANK_LENGTH))) { MessagesController.getInstance(currentAccount).convertToMegaGroup(getParentActivity(), chatId, this, param -> { if (param != 0) { chatId = param; currentChat = MessagesController.getInstance(currentAccount).getChat(param); onDonePressed(); } }); return; } if (currentType == TYPE_ADMIN) { if (rankRow != -1 && currentRank.codePointCount(0, currentRank.length()) > MAX_RANK_LENGTH) { listView.smoothScrollToPosition(rankRow); Vibrator v = (Vibrator) getParentActivity().getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(200); } RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(rankHeaderRow); if (holder != null) { AndroidUtilities.shakeView(holder.itemView, 2, 0); } return; } if (isChannel) { adminRights.pin_messages = adminRights.ban_users = false; } else { adminRights.post_messages = adminRights.edit_messages = false; } if (!adminRights.change_info && !adminRights.post_messages && !adminRights.edit_messages && !adminRights.delete_messages && !adminRights.ban_users && !adminRights.invite_users && !adminRights.pin_messages && !adminRights.add_admins && !adminRights.anonymous && !adminRights.manage_call) { adminRights.other = true; } else { adminRights.other = false; } MessagesController.getInstance(currentAccount).setUserAdminRole(chatId, currentUser, adminRights, currentRank, isChannel, getFragmentForAlert(1), isAddingNew); if (delegate != null) { delegate.didSetRights( adminRights.change_info || adminRights.post_messages || adminRights.edit_messages || adminRights.delete_messages || adminRights.ban_users || adminRights.invite_users || adminRights.pin_messages || adminRights.add_admins || adminRights.anonymous || adminRights.manage_call || adminRights.other ? 1 : 0, adminRights, bannedRights, currentRank); } } else if (currentType == TYPE_BANNED) { MessagesController.getInstance(currentAccount).setParticipantBannedRole(chatId, currentUser, null, bannedRights, isChannel, getFragmentForAlert(1)); int rights; if (bannedRights.send_messages || bannedRights.send_stickers || bannedRights.embed_links || bannedRights.send_media || bannedRights.send_gifs || bannedRights.send_games || bannedRights.send_inline) { rights = 1; } else { bannedRights.until_date = 0; rights = 2; } if (delegate != null) { delegate.didSetRights(rights, adminRights, bannedRights, currentRank); } } finishFragment(); } public void setDelegate(ChatRightsEditActivityDelegate channelRightsEditActivityDelegate) { delegate = channelRightsEditActivityDelegate; } private boolean checkDiscard() { boolean changed; if (currentType == TYPE_BANNED) { String newBannedRights = ChatObject.getBannedRightsString(bannedRights); changed = !currentBannedRights.equals(newBannedRights); } else { changed = !initialRank.equals(currentRank); } if (changed) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("UserRestrictionsApplyChanges", R.string.UserRestrictionsApplyChanges)); TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(chatId); builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("UserRestrictionsApplyChangesText", R.string.UserRestrictionsApplyChangesText, chat.title))); builder.setPositiveButton(LocaleController.getString("ApplyTheme", R.string.ApplyTheme), (dialogInterface, i) -> onDonePressed()); builder.setNegativeButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment()); showDialog(builder.create()); return false; } return true; } private final static int MAX_RANK_LENGTH = 16; private void setTextLeft(View cell) { if (cell instanceof HeaderCell) { HeaderCell headerCell = (HeaderCell) cell; int left = MAX_RANK_LENGTH - (currentRank != null ? currentRank.codePointCount(0, currentRank.length()) : 0); if (left <= MAX_RANK_LENGTH - MAX_RANK_LENGTH * 0.7f) { headerCell.setText2(String.format("%d", left)); SimpleTextView textView = headerCell.getTextView2(); String key = left < 0 ? Theme.key_windowBackgroundWhiteRedText5 : Theme.key_windowBackgroundWhiteGrayText3; textView.setTextColor(Theme.getColor(key)); textView.setTag(key); } else { headerCell.setText2(""); } } } @Override public boolean onBackPressed() { return checkDiscard(); } private class ListAdapter extends RecyclerListView.SelectionAdapter { private Context mContext; private boolean ignoreTextChange; public ListAdapter(Context context) { mContext = context; } @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int type = holder.getItemViewType(); if (currentChat.creator && currentType == TYPE_ADMIN && type == 4 && holder.getAdapterPosition() == anonymousRow) { return true; } if (!canEdit) { return false; } if (currentType == TYPE_ADMIN && type == 4) { int position = holder.getAdapterPosition(); if (position == changeInfoRow) { return myAdminRights.change_info; } else if (position == postMessagesRow) { return myAdminRights.post_messages; } else if (position == editMesagesRow) { return myAdminRights.edit_messages; } else if (position == deleteMessagesRow) { return myAdminRights.delete_messages; } else if (position == startVoiceChatRow) { return myAdminRights.manage_call; } else if (position == addAdminsRow) { return myAdminRights.add_admins; } else if (position == anonymousRow) { return myAdminRights.anonymous; } else if (position == banUsersRow) { return myAdminRights.ban_users; } else if (position == addUsersRow) { return myAdminRights.invite_users; } else if (position == pinMessagesRow) { return myAdminRights.pin_messages; } } return type != 3 && type != 1 && type != 5; } @Override public int getItemCount() { return rowCount; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { case 0: view = new UserCell2(mContext, 4, 0); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 1: view = new TextInfoPrivacyCell(mContext); view.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); break; case 2: view = new TextSettingsCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 3: view = new HeaderCell(mContext, Theme.key_windowBackgroundWhiteBlueHeader, 21, 15, true); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 4: view = new TextCheckCell2(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 5: view = new ShadowSectionCell(mContext); break; case 6: view = new TextDetailCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 7: default: PollEditTextCell cell = new PollEditTextCell(mContext, null); cell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); cell.addTextWatcher(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (ignoreTextChange) { return; } currentRank = s.toString(); RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(rankHeaderRow); if (holder != null) { setTextLeft(holder.itemView); } } }); view = cell; break; } return new RecyclerListView.Holder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { case 0: UserCell2 userCell2 = (UserCell2) holder.itemView; userCell2.setData(currentUser, null, null, 0); break; case 1: TextInfoPrivacyCell privacyCell = (TextInfoPrivacyCell) holder.itemView; if (position == cantEditInfoRow) { privacyCell.setText(LocaleController.getString("EditAdminCantEdit", R.string.EditAdminCantEdit)); } else if (position == rankInfoRow) { String hint; if (UserObject.isUserSelf(currentUser) && currentChat.creator) { hint = LocaleController.getString("ChannelCreator", R.string.ChannelCreator); } else { hint = LocaleController.getString("ChannelAdmin", R.string.ChannelAdmin); } privacyCell.setText(LocaleController.formatString("EditAdminRankInfo", R.string.EditAdminRankInfo, hint)); } break; case 2: TextSettingsCell actionCell = (TextSettingsCell) holder.itemView; if (position == removeAdminRow) { actionCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText5)); actionCell.setTag(Theme.key_windowBackgroundWhiteRedText5); if (currentType == TYPE_ADMIN) { actionCell.setText(LocaleController.getString("EditAdminRemoveAdmin", R.string.EditAdminRemoveAdmin), false); } else if (currentType == TYPE_BANNED) { actionCell.setText(LocaleController.getString("UserRestrictionsBlock", R.string.UserRestrictionsBlock), false); } } else if (position == transferOwnerRow) { actionCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); actionCell.setTag(Theme.key_windowBackgroundWhiteBlackText); if (isChannel) { actionCell.setText(LocaleController.getString("EditAdminChannelTransfer", R.string.EditAdminChannelTransfer), false); } else { actionCell.setText(LocaleController.getString("EditAdminGroupTransfer", R.string.EditAdminGroupTransfer), false); } } break; case 3: HeaderCell headerCell = (HeaderCell) holder.itemView; if (position == 2) { if (currentType == TYPE_ADMIN) { headerCell.setText(LocaleController.getString("EditAdminWhatCanDo", R.string.EditAdminWhatCanDo)); } else if (currentType == TYPE_BANNED) { headerCell.setText(LocaleController.getString("UserRestrictionsCanDo", R.string.UserRestrictionsCanDo)); } } else if (position == rankHeaderRow) { headerCell.setText(LocaleController.getString("EditAdminRank", R.string.EditAdminRank)); } break; case 4: TextCheckCell2 checkCell = (TextCheckCell2) holder.itemView; if (position == changeInfoRow) { if (currentType == TYPE_ADMIN) { if (isChannel) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminChangeChannelInfo", R.string.EditAdminChangeChannelInfo), adminRights.change_info, true); } else { checkCell.setTextAndCheck(LocaleController.getString("EditAdminChangeGroupInfo", R.string.EditAdminChangeGroupInfo), adminRights.change_info, true); } } else if (currentType == TYPE_BANNED) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsChangeInfo", R.string.UserRestrictionsChangeInfo), !bannedRights.change_info && !defaultBannedRights.change_info, false); checkCell.setIcon(defaultBannedRights.change_info ? R.drawable.permission_locked : 0); } } else if (position == postMessagesRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminPostMessages", R.string.EditAdminPostMessages), adminRights.post_messages, true); } else if (position == editMesagesRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminEditMessages", R.string.EditAdminEditMessages), adminRights.edit_messages, true); } else if (position == deleteMessagesRow) { if (isChannel) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminDeleteMessages", R.string.EditAdminDeleteMessages), adminRights.delete_messages, true); } else { checkCell.setTextAndCheck(LocaleController.getString("EditAdminGroupDeleteMessages", R.string.EditAdminGroupDeleteMessages), adminRights.delete_messages, true); } } else if (position == addAdminsRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminAddAdmins", R.string.EditAdminAddAdmins), adminRights.add_admins, anonymousRow != -1); } else if (position == anonymousRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminSendAnonymously", R.string.EditAdminSendAnonymously), adminRights.anonymous, false); } else if (position == banUsersRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminBanUsers", R.string.EditAdminBanUsers), adminRights.ban_users, true); } else if (position == startVoiceChatRow) { checkCell.setTextAndCheck(LocaleController.getString("StartVoipChatPermission", R.string.StartVoipChatPermission), adminRights.manage_call, true); } else if (position == addUsersRow) { if (currentType == TYPE_ADMIN) { if (ChatObject.isActionBannedByDefault(currentChat, ChatObject.ACTION_INVITE)) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminAddUsers", R.string.EditAdminAddUsers), adminRights.invite_users, true); } else { checkCell.setTextAndCheck(LocaleController.getString("EditAdminAddUsersViaLink", R.string.EditAdminAddUsersViaLink), adminRights.invite_users, true); } } else if (currentType == TYPE_BANNED) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsInviteUsers", R.string.UserRestrictionsInviteUsers), !bannedRights.invite_users && !defaultBannedRights.invite_users, true); checkCell.setIcon(defaultBannedRights.invite_users ? R.drawable.permission_locked : 0); } } else if (position == pinMessagesRow) { if (currentType == TYPE_ADMIN) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminPinMessages", R.string.EditAdminPinMessages), adminRights.pin_messages, true); } else if (currentType == TYPE_BANNED) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsPinMessages", R.string.UserRestrictionsPinMessages), !bannedRights.pin_messages && !defaultBannedRights.pin_messages, true); checkCell.setIcon(defaultBannedRights.pin_messages ? R.drawable.permission_locked : 0); } } else if (position == sendMessagesRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSend", R.string.UserRestrictionsSend), !bannedRights.send_messages && !defaultBannedRights.send_messages, true); checkCell.setIcon(defaultBannedRights.send_messages ? R.drawable.permission_locked : 0); } else if (position == sendMediaRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSendMedia", R.string.UserRestrictionsSendMedia), !bannedRights.send_media && !defaultBannedRights.send_media, true); checkCell.setIcon(defaultBannedRights.send_media ? R.drawable.permission_locked : 0); } else if (position == sendStickersRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSendStickers", R.string.UserRestrictionsSendStickers), !bannedRights.send_stickers && !defaultBannedRights.send_stickers, true); checkCell.setIcon(defaultBannedRights.send_stickers ? R.drawable.permission_locked : 0); } else if (position == embedLinksRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsEmbedLinks", R.string.UserRestrictionsEmbedLinks), !bannedRights.embed_links && !defaultBannedRights.embed_links, true); checkCell.setIcon(defaultBannedRights.embed_links ? R.drawable.permission_locked : 0); } else if (position == sendPollsRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSendPolls", R.string.UserRestrictionsSendPolls), !bannedRights.send_polls && !defaultBannedRights.send_polls, true); checkCell.setIcon(defaultBannedRights.send_polls ? R.drawable.permission_locked : 0); } if (position == sendMediaRow || position == sendStickersRow || position == embedLinksRow || position == sendPollsRow) { checkCell.setEnabled(!bannedRights.send_messages && !bannedRights.view_messages && !defaultBannedRights.send_messages && !defaultBannedRights.view_messages); } else if (position == sendMessagesRow) { checkCell.setEnabled(!bannedRights.view_messages && !defaultBannedRights.view_messages); } break; case 5: ShadowSectionCell shadowCell = (ShadowSectionCell) holder.itemView; if (position == rightsShadowRow) { shadowCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, removeAdminRow == -1 && rankRow == -1 ? R.drawable.greydivider_bottom : R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); } else if (position == removeAdminShadowRow) { shadowCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); } else if (position == rankInfoRow) { shadowCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, canEdit ? R.drawable.greydivider : R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); } else { shadowCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); } break; case 6: TextDetailCell detailCell = (TextDetailCell) holder.itemView; if (position == untilDateRow) { String value; if (bannedRights.until_date == 0 || Math.abs(bannedRights.until_date - System.currentTimeMillis() / 1000) > 10 * 365 * 24 * 60 * 60) { value = LocaleController.getString("UserRestrictionsUntilForever", R.string.UserRestrictionsUntilForever); } else { value = LocaleController.formatDateForBan(bannedRights.until_date); } detailCell.setTextAndValue(LocaleController.getString("UserRestrictionsDuration", R.string.UserRestrictionsDuration), value, false); } break; case 7: PollEditTextCell textCell = (PollEditTextCell) holder.itemView; String hint; if (UserObject.isUserSelf(currentUser) && currentChat.creator) { hint = LocaleController.getString("ChannelCreator", R.string.ChannelCreator); } else { hint = LocaleController.getString("ChannelAdmin", R.string.ChannelAdmin); } ignoreTextChange = true; textCell.getTextView().setEnabled(canEdit || currentChat.creator); textCell.getTextView().setSingleLine(true); textCell.getTextView().setImeOptions(EditorInfo.IME_ACTION_DONE); textCell.setTextAndHint(currentRank, hint, false); ignoreTextChange = false; break; } } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { if (holder.getAdapterPosition() == rankHeaderRow) { setTextLeft(holder.itemView); } } @Override public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) { if (holder.getAdapterPosition() == rankRow && getParentActivity() != null) { AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); } } @Override public int getItemViewType(int position) { if (position == 0) { return 0; } else if (position == 1 || position == rightsShadowRow || position == removeAdminShadowRow || position == untilSectionRow || position == transferOwnerShadowRow) { return 5; } else if (position == 2 || position == rankHeaderRow) { return 3; } else if (position == changeInfoRow || position == postMessagesRow || position == editMesagesRow || position == deleteMessagesRow || position == addAdminsRow || position == banUsersRow || position == addUsersRow || position == pinMessagesRow || position == sendMessagesRow || position == sendMediaRow || position == sendStickersRow || position == embedLinksRow || position == sendPollsRow || position == anonymousRow || position == startVoiceChatRow) { return 4; } else if (position == cantEditInfoRow || position == rankInfoRow) { return 1; } else if (position == untilDateRow) { return 6; } else if (position == rankRow) { return 7; } else { return 2; } } } @Override public ArrayList getThemeDescriptions() { ArrayList themeDescriptions = new ArrayList<>(); ThemeDescription.ThemeDescriptionDelegate cellDelegate = () -> { if (listView != null) { int count = listView.getChildCount(); for (int a = 0; a < count; a++) { View child = listView.getChildAt(a); if (child instanceof UserCell2) { ((UserCell2) child).update(0); } } } }; themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{UserCell2.class, TextSettingsCell.class, TextCheckCell2.class, HeaderCell.class, TextDetailCell.class, PollEditTextCell.class}, null, null, null, Theme.key_windowBackgroundWhite)); themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray)); themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault)); themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon)); themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle)); themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{View.class}, Theme.dividerPaint, null, null, Theme.key_divider)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteRedText5)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteValueText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueImageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextDetailCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextDetailCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell2.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell2.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell2.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switch2Track)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell2.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switch2TrackChecked)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{HeaderCell.class}, new String[]{"textView2"}, null, null, null, Theme.key_windowBackgroundWhiteRedText5)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{HeaderCell.class}, new String[]{"textView2"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText3)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{PollEditTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_HINTTEXTCOLOR, new Class[]{PollEditTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteHintText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{UserCell2.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{UserCell2.class}, new String[]{"statusColor"}, null, null, cellDelegate, Theme.key_windowBackgroundWhiteGrayText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{UserCell2.class}, new String[]{"statusOnlineColor"}, null, null, cellDelegate, Theme.key_windowBackgroundWhiteBlueText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{UserCell2.class}, null, Theme.avatarDrawables, null, Theme.key_avatar_text)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundRed)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundOrange)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundViolet)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundGreen)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundCyan)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundBlue)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundPink)); themeDescriptions.add(new ThemeDescription(null, 0, new Class[]{DialogRadioCell.class}, new String[]{"textView"}, null, null, null, Theme.key_dialogTextBlack)); themeDescriptions.add(new ThemeDescription(null, 0, new Class[]{DialogRadioCell.class}, new String[]{"textView"}, null, null, null, Theme.key_dialogTextGray2)); themeDescriptions.add(new ThemeDescription(null, ThemeDescription.FLAG_CHECKBOX, new Class[]{DialogRadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_dialogRadioBackground)); themeDescriptions.add(new ThemeDescription(null, ThemeDescription.FLAG_CHECKBOXCHECK, new Class[]{DialogRadioCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_dialogRadioBackgroundChecked)); return themeDescriptions; } }