diff options
author | stefan-niedermann <info@niedermann.it> | 2019-02-07 00:45:03 +0300 |
---|---|---|
committer | stefan-niedermann <info@niedermann.it> | 2019-02-07 00:45:03 +0300 |
commit | b1b2d64cb754e7409a5829d7ef6476412f0afce4 (patch) | |
tree | c70814bf034bff11eab49e0ea5f13e7e9193305c /app/src | |
parent | c8f1581a2b18a2f1ff294f2879a1935ad12eae21 (diff) |
Enable link creation and bold/italic toggle
Diffstat (limited to 'app/src')
-rw-r--r-- | app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java | 70 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_insert_link_black_24dp.xml | 5 | ||||
-rw-r--r-- | app/src/main/res/menu/style.xml | 4 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 1 |
4 files changed, 60 insertions, 20 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java b/app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java index e601c064..50fea152 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/StyleCallback.java @@ -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 @@ -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); - break; + 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; } @@ -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); + } } diff --git a/app/src/main/res/drawable/ic_insert_link_black_24dp.xml b/app/src/main/res/drawable/ic_insert_link_black_24dp.xml new file mode 100644 index 00000000..3672c276 --- /dev/null +++ b/app/src/main/res/drawable/ic_insert_link_black_24dp.xml @@ -0,0 +1,5 @@ +<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> diff --git a/app/src/main/res/menu/style.xml b/app/src/main/res/menu/style.xml index 5d187654..7d671bb1 100644 --- a/app/src/main/res/menu/style.xml +++ b/app/src/main/res/menu/style.xml @@ -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 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a3f9966..f6528e8a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -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> |