mirror of https://github.com/NekoX-Dev/NekoX.git
888 lines
46 KiB
Java
888 lines
46 KiB
Java
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.MULTIPLY));
|
|
moveImageView.setContentDescription(LocaleController.getString("FilterReorder", R.string.FilterReorder));
|
|
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.MULTIPLY));
|
|
optionsImageView.setImageResource(R.drawable.msg_actions);
|
|
optionsImageView.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions));
|
|
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(LocaleController.isRTL ? 0 : AndroidUtilities.dp(62), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(62) : 0), 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);
|
|
getNotificationCenter().addObserver(this, NotificationCenter.suggestedFiltersLoaded);
|
|
if (getMessagesController().suggestedFilters.isEmpty()) {
|
|
getMessagesController().loadSuggestedFilters();
|
|
}
|
|
return super.onFragmentCreate();
|
|
}
|
|
|
|
private void updateRows(boolean notify) {
|
|
recommendedHeaderRow = -1;
|
|
recommendedStartRow = -1;
|
|
recommendedEndRow = -1;
|
|
recommendedSectionRow = -1;
|
|
|
|
ArrayList<TLRPC.TL_dialogFilterSuggested> 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<MessagesController.DialogFilter> 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);
|
|
} 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.msg_edit,
|
|
R.drawable.msg_delete
|
|
};
|
|
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<TLRPC.InputPeer> fromArray = b == 0 ? suggested.filter.include_peers : suggested.filter.exclude_peers;
|
|
ArrayList<Integer> 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<TLRPC.TL_dialogFilterSuggested> 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.MULTIPLY));
|
|
drawable2.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_checkboxCheck), PorterDuff.Mode.MULTIPLY));
|
|
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<MessagesController.DialogFilter> 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<ThemeDescription> getThemeDescriptions() {
|
|
ArrayList<ThemeDescription> 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;
|
|
}
|
|
}
|