package com.moez.QKSMS.ui.search; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.moez.QKSMS.R; import com.moez.QKSMS.common.LiveViewManager; import com.moez.QKSMS.common.utils.DateFormatter; import com.moez.QKSMS.enums.QKPreference; import com.moez.QKSMS.ui.ThemeManager; import com.moez.QKSMS.ui.base.QKActivity; import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; import java.util.ArrayList; public class SearchAdapter extends RecyclerCursorAdapter<SearchViewHolder, SearchData> { private String mQuery; public SearchAdapter(QKActivity context) { super(context); } public void setQuery(String query) { mQuery = query; } @Override protected SearchData getItem(int position) { mCursor.moveToPosition(position); return new SearchData(mCursor); } @Override public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(mContext); View view = inflater.inflate(R.layout.list_item_search, parent, false); LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { view.setBackgroundDrawable(ThemeManager.getRippleBackground()); }); return new SearchViewHolder(mContext, view); } @Override public void onBindViewHolder(SearchViewHolder holder, int position) { SearchData data = getItem(position); holder.mData = data; holder.mClickListener = mItemClickListener; holder.root.setOnClickListener(holder); holder.root.setOnLongClickListener(holder); if (data.contact != null) { Drawable avatarDrawable = data.contact.getAvatar(mContext, null); holder.avatar.setImageDrawable(avatarDrawable); holder.avatar.setContactName(data.contact.getName()); holder.name.setText(data.contact.getName()); } else { holder.avatar.setImageDrawable(null); holder.avatar.setContactName(null); holder.name.setText(null); } holder.date.setText(DateFormatter.getConversationTimestamp(mContext, data.date)); if (mQuery != null) { // We need to make the search string bold within the full message // Get all of the start positions of the query within the messages ArrayList<Integer> indices = new ArrayList<>(); int index = data.body.toLowerCase().indexOf(mQuery.toLowerCase()); while (index >= 0) { indices.add(index); index = data.body.toLowerCase().indexOf(mQuery.toLowerCase(), index + 1); } // Make all instances of the search query bold SpannableStringBuilder sb = new SpannableStringBuilder(data.body); for (int i : indices) { StyleSpan span = new StyleSpan(Typeface.BOLD); sb.setSpan(span, i, i + mQuery.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } holder.snippet.setText(sb); } } }