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