Skip to content

Commit

Permalink
feat: support filter search by types
Browse files Browse the repository at this point in the history
Thanks to @NekoUpdates

Co-authored-by: tehcneko <chsqwyx@gmail.com>
  • Loading branch information
omg-xtao and tehcneko committed Apr 3, 2024
1 parent a47ab7c commit 06d7da0
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 17 deletions.
Expand Up @@ -3442,6 +3442,7 @@ public void processStickerSetInstallResultArchive(BaseFragment baseFragment, boo
private SparseArray<MessageObject>[] searchServerResultMessagesMap = new SparseArray[]{new SparseArray<>(), new SparseArray<>()};
private ArrayList<MessageObject> deletedFromResultMessages = new ArrayList<>();
private String lastSearchQuery;
private TLRPC.MessagesFilter lastSearchFilter;
private int lastReturnedNum;
private boolean loadingMoreSearchMessages;
private boolean loadingSearchLocal;
Expand Down Expand Up @@ -3559,8 +3560,8 @@ public boolean isMessageFound(int messageId, boolean mergeDialog) {
return searchServerResultMessagesMap[mergeDialog ? 1 : 0].indexOfKey(messageId) >= 0;
}

public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, TLRPC.User user, TLRPC.Chat chat, ReactionsLayoutInBubble.VisibleReaction reaction) {
searchMessagesInChat(query, dialogId, mergeDialogId, guid, direction, replyMessageId, false, user, chat, true, reaction);
public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, TLRPC.User user, TLRPC.Chat chat, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter) {
searchMessagesInChat(query, dialogId, mergeDialogId, guid, direction, replyMessageId, false, user, chat, true, reaction, filter);
}

public void jumpToSearchedMessage(int guid, int index) {
Expand Down Expand Up @@ -3601,15 +3602,15 @@ public void loadMoreSearchMessages(boolean fromList) {
int temp = lastReturnedNum;
lastReturnedNum = searchResultMessages.size();
loadingMoreSearchMessages = true;
searchMessagesInChat(null, lastDialogId, lastMergeDialogId, lastGuid, 1, lastReplyMessageId, false, lastSearchUser, lastSearchChat, false, lastReaction);
searchMessagesInChat(null, lastDialogId, lastMergeDialogId, lastGuid, 1, lastReplyMessageId, false, lastSearchUser, lastSearchChat, false, lastReaction, lastSearchFilter);
lastReturnedNum = temp;
}

public boolean isSearchLoading() {
return reqId != 0;
}

public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, boolean internal, TLRPC.User user, TLRPC.Chat chat, boolean jumpToMessage, ReactionsLayoutInBubble.VisibleReaction reaction) {
public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, boolean internal, TLRPC.User user, TLRPC.Chat chat, boolean jumpToMessage, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter) {
int max_id = 0;
long queryWithDialog = dialogId;
boolean firstQuery = !internal;
Expand Down Expand Up @@ -3714,19 +3715,23 @@ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId
req.saved_reaction.add(reaction.toTLReaction());
req.flags |= 8;
}
req.filter = new TLRPC.TL_inputMessagesFilterEmpty();
if (filter == null) {
req.filter = new TLRPC.TL_inputMessagesFilterEmpty();
} else {
req.filter = filter;
}
mergeReqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (lastMergeDialogId == mergeDialogId) {
mergeReqId = 0;
if (response != null) {
TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
messagesSearchEndReached[1] = res.messages.isEmpty();
messagesSearchCount[1] = res instanceof TLRPC.TL_messages_messagesSlice ? res.count : res.messages.size();
searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction);
searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction, filter);
} else {
messagesSearchEndReached[1] = true;
messagesSearchCount[1] = 0;
searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction);
searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction, filter);
}
}
}), ConnectionsManager.RequestFlagFailOnServerErrors);
Expand All @@ -3743,6 +3748,7 @@ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId
loadingMoreSearchMessages = false;
return;
}
lastSearchFilter = filter;
lastGuid = guid;
lastDialogId = dialogId;
lastSearchUser = user;
Expand Down Expand Up @@ -3799,7 +3805,11 @@ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId
req.saved_reaction.add(reaction.toTLReaction());
req.flags |= 8;
}
req.filter = new TLRPC.TL_inputMessagesFilterEmpty();
if (filter == null) {
req.filter = new TLRPC.TL_inputMessagesFilterEmpty();
} else {
req.filter = filter;
}
lastSearchQuery = query;
long queryWithDialogFinal = queryWithDialog;
String finalQuery = query;
Expand Down Expand Up @@ -3871,7 +3881,7 @@ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId
}
}
if (queryWithDialogFinal == dialogId && messagesSearchEndReached[0] && mergeDialogId != 0 && !messagesSearchEndReached[1]) {
searchMessagesInChat(lastSearchQuery, dialogId, mergeDialogId, guid, 0, replyMessageId, true, user, chat, jumpToMessage, lastReaction);
searchMessagesInChat(lastSearchQuery, dialogId, mergeDialogId, guid, 0, replyMessageId, true, user, chat, jumpToMessage, lastReaction, lastSearchFilter);
}
};
if (isSaved) {
Expand Down
70 changes: 63 additions & 7 deletions TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
Expand Up @@ -568,6 +568,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private BlurredFrameLayout searchContainer;
private ImageView searchCalendarButton;
private ImageView searchUserButton;
private ImageView searchFilterButton;
private AnimatedTextView searchCountText;
private AnimatedTextView searchExpandList;
private AnimatedTextView searchOtherButton;
Expand Down Expand Up @@ -601,6 +602,7 @@ public ArrayList<MessageObject> getFilteredMessages() {
private boolean searchingFiltered;
private boolean searching;
private String searchingQuery;
private TLRPC.MessagesFilter searchingType;
private UndoView undoView;
private UndoView topUndoView;
private Bulletin pinBulletin;
Expand Down Expand Up @@ -6612,11 +6614,11 @@ public void getOutline(View view, Outline outline) {
ScaleStateListAnimator.apply(searchDownButton, .12f, 2f);

searchUpButton.setOnClickListener(view -> {
getMediaDataController().searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, reversed ? 2 : 1, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction);
getMediaDataController().searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, reversed ? 2 : 1, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
showMessagesSearchListView(false);
});
searchDownButton.setOnClickListener(view -> {
getMediaDataController().searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, reversed ? 1 : 2, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction);
getMediaDataController().searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, reversed ? 1 : 2, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
showMessagesSearchListView(false);
});

Expand Down Expand Up @@ -8381,7 +8383,7 @@ protected boolean setFilter(ReactionsLayoutInBubble.VisibleReaction reaction) {
updateSearchUpDownButtonVisibility(true);
updatePagedownButtonVisibility(true);
searchingQuery = searchItem.getSearchField().getText().toString();
getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages, searchingChatMessages, !TextUtils.isEmpty(searchingQuery) || searchingReaction != null, searchingReaction);
getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages, searchingChatMessages, !TextUtils.isEmpty(searchingQuery) || searchingReaction != null, searchingReaction, searchingType);
AndroidUtilities.hideKeyboard(searchItem.getSearchField());
return true;
}
Expand Down Expand Up @@ -8503,7 +8505,7 @@ public void setSearchQuery(String text) {
public void hitSearch() {
searchWas = true;
updateSearchButtons(0, 0, -1);
getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction);
getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
searchItemVisible = searching = !TextUtils.isEmpty(searchingQuery) || searchingReaction != null;
updateBottomOverlay();
updateSearchUpDownButtonVisibility(true);
Expand Down Expand Up @@ -9541,6 +9543,17 @@ public void onReactionClicked(View view, ReactionsLayoutInBubble.VisibleReaction
tagSelector.setTranslationY(contentPanTranslation + (actionBarSearchTags != null ? actionBarSearchTags.getCurrentHeight() : 0));
}

private ArrayList<Pair<String, TLRPC.MessagesFilter>> searchFilters = new ArrayList<>() {{
add(Pair.create(LocaleController.getString(R.string.FilterAllChatsShort), null));
add(Pair.create(LocaleController.getString(R.string.SharedMediaTab2), new TLRPC.TL_inputMessagesFilterPhotoVideo()));
add(Pair.create(LocaleController.getString(R.string.SharedVoiceTab2), new TLRPC.TL_inputMessagesFilterVoice()));
add(Pair.create(LocaleController.getString(R.string.SharedFilesTab2), new TLRPC.TL_inputMessagesFilterDocument()));
add(Pair.create(LocaleController.getString(R.string.SharedMusicTab2), new TLRPC.TL_inputMessagesFilterMusic()));
add(Pair.create(LocaleController.getString(R.string.SharedGIFsTab2), new TLRPC.TL_inputMessagesFilterGif()));
add(Pair.create(LocaleController.getString(R.string.ChatLocation), new TLRPC.TL_inputMessagesFilterGeo()));
add(Pair.create(LocaleController.getString(R.string.Mention), new TLRPC.TL_inputMessagesFilterMyMentions()));
}};

private void createSearchContainer() {
if (searchContainer != null || getContext() == null) {
return;
Expand Down Expand Up @@ -9568,6 +9581,9 @@ protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, i
if (searchUserButton != null && searchUserButton.getVisibility() != GONE) {
leftMargin += 48;
}
if (searchFilterButton != null && searchFilterButton.getVisibility() != GONE) {
leftMargin += 48;
}
((MarginLayoutParams) child.getLayoutParams()).leftMargin = AndroidUtilities.dp(leftMargin);
}
super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
Expand Down Expand Up @@ -9644,6 +9660,7 @@ public void setVisibility(int visibility) {
}
searchCalendarButton.setVisibility(View.GONE);
searchUserButton.setVisibility(View.GONE);
searchFilterButton.setVisibility(View.GONE);
searchingForUser = true;
searchingUserMessages = null;
searchingChatMessages = null;
Expand Down Expand Up @@ -9675,6 +9692,39 @@ public void run(int param) {
});
searchCalendarButton.setContentDescription(LocaleController.getString("JumpToDate", R.string.JumpToDate));

searchFilterButton = new ImageView(getContext());
searchFilterButton.setScaleType(ImageView.ScaleType.CENTER);
searchFilterButton.setImageResource(R.drawable.ic_filter_list);
searchFilterButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_searchPanelIcons), PorterDuff.Mode.MULTIPLY));
searchFilterButton.setBackground(Theme.createSelectorDrawable(getThemedColor(Theme.key_actionBarActionModeDefaultSelector), 1));
searchContainer.addView(searchFilterButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP, searchUserButton != null ? (96 - 2.66f) : 48, 0, 0, 0));
searchFilterButton.setOnClickListener(view -> {
if (getParentActivity() == null) {
return;
}

var filterPopup = ItemOptions.makeOptions(contentView, themeDelegate, searchFilterButton);
filterPopup.setDimAlpha(0);
for (var filter : searchFilters) {
filterPopup.add(0, filter.first, () -> {
if (searchingType == filter.second) {
return;
}
searchingType = filter.second;
getMediaDataController().clearFoundMessageObjects();
updateSearchButtons(0, 0, -1);
updateSearchUpDownButtonVisibility(true);
updatePagedownButtonVisibility(true);
searchingQuery = searchItem.getSearchField().getText().toString();
getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
});
if (searchingType == filter.second) {
filterPopup.putCheck();
}
}
filterPopup.show();
});
searchFilterButton.setContentDescription(LocaleController.getString("JumpToDate", R.string.JumpToDate));
}

private void showSearchShowOther(boolean show) {
Expand Down Expand Up @@ -10263,7 +10313,7 @@ private void searchUserMessages(TLRPC.User user, TLRPC.Chat chat) {
mentionContainer.getAdapter().searchUsernameOrHashtag(null, 0, null, false, true);
searchItem.setSearchFieldHint(null);
searchItem.clearSearchText();
getMediaDataController().searchMessagesInChat(searchingQuery = "", dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction);
getMediaDataController().searchMessagesInChat(searchingQuery = "", dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType = null);
}

private void updateTranslateItemVisibility() {
Expand Down Expand Up @@ -31880,7 +31930,7 @@ public void openSearchWithText(String text) {
if (searchItem != null) {
searchItem.setSearchFieldText(text, false);
}
getMediaDataController().searchMessagesInChat(searchingQuery = (text == null ? "" : text), dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages, searchingChatMessages, !TextUtils.isEmpty(text), searchingReaction);
getMediaDataController().searchMessagesInChat(searchingQuery = (text == null ? "" : text), dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages, searchingChatMessages, !TextUtils.isEmpty(text), searchingReaction, searchingType = null);
updatePinnedMessageView(true);
}

Expand Down Expand Up @@ -34534,6 +34584,9 @@ public void onSearchCollapse() {
if (searchUserButton != null) {
searchUserButton.setVisibility(View.VISIBLE);
}
if (searchFilterButton != null) {
searchFilterButton.setVisibility(View.VISIBLE);
}
if (searchingForUser) {
mentionContainer.getAdapter().searchUsernameOrHashtag(null, 0, null, false, true);
searchingForUser = false;
Expand Down Expand Up @@ -34693,7 +34746,7 @@ public void setSearchAnimationProgress(float progress) {
public void onSearchPressed(EditText editText) {
searchWas = true;
updateSearchButtons(0, 0, -1);
getMediaDataController().searchMessagesInChat(searchingQuery = editText.getText().toString(), dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction);
getMediaDataController().searchMessagesInChat(searchingQuery = editText.getText().toString(), dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
}

@Override
Expand Down Expand Up @@ -34723,6 +34776,7 @@ public void onCaptionCleared() {
searchItem.setSearchFieldHint(isSupportedTags() ? LocaleController.getString("SavedTagSearchHint", R.string.SavedTagSearchHint) : LocaleController.getString("Search", R.string.Search));
searchCalendarButton.setVisibility(View.VISIBLE);
searchUserButton.setVisibility(View.VISIBLE);
searchFilterButton.setVisibility(View.VISIBLE);
searchingUserMessages = null;
searchingChatMessages = null;
}
Expand Down Expand Up @@ -37397,6 +37451,8 @@ public ArrayList<ThemeDescription> getThemeDescriptions() {
themeDescriptions.add(new ThemeDescription(replyCloseImageView, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_replyPanelClose));
themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, selectedBackgroundDelegate, Theme.key_chat_replyPanelName));

themeDescriptions.add(new ThemeDescription(searchFilterButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons));
themeDescriptions.add(new ThemeDescription(searchFilterButton, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_actionBarActionModeDefaultSelector));
themeDescriptions.add(new ThemeDescription(searchCalendarButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons));
themeDescriptions.add(new ThemeDescription(searchCalendarButton, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_actionBarActionModeDefaultSelector));
themeDescriptions.add(new ThemeDescription(searchUserButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_searchPanelIcons));
Expand Down
Expand Up @@ -254,7 +254,7 @@ public ItemOptions putCheck() {
}
ActionBarMenuSubItem lastSubItem = (ActionBarMenuSubItem) lastChild;
lastSubItem.setRightIcon(R.drawable.msg_text_check);
lastSubItem.getRightIcon().setColorFilter(0xffffffff, PorterDuff.Mode.MULTIPLY);
lastSubItem.getRightIcon().setColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlueIcon, resourcesProvider), PorterDuff.Mode.MULTIPLY);
lastSubItem.getRightIcon().setScaleX(.85f);
lastSubItem.getRightIcon().setScaleY(.85f);
return this;
Expand Down

0 comments on commit 06d7da0

Please sign in to comment.