Loading app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java +50 −20 Original line number Diff line number Diff line Loading @@ -7,16 +7,16 @@ import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; import android.widget.EditText; import it.niedermann.owncloud.notes.R; public class StyleCallback implements ActionMode.Callback { private TextView textView; private EditText editText; public StyleCallback(TextView textView) { this.textView = textView; public StyleCallback(EditText editText) { this.editText = editText; } @Override Loading @@ -34,29 +34,39 @@ public class StyleCallback implements ActionMode.Callback { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { int start = textView.getSelectionStart(); int end = textView.getSelectionEnd(); SpannableStringBuilder ssb = new SpannableStringBuilder(textView.getText()); int start = editText.getSelectionStart(); int end = editText.getSelectionEnd(); SpannableStringBuilder ssb = new SpannableStringBuilder(editText.getText()); final String markdown; switch(item.getItemId()) { case R.id.bold: markdown = "**"; ssb.insert(end, markdown); ssb.insert(start, markdown); textView.getText().charAt(start); textView.getText().charAt(start + 1); end += markdown.length() * 2; ssb.setSpan(new StyleSpan(Typeface.BOLD), start, end, 1); textView.setText(ssb); if (hasAlreadyMarkdown(start, end, markdown)) { this.removeMarkdown(ssb, start, end, markdown); } else { this.addMarkdown(ssb, start, end, markdown, Typeface.BOLD); } editText.setText(ssb); break; case R.id.italic: markdown = "*"; ssb.insert(end, markdown); ssb.insert(start, markdown); end += markdown.length() * 2; ssb.setSpan(new StyleSpan(Typeface.ITALIC), start, end, 1); textView.setText(ssb); if (hasAlreadyMarkdown(start, end, markdown)) { this.removeMarkdown(ssb, start, end, markdown); } else { this.addMarkdown(ssb, start, end, markdown, Typeface.ITALIC); } editText.setText(ssb); break; case R.id.link: ssb.insert(end, "]()"); ssb.insert(start, "["); end++; ssb.setSpan(new StyleSpan(Typeface.NORMAL), start, end, 1); editText.setText(ssb); editText.setSelection(end + 2); // after <end>]( return true; } return false; } Loading @@ -65,4 +75,24 @@ public class StyleCallback implements ActionMode.Callback { public void onDestroyActionMode(ActionMode mode) { } private boolean hasAlreadyMarkdown(int start, int end, String markdown) { return start > markdown.length() && markdown.contentEquals(editText.getText().subSequence(start - markdown.length(), start)) && editText.getText().length() > end + markdown.length() && markdown.contentEquals(editText.getText().subSequence(end, end + markdown.length())); } private void removeMarkdown(SpannableStringBuilder ssb, int start, int end, String markdown) { ssb.delete(start - markdown.length(), start); ssb.delete(end - markdown.length(), end); ssb.setSpan(new StyleSpan(Typeface.NORMAL), start, end, 1); } private void addMarkdown(SpannableStringBuilder ssb, int start, int end, String markdown, int typeface) { ssb.insert(end, markdown); ssb.insert(start, markdown); editText.getText().charAt(start); editText.getText().charAt(start + 1); end += markdown.length() * 2; ssb.setSpan(new StyleSpan(typeface), start, end, 1); } } app/src/main/res/drawable/ic_insert_link_black_24dp.xml 0 → 100644 +5 −0 Original line number Diff line number Diff line <vector android:autoMirrored="true" android:height="24dp" android:tint="#666666" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z"/> </vector> app/src/main/res/menu/style.xml +4 −0 Original line number Diff line number Diff line Loading @@ -9,4 +9,8 @@ android:icon="@drawable/ic_format_bold_black_24dp" android:title="@string/simple_bold" app:showAsAction="ifRoom" /> <item android:id="@+id/link" android:icon="@drawable/ic_insert_link_black_24dp" android:title="@string/simple_link" app:showAsAction="ifRoom" /> </menu> No newline at end of file app/src/main/res/values/strings.xml +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ <string name="action_edit_saved">Saved</string> <string name="simple_about">About</string> <string name="simple_bold">Bold</string> <string name="simple_link">Link</string> <string name="simple_italic">Italic</string> <string name="action_select_note">Select note</string> <string name="action_note_deleted">Note deleted</string> Loading Loading
app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java +50 −20 Original line number Diff line number Diff line Loading @@ -7,16 +7,16 @@ import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; import android.widget.EditText; import it.niedermann.owncloud.notes.R; public class StyleCallback implements ActionMode.Callback { private TextView textView; private EditText editText; public StyleCallback(TextView textView) { this.textView = textView; public StyleCallback(EditText editText) { this.editText = editText; } @Override Loading @@ -34,29 +34,39 @@ public class StyleCallback implements ActionMode.Callback { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { int start = textView.getSelectionStart(); int end = textView.getSelectionEnd(); SpannableStringBuilder ssb = new SpannableStringBuilder(textView.getText()); int start = editText.getSelectionStart(); int end = editText.getSelectionEnd(); SpannableStringBuilder ssb = new SpannableStringBuilder(editText.getText()); final String markdown; switch(item.getItemId()) { case R.id.bold: markdown = "**"; ssb.insert(end, markdown); ssb.insert(start, markdown); textView.getText().charAt(start); textView.getText().charAt(start + 1); end += markdown.length() * 2; ssb.setSpan(new StyleSpan(Typeface.BOLD), start, end, 1); textView.setText(ssb); if (hasAlreadyMarkdown(start, end, markdown)) { this.removeMarkdown(ssb, start, end, markdown); } else { this.addMarkdown(ssb, start, end, markdown, Typeface.BOLD); } editText.setText(ssb); break; case R.id.italic: markdown = "*"; ssb.insert(end, markdown); ssb.insert(start, markdown); end += markdown.length() * 2; ssb.setSpan(new StyleSpan(Typeface.ITALIC), start, end, 1); textView.setText(ssb); if (hasAlreadyMarkdown(start, end, markdown)) { this.removeMarkdown(ssb, start, end, markdown); } else { this.addMarkdown(ssb, start, end, markdown, Typeface.ITALIC); } editText.setText(ssb); break; case R.id.link: ssb.insert(end, "]()"); ssb.insert(start, "["); end++; ssb.setSpan(new StyleSpan(Typeface.NORMAL), start, end, 1); editText.setText(ssb); editText.setSelection(end + 2); // after <end>]( return true; } return false; } Loading @@ -65,4 +75,24 @@ public class StyleCallback implements ActionMode.Callback { public void onDestroyActionMode(ActionMode mode) { } private boolean hasAlreadyMarkdown(int start, int end, String markdown) { return start > markdown.length() && markdown.contentEquals(editText.getText().subSequence(start - markdown.length(), start)) && editText.getText().length() > end + markdown.length() && markdown.contentEquals(editText.getText().subSequence(end, end + markdown.length())); } private void removeMarkdown(SpannableStringBuilder ssb, int start, int end, String markdown) { ssb.delete(start - markdown.length(), start); ssb.delete(end - markdown.length(), end); ssb.setSpan(new StyleSpan(Typeface.NORMAL), start, end, 1); } private void addMarkdown(SpannableStringBuilder ssb, int start, int end, String markdown, int typeface) { ssb.insert(end, markdown); ssb.insert(start, markdown); editText.getText().charAt(start); editText.getText().charAt(start + 1); end += markdown.length() * 2; ssb.setSpan(new StyleSpan(typeface), start, end, 1); } }
app/src/main/res/drawable/ic_insert_link_black_24dp.xml 0 → 100644 +5 −0 Original line number Diff line number Diff line <vector android:autoMirrored="true" android:height="24dp" android:tint="#666666" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z"/> </vector>
app/src/main/res/menu/style.xml +4 −0 Original line number Diff line number Diff line Loading @@ -9,4 +9,8 @@ android:icon="@drawable/ic_format_bold_black_24dp" android:title="@string/simple_bold" app:showAsAction="ifRoom" /> <item android:id="@+id/link" android:icon="@drawable/ic_insert_link_black_24dp" android:title="@string/simple_link" app:showAsAction="ifRoom" /> </menu> No newline at end of file
app/src/main/res/values/strings.xml +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ <string name="action_edit_saved">Saved</string> <string name="simple_about">About</string> <string name="simple_bold">Bold</string> <string name="simple_link">Link</string> <string name="simple_italic">Italic</string> <string name="action_select_note">Select note</string> <string name="action_note_deleted">Note deleted</string> Loading