diff --git a/app/src/main/java/eu/faircode/email/ActivitySignature.java b/app/src/main/java/eu/faircode/email/ActivitySignature.java index 1bc4888d7a..42b9b5ec0e 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySignature.java +++ b/app/src/main/java/eu/faircode/email/ActivitySignature.java @@ -268,7 +268,7 @@ public class ActivitySignature extends ActivityBase { public void onClick(DialogInterface dialog, int which) { String link = etLink.getText().toString(); etText.setSelection(start, end); - StyleHelper.apply(R.id.menu_link, etText, link); + StyleHelper.apply(R.id.menu_link, null, etText, link); } }) .setNegativeButton(android.R.string.cancel, null) @@ -276,7 +276,7 @@ public class ActivitySignature extends ActivityBase { return true; } else - return StyleHelper.apply(action, etText); + return StyleHelper.apply(action, findViewById(action), etText); } private void onImageSelected(Uri uri) { diff --git a/app/src/main/java/eu/faircode/email/FragmentAnswer.java b/app/src/main/java/eu/faircode/email/FragmentAnswer.java index ee057a0805..306ae74335 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAnswer.java +++ b/app/src/main/java/eu/faircode/email/FragmentAnswer.java @@ -351,7 +351,7 @@ public class FragmentAnswer extends FragmentBase { int start = args.getInt("start"); int end = args.getInt("end"); etText.setSelection(start, end); - StyleHelper.apply(R.id.menu_link, etText, link); + StyleHelper.apply(R.id.menu_link, null, etText, link); } private void onDelete() { @@ -414,7 +414,7 @@ public class FragmentAnswer extends FragmentBase { return true; } else - return StyleHelper.apply(action, etText); + return StyleHelper.apply(action, view.findViewById(action), etText); } public static class FragmentInfo extends FragmentDialogBase { diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 36d2718a92..6abb2d8f11 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -1276,7 +1276,7 @@ public class FragmentCompose extends FragmentBase { onMenuAnswer(); return true; case R.id.menu_clear: - StyleHelper.apply(R.id.menu_clear, etBody); + StyleHelper.apply(R.id.menu_clear, null, etBody); return true; case R.id.menu_legend: onMenuLegend(); @@ -1464,7 +1464,7 @@ public class FragmentCompose extends FragmentBase { fragment.show(getParentFragmentManager(), "account:color"); return true; } else - return StyleHelper.apply(action, etBody); + return StyleHelper.apply(action, view.findViewById(action), etBody); } private void onActionRecordAudio() { @@ -2768,7 +2768,7 @@ public class FragmentCompose extends FragmentBase { int start = args.getInt("start"); int end = args.getInt("end"); etBody.setSelection(start, end); - StyleHelper.apply(R.id.menu_color, etBody, color); + StyleHelper.apply(R.id.menu_color, null, etBody, color); } private void onLinkSelected(Bundle args) { @@ -2776,7 +2776,7 @@ public class FragmentCompose extends FragmentBase { int start = args.getInt("start"); int end = args.getInt("end"); etBody.setSelection(start, end); - StyleHelper.apply(R.id.menu_link, etBody, link); + StyleHelper.apply(R.id.menu_link, null, etBody, link); } private void onActionDiscardConfirmed() { @@ -4848,17 +4848,17 @@ public class FragmentCompose extends FragmentBase { return true; case KeyEvent.KEYCODE_B: if (etBody.hasSelection()) - return StyleHelper.apply(R.id.menu_bold, etBody); + return StyleHelper.apply(R.id.menu_bold, null, etBody); else return false; case KeyEvent.KEYCODE_I: if (etBody.hasSelection()) - return StyleHelper.apply(R.id.menu_italic, etBody); + return StyleHelper.apply(R.id.menu_italic, null, etBody); else return false; case KeyEvent.KEYCODE_U: if (etBody.hasSelection()) - return StyleHelper.apply(R.id.menu_underline, etBody); + return StyleHelper.apply(R.id.menu_underline, null, etBody); else return false; } diff --git a/app/src/main/java/eu/faircode/email/StyleHelper.java b/app/src/main/java/eu/faircode/email/StyleHelper.java index b7e35ab84f..9b37b913ac 100644 --- a/app/src/main/java/eu/faircode/email/StyleHelper.java +++ b/app/src/main/java/eu/faircode/email/StyleHelper.java @@ -9,13 +9,18 @@ import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.text.style.URLSpan; import android.text.style.UnderlineSpan; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; import android.widget.EditText; +import androidx.appcompat.widget.PopupMenu; + import java.util.ArrayList; import java.util.List; public class StyleHelper { - static boolean apply(int action, EditText etBody, Object... args) { + static boolean apply(int action, View anchor, EditText etBody, Object... args) { Log.i("Style action=" + action); try { @@ -72,25 +77,41 @@ public class StyleHelper { } case R.id.menu_size: { - RelativeSizeSpan[] spans = ss.getSpans(start, end, RelativeSizeSpan.class); - float size = (spans.length > 0 ? spans[0].getSizeChange() : 1.0f); - - // Match small/big - if (size == 0.8f) - size = 1.0f; - else if (size == 1.0) - size = 1.25f; - else - size = 0.8f; - - for (RelativeSizeSpan span : spans) - ss.removeSpan(span); + final int s = start; + final int e = end; + final SpannableString t = ss; - if (size != 1.0f) - ss.setSpan(new RelativeSizeSpan(size), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + PopupMenu popupMenu = new PopupMenu(anchor.getContext(), anchor); + popupMenu.getMenu().add(Menu.NONE, R.string.title_style_size_small, 1, R.string.title_style_size_small); + popupMenu.getMenu().add(Menu.NONE, R.string.title_style_size_medium, 2, R.string.title_style_size_medium); + popupMenu.getMenu().add(Menu.NONE, R.string.title_style_size_large, 3, R.string.title_style_size_large); - etBody.setText(ss); - etBody.setSelection(start, end); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + RelativeSizeSpan[] spans = t.getSpans(s, e, RelativeSizeSpan.class); + + for (RelativeSizeSpan span : spans) + t.removeSpan(span); + + float size; + if (item.getItemId() == R.string.title_style_size_small) + size = 0.8f; + else if (item.getItemId() == R.string.title_style_size_large) + size = 1.25f; + else + size = 1.0f; + + t.setSpan(new RelativeSizeSpan(size), s, e, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + etBody.setText(t); + etBody.setSelection(s, e); + + return false; + } + }); + + popupMenu.show(); return true; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8b3ddaa609..ce0f83a5bc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -867,6 +867,9 @@ Italic Underline Size + Small + Medium + Large Color Clear formatting Insert link