implement in-chat-search

This commit is contained in:
B. Petersen 2020-04-05 01:40:21 +02:00
parent 2ae7e8896b
commit 0a3dee4573
No known key found for this signature in database
GPG key ID: 3B88E92DEA8E9AFC
3 changed files with 54 additions and 2 deletions

View file

@ -1534,8 +1534,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
// in-chat search
int beforeSearchComposeVisibility = View.VISIBLE;
int beforeSearchAttachVisibility = View.GONE;
private int beforeSearchComposeVisibility = View.VISIBLE;
private int beforeSearchAttachVisibility = View.GONE;
private int[] searchResult = {};
private int searchResultPosition = -1;
private Toast lastToast = null;
private void searchExpand(final Menu menu, final MenuItem searchItem) {
beforeSearchComposeVisibility = composePanel.getVisibility();
@ -1555,6 +1560,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
private void handleMenuSearchNext(boolean searchNext) {
if(searchResult.length>0) {
searchResultPosition += searchNext? 1 : -1;
if(searchResultPosition<0) searchResultPosition = searchResult.length-1;
if(searchResultPosition>=searchResult.length) searchResultPosition = 0;
fragment.scrollToMsgId(searchResult[searchResultPosition]);
}
}
@Override
@ -1564,6 +1575,30 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
public boolean onQueryTextChange(String query) {
if (lastToast!=null) {
lastToast.cancel();
lastToast = null;
}
String normQuery = query.trim();
searchResult = dcContext.searchMsgs(chatId, normQuery);
if(searchResult.length>0) {
searchResultPosition = 0;
fragment.scrollToMsgId(searchResult[searchResultPosition]);
} else {
searchResultPosition = -1;
if (!normQuery.isEmpty()) {
String msg = getString(R.string.search_no_result_for_x, normQuery);
if (lastToast != null) {
lastToast.cancel();
}
lastToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
lastToast.show();
}
}
return true; // action handled by listener
}
}

View file

@ -170,6 +170,14 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
return fromDb;
}
public int msgIdToPosition(int msgId) {
for(int i=0; i<dcMsgList.length; i++ ) {
if(dcMsgList[i]==msgId) {
return dcMsgList.length - 1 - i;
}
}
return -1;
}
static class HeaderViewHolder extends RecyclerView.ViewHolder {
TextView textView;

View file

@ -512,6 +512,15 @@ public class ConversationFragment extends Fragment
}
}
public void scrollToMsgId(final int msgId) {
ConversationAdapter adapter = (ConversationAdapter)list.getAdapter();
int position = adapter.msgIdToPosition(msgId);
if (position!=-1) {
scrollToStartingPosition(position);
Log.i("Delta Chat", String.format(">>>>>>>>>>>>>>>>>>> %d", position));
}
}
public interface ConversationFragmentListener {
void setChatId(int threadId);
void handleReplyMessage(DcMsg messageRecord);