Moved color selection to style helper

pull/183/head
M66B 5 years ago
parent 23eb8b1c97
commit 20a81ac386

@ -37,7 +37,6 @@ import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
@ -275,12 +274,11 @@ public class FragmentCompose extends FragmentBase {
private static final int REQUEST_TAKE_PHOTO = 7;
private static final int REQUEST_RECORD_AUDIO = 8;
private static final int REQUEST_OPENPGP = 9;
private static final int REQUEST_COLOR = 10;
private static final int REQUEST_CONTACT_GROUP = 11;
private static final int REQUEST_ANSWER = 12;
private static final int REQUEST_LINK = 13;
private static final int REQUEST_DISCARD = 14;
private static final int REQUEST_SEND = 15;
private static final int REQUEST_CONTACT_GROUP = 10;
private static final int REQUEST_ANSWER = 11;
private static final int REQUEST_LINK = 12;
private static final int REQUEST_DISCARD = 13;
private static final int REQUEST_SEND = 14;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -1446,24 +1444,6 @@ public class FragmentCompose extends FragmentBase {
private boolean onActionStyle(int action) {
Log.i("Style action=" + action);
if (action == R.id.menu_color) {
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null)
imm.hideSoftInputFromWindow(etBody.getWindowToken(), 0);
Bundle args = new Bundle();
args.putInt("color", Color.TRANSPARENT);
args.putString("title", getString(R.string.title_style_color));
args.putInt("start", etBody.getSelectionStart());
args.putInt("end", etBody.getSelectionEnd());
FragmentDialogColor fragment = new FragmentDialogColor();
fragment.setArguments(args);
fragment.setTargetFragment(FragmentCompose.this, REQUEST_COLOR);
fragment.show(getParentFragmentManager(), "account:color");
return true;
} else
return StyleHelper.apply(action, view.findViewById(action), etBody);
}
@ -1752,10 +1732,6 @@ public class FragmentCompose extends FragmentBase {
if (resultCode == RESULT_OK && data != null)
onAnswerSelected(data.getBundleExtra("args"));
break;
case REQUEST_COLOR:
if (resultCode == RESULT_OK && data != null)
onColorSelected(data.getBundleExtra("args"));
break;
case REQUEST_LINK:
if (resultCode == RESULT_OK && data != null)
onLinkSelected(data.getBundleExtra("args"));
@ -2764,14 +2740,6 @@ public class FragmentCompose extends FragmentBase {
etBody.getText().insert(etBody.getSelectionStart(), spanned);
}
private void onColorSelected(Bundle args) {
int color = args.getInt("color");
int start = args.getInt("start");
int end = args.getInt("end");
etBody.setSelection(start, end);
StyleHelper.apply(R.id.menu_color, null, etBody, color);
}
private void onLinkSelected(Bundle args) {
String link = args.getString("link");
int start = args.getInt("start");

@ -1,5 +1,8 @@
package eu.faircode.email;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.text.SpannableString;
import android.text.Spanned;
@ -10,13 +13,18 @@ import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.appcompat.widget.PopupMenu;
import com.flask.colorpicker.ColorPickerView;
import com.flask.colorpicker.builder.ColorPickerClickListener;
import com.flask.colorpicker.builder.ColorPickerDialogBuilder;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
@ -77,27 +85,44 @@ public class StyleHelper {
return true;
}
case R.id.menu_size: {
case R.id.menu_style: {
final int s = start;
final int e = end;
final SpannableString t = ss;
int order = 1;
PopupMenu popupMenu = new PopupMenu(anchor.getContext(), anchor);
popupMenu.getMenu().add(Menu.NONE, R.string.title_style_size_small, order++, R.string.title_style_size_small);
popupMenu.getMenu().add(Menu.NONE, R.string.title_style_size_medium, order++, R.string.title_style_size_medium);
popupMenu.getMenu().add(Menu.NONE, R.string.title_style_size_large, order++, R.string.title_style_size_large);
popupMenu.getMenu().add(0, R.string.title_style_size_small, order++, R.string.title_style_size_small);
popupMenu.getMenu().add(0, R.string.title_style_size_medium, order++, R.string.title_style_size_medium);
popupMenu.getMenu().add(0, R.string.title_style_size_large, order++, R.string.title_style_size_large);
popupMenu.getMenu().add(1, R.string.title_style_color, order++, R.string.title_style_color);
popupMenu.getMenu().add(1, R.string.title_style_font_cursive, order++, R.string.title_style_font_cursive);
popupMenu.getMenu().add(1, R.string.title_style_font_serif, order++, R.string.title_style_font_serif);
popupMenu.getMenu().add(1, R.string.title_style_font_sans_serif, order++, R.string.title_style_font_sans_serif);
popupMenu.getMenu().add(1, R.string.title_style_font_monospace, order++, R.string.title_style_font_monospace);
popupMenu.getMenu().add(1, R.string.title_style_font_default, order++, R.string.title_style_font_default);
popupMenu.getMenu().add(2, R.string.title_style_font_cursive, order++, R.string.title_style_font_cursive);
popupMenu.getMenu().add(2, R.string.title_style_font_serif, order++, R.string.title_style_font_serif);
popupMenu.getMenu().add(2, R.string.title_style_font_sans_serif, order++, R.string.title_style_font_sans_serif);
popupMenu.getMenu().add(2, R.string.title_style_font_monospace, order++, R.string.title_style_font_monospace);
popupMenu.getMenu().add(3, R.string.title_style_clear, order++, R.string.title_style_clear);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getGroupId() == Menu.NONE) {
switch (item.getGroupId()) {
case 0:
return setSize(item);
case 1:
return setColor(item);
case 2:
return setFont(item);
case 3:
return clear(item);
default:
return false;
}
}
private boolean setSize(MenuItem item) {
RelativeSizeSpan[] spans = t.getSpans(s, e, RelativeSizeSpan.class);
for (RelativeSizeSpan span : spans)
t.removeSpan(span);
@ -115,7 +140,63 @@ public class StyleHelper {
etBody.setText(t);
etBody.setSelection(s, e);
} else {
return true;
}
private boolean setColor(MenuItem item) {
InputMethodManager imm = (InputMethodManager) etBody.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null)
imm.hideSoftInputFromWindow(etBody.getWindowToken(), 0);
ColorPickerDialogBuilder builder = ColorPickerDialogBuilder
.with(etBody.getContext())
.setTitle(R.string.title_color)
.showColorEdit(true)
.wheelType(ColorPickerView.WHEEL_TYPE.FLOWER)
.density(6)
.lightnessSliderOnly()
.setPositiveButton(android.R.string.ok, new ColorPickerClickListener() {
@Override
public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) {
_setColor(selectedColor);
}
})
.setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
_setColor(null);
}
});
Dialog dialog = builder.build();
try {
Field fColorEdit = builder.getClass().getDeclaredField("colorEdit");
fColorEdit.setAccessible(true);
EditText colorEdit = (EditText) fColorEdit.get(builder);
colorEdit.setTextColor(Helper.resolveColor(etBody.getContext(), android.R.attr.textColorPrimary));
} catch (Throwable ex) {
Log.w(ex);
}
dialog.show();
return true;
}
private void _setColor(Integer color) {
for (ForegroundColorSpan span : t.getSpans(s, e, ForegroundColorSpan.class))
t.removeSpan(span);
if (color != null)
t.setSpan(new ForegroundColorSpan(color), s, e, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
etBody.setText(t);
etBody.setSelection(s, e);
}
private boolean setFont(MenuItem item) {
TypefaceSpan[] spans = t.getSpans(s, e, TypefaceSpan.class);
for (TypefaceSpan span : spans)
t.removeSpan(span);
@ -143,25 +224,23 @@ public class StyleHelper {
etBody.setText(t);
etBody.setSelection(s, e);
}
return false;
return true;
}
});
popupMenu.show();
private boolean clear(MenuItem item) {
for (Object span : t.getSpans(s, e, Object.class))
if (!(span instanceof ImageSpan))
t.removeSpan(span);
etBody.setText(t);
etBody.setSelection(s, e);
return true;
}
});
case R.id.menu_color: {
for (ForegroundColorSpan span : ss.getSpans(start, end, ForegroundColorSpan.class))
ss.removeSpan(span);
ss.setSpan(new ForegroundColorSpan((int) args[0]), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
etBody.setText(ss);
etBody.setSelection(start, end);
popupMenu.show();
return true;
}

@ -1,14 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M0,20h24v4H0z"
android:fillAlpha=".36"/>
<path
android:fillColor="@android:color/white"
android:pathData="M11,3L5.5,17h2.25l1.12,-3h6.25l1.12,3h2.25L13,3h-2zM9.62,12L12,5.67 14.38,12L9.62,12z"/>
</vector>

@ -233,47 +233,25 @@
app:layout_constraintTop_toTopOf="@id/ivUnderline" />
<ImageView
android:id="@+id/ivSize"
android:id="@+id/ivStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_text_size"
android:contentDescription="@string/title_legend_text_style"
android:padding="12dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivUnderline"
app:srcCompat="@drawable/baseline_format_size_24" />
app:srcCompat="@drawable/baseline_text_format_24" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvSize"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="center_vertical"
android:text="@string/title_legend_text_size"
android:text="@string/title_legend_text_style"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintBottom_toBottomOf="@id/ivSize"
app:layout_constraintBottom_toBottomOf="@id/ivStyle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivSize"
app:layout_constraintTop_toTopOf="@id/ivSize" />
<ImageView
android:id="@+id/ivColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/title_legend_text_color"
android:padding="12dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivSize"
app:srcCompat="@drawable/baseline_format_color_text_24" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvColor"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="center_vertical"
android:text="@string/title_legend_text_color"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintBottom_toBottomOf="@id/ivColor"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivColor"
app:layout_constraintTop_toTopOf="@id/ivColor" />
app:layout_constraintStart_toEndOf="@id/ivStyle"
app:layout_constraintTop_toTopOf="@id/ivStyle" />
</androidx.constraintlayout.widget.ConstraintLayout>
</eu.faircode.email.ScrollViewEx>

@ -16,9 +16,9 @@
android:title="@string/title_style_underline" />
<item
android:id="@+id/menu_size"
android:id="@+id/menu_style"
android:icon="@drawable/baseline_text_format_24"
android:title="@string/title_style_size" />
android:title="@string/title_style" />
<item
android:id="@+id/menu_link"

@ -16,12 +16,7 @@
android:title="@string/title_style_underline" />
<item
android:id="@+id/menu_size"
android:id="@+id/menu_style"
android:icon="@drawable/baseline_text_format_24"
android:title="@string/title_style_size" />
<item
android:id="@+id/menu_color"
android:icon="@drawable/baseline_format_color_text_24"
android:title="@string/title_style_color" />
android:title="@string/title_style" />
</menu>

@ -16,9 +16,9 @@
android:title="@string/title_style_underline" />
<item
android:id="@+id/menu_size"
android:id="@+id/menu_style"
android:icon="@drawable/baseline_text_format_24"
android:title="@string/title_style_size" />
android:title="@string/title_style" />
<item
android:id="@+id/menu_link"

@ -863,23 +863,28 @@
<string name="title_send_priority">Priority</string>
<string name="title_no_server">No server found at \'%1$s\'</string>
<string name="title_style">Style</string>
<string name="title_style_bold">Bold</string>
<string name="title_style_italic">Italic</string>
<string name="title_style_underline">Underline</string>
<string name="title_style_size">Size</string>
<string name="title_style_size_small">Small</string>
<string name="title_style_size_medium">Medium</string>
<string name="title_style_size_large">Large</string>
<string name="title_style_font">Font</string>
<string name="title_style_font_cursive">Cursive</string>
<string name="title_style_font_serif">Serif</string>
<string name="title_style_font_sans_serif">Sans-serif</string>
<string name="title_style_font_monospace">Monospace</string>
<string name="title_style_font_default">Default</string>
<string name="title_style_color">Color</string>
<string name="title_style_color">Color &#8230;</string>
<string name="title_style_clear">Clear formatting</string>
<string name="title_style_link">Insert link</string>
<string name="title_add_image">Add image</string>
<string name="title_add_image_inline">Insert</string>
<string name="title_add_image_attach">Attach</string>
@ -1167,8 +1172,7 @@
<string name="title_legend_bold">Make text bold</string>
<string name="title_legend_italic">Make text italic</string>
<string name="title_legend_underline">Underline text</string>
<string name="title_legend_text_size">Set text size</string>
<string name="title_legend_text_color">Set text color</string>
<string name="title_legend_text_style">Set text style</string>
<string name="title_legend_metered">Connection is metered</string>
<string name="title_legend_unmetered">Connection is unmetered</string>

Loading…
Cancel
Save