/* * 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.animation.ValueAnimator; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.text.Editable; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; 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 androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; 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.TLObject; 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.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.BulletinFactory; import org.telegram.ui.Components.CircularProgressDrawable; import org.telegram.ui.Components.CrossfadeDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; import java.util.Calendar; import tw.nekomimi.nekogram.utils.VibrateUtil; public class ChatRightsEditActivity extends BaseFragment { private ListAdapter listViewAdapter; private RecyclerListView listView; private LinearLayoutManager linearLayoutManager; private FrameLayout addBotButtonContainer; private FrameLayout addBotButton; private PollEditTextCell rankEditTextCell; private CrossfadeDrawable doneDrawable; private long chatId; private TLRPC.User currentUser; private TLRPC.Chat currentChat; private TLObject participant; private int currentType; private boolean isChannel; private boolean loading = false; private boolean canEdit; private float asAdminT = 0; private boolean asAdmin = false; private boolean initialAsAdmin = false; 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 manageRow; private int permissionsStartRow; private int permissionsEndRow; 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 addBotButtonRow; private int sendMessagesRow; private int sendMediaRow; private int sendStickersRow; private int sendGamesRow; private int sendInlineRow; private int sendGifsRow; private int sendPollsRow; private int embedLinksRow; private int startVoiceChatRow; private int untilSectionRow; private int untilDateRow; private ChatRightsEditActivityDelegate delegate; private String botHash; private boolean isAddingNew; private boolean initialIsSet; public static final int TYPE_ADMIN = 0; public static final int TYPE_BANNED = 1; public static final int TYPE_ADD_BOT = 2; private boolean closingKeyboardAfterFinish = false; 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(long userId, long channelId, TLRPC.TL_chatAdminRights rightsAdmin, TLRPC.TL_chatBannedRights rightsBannedDefault, TLRPC.TL_chatBannedRights rightsBanned, String rank, int type, boolean edit, boolean addingNew, String addingNewBotHash ,TLObject part) { this(userId, channelId, rightsAdmin, rightsBannedDefault, rightsBanned, rank, type, edit, addingNew, addingNewBotHash); participant = part; } public ChatRightsEditActivity(long userId, long channelId, TLRPC.TL_chatAdminRights rightsAdmin, TLRPC.TL_chatBannedRights rightsBannedDefault, TLRPC.TL_chatBannedRights rightsBanned, String rank, int type, boolean edit, boolean addingNew, String addingNewBotHash) { super(); isAddingNew = addingNew; chatId = channelId; currentUser = MessagesController.getInstance(currentAccount).getUser(userId); currentType = type; canEdit = edit; botHash = addingNewBotHash; 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 = emptyAdminRights(currentType != TYPE_ADD_BOT || (currentChat != null && currentChat.creator)); } if (type == TYPE_ADMIN || type == TYPE_ADD_BOT) { if (rightsAdmin == null) { initialAsAdmin = false; if (type == TYPE_ADD_BOT) { adminRights = emptyAdminRights(false); asAdmin = isChannel; asAdminT = asAdmin ? 1 : 0; initialIsSet = false; } else { adminRights = new TLRPC.TL_chatAdminRights(); 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; adminRights.other = myAdminRights.other; initialIsSet = false; } } else { initialAsAdmin = true; adminRights = new TLRPC.TL_chatAdminRights(); 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; adminRights.other = rightsAdmin.other; 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 || adminRights.other; if (type == TYPE_ADD_BOT) { asAdmin = isChannel || initialIsSet; asAdminT = asAdmin ? 1 : 0; initialIsSet = false; } } if (currentChat != null) { defaultBannedRights = currentChat.default_banned_rights; } 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 = true; } if (!defaultBannedRights.change_info) { adminRights.change_info = true; } if (!defaultBannedRights.pin_messages) { adminRights.pin_messages = true; } } else if (type == TYPE_BANNED) { 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); } public static TLRPC.TL_chatAdminRights emptyAdminRights(boolean value) { TLRPC.TL_chatAdminRights adminRights = new TLRPC.TL_chatAdminRights(); 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 = value; return adminRights; } @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 if (currentType == TYPE_ADD_BOT) { actionBar.setTitle(LocaleController.getString("AddBot", R.string.AddBot)); } 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(); doneDrawable = new CrossfadeDrawable(context.getResources().getDrawable(R.drawable.ic_done), new CircularProgressDrawable(Theme.getColor(Theme.key_actionBarDefaultIcon))); menu.addItemWithWidth(done_button, 0, AndroidUtilities.dp(56), LocaleController.getString("Done", R.string.Done)); menu.getItem(done_button).setIcon(doneDrawable); } fragmentView = new FrameLayout(context) { private int previousHeight = -1; @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); int height = bottom - top; if (previousHeight != -1 && Math.abs(previousHeight - height) > AndroidUtilities.dp(20)) { listView.smoothScrollToPosition(rowCount - 1); } previousHeight = height; } }; fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); FrameLayout frameLayout = (FrameLayout) fragmentView; fragmentView.setFocusableInTouchMode(true); listView = new RecyclerListView(context) { @Override public boolean onTouchEvent(MotionEvent e) { if (loading) { return false; } return super.onTouchEvent(e); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { if (loading) { return false; } return super.onInterceptTouchEvent(e); } }; listView.setClipChildren(currentType != TYPE_ADD_BOT); linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) { @Override protected int getExtraLayoutSpace(RecyclerView.State state) { return 5000; } }; linearLayoutManager.setInitialPrefetchItemCount(100); listView.setLayoutManager(linearLayoutManager); listView.setAdapter(listViewAdapter = new ListAdapter(context)); DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); if (currentType == TYPE_ADD_BOT) { listView.setResetSelectorOnChanged(false); } itemAnimator.setDelayAnimations(false); listView.setItemAnimator(itemAnimator); 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 (position == 0) { Bundle args = new Bundle(); args.putLong("user_id", currentUser.id); presentFragment(new ProfileActivity(args)); } else if (!canEdit && (!currentChat.creator || currentType != TYPE_ADMIN || position != anonymousRow)) { return; } else if (position == removeAdminRow) { if (currentType == TYPE_ADMIN) { MessagesController.getInstance(currentAccount).setUserAdminRole(chatId, currentUser, new TLRPC.TL_chatAdminRights(), currentRank, isChannel, getFragmentForAlert(0), isAddingNew, false, null,null); 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()) { if (currentType != TYPE_ADD_BOT) { new AlertDialog.Builder(getParentActivity()) .setTitle(LocaleController.getString("UserRestrictionsCantModify", R.string.UserRestrictionsCantModify)) .setMessage(LocaleController.getString("UserRestrictionsCantModifyDisabled", R.string.UserRestrictionsCantModifyDisabled)) .setPositiveButton(LocaleController.getString("OK", R.string.OK), null) .create() .show(); } return; } if (!checkCell.isEnabled()) { if ((currentType == TYPE_ADD_BOT || currentType == TYPE_ADMIN) && (position == changeInfoRow && defaultBannedRights != null && !defaultBannedRights.change_info || position == pinMessagesRow && defaultBannedRights != null && !defaultBannedRights.pin_messages)) { new AlertDialog.Builder(getParentActivity()) .setTitle(LocaleController.getString("UserRestrictionsCantModify", R.string.UserRestrictionsCantModify)) .setMessage(LocaleController.getString("UserRestrictionsCantModifyEnabled", R.string.UserRestrictionsCantModifyEnabled)) .setPositiveButton(LocaleController.getString("OK", R.string.OK), null) .create() .show(); } return; } if (currentType != TYPE_ADD_BOT) { checkCell.setChecked(!checkCell.isChecked()); } boolean value = checkCell.isChecked(); if (position == manageRow) { value = asAdmin = !asAdmin; updateAsAdmin(true); } else if (position == changeInfoRow) { if (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) { value = adminRights.change_info = !adminRights.change_info; } else { value = bannedRights.change_info = !bannedRights.change_info; } } else if (position == postMessagesRow) { value = adminRights.post_messages = !adminRights.post_messages; } else if (position == editMesagesRow) { value = adminRights.edit_messages = !adminRights.edit_messages; } else if (position == deleteMessagesRow) { value = adminRights.delete_messages = !adminRights.delete_messages; } else if (position == addAdminsRow) { value = adminRights.add_admins = !adminRights.add_admins; } else if (position == anonymousRow) { value = adminRights.anonymous = !adminRights.anonymous; } else if (position == banUsersRow) { value = adminRights.ban_users = !adminRights.ban_users; } else if (position == startVoiceChatRow) { value = adminRights.manage_call = !adminRights.manage_call; } else if (position == addUsersRow) { if (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) { value = adminRights.invite_users = !adminRights.invite_users; } else { value = bannedRights.invite_users = !bannedRights.invite_users; } } else if (position == pinMessagesRow) { if (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) { value = adminRights.pin_messages = !adminRights.pin_messages; } else { value = bannedRights.pin_messages = !bannedRights.pin_messages; } } else if (currentType == TYPE_BANNED && bannedRights != null) { boolean disabled = !checkCell.isChecked(); if (position == sendMessagesRow) { value = bannedRights.send_messages = !bannedRights.send_messages; } else if (position == sendMediaRow) { value = bannedRights.send_media = !bannedRights.send_media; } else if (position == sendStickersRow) { value = bannedRights.send_stickers = !bannedRights.send_stickers; } else if (position == sendGamesRow) { bannedRights.send_games = !bannedRights.send_games; } else if (position == sendInlineRow) { bannedRights.send_inline = !bannedRights.send_inline; } else if (position == sendGifsRow) { bannedRights.send_gifs = !bannedRights.send_gifs; } else if (position == embedLinksRow) { value = bannedRights.embed_links = !bannedRights.embed_links; } else if (position == sendPollsRow) { value = 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 = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendStickersRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_messages) && !bannedRights.send_games) { bannedRights.send_games = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendGamesRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_inline) && !bannedRights.send_inline) { bannedRights.send_inline = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendInlineRow); if (holder != null) { ((TextCheckCell2) holder.itemView).setChecked(false); } } if ((bannedRights.view_messages || bannedRights.send_messages) && !bannedRights.send_gifs) { bannedRights.send_gifs = true; RecyclerListView.ViewHolder holder = listView.findViewHolderForAdapterPosition(sendGifsRow); 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); } } } } if (currentType == TYPE_ADD_BOT) { checkCell.setChecked(asAdmin && value); } 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.SRC_IN)); 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.SRC_IN)); 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); manageRow = -1; 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; sendGamesRow = -1; sendInlineRow = -1; sendGifsRow = -1; sendPollsRow = -1; embedLinksRow = -1; startVoiceChatRow = -1; untilSectionRow = -1; untilDateRow = -1; addBotButtonRow = -1; rowCount = 3; permissionsStartRow = rowCount; if (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) { if (isChannel) { changeInfoRow = rowCount++; postMessagesRow = rowCount++; editMesagesRow = rowCount++; deleteMessagesRow = rowCount++; addUsersRow = rowCount++; startVoiceChatRow = rowCount++; addAdminsRow = rowCount++; } else { if (currentType == TYPE_ADD_BOT) { manageRow = rowCount++; } 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++; sendGamesRow = rowCount++; sendInlineRow = rowCount++; sendGifsRow = rowCount++; sendPollsRow = rowCount++; embedLinksRow = rowCount++; addUsersRow = rowCount++; pinMessagesRow = rowCount++; changeInfoRow = rowCount++; untilSectionRow = rowCount++; untilDateRow = rowCount++; } permissionsEndRow = rowCount; if (canEdit) { if (!isChannel && (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT && asAdmin)) { 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 && (!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 (currentType == TYPE_ADD_BOT) { addBotButtonRow = 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 (loading) { return; } if (!ChatObject.isChannel(currentChat) && (currentType == TYPE_BANNED || currentType == TYPE_ADMIN && (!isDefaultAdminRights() || rankRow != -1 && currentRank.codePointCount(0, currentRank.length()) > MAX_RANK_LENGTH) || currentType == TYPE_ADD_BOT && (currentRank != null || !isDefaultAdminRights()))) { 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 || currentType == TYPE_ADD_BOT) { if (rankRow != -1 && currentRank.codePointCount(0, currentRank.length()) > MAX_RANK_LENGTH) { listView.smoothScrollToPosition(rankRow); VibrateUtil.vibrate(); 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; } } boolean finishFragment = true; if (currentType == TYPE_ADMIN) { finishFragment = delegate == null; setLoading(true); MessagesController.getInstance(currentAccount).setUserAdminRole(chatId, currentUser, adminRights, currentRank, isChannel, this, isAddingNew, false, null, () -> { 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); finishFragment(); } }, () -> { setLoading(false); }); } 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); } } else if (currentType == TYPE_ADD_BOT) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(asAdmin ? LocaleController.getString("AddBotAdmin", R.string.AddBotAdmin) : LocaleController.getString("AddBot", R.string.AddBot) ); boolean isChannel = ChatObject.isChannel(currentChat) && !currentChat.megagroup; String chatName = currentChat == null ? "" : currentChat.title; builder.setMessage(AndroidUtilities.replaceTags( asAdmin ? ( isChannel ? LocaleController.formatString("AddBotMessageAdminChannel", R.string.AddBotMessageAdminChannel, chatName) : LocaleController.formatString("AddBotMessageAdminGroup", R.string.AddBotMessageAdminGroup, chatName) ) : LocaleController.formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, UserObject.getUserName(currentUser), chatName) )); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setPositiveButton(asAdmin ? LocaleController.getString("AddAsAdmin", R.string.AddAsAdmin) : LocaleController.getString("AddBot", R.string.AddBot), (di, i) -> { setLoading(true); Runnable onFinish = () -> { if (delegate != null) { delegate.didSetRights(0, asAdmin ? adminRights : null, null, currentRank); } closingKeyboardAfterFinish = true; Bundle args1 = new Bundle(); args1.putBoolean("scrollToTopOnResume", true); args1.putLong("chat_id", currentChat.id); if (!getMessagesController().checkCanOpenChat(args1, this)) { setLoading(false); return; } ChatActivity chatActivity = new ChatActivity(args1); presentFragment(chatActivity, true); if (BulletinFactory.canShowBulletin(chatActivity)) { if (isAddingNew && asAdmin) { BulletinFactory.createAddedAsAdminBulletin(chatActivity, currentUser.first_name).show(); } else if (!isAddingNew && !initialAsAdmin && asAdmin) { BulletinFactory.createPromoteToAdminBulletin(chatActivity, currentUser.first_name).show(); } } }; if (asAdmin || initialAsAdmin) { getMessagesController().setUserAdminRole(currentChat.id, currentUser, asAdmin ? adminRights : emptyAdminRights(false), currentRank, false, this, isAddingNew, asAdmin, botHash, onFinish, () -> setLoading(false)); } else { getMessagesController().addUserToChat(currentChat.id, currentUser, 0, botHash, this, true, onFinish, () -> setLoading(false)); } }); showDialog(builder.create()); finishFragment = false; } if (finishFragment) { finishFragment(); } } private ValueAnimator doneDrawableAnimator; public void setLoading(boolean enable) { if (doneDrawableAnimator != null) { doneDrawableAnimator.cancel(); } loading = !enable; actionBar.getBackButton().setEnabled(!enable); if (doneDrawable != null) { doneDrawableAnimator = ValueAnimator.ofFloat(doneDrawable.getProgress(), enable ? 1f : 0f); doneDrawableAnimator.addUpdateListener(a -> { doneDrawable.setProgress((float) a.getAnimatedValue()); doneDrawable.invalidateSelf(); }); doneDrawableAnimator.setDuration((long) (150 * Math.abs(doneDrawable.getProgress() - (enable ? 1 : 0)))); doneDrawableAnimator.start(); } } public void setDelegate(ChatRightsEditActivityDelegate channelRightsEditActivityDelegate) { delegate = channelRightsEditActivityDelegate; } private boolean checkDiscard() { if (currentType == TYPE_ADD_BOT) { return true; } 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)); TextView 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 final int VIEW_TYPE_USER_CELL = 0; private final int VIEW_TYPE_INFO_CELL = 1; private final int VIEW_TYPE_TRANSFER_CELL = 2; private final int VIEW_TYPE_HEADER_CELL = 3; private final int VIEW_TYPE_SWITCH_CELL = 4; private final int VIEW_TYPE_SHADOW_CELL = 5; private final int VIEW_TYPE_UNTIL_DATE_CELL = 6; private final int VIEW_TYPE_RANK_CELL = 7; private final int VIEW_TYPE_ADD_BOT_CELL = 8; private Context mContext; private boolean ignoreTextChange; public ListAdapter(Context context) { if (currentType == TYPE_ADD_BOT) { setHasStableIds(true); } mContext = context; } @Override public long getItemId(int position) { if (currentType == TYPE_ADD_BOT) { if (position == manageRow) return 1; if (position == changeInfoRow) return 2; if (position == postMessagesRow) return 3; if (position == editMesagesRow) return 4; if (position == deleteMessagesRow) return 5; if (position == addAdminsRow) return 6; if (position == anonymousRow) return 7; if (position == banUsersRow) return 8; if (position == addUsersRow) return 9; if (position == pinMessagesRow) return 10; if (position == rightsShadowRow) return 11; if (position == removeAdminRow) return 12; if (position == removeAdminShadowRow) return 13; if (position == cantEditInfoRow) return 14; if (position == transferOwnerShadowRow) return 15; if (position == transferOwnerRow) return 16; if (position == rankHeaderRow) return 17; if (position == rankRow) return 18; if (position == rankInfoRow) return 19; if (position == sendMessagesRow) return 20; if (position == sendMediaRow) return 21; if (position == sendStickersRow) return 22; if (position == sendPollsRow) return 23; if (position == embedLinksRow) return 24; if (position == startVoiceChatRow) return 25; if (position == untilSectionRow) return 26; if (position == untilDateRow) return 27; if (position == addBotButtonRow) return 28; return 0; } else { return super.getItemId(position); } } @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int type = holder.getItemViewType(); if (currentChat.creator && (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT && asAdmin) && type == VIEW_TYPE_SWITCH_CELL && holder.getAdapterPosition() == anonymousRow) { return true; } if (!canEdit && holder.getAdapterPosition() != 0) { return false; } if ((currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) && type == VIEW_TYPE_SWITCH_CELL) { int position = holder.getAdapterPosition(); if (position == manageRow) { return myAdminRights.add_admins || (currentChat != null && currentChat.creator); } else { if (currentType == TYPE_ADD_BOT && !asAdmin) { return false; } if (position == changeInfoRow) { return myAdminRights.change_info && (defaultBannedRights == null || defaultBannedRights.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 && (defaultBannedRights == null || defaultBannedRights.pin_messages); } } } return type != VIEW_TYPE_HEADER_CELL && type != VIEW_TYPE_INFO_CELL && type != VIEW_TYPE_SHADOW_CELL && type != VIEW_TYPE_ADD_BOT_CELL; } @Override public int getItemCount() { return rowCount; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { case VIEW_TYPE_USER_CELL: view = new UserCell2(mContext, 4, 0); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_INFO_CELL: view = new TextInfoPrivacyCell(mContext); view.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); break; case VIEW_TYPE_TRANSFER_CELL: default: view = new TextSettingsCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_HEADER_CELL: view = new HeaderCell(mContext, Theme.key_windowBackgroundWhiteBlueHeader, 21, 15, true); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_SWITCH_CELL: view = new TextCheckCell2(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_SHADOW_CELL: view = new ShadowSectionCell(mContext); break; case VIEW_TYPE_UNTIL_DATE_CELL: view = new TextDetailCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_ADD_BOT_CELL: addBotButtonContainer = new FrameLayout(mContext); addBotButtonContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); addBotButton = new FrameLayout(mContext) { private TextPaint textPaint; private StaticLayout mainText; private StaticLayout asMemberText; private StaticLayout asAdminText; { textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); textPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); textPaint.setTextSize(AndroidUtilities.dp(14)); textPaint.setColor(0xffffffff); mainText = new StaticLayout(LocaleController.getString("AddBotButton", R.string.AddBotButton) + " ", textPaint, 9999, Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false); asMemberText = new StaticLayout(LocaleController.getString("AddBotButtonAsMember", R.string.AddBotButtonAsMember), textPaint, 9999, Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false); asAdminText = new StaticLayout(LocaleController.getString("AddBotButtonAsAdmin", R.string.AddBotButtonAsAdmin), textPaint, 9999, Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false); } private long lastFrame; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float t = CubicBezierInterpolator.EASE_BOTH.getInterpolation(asAdminT); float mainWidth = mainText.getLineWidth(0); float asWidth; if (asAdminT <= 0) { asWidth = asMemberText.getLineWidth(0); } else if (asAdminT >= 1) { asWidth = asAdminText.getLineWidth(0); } else { asWidth = AndroidUtilities.lerp(asMemberText.getLineWidth(0), asAdminText.getLineWidth(0), t); } float width = mainWidth + asWidth; canvas.save(); canvas.translate((getWidth() - width) / 2, (getHeight() - mainText.getHeight()) / 2); textPaint.setAlpha(255); mainText.draw(canvas); canvas.translate(mainWidth, 0); if (t <= 0) { asMemberText.draw(canvas); } else { canvas.save(); canvas.translate(0, AndroidUtilities.dp(8) * t); canvas.scale(1, 1 - 0.2f * t); textPaint.setAlpha((int) (255 * (1f - t))); asMemberText.draw(canvas); canvas.restore(); } if (t >= 1) { textPaint.setAlpha(255); asAdminText.draw(canvas); } else { canvas.save(); canvas.translate(0, -AndroidUtilities.dp(8) * (1f - t)); canvas.scale(1, 1 - 0.2f * (1f - t)); textPaint.setAlpha((int) (255 * t)); asAdminText.draw(canvas); canvas.restore(); } canvas.restore(); } }; addBotButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(4), Theme.getColor(Theme.key_featuredStickers_addButton), 0x40ffffff)); addBotButton.setOnClickListener(e -> onDonePressed()); addBotButtonContainer.addView(addBotButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.FILL, 14, 28, 14, 14)); addBotButtonContainer.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); View bg = new View(mContext); bg.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); addBotButtonContainer.setClipChildren(false); addBotButtonContainer.setClipToPadding(false); addBotButtonContainer.addView(bg, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 800, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 0, 0, 0, -800)); view = addBotButtonContainer; break; case VIEW_TYPE_RANK_CELL: PollEditTextCell cell = rankEditTextCell = 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 VIEW_TYPE_USER_CELL: UserCell2 userCell2 = (UserCell2) holder.itemView; String status = null; if (currentType == TYPE_ADD_BOT) { status = LocaleController.getString("Bot", R.string.Bot); } userCell2.setData(currentUser, null, status, 0); break; case VIEW_TYPE_INFO_CELL: 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 VIEW_TYPE_TRANSFER_CELL: 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 VIEW_TYPE_HEADER_CELL: HeaderCell headerCell = (HeaderCell) holder.itemView; if (position == 2) { if (currentType == TYPE_ADD_BOT || (currentUser != null && currentUser.bot)) { headerCell.setText(LocaleController.getString("BotRestrictionsCanDo", R.string.BotRestrictionsCanDo)); } else 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 VIEW_TYPE_SWITCH_CELL: TextCheckCell2 checkCell = (TextCheckCell2) holder.itemView; boolean asAdminValue = currentType != TYPE_ADD_BOT || asAdmin; boolean isCreator = (currentChat != null && currentChat.creator); if (position == manageRow) { checkCell.setTextAndCheck(LocaleController.getString("ManageGroup", R.string.ManageGroup), asAdmin, true); checkCell.setIcon(myAdminRights.add_admins || isCreator ? 0 : R.drawable.permission_locked); } else if (position == changeInfoRow) { if (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) { if (isChannel) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminChangeChannelInfo", R.string.EditAdminChangeChannelInfo), asAdminValue && adminRights.change_info || !defaultBannedRights.change_info, true); } else { checkCell.setTextAndCheck(LocaleController.getString("EditAdminChangeGroupInfo", R.string.EditAdminChangeGroupInfo), asAdminValue && adminRights.change_info || !defaultBannedRights.change_info, true); } if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.change_info || isCreator ? 0 : R.drawable.permission_locked); } } 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), asAdminValue && adminRights.post_messages, true); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.post_messages || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == editMesagesRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminEditMessages", R.string.EditAdminEditMessages), asAdminValue && adminRights.edit_messages, true); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.edit_messages || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == deleteMessagesRow) { if (isChannel) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminDeleteMessages", R.string.EditAdminDeleteMessages), asAdminValue && adminRights.delete_messages, true); } else { checkCell.setTextAndCheck(LocaleController.getString("EditAdminGroupDeleteMessages", R.string.EditAdminGroupDeleteMessages), asAdminValue && adminRights.delete_messages, true); } if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.delete_messages || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == addAdminsRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminAddAdmins", R.string.EditAdminAddAdmins), asAdminValue && adminRights.add_admins, anonymousRow != -1); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.add_admins || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == anonymousRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminSendAnonymously", R.string.EditAdminSendAnonymously), asAdminValue && adminRights.anonymous, false); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.anonymous || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == banUsersRow) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminBanUsers", R.string.EditAdminBanUsers), asAdminValue && adminRights.ban_users, true); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.ban_users || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == startVoiceChatRow) { checkCell.setTextAndCheck(LocaleController.getString("StartVoipChatPermission", R.string.StartVoipChatPermission), asAdminValue && adminRights.manage_call, true); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.manage_call || isCreator ? 0 : R.drawable.permission_locked); } } 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 (currentType == TYPE_ADD_BOT) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminAddUsersViaLink", R.string.EditAdminAddUsersViaLink), asAdminValue && adminRights.invite_users, true); checkCell.setIcon(myAdminRights.invite_users || isCreator ? 0 : R.drawable.permission_locked); } } else if (position == pinMessagesRow) { if (currentType == TYPE_ADMIN || currentType == TYPE_ADD_BOT) { checkCell.setTextAndCheck(LocaleController.getString("EditAdminPinMessages", R.string.EditAdminPinMessages), asAdminValue && adminRights.pin_messages || !defaultBannedRights.pin_messages, true); if (currentType == TYPE_ADD_BOT) { checkCell.setIcon(myAdminRights.pin_messages || isCreator ? 0 : R.drawable.permission_locked); } } 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("UserRestrictionsSendStickers2", R.string.UserRestrictionsSendStickers2), !bannedRights.send_stickers && !defaultBannedRights.send_stickers, true); checkCell.setIcon(defaultBannedRights.send_stickers ? R.drawable.permission_locked : 0); } else if (position == sendGamesRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSendGames", R.string.UserRestrictionsSendGames), !bannedRights.send_games && !defaultBannedRights.send_games, true); checkCell.setIcon(defaultBannedRights.send_stickers ? R.drawable.permission_locked : 0); } else if (position == sendInlineRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSendInline", R.string.UserRestrictionsSendInline), !bannedRights.send_inline && !defaultBannedRights.send_inline, true); checkCell.setIcon(defaultBannedRights.send_stickers ? R.drawable.permission_locked : 0); } else if (position == sendGifsRow) { checkCell.setTextAndCheck(LocaleController.getString("UserRestrictionsSendGifs", R.string.UserRestrictionsSendGifs), !bannedRights.send_gifs && !defaultBannedRights.send_gifs, true); checkCell.setIcon(defaultBannedRights.send_gifs ? 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 (currentType == TYPE_ADD_BOT) { // checkCell.setEnabled((asAdmin || position == manageRow) && !checkCell.hasIcon(), false); } else { if (position == sendMediaRow || position == sendStickersRow || position == sendGamesRow || position == sendInlineRow || position == sendGifsRow || 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 VIEW_TYPE_SHADOW_CELL: ShadowSectionCell shadowCell = (ShadowSectionCell) holder.itemView; if (currentType == TYPE_ADD_BOT && (position == rightsShadowRow || position == rankInfoRow)) { shadowCell.setAlpha(asAdminT); } else { shadowCell.setAlpha(1); } 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 VIEW_TYPE_UNTIL_DATE_CELL: 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 VIEW_TYPE_RANK_CELL: 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 VIEW_TYPE_USER_CELL; } else if (position == 1 || position == rightsShadowRow || position == removeAdminShadowRow || position == untilSectionRow || position == transferOwnerShadowRow) { return VIEW_TYPE_SHADOW_CELL; } else if (position == 2 || position == rankHeaderRow) { return VIEW_TYPE_HEADER_CELL; } 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 == sendGamesRow || position == sendInlineRow || position == sendGifsRow || position == embedLinksRow || position == sendPollsRow || position == anonymousRow || position == startVoiceChatRow || position == manageRow) { return VIEW_TYPE_SWITCH_CELL; } else if (position == cantEditInfoRow || position == rankInfoRow) { return VIEW_TYPE_INFO_CELL; } else if (position == untilDateRow) { return VIEW_TYPE_UNTIL_DATE_CELL; } else if (position == rankRow) { return VIEW_TYPE_RANK_CELL; } else if (position == addBotButtonRow) { return VIEW_TYPE_ADD_BOT_CELL; } else { return VIEW_TYPE_TRANSFER_CELL; } } } private ValueAnimator asAdminAnimator; private void updateAsAdmin(boolean animated) { if (addBotButton != null) { addBotButton.invalidate(); } final int count = listView.getChildCount(); for (int i = 0; i < count; ++i) { View child = listView.getChildAt(i); int childPosition = listView.getChildAdapterPosition(child); if (child instanceof TextCheckCell2) { if (!asAdmin) { if (childPosition == changeInfoRow && !defaultBannedRights.change_info || childPosition == pinMessagesRow && !defaultBannedRights.pin_messages) { ((TextCheckCell2) child).setChecked(true); ((TextCheckCell2) child).setEnabled(false, false); } else { ((TextCheckCell2) child).setChecked(false); ((TextCheckCell2) child).setEnabled(childPosition == manageRow, animated); } } else { boolean childValue = false, childEnabled = false; if (childPosition == manageRow) { childValue = asAdmin; childEnabled = myAdminRights.add_admins || (currentChat != null && currentChat.creator); } else if (childPosition == changeInfoRow) { childValue = adminRights.change_info; childEnabled = myAdminRights.change_info && defaultBannedRights.change_info; } else if (childPosition == postMessagesRow) { childValue = adminRights.post_messages; childEnabled = myAdminRights.post_messages; } else if (childPosition == editMesagesRow) { childValue = adminRights.edit_messages; childEnabled = myAdminRights.edit_messages; } else if (childPosition == deleteMessagesRow) { childValue = adminRights.delete_messages; childEnabled = myAdminRights.delete_messages; } else if (childPosition == banUsersRow) { childValue = adminRights.ban_users; childEnabled = myAdminRights.ban_users; } else if (childPosition == addUsersRow) { childValue = adminRights.invite_users; childEnabled = myAdminRights.invite_users; } else if (childPosition == pinMessagesRow) { childValue = adminRights.pin_messages; childEnabled = myAdminRights.pin_messages && defaultBannedRights.pin_messages; } else if (childPosition == startVoiceChatRow) { childValue = adminRights.manage_call; childEnabled = myAdminRights.manage_call; } else if (childPosition == addAdminsRow) { childValue = adminRights.add_admins; childEnabled = myAdminRights.add_admins; } else if (childPosition == anonymousRow) { childValue = adminRights.anonymous; childEnabled = myAdminRights.anonymous || (currentChat != null && currentChat.creator); } ((TextCheckCell2) child).setChecked(childValue); ((TextCheckCell2) child).setEnabled(childEnabled, animated); } } } // listViewAdapter.notifyItemRangeChanged(permissionsStartRow, permissionsEndRow - permissionsStartRow); // if (asAdmin) { // listViewAdapter.notifyItemMoved(addBotButtonRow, rightsShadowRow + 1); // listViewAdapter.notifyItemRangeInserted(rightsShadowRow, rankInfoRow - rightsShadowRow + 1); // } else { // listViewAdapter.notifyItemRangeRemoved(rightsShadowRow, rankInfoRow - rightsShadowRow + 1); // listViewAdapter.notifyItemMoved(addBotButtonRow, permissionsEndRow + 1); // } listViewAdapter.notifyDataSetChanged(); if (asAdminAnimator != null) { asAdminAnimator.cancel(); asAdminAnimator = null; } if (animated) { asAdminAnimator = ValueAnimator.ofFloat(asAdminT, asAdmin ? 1f : 0f); asAdminAnimator.addUpdateListener(a -> { asAdminT = (float) a.getAnimatedValue(); if (addBotButton != null) { addBotButton.invalidate(); } }); asAdminAnimator.setDuration((long) (Math.abs(asAdminT - (asAdmin ? 1f : 0f)) * 200)); asAdminAnimator.start(); } else { asAdminT = asAdmin ? 1f : 0f; if (addBotButton != null) { addBotButton.invalidate(); } } } @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; } }