package org.telegram.ui; import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.text.TextPaint; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.ProgressButton; import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; public class FiltersSetupActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private RecyclerListView listView; private ListAdapter adapter; private ItemTouchHelper itemTouchHelper; private boolean orderChanged; private int filterHelpRow; private int recommendedHeaderRow; private int recommendedStartRow; private int recommendedEndRow; private int recommendedSectionRow; private int filtersHeaderRow; private int filtersStartRow; private int filtersEndRow; private int createFilterRow; private int createSectionRow; private int rowCount = 0; private boolean ignoreUpdates; public static class TextCell extends FrameLayout { private SimpleTextView textView; private ImageView imageView; public TextCell(Context context) { super(context); textView = new SimpleTextView(context); textView.setTextSize(16); textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2)); textView.setTag(Theme.key_windowBackgroundWhiteBlueText2); addView(textView); imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER); addView(imageView); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = AndroidUtilities.dp(48); textView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(71 + 23), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY)); imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.EXACTLY)); setMeasuredDimension(width, AndroidUtilities.dp(50)); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int height = bottom - top; int width = right - left; int viewLeft; int viewTop = (height - textView.getTextHeight()) / 2; if (LocaleController.isRTL) { viewLeft = getMeasuredWidth() - textView.getMeasuredWidth() - AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? 64 : 23); } else { viewLeft = AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? 64 : 23); } textView.layout(viewLeft, viewTop, viewLeft + textView.getMeasuredWidth(), viewTop + textView.getMeasuredHeight()); viewLeft = !LocaleController.isRTL ? AndroidUtilities.dp(20) : width - imageView.getMeasuredWidth() - AndroidUtilities.dp(20); imageView.layout(viewLeft, 0, viewLeft + imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); } public void setTextAndIcon(String text, Drawable icon, boolean divider) { textView.setText(text); imageView.setImageDrawable(icon); } } public static class SuggestedFilterCell extends FrameLayout { private TextView textView; private TextView valueTextView; private ProgressButton addButton; private boolean needDivider; private TLRPC.TL_dialogFilterSuggested suggestedFilter; public SuggestedFilterCell(Context context) { super(context); textView = new TextView(context); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setLines(1); textView.setMaxLines(1); textView.setSingleLine(true); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 22, 10, 22, 0)); valueTextView = new TextView(context); valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2)); valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); valueTextView.setLines(1); valueTextView.setMaxLines(1); valueTextView.setSingleLine(true); valueTextView.setEllipsize(TextUtils.TruncateAt.END); valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 22, 35, 22, 0)); addButton = new ProgressButton(context); addButton.setText(LocaleController.getString("Add", R.string.Add)); addButton.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); addButton.setProgressColor(Theme.getColor(Theme.key_featuredStickers_buttonProgress)); addButton.setBackgroundRoundRect(Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed)); addView(addButton, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.TOP | Gravity.END, 0, 18, 14, 0)); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(64)); measureChildWithMargins(addButton, widthMeasureSpec, 0, heightMeasureSpec, 0); measureChildWithMargins(textView, widthMeasureSpec, addButton.getMeasuredWidth(), heightMeasureSpec, 0); measureChildWithMargins(valueTextView, widthMeasureSpec, addButton.getMeasuredWidth(), heightMeasureSpec, 0); } public void setFilter(TLRPC.TL_dialogFilterSuggested filter, boolean divider) { needDivider = divider; suggestedFilter = filter; setWillNotDraw(!needDivider); textView.setText(filter.filter.title); valueTextView.setText(filter.description); } public TLRPC.TL_dialogFilterSuggested getSuggestedFilter() { return suggestedFilter; } public void setAddOnClickListener(OnClickListener onClickListener) { addButton.setOnClickListener(onClickListener); } @Override protected void onDraw(Canvas canvas) { if (needDivider) { canvas.drawLine(0, getHeight() - 1, getWidth() - getPaddingRight(), getHeight() - 1, Theme.dividerPaint); } } } @SuppressWarnings("FieldCanBeLocal") public static class HintInnerCell extends FrameLayout { private RLottieImageView imageView; private TextView messageTextView; public HintInnerCell(Context context) { super(context); imageView = new RLottieImageView(context); imageView.setAnimation(R.raw.filters, 90, 90); imageView.setScaleType(ImageView.ScaleType.CENTER); imageView.playAnimation(); addView(imageView, LayoutHelper.createFrame(90, 90, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 14, 0, 0)); imageView.setOnClickListener(v -> { if (!imageView.isPlaying()) { imageView.setProgress(0.0f); imageView.playAnimation(); } }); messageTextView = new TextView(context); messageTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText4)); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); messageTextView.setGravity(Gravity.CENTER); messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("CreateNewFilterInfo", R.string.CreateNewFilterInfo))); addView(messageTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 40, 121, 40, 24)); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), heightMeasureSpec); } } public static class FilterCell extends FrameLayout { private TextView textView; private TextView valueTextView; @SuppressWarnings("FieldCanBeLocal") private ImageView moveImageView; @SuppressWarnings("FieldCanBeLocal") private ImageView optionsImageView; private boolean needDivider; private MessagesController.DialogFilter currentFilter; public FilterCell(Context context) { super(context); setWillNotDraw(false); moveImageView = new ImageView(context); moveImageView.setFocusable(false); moveImageView.setScaleType(ImageView.ScaleType.CENTER); moveImageView.setImageResource(R.drawable.list_reorder); moveImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.SRC_IN)); moveImageView.setClickable(true); addView(moveImageView, LayoutHelper.createFrame(48, 48, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, 6, 0, 6, 0)); textView = new TextView(context); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setLines(1); textView.setMaxLines(1); textView.setSingleLine(true); textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); textView.setEllipsize(TextUtils.TruncateAt.END); addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 80 : 64, 14, LocaleController.isRTL ? 64 : 80, 0)); valueTextView = new TextView(context); valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2)); valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); valueTextView.setLines(1); valueTextView.setMaxLines(1); valueTextView.setSingleLine(true); valueTextView.setPadding(0, 0, 0, 0); valueTextView.setEllipsize(TextUtils.TruncateAt.END); addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 80 : 64, 35, LocaleController.isRTL ? 64 : 80, 0)); valueTextView.setVisibility(GONE); optionsImageView = new ImageView(context); optionsImageView.setFocusable(false); optionsImageView.setScaleType(ImageView.ScaleType.CENTER); optionsImageView.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(Theme.key_stickers_menuSelector))); optionsImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.SRC_IN)); optionsImageView.setImageResource(R.drawable.msg_actions); addView(optionsImageView, LayoutHelper.createFrame(40, 40, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 6, 0, 6, 0)); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.EXACTLY)); } public void setFilter(MessagesController.DialogFilter filter, boolean divider) { currentFilter = filter; StringBuilder info = new StringBuilder(); if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_ALL_CHATS) == MessagesController.DIALOG_FILTER_FLAG_ALL_CHATS) { info.append(LocaleController.getString("FilterAllChats", R.string.FilterAllChats)); } else { if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_CONTACTS) != 0) { if (info.length() != 0) { info.append(", "); } info.append(LocaleController.getString("FilterContacts", R.string.FilterContacts)); } if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_NON_CONTACTS) != 0) { if (info.length() != 0) { info.append(", "); } info.append(LocaleController.getString("FilterNonContacts", R.string.FilterNonContacts)); } if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_GROUPS) != 0) { if (info.length() != 0) { info.append(", "); } info.append(LocaleController.getString("FilterGroups", R.string.FilterGroups)); } if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_CHANNELS) != 0) { if (info.length() != 0) { info.append(", "); } info.append(LocaleController.getString("FilterChannels", R.string.FilterChannels)); } if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_BOTS) != 0) { if (info.length() != 0) { info.append(", "); } info.append(LocaleController.getString("FilterBots", R.string.FilterBots)); } } if (!filter.alwaysShow.isEmpty() || !filter.neverShow.isEmpty()) { if (info.length() != 0) { info.append(", "); } info.append(LocaleController.formatPluralString("Exception", filter.alwaysShow.size() + filter.neverShow.size())); } if (info.length() == 0) { info.append(LocaleController.getString("FilterNoChats", R.string.FilterNoChats)); } textView.setText(Emoji.replaceEmoji(filter.name, textView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false)); valueTextView.setText(info); //valueTextView.setVisibility(VISIBLE); needDivider = divider; } public MessagesController.DialogFilter getCurrentFilter() { return currentFilter; } public void setOnOptionsClick(OnClickListener listener) { optionsImageView.setOnClickListener(listener); } @Override protected void onDraw(Canvas canvas) { if (needDivider) { canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint); } } @SuppressLint("ClickableViewAccessibility") public void setOnReorderButtonTouchListener(OnTouchListener listener) { moveImageView.setOnTouchListener(listener); } } @Override public boolean onFragmentCreate() { updateRows(true); getMessagesController().loadRemoteFilters(true); getNotificationCenter().addObserver(this, NotificationCenter.dialogFiltersUpdated); return super.onFragmentCreate(); } private void updateRows(boolean notify) { recommendedHeaderRow = -1; recommendedStartRow = -1; recommendedEndRow = -1; recommendedSectionRow = -1; ArrayList suggestedFilters = getMessagesController().suggestedFilters; rowCount = 0; filterHelpRow = rowCount++; int count = getMessagesController().dialogFilters.size(); if (!suggestedFilters.isEmpty() && count < 10) { recommendedHeaderRow = rowCount++; recommendedStartRow = rowCount; rowCount += suggestedFilters.size(); recommendedEndRow = rowCount; recommendedSectionRow = rowCount++; } if (count != 0) { filtersHeaderRow = rowCount++; filtersStartRow = rowCount; rowCount += count; filtersEndRow = rowCount; } else { filtersHeaderRow = -1; filtersStartRow = -1; filtersEndRow = -1; } if (count < 10) { createFilterRow = rowCount++; } else { createFilterRow = -1; } createSectionRow = rowCount++; if (notify && adapter != null) { adapter.notifyDataSetChanged(); } } @Override public void onFragmentDestroy() { getNotificationCenter().removeObserver(this, NotificationCenter.dialogFiltersUpdated); getNotificationCenter().removeObserver(this, NotificationCenter.suggestedFiltersLoaded); if (orderChanged) { getNotificationCenter().postNotificationName(NotificationCenter.dialogFiltersUpdated); getMessagesStorage().saveDialogFiltersOrder(); TLRPC.TL_messages_updateDialogFiltersOrder req = new TLRPC.TL_messages_updateDialogFiltersOrder(); ArrayList filters = getMessagesController().dialogFilters; for (int a = 0, N = filters.size(); a < N; a++) { MessagesController.DialogFilter filter = filters.get(a); req.order.add(filters.get(a).id); } getConnectionsManager().sendRequest(req, (response, error) -> { }); } super.onFragmentDestroy(); } @Override public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("Filters", R.string.Filters)); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { if (id == -1) { finishFragment(); } } }); fragmentView = new FrameLayout(context); FrameLayout frameLayout = (FrameLayout) fragmentView; frameLayout.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); listView = new RecyclerListView(context); ((DefaultItemAnimator) listView.getItemAnimator()).setDelayAnimations(false); listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); listView.setVerticalScrollBarEnabled(false); itemTouchHelper = new ItemTouchHelper(new TouchHelperCallback()); itemTouchHelper.attachToRecyclerView(listView); frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setAdapter(adapter = new ListAdapter(context)); listView.setOnItemClickListener((view, position, x, y) -> { if (position >= filtersStartRow && position < filtersEndRow) { presentFragment(new FilterCreateActivity(getMessagesController().dialogFilters.get(position - filtersStartRow))); } else if (position == createFilterRow) { presentFragment(new FilterCreateActivity()); } }); return fragmentView; } @Override public void onResume() { super.onResume(); if (adapter != null) { adapter.notifyDataSetChanged(); } } @Override public void didReceivedNotification(int id, int account, Object... args) { if (id == NotificationCenter.dialogFiltersUpdated) { if (ignoreUpdates) { return; } updateRows(true); getNotificationCenter().addObserver(this, NotificationCenter.suggestedFiltersLoaded); if (getMessagesController().suggestedFilters.isEmpty()) { getMessagesController().loadSuggestedFilters(); } } else if (id == NotificationCenter.suggestedFiltersLoaded) { updateRows(true); } } private class ListAdapter extends RecyclerListView.SelectionAdapter { private Context mContext; public ListAdapter(Context context) { mContext = context; } @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int type = holder.getItemViewType(); return type != 3 && type != 0 && type != 5 && type != 1; } @Override public int getItemCount() { return rowCount; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { case 0: view = new HeaderCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 1: view = new HintInnerCell(mContext); view.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_top, Theme.key_windowBackgroundGrayShadow)); break; case 2: FilterCell filterCell = new FilterCell(mContext); filterCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); filterCell.setOnReorderButtonTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_DOWN) { itemTouchHelper.startDrag(listView.getChildViewHolder(filterCell)); } return false; }); filterCell.setOnOptionsClick(v -> { FilterCell cell = (FilterCell) v.getParent(); MessagesController.DialogFilter filter = cell.getCurrentFilter(); AlertDialog.Builder builder1 = new AlertDialog.Builder(getParentActivity()); TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG); paint.setTextSize(AndroidUtilities.dp(20)); builder1.setTitle(Emoji.replaceEmoji(filter.name, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false)); final CharSequence[] items = new CharSequence[]{ LocaleController.getString("FilterEditItem", R.string.FilterEditItem), LocaleController.getString("FilterDeleteItem", R.string.FilterDeleteItem), }; final int[] icons = new int[]{ R.drawable.baseline_edit_24, R.drawable.baseline_delete_24 }; builder1.setItems(items, icons, (dialog, which) -> { if (which == 0) { presentFragment(new FilterCreateActivity(filter)); } else if (which == 1) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("FilterDelete", R.string.FilterDelete)); builder.setMessage(LocaleController.getString("FilterDeleteAlert", R.string.FilterDeleteAlert)); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialog2, which2) -> { AlertDialog progressDialog = null; if (getParentActivity() != null) { progressDialog = new AlertDialog(getParentActivity(), 3); progressDialog.setCanCacnel(false); progressDialog.show(); } final AlertDialog progressDialogFinal = progressDialog; TLRPC.TL_messages_updateDialogFilter req = new TLRPC.TL_messages_updateDialogFilter(); req.id = filter.id; getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { try { if (progressDialogFinal != null) { progressDialogFinal.dismiss(); } } catch (Exception e) { FileLog.e(e); } int idx = getMessagesController().dialogFilters.indexOf(filter); if (idx >= 0) { idx += filtersStartRow; } ignoreUpdates = true; getMessagesController().removeFilter(filter); getMessagesStorage().deleteDialogFilter(filter); ignoreUpdates = false; int prevAddRow = createFilterRow; int prevRecommendedHeaderRow = recommendedHeaderRow; updateRows(idx == -1); if (idx != -1) { if (filtersStartRow == -1) { adapter.notifyItemRangeRemoved(idx - 1, 2); } else { adapter.notifyItemRemoved(idx); } if (prevRecommendedHeaderRow == -1 && recommendedHeaderRow != -1) { adapter.notifyItemRangeInserted(prevRecommendedHeaderRow, recommendedSectionRow - recommendedHeaderRow + 1); } if (prevAddRow == -1 && createFilterRow != -1) { adapter.notifyItemInserted(createFilterRow); } } })); }); AlertDialog alertDialog = builder.create(); showDialog(alertDialog); TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); if (button != null) { button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2)); } } }); final AlertDialog dialog = builder1.create(); showDialog(dialog); dialog.setItemColor(items.length - 1, Theme.getColor(Theme.key_dialogTextRed2), Theme.getColor(Theme.key_dialogRedIcon)); }); view = filterCell; break; case 3: view = new ShadowSectionCell(mContext); break; case 4: view = new TextCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 5: default: SuggestedFilterCell suggestedFilterCell = new SuggestedFilterCell(mContext); suggestedFilterCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); suggestedFilterCell.setAddOnClickListener(v -> { TLRPC.TL_dialogFilterSuggested suggested = suggestedFilterCell.getSuggestedFilter(); MessagesController.DialogFilter filter = new MessagesController.DialogFilter(); filter.name = suggested.filter.title; filter.id = 2; while (getMessagesController().dialogFiltersById.get(filter.id) != null) { filter.id++; } filter.pendingUnreadCount = filter.unreadCount = -1; for (int b = 0; b < 2; b++) { ArrayList fromArray = b == 0 ? suggested.filter.include_peers : suggested.filter.exclude_peers; ArrayList toArray = b == 0 ? filter.alwaysShow : filter.neverShow; for (int a = 0, N = fromArray.size(); a < N; a++) { TLRPC.InputPeer peer = fromArray.get(a); int lowerId; if (peer.user_id != 0) { lowerId = peer.user_id; } else if (peer.chat_id != 0) { lowerId = -peer.chat_id; } else { lowerId = -peer.channel_id; } toArray.add(lowerId); } } if (suggested.filter.groups) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_GROUPS; } if (suggested.filter.bots) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_BOTS; } if (suggested.filter.contacts) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_CONTACTS; } if (suggested.filter.non_contacts) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_NON_CONTACTS; } if (suggested.filter.broadcasts) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_CHANNELS; } if (suggested.filter.exclude_archived) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_ARCHIVED; } if (suggested.filter.exclude_read) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_READ; } if (suggested.filter.exclude_muted) { filter.flags |= MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_MUTED; } ignoreUpdates = true; FilterCreateActivity.saveFilterToServer(filter, filter.flags, filter.name, filter.alwaysShow, filter.neverShow, filter.pinnedDialogs, true, true, true, true, false, FiltersSetupActivity.this, () -> { getNotificationCenter().postNotificationName(NotificationCenter.dialogFiltersUpdated); ignoreUpdates = false; ArrayList suggestedFilters = getMessagesController().suggestedFilters; int index = suggestedFilters.indexOf(suggested); if (index != -1) { boolean wasEmpty = filtersStartRow == -1; suggestedFilters.remove(index); index += recommendedStartRow; int prevAddRow = createFilterRow; int prevRecommendedHeaderRow = recommendedHeaderRow; int prevRecommendedSectionRow = recommendedSectionRow; updateRows(false); if (prevAddRow != -1 && createFilterRow == -1) { adapter.notifyItemRemoved(prevAddRow); } if (prevRecommendedHeaderRow != -1 && recommendedHeaderRow == -1) { adapter.notifyItemRangeRemoved(prevRecommendedHeaderRow, prevRecommendedSectionRow - prevRecommendedHeaderRow + 1); } else { adapter.notifyItemRemoved(index); } if (wasEmpty) { adapter.notifyItemInserted(filtersHeaderRow); } adapter.notifyItemInserted(filtersStartRow); } else { updateRows(true); } }); }); view = suggestedFilterCell; break; } return new RecyclerListView.Holder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { case 0: { HeaderCell headerCell = (HeaderCell) holder.itemView; if (position == filtersHeaderRow) { headerCell.setText(LocaleController.getString("Filters", R.string.Filters)); } else if (position == recommendedHeaderRow) { headerCell.setText(LocaleController.getString("FilterRecommended", R.string.FilterRecommended)); } break; } case 2: { FilterCell filterCell = (FilterCell) holder.itemView; filterCell.setFilter(getMessagesController().dialogFilters.get(position - filtersStartRow), true); break; } case 3: { if (position == createSectionRow) { holder.itemView.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); } else { holder.itemView.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); } break; } case 4: { TextCell textCell = (TextCell) holder.itemView; SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount); if (position == createFilterRow) { Drawable drawable1 = mContext.getResources().getDrawable(R.drawable.poll_add_circle); Drawable drawable2 = mContext.getResources().getDrawable(R.drawable.poll_add_plus); drawable1.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_switchTrackChecked), PorterDuff.Mode.SRC_IN)); drawable2.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_checkboxCheck), PorterDuff.Mode.SRC_IN)); CombinedDrawable combinedDrawable = new CombinedDrawable(drawable1, drawable2); textCell.setTextAndIcon(LocaleController.getString("CreateNewFilter", R.string.CreateNewFilter), combinedDrawable, false); } break; } case 5: { SuggestedFilterCell filterCell = (SuggestedFilterCell) holder.itemView; filterCell.setFilter(getMessagesController().suggestedFilters.get(position - recommendedStartRow), recommendedStartRow != recommendedEndRow - 1); break; } } } @Override public int getItemViewType(int position) { if (position == filtersHeaderRow || position == recommendedHeaderRow) { return 0; } else if (position == filterHelpRow) { return 1; } else if (position >= filtersStartRow && position < filtersEndRow) { return 2; } else if (position == createSectionRow || position == recommendedSectionRow) { return 3; } else if (position == createFilterRow) { return 4; } else { return 5; } } public void swapElements(int fromIndex, int toIndex) { int idx1 = fromIndex - filtersStartRow; int idx2 = toIndex - filtersStartRow; int count = filtersEndRow - filtersStartRow; if (idx1 < 0 || idx2 < 0 || idx1 >= count || idx2 >= count) { return; } ArrayList filters = getMessagesController().dialogFilters; MessagesController.DialogFilter filter1 = filters.get(idx1); MessagesController.DialogFilter filter2 = filters.get(idx2); int temp = filter1.order; filter1.order = filter2.order; filter2.order = temp; filters.set(idx1, filter2); filters.set(idx2, filter1); orderChanged = true; notifyItemMoved(fromIndex, toIndex); } } public class TouchHelperCallback extends ItemTouchHelper.Callback { @Override public boolean isLongPressDragEnabled() { return true; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { if (viewHolder.getItemViewType() != 2) { return makeMovementFlags(0, 0); } return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { if (source.getItemViewType() != target.getItemViewType()) { return false; } adapter.swapElements(source.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { listView.cancelClickRunnables(false); viewHolder.itemView.setPressed(true); } super.onSelectedChanged(viewHolder, actionState); } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); viewHolder.itemView.setPressed(false); } } @Override public ArrayList getThemeDescriptions() { ArrayList themeDescriptions = new ArrayList<>(); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{HeaderCell.class, TextCell.class, FilterCell.class, SuggestedFilterCell.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, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{FilterCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{FilterCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{FilterCell.class}, new String[]{"moveImageView"}, null, null, null, Theme.key_stickers_menu)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{FilterCell.class}, new String[]{"optionsImageView"}, null, null, null, Theme.key_stickers_menu)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_USEBACKGROUNDDRAWABLE | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, new Class[]{FilterCell.class}, new String[]{"optionsImageView"}, null, null, null, Theme.key_stickers_menuSelector)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText2)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_switchTrackChecked)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_checkboxCheck)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); return themeDescriptions; } }