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

Commit 95658a6d authored by stefan-niedermann's avatar stefan-niedermann
Browse files

Implement menu for context based formatting without selected range

parent 052c6202
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -37,8 +37,8 @@ import butterknife.ButterKnife;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.model.CloudNote;
import it.niedermann.owncloud.notes.model.ISyncCallback;
import it.niedermann.owncloud.notes.util.ContextBasedFormattingCallback;
import it.niedermann.owncloud.notes.util.ContextBasedRangeFormattingCallback;
import it.niedermann.owncloud.notes.util.format.ContextBasedFormattingCallback;
import it.niedermann.owncloud.notes.util.format.ContextBasedRangeFormattingCallback;
import it.niedermann.owncloud.notes.util.DisplayUtils;
import it.niedermann.owncloud.notes.util.MarkDownUtil;
import it.niedermann.owncloud.notes.util.NotesTextWatcher;
+14 −11
Original line number Diff line number Diff line
@@ -34,8 +34,6 @@ import com.yydcdut.markdown.MarkdownProcessor;
import com.yydcdut.markdown.MarkdownTextView;
import com.yydcdut.markdown.syntax.text.TextFactory;

import java.util.Objects;

import butterknife.BindView;
import butterknife.ButterKnife;
import it.niedermann.owncloud.notes.R;
@@ -47,6 +45,11 @@ import it.niedermann.owncloud.notes.util.MarkDownUtil;
import it.niedermann.owncloud.notes.util.NoteLinksUtils;
import it.niedermann.owncloud.notes.util.SSOUtil;

import static it.niedermann.owncloud.notes.util.MarkDownUtil.CHECKBOX_CHECKED_MINUS;
import static it.niedermann.owncloud.notes.util.MarkDownUtil.CHECKBOX_CHECKED_STAR;
import static it.niedermann.owncloud.notes.util.MarkDownUtil.CHECKBOX_UNCHECKED_MINUS;
import static it.niedermann.owncloud.notes.util.MarkDownUtil.CHECKBOX_UNCHECKED_STAR;

public class NotePreviewFragment extends SearchableBaseNoteFragment implements OnRefreshListener {

    private String changedText;
@@ -115,8 +118,8 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ButterKnife.bind(this, Objects.requireNonNull(getView()));
        markdownProcessor = new MarkdownProcessor(getContext());
        ButterKnife.bind(this, requireView());
        markdownProcessor = new MarkdownProcessor(requireContext());
        markdownProcessor.factory(TextFactory.create());
        markdownProcessor.config(
                MarkDownUtil.getMarkDownConfiguration(noteContent.getContext())
@@ -142,12 +145,12 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
                                         * When (un)checking a checkbox which is in the last line, every time it gets toggled, the last character of the line gets lost.
                                         * When (un)checking a checkbox, every markdown gets stripped in the given line argument
                                         */
                                        if (lines[lineNumber].startsWith("- [ ]") || lines[lineNumber].startsWith("* [ ]")) {
                                            lines[lineNumber] = lines[lineNumber].replace("- [ ]", "- [x]");
                                            lines[lineNumber] = lines[lineNumber].replace("* [ ]", "* [x]");
                                        if (lines[lineNumber].startsWith(CHECKBOX_UNCHECKED_MINUS) || lines[lineNumber].startsWith(CHECKBOX_UNCHECKED_STAR)) {
                                            lines[lineNumber] = lines[lineNumber].replace(CHECKBOX_UNCHECKED_MINUS, CHECKBOX_CHECKED_MINUS);
                                            lines[lineNumber] = lines[lineNumber].replace(CHECKBOX_UNCHECKED_STAR, CHECKBOX_CHECKED_STAR);
                                        } else {
                                            lines[lineNumber] = lines[lineNumber].replace("- [x]", "- [ ]");
                                            lines[lineNumber] = lines[lineNumber].replace("* [x]", "* [ ]");
                                            lines[lineNumber] = lines[lineNumber].replace(CHECKBOX_CHECKED_MINUS, CHECKBOX_UNCHECKED_MINUS);
                                            lines[lineNumber] = lines[lineNumber].replace(CHECKBOX_CHECKED_STAR, CHECKBOX_UNCHECKED_STAR);
                                        }

                                        changedText = TextUtils.join("\n", lines);
@@ -164,7 +167,7 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
                            if (NoteLinksUtils.isNoteLink(link)) {
                                long noteRemoteId = NoteLinksUtils.extractNoteRemoteId(link);
                                long noteLocalId = db.getLocalIdByRemoteId(this.note.getAccountId(), noteRemoteId);
                                Intent intent = new Intent(getActivity().getApplicationContext(), EditNoteActivity.class);
                                Intent intent = new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class);
                                intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, noteLocalId);
                                startActivity(intent);
                            } else {
@@ -188,7 +191,7 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
        db = NoteSQLiteOpenHelper.getInstance(getContext());
        swipeRefreshLayout.setOnRefreshListener(this);

        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(getActivity()).getApplicationContext());
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext());
        noteContent.setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSizeFromPreferences(sp));
        if (sp.getBoolean(getString(R.string.pref_key_font), false)) {
            noteContent.setTypeface(Typeface.MONOSPACE);
+34 −0
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes.util;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.util.Log;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Objects;

import static android.content.Context.CLIPBOARD_SERVICE;

public class ClipboardUtil {

    private static final String TAG = ClipboardUtil.class.getCanonicalName();

    private ClipboardUtil() {
        // Util class
    }

    public static String getClipboardURLorNull(Context context) {
        String clipboardURL = null;
        ClipData clipboardData = Objects.requireNonNull(((ClipboardManager) Objects.requireNonNull(context.getSystemService(CLIPBOARD_SERVICE))).getPrimaryClip());
        if (clipboardData.getItemCount() > 0) {
            try {
                clipboardURL = new URL(clipboardData.getItemAt(0).getText().toString()).toString();
            } catch (MalformedURLException e) {
                Log.d(TAG, "Clipboard does not contain a valid URL: " + clipboardURL);
            }
        }
        return clipboardURL;
    }
}
+24 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import android.content.Context;
import android.graphics.Color;
import android.text.Spanned;

import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;

import com.yydcdut.markdown.MarkdownConfiguration;
@@ -18,8 +19,16 @@ import it.niedermann.owncloud.notes.R;
 * Created by stefan on 07.12.16.
 */

@SuppressWarnings("WeakerAccess")
public class MarkDownUtil {

    public static final String CHECKBOX_UNCHECKED_MINUS = "- [ ]";
    public static final String CHECKBOX_UNCHECKED_MINUS_TRAILING_SPACE = CHECKBOX_UNCHECKED_MINUS + " ";
    public static final String CHECKBOX_UNCHECKED_STAR = "* [ ]";
    public static final String CHECKBOX_UNCHECKED_STAR_TRAILING_SPACE = CHECKBOX_UNCHECKED_STAR + " ";
    public static final String CHECKBOX_CHECKED_MINUS = "- [x]";
    public static final String CHECKBOX_CHECKED_STAR = "* [x]";

    /**
     * Ensures every instance of RxMD uses the same configuration
     *
@@ -51,8 +60,22 @@ public class MarkDownUtil {
                .setDefaultImageSize(400, 300);
    }

    public static boolean containsImageSpan(CharSequence text) {
    public static boolean containsImageSpan(@NonNull CharSequence text) {
        return ((Spanned) text).getSpans(0, text.length(), MDImageSpan.class).length > 0;
    }

    public static boolean lineStartsWithCheckbox(@NonNull String line, boolean starAsLeadingCharacter) {
        return starAsLeadingCharacter
                ? line.startsWith(CHECKBOX_UNCHECKED_STAR) || line.startsWith(CHECKBOX_CHECKED_STAR)
                : line.startsWith(CHECKBOX_UNCHECKED_MINUS) || line.startsWith(CHECKBOX_CHECKED_MINUS);
    }

    public static int getStartOfLine(@NonNull CharSequence s, int start) {
        int startOfLine = start;
        while (startOfLine > 0 && s.charAt(startOfLine - 1) != '\n') {
            startOfLine--;
        }
        return startOfLine;
    }
}
+15 −28
Original line number Diff line number Diff line
@@ -5,6 +5,11 @@ import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;

import androidx.annotation.NonNull;

import static it.niedermann.owncloud.notes.util.MarkDownUtil.CHECKBOX_UNCHECKED_MINUS_TRAILING_SPACE;
import static it.niedermann.owncloud.notes.util.MarkDownUtil.CHECKBOX_UNCHECKED_STAR_TRAILING_SPACE;

/**
 * Implements auto-continuation for checked-lists
 */
@@ -14,10 +19,6 @@ public abstract class NotesTextWatcher implements TextWatcher {

    private static final String codeBlock = "```";

    private static final String uncheckedMinusCheckbox = "- [ ] ";
    private static final String uncheckedStarCheckbox = "* [ ] ";
    private static final String checkedMinusCheckbox = "- [x] ";
    private static final String checkedStarCheckbox = "* [x] ";
    private static final int lengthCheckbox = 6;

    private boolean resetSelection = false;
@@ -59,32 +60,24 @@ public abstract class NotesTextWatcher implements TextWatcher {
        }
    }

    private void autoContinueCheckboxListsOnEnter(CharSequence s, int start, int count) {
    private void autoContinueCheckboxListsOnEnter(@NonNull CharSequence s, int start, int count) {
        // Find start of line
        int startOfLine = getStartOfLine(s, start);
        int startOfLine = MarkDownUtil.getStartOfLine(s, start);
        String line = s.subSequence(startOfLine, start).toString();

        if (line.equals(uncheckedMinusCheckbox) || line.equals(uncheckedStarCheckbox)) {
        if (line.equals(CHECKBOX_UNCHECKED_MINUS_TRAILING_SPACE) || line.equals(CHECKBOX_UNCHECKED_STAR_TRAILING_SPACE)) {
            editText.setSelection(startOfLine + 1);
            setNewText(new StringBuilder(s).replace(startOfLine, startOfLine + lengthCheckbox + 1, "\n"), startOfLine + 1);
        } else if (lineStartsWithCheckbox(line, false)) {
            setNewText(new StringBuilder(s).insert(start + count, uncheckedMinusCheckbox), start + lengthCheckbox + 1);
        } else if (lineStartsWithCheckbox(line, true)) {
            setNewText(new StringBuilder(s).insert(start + count, uncheckedStarCheckbox), start + lengthCheckbox + 1);
        } else if (MarkDownUtil.lineStartsWithCheckbox(line, false)) {
            setNewText(new StringBuilder(s).insert(start + count, CHECKBOX_UNCHECKED_MINUS_TRAILING_SPACE), start + lengthCheckbox + 1);
        } else if (MarkDownUtil.lineStartsWithCheckbox(line, true)) {
            setNewText(new StringBuilder(s).insert(start + count, CHECKBOX_UNCHECKED_STAR_TRAILING_SPACE), start + lengthCheckbox + 1);
        }
    }

    private static int getStartOfLine(CharSequence s, int start) {
        int startOfLine = start;
        while (startOfLine > 0 && s.charAt(startOfLine - 1) != '\n') {
            startOfLine--;
        }
        return startOfLine;
    }

    private void preventCursorJumpToTopWithinCodeBlock(CharSequence s, int start, int count) {
    private void preventCursorJumpToTopWithinCodeBlock(@NonNull CharSequence s, int start, int count) {
        // Find start of line
        int startOfLine = getStartOfLine(s, start);
        int startOfLine = MarkDownUtil.getStartOfLine(s, start);
        String line = s.subSequence(startOfLine, start).toString();
        if (line.startsWith(codeBlock)) {
            // "start" is the direct sibling of the codeBlock
@@ -104,13 +97,7 @@ public abstract class NotesTextWatcher implements TextWatcher {
        }
    }

    static boolean lineStartsWithCheckbox(String line, boolean starAsLeadingCharacter) {
        return starAsLeadingCharacter
                ? line.startsWith(uncheckedStarCheckbox) || line.startsWith(checkedStarCheckbox)
                : line.startsWith(uncheckedMinusCheckbox) || line.startsWith(checkedMinusCheckbox);
    }

    private void setNewText(StringBuilder newText, int selection) {
    private void setNewText(@NonNull StringBuilder newText, int selection) {
        editText.setText(newText);
        editText.setSelection(selection);
    }
Loading