diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 45ae2ef752..d89ee695d5 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -55,6 +55,7 @@ import android.text.Editable; import android.text.Html; import android.text.Layout; import android.text.Spannable; +import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -62,6 +63,7 @@ import android.text.TextWatcher; import android.text.format.DateUtils; import android.text.method.ArrowKeyMovementMethod; import android.text.method.LinkMovementMethod; +import android.text.style.BackgroundColorSpan; import android.text.style.DynamicDrawableSpan; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; @@ -69,6 +71,7 @@ import android.text.style.QuoteSpan; import android.text.style.URLSpan; import android.util.Pair; import android.util.TypedValue; +import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -92,6 +95,7 @@ import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; @@ -956,7 +960,7 @@ public class AdapterMessage extends RecyclerView.Adapter 0); + } + + @Override + public void afterTextChanged(Editable s) { + // Do nothing + } + }); + + ibNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + found = find(etSearch.getText().toString(), ++found); + } + }); + + PopupWindow pw = new PopupWindow(dview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + pw.setFocusable(true); + pw.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + SpannableString ss = new SpannableString(tvBody.getText()); + for (BackgroundColorSpan span : ss.getSpans(0, ss.length(), BackgroundColorSpan.class)) + ss.removeSpan(span); + tvBody.setText(ss); + } + }); + pw.showAtLocation(parentFragment.getView(), Gravity.TOP | Gravity.END, 0, 0); + } + + private int find(String query, int result) { + query = query.toLowerCase(); + + SpannableString ss = new SpannableString(tvBody.getText()); + for (BackgroundColorSpan span : ss.getSpans(0, ss.length(), BackgroundColorSpan.class)) + ss.removeSpan(span); + + int p = -1; + String text = tvBody.getText().toString().toLowerCase(); + for (int i = 0; i < result; i++) + p = (p < 0 ? text.indexOf(query) : text.indexOf(query, p + 1)); + + if (p < 0 && result > 1) { + result = 1; + p = text.indexOf(query); + } + if (p < 0) + result = 0; + + final int pos = p; + if (pos > 0) { + int color = Helper.resolveColor(context, R.attr.colorHighlight); + ss.setSpan(new BackgroundColorSpan(color), pos, pos + query.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + tvBody.setText(ss); + + final int apos = getAdapterPosition(); + + tvBody.post(new Runnable() { + @Override + public void run() { + try { + int line = tvBody.getLayout().getLineForOffset(pos); + int y = Math.round(line * tvBody.getLineHeight()); + + Rect rect = new Rect(); + tvBody.getDrawingRect(rect); + ((ViewGroup) view).offsetDescendantRectToMyCoords(tvBody, rect); + + properties.scrollTo(apos, rect.top + y); + } catch (Throwable ex) { + Log.e(ex); + } + } + }); + } else + tvBody.setText(ss, TextView.BufferType.SPANNABLE); + + return result; + } + private void onMenuCreateRule(TupleMessageEx message) { Intent rule = new Intent(ActivityView.ACTION_EDIT_RULE); rule.putExtra("account", message.account); @@ -4840,6 +4949,8 @@ public class AdapterMessage extends RecyclerView.Adapter + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/popup_message_more.xml b/app/src/main/res/menu/popup_message_more.xml index c26452342b..26b28dfce1 100644 --- a/app/src/main/res/menu/popup_message_more.xml +++ b/app/src/main/res/menu/popup_message_more.xml @@ -44,6 +44,10 @@ android:id="@+id/menu_resync" android:title="@string/title_resync" /> + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index dd778f3f92..e186c151d1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,6 +10,9 @@ #ffffffff + #ffffe000 + #ffffff00 + #ff00ff00 #ff00e000 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index bd3058e71a..43e1aed222 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -3,6 +3,7 @@ + @@ -26,6 +27,8 @@ @color/colorReadLight @color/colorUnreadLight + @color/colorHighlightLight + @color/colorEncryptLight @color/lightColorSeparator @@ -66,6 +69,8 @@ @color/colorReadDark @color/colorUnreadDark + @color/colorHighlightDark + @color/colorEncryptDark @color/darkColorSeparator