Loading app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java +5 −5 Original line number Diff line number Diff line package it.niedermann.owncloud.notes; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast; Loading @@ -9,8 +9,9 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import it.niedermann.owncloud.notes.shared.model.DBNote; import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.shared.model.DBNote; import it.niedermann.owncloud.notes.shared.util.ShareUtil; public class AppendToNoteActivity extends MainActivity { Loading @@ -22,8 +23,7 @@ public class AppendToNoteActivity extends MainActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent receivedIntent = getIntent(); receivedText = receivedIntent.getStringExtra(Intent.EXTRA_TEXT); receivedText = ShareUtil.extractSharedText(getIntent()); @Nullable final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { getSupportActionBar().setTitle(R.string.append_to_note); Loading @@ -35,7 +35,7 @@ public class AppendToNoteActivity extends MainActivity { @Override public void onNoteClick(int position, View v) { if (receivedText != null && receivedText.length() > 0) { if (!TextUtils.isEmpty(receivedText)) { final DBNote note = db.getNote(localAccount.getId(), ((DBNote) adapter.getItem(position)).getId()); final String oldContent = note.getContent(); String newContent; Loading app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +6 −2 Original line number Diff line number Diff line Loading @@ -15,19 +15,23 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.Objects; import it.niedermann.android.markdown.MarkdownUtil; import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityEditBinding; import it.niedermann.owncloud.notes.accountpicker.AccountPickerListener; import it.niedermann.owncloud.notes.databinding.ActivityEditBinding; import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.shared.model.Category; import it.niedermann.owncloud.notes.shared.model.CloudNote; import it.niedermann.owncloud.notes.shared.model.DBNote; import it.niedermann.owncloud.notes.shared.model.LocalAccount; import it.niedermann.owncloud.notes.shared.util.NoteUtil; import it.niedermann.owncloud.notes.shared.util.ShareUtil; public class EditNoteActivity extends LockedActivity implements BaseNoteFragment.NoteFragmentListener, AccountPickerListener { Loading Loading @@ -170,7 +174,7 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment (Intent.ACTION_SEND.equals(intent.getAction()) || INTENT_GOOGLE_ASSISTANT.equals(intent.getAction())) ) { content = intent.getStringExtra(Intent.EXTRA_TEXT); content = ShareUtil.extractSharedText(intent); } else if (intent.hasExtra(PARAM_CONTENT)) { content = intent.getStringExtra(PARAM_CONTENT); } Loading app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.javadeleted 100644 → 0 +0 −132 Original line number Diff line number Diff line /* * Nextcloud Notes application * * @author Mario Danic * Copyright (C) 2018 Mario Danic <mario@lovelyhq.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package it.niedermann.owncloud.notes.shared.util; import android.content.Context; import android.graphics.Color; import android.text.Spannable; import android.text.TextPaint; import android.text.TextUtils; import android.text.style.MetricAffectingSpan; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import java.util.regex.Matcher; import java.util.regex.Pattern; import it.niedermann.android.util.ColorUtil; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; public class DisplayUtils { private DisplayUtils() { } public static Spannable searchAndColor(Spannable spannable, CharSequence searchText, @NonNull Context context, @Nullable Integer current, @ColorInt int mainColor, @ColorInt int textColor) { CharSequence text = spannable.toString(); Object[] spansToRemove = spannable.getSpans(0, text.length(), Object.class); for (Object span : spansToRemove) { if (span instanceof SearchSpan) spannable.removeSpan(span); } if (TextUtils.isEmpty(text) || TextUtils.isEmpty(searchText)) { return spannable; } Matcher m = Pattern.compile(searchText.toString(), Pattern.CASE_INSENSITIVE | Pattern.LITERAL) .matcher(text); int i = 1; while (m.find()) { int start = m.start(); int end = m.end(); spannable.setSpan(new SearchSpan(context, mainColor, textColor, (current != null && i == current)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); i++; } return spannable; } static class SearchSpan extends MetricAffectingSpan { private final boolean current; @NonNull Context context; @ColorInt private final int mainColor; @ColorInt private final int textColor; @ColorInt private final int highlightColor; SearchSpan(@NonNull Context context, @ColorInt int mainColor, @ColorInt int textColor, boolean current) { this.context = context; this.mainColor = mainColor; this.textColor = textColor; this.current = current; this.highlightColor = ContextCompat.getColor(context, R.color.bg_highlighted); } @Override public void updateDrawState(TextPaint tp) { if (current) { if (NotesApplication.isDarkThemeActive(context)) { if (ColorUtil.INSTANCE.isColorDark(mainColor)) { tp.bgColor = Color.WHITE; tp.setColor(mainColor); } else { tp.bgColor = mainColor; tp.setColor(Color.BLACK); } } else { if (ColorUtil.INSTANCE.isColorDark(mainColor)) { tp.bgColor = mainColor; tp.setColor(Color.WHITE); } else { if (NotesColorUtil.contrastRatioIsSufficient(mainColor, highlightColor)) { tp.bgColor = highlightColor; } else { tp.bgColor = Color.BLACK; } tp.setColor(mainColor); } } } else { tp.bgColor = highlightColor; tp.setColor(BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor)); } tp.setFakeBoldText(true); } @Override public void updateMeasureState(@NonNull TextPaint tp) { tp.setFakeBoldText(true); } } } app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java +28 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,11 @@ import android.content.Intent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.net.MalformedURLException; import java.net.URL; import it.niedermann.android.markdown.MarkdownUtil; import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; public class ShareUtil { Loading @@ -17,4 +22,27 @@ public class ShareUtil { .putExtra(Intent.EXTRA_TITLE, subject) .putExtra(Intent.EXTRA_TEXT, text), subject)); } public static String extractSharedText(@NonNull Intent intent) { final String text = intent.getStringExtra(Intent.EXTRA_TEXT); if (intent.hasExtra(Intent.EXTRA_SUBJECT)) { final String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); try { new URL(text); if (text != null && subject != null && !subject.trim().isEmpty()) { return MarkdownUtil.getMarkdownLink(subject, text); } else { return text; } } catch (MalformedURLException e) { if (subject != null && !subject.trim().isEmpty()) { return subject + ": " + text; } else { return text; } } } else { return text; } } } markdown/src/main/java/it/niedermann/android/markdown/MarkdownUtil.java +6 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import io.noties.markwon.Markwon; import it.niedermann.android.markdown.model.SearchSpan; import it.niedermann.android.markdown.model.EListType; import it.niedermann.android.markdown.model.SearchSpan; public class MarkdownUtil { Loading Loading @@ -337,4 +337,8 @@ public class MarkdownUtil { return spannableContent; } } public static String getMarkdownLink(@NonNull String text, @NonNull String url) { return "[" + text + "](" + url + ")"; } } Loading
app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java +5 −5 Original line number Diff line number Diff line package it.niedermann.owncloud.notes; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast; Loading @@ -9,8 +9,9 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import it.niedermann.owncloud.notes.shared.model.DBNote; import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.shared.model.DBNote; import it.niedermann.owncloud.notes.shared.util.ShareUtil; public class AppendToNoteActivity extends MainActivity { Loading @@ -22,8 +23,7 @@ public class AppendToNoteActivity extends MainActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent receivedIntent = getIntent(); receivedText = receivedIntent.getStringExtra(Intent.EXTRA_TEXT); receivedText = ShareUtil.extractSharedText(getIntent()); @Nullable final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { getSupportActionBar().setTitle(R.string.append_to_note); Loading @@ -35,7 +35,7 @@ public class AppendToNoteActivity extends MainActivity { @Override public void onNoteClick(int position, View v) { if (receivedText != null && receivedText.length() > 0) { if (!TextUtils.isEmpty(receivedText)) { final DBNote note = db.getNote(localAccount.getId(), ((DBNote) adapter.getItem(position)).getId()); final String oldContent = note.getContent(); String newContent; Loading
app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +6 −2 Original line number Diff line number Diff line Loading @@ -15,19 +15,23 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.Objects; import it.niedermann.android.markdown.MarkdownUtil; import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityEditBinding; import it.niedermann.owncloud.notes.accountpicker.AccountPickerListener; import it.niedermann.owncloud.notes.databinding.ActivityEditBinding; import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.shared.model.Category; import it.niedermann.owncloud.notes.shared.model.CloudNote; import it.niedermann.owncloud.notes.shared.model.DBNote; import it.niedermann.owncloud.notes.shared.model.LocalAccount; import it.niedermann.owncloud.notes.shared.util.NoteUtil; import it.niedermann.owncloud.notes.shared.util.ShareUtil; public class EditNoteActivity extends LockedActivity implements BaseNoteFragment.NoteFragmentListener, AccountPickerListener { Loading Loading @@ -170,7 +174,7 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment (Intent.ACTION_SEND.equals(intent.getAction()) || INTENT_GOOGLE_ASSISTANT.equals(intent.getAction())) ) { content = intent.getStringExtra(Intent.EXTRA_TEXT); content = ShareUtil.extractSharedText(intent); } else if (intent.hasExtra(PARAM_CONTENT)) { content = intent.getStringExtra(PARAM_CONTENT); } Loading
app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.javadeleted 100644 → 0 +0 −132 Original line number Diff line number Diff line /* * Nextcloud Notes application * * @author Mario Danic * Copyright (C) 2018 Mario Danic <mario@lovelyhq.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package it.niedermann.owncloud.notes.shared.util; import android.content.Context; import android.graphics.Color; import android.text.Spannable; import android.text.TextPaint; import android.text.TextUtils; import android.text.style.MetricAffectingSpan; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import java.util.regex.Matcher; import java.util.regex.Pattern; import it.niedermann.android.util.ColorUtil; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; public class DisplayUtils { private DisplayUtils() { } public static Spannable searchAndColor(Spannable spannable, CharSequence searchText, @NonNull Context context, @Nullable Integer current, @ColorInt int mainColor, @ColorInt int textColor) { CharSequence text = spannable.toString(); Object[] spansToRemove = spannable.getSpans(0, text.length(), Object.class); for (Object span : spansToRemove) { if (span instanceof SearchSpan) spannable.removeSpan(span); } if (TextUtils.isEmpty(text) || TextUtils.isEmpty(searchText)) { return spannable; } Matcher m = Pattern.compile(searchText.toString(), Pattern.CASE_INSENSITIVE | Pattern.LITERAL) .matcher(text); int i = 1; while (m.find()) { int start = m.start(); int end = m.end(); spannable.setSpan(new SearchSpan(context, mainColor, textColor, (current != null && i == current)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); i++; } return spannable; } static class SearchSpan extends MetricAffectingSpan { private final boolean current; @NonNull Context context; @ColorInt private final int mainColor; @ColorInt private final int textColor; @ColorInt private final int highlightColor; SearchSpan(@NonNull Context context, @ColorInt int mainColor, @ColorInt int textColor, boolean current) { this.context = context; this.mainColor = mainColor; this.textColor = textColor; this.current = current; this.highlightColor = ContextCompat.getColor(context, R.color.bg_highlighted); } @Override public void updateDrawState(TextPaint tp) { if (current) { if (NotesApplication.isDarkThemeActive(context)) { if (ColorUtil.INSTANCE.isColorDark(mainColor)) { tp.bgColor = Color.WHITE; tp.setColor(mainColor); } else { tp.bgColor = mainColor; tp.setColor(Color.BLACK); } } else { if (ColorUtil.INSTANCE.isColorDark(mainColor)) { tp.bgColor = mainColor; tp.setColor(Color.WHITE); } else { if (NotesColorUtil.contrastRatioIsSufficient(mainColor, highlightColor)) { tp.bgColor = highlightColor; } else { tp.bgColor = Color.BLACK; } tp.setColor(mainColor); } } } else { tp.bgColor = highlightColor; tp.setColor(BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor)); } tp.setFakeBoldText(true); } @Override public void updateMeasureState(@NonNull TextPaint tp) { tp.setFakeBoldText(true); } } }
app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java +28 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,11 @@ import android.content.Intent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.net.MalformedURLException; import java.net.URL; import it.niedermann.android.markdown.MarkdownUtil; import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; public class ShareUtil { Loading @@ -17,4 +22,27 @@ public class ShareUtil { .putExtra(Intent.EXTRA_TITLE, subject) .putExtra(Intent.EXTRA_TEXT, text), subject)); } public static String extractSharedText(@NonNull Intent intent) { final String text = intent.getStringExtra(Intent.EXTRA_TEXT); if (intent.hasExtra(Intent.EXTRA_SUBJECT)) { final String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); try { new URL(text); if (text != null && subject != null && !subject.trim().isEmpty()) { return MarkdownUtil.getMarkdownLink(subject, text); } else { return text; } } catch (MalformedURLException e) { if (subject != null && !subject.trim().isEmpty()) { return subject + ": " + text; } else { return text; } } } else { return text; } } }
markdown/src/main/java/it/niedermann/android/markdown/MarkdownUtil.java +6 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import io.noties.markwon.Markwon; import it.niedermann.android.markdown.model.SearchSpan; import it.niedermann.android.markdown.model.EListType; import it.niedermann.android.markdown.model.SearchSpan; public class MarkdownUtil { Loading Loading @@ -337,4 +337,8 @@ public class MarkdownUtil { return spannableContent; } } public static String getMarkdownLink(@NonNull String text, @NonNull String url) { return "[" + text + "](" + url + ")"; } }