Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1b2d64c authored by stefan-niedermann's avatar stefan-niedermann
Browse files

Enable link creation and bold/italic toggle

parent c8f1581a
Loading
Loading
Loading
Loading
+50 −20
Original line number Diff line number Diff line
@@ -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);
                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);
    }
}
+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>
+4 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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>