Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-notes.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2021-01-05 21:46:46 +0300
committerStefan Niedermann <info@niedermann.it>2021-01-05 21:46:46 +0300
commitefa1a8f9cbf786b7c391dbbf07dd8aa78e0ccac4 (patch)
treec4057a69238a41492cd1119d31378b5380c71a3b /app/src/main/java
parent0fe4b5b4b101e6a303e9b9629d38dace6de2651f (diff)
parent8fdbd61b683444df52bdc0e2209b2254013f8fc9 (diff)
Merge branch 'master' into 831-room
# Conflicts: # app/build.gradle # app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java # app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java # app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java # app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java # app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java # app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java # app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java # app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java # app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java # app/src/main/res/drawable/ic_format_bold_black_24dp.xml # app/src/main/res/drawable/ic_format_italic_black_24dp.xml # app/src/main/res/drawable/ic_insert_link_black_24dp.xml # app/src/main/res/menu/context_based_formatting.xml # app/src/main/res/menu/context_based_range_formatting.xml # app/src/main/res/values/strings.xml # app/src/test/java/it/niedermann/owncloud/notes/shared/util/MarkDownUtilTest.java # app/src/test/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessorTest.java
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java154
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/NotesApplication.java2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java71
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java14
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java4
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java38
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java205
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java131
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java9
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java3
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java3
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java3
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesFragment.java5
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java3
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/MarkDownUtil.java124
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java26
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java26
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java63
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java11
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java12
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/WwwLinksProcessor.java24
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java10
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java4
23 files changed, 242 insertions, 703 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java
index 68ae25a5..4bd65501 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java
@@ -1,37 +1,26 @@
package it.niedermann.owncloud.notes;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
-import android.net.Uri;
import android.os.Bundle;
-import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.TypedValue;
-import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
-import com.yydcdut.markdown.MarkdownProcessor;
-import com.yydcdut.markdown.syntax.text.TextFactory;
-
+import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.branding.BrandedActivity;
import it.niedermann.owncloud.notes.databinding.ActivityFormattingHelpBinding;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_CHECKED_MINUS;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_CHECKED_STAR;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_UNCHECKED_MINUS;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_UNCHECKED_STAR;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.getMarkDownConfiguration;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.parseCompat;
import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences;
public class FormattingHelpActivity extends BrandedActivity {
private ActivityFormattingHelpBinding binding;
- private String content;
+
+ private static final String lineBreak = "\n";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -42,61 +31,11 @@ public class FormattingHelpActivity extends BrandedActivity {
setSupportActionBar(binding.toolbar);
- content = buildFormattingHelp();
-
- final MarkdownProcessor markdownProcessor = new MarkdownProcessor(this);
- markdownProcessor.factory(TextFactory.create());
- markdownProcessor.config(getMarkDownConfiguration(binding.content.getContext())
- .setOnTodoClickCallback((view, line, lineNumber) -> {
- try {
- String[] lines = TextUtils.split(content, "\\r?\\n");
- /*
- * Workaround for RxMarkdown-bug:
- * When (un)checking a checkbox in a note which contains code-blocks, the "`"-characters get stripped out in the TextView and therefore the given lineNumber is wrong
- * Find number of lines starting with ``` before lineNumber
- */
- boolean inCodefence = false;
- for (int i = 0; i < lines.length; i++) {
- if (lines[i].startsWith("```")) {
- inCodefence = !inCodefence;
- lineNumber++;
- }
- if (inCodefence && TextUtils.isEmpty(lines[i])) {
- lineNumber++;
- }
- if (i == lineNumber) {
- break;
- }
- }
-
- /*
- * Workaround for multiple RxMarkdown-bugs:
- * 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(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(CHECKBOX_CHECKED_MINUS, CHECKBOX_UNCHECKED_MINUS);
- lines[lineNumber] = lines[lineNumber].replace(CHECKBOX_CHECKED_STAR, CHECKBOX_UNCHECKED_STAR);
- }
-
- content = TextUtils.join("\n", lines);
- binding.content.setText(parseCompat(markdownProcessor, content));
- } catch (IndexOutOfBoundsException e) {
- Toast.makeText(this, R.string.checkbox_could_not_be_toggled, Toast.LENGTH_SHORT).show();
- e.printStackTrace();
- }
- return line;
- }
- )
- .setOnLinkClickCallback((view, link) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(link))))
- .build());
+ binding.contentContextBasedFormatting.setMarkdownString(buildContextBasedFormattingHelp());
binding.content.setMovementMethod(LinkMovementMethod.getInstance());
- binding.content.setText(parseCompat(markdownProcessor, content));
+ binding.content.setMarkdownString(buildFormattingHelp());
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
binding.content.setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSizeFromPreferences(this, sp));
if (sp.getBoolean(getString(R.string.pref_key_font), false)) {
binding.content.setTypeface(Typeface.MONOSPACE);
@@ -104,11 +43,25 @@ public class FormattingHelpActivity extends BrandedActivity {
}
@NonNull
+ private String buildContextBasedFormattingHelp() {
+ return getString(R.string.formatting_help_title, getString(R.string.formatting_help_cbf_title)) + lineBreak +
+ lineBreak +
+ getString(R.string.formatting_help_cbf_body_1) + lineBreak +
+ getString(R.string.formatting_help_cbf_body_2,
+ getString(R.string.formatting_help_codefence_inline, getString(android.R.string.cut)),
+ getString(R.string.formatting_help_codefence_inline, getString(android.R.string.copy)),
+ getString(R.string.formatting_help_codefence_inline, getString(android.R.string.selectAll)),
+ getString(R.string.formatting_help_codefence_inline, getString(R.string.simple_link)),
+ getString(R.string.formatting_help_codefence_inline, getString(R.string.simple_checkbox))
+ );
+ }
+
+ @NonNull
private String buildFormattingHelp() {
- final String lineBreak = "\n";
final String indention = " ";
final String divider = getString(R.string.formatting_help_divider);
final String codefence = getString(R.string.formatting_help_codefence);
+ final String outerCodefence = getString(R.string.formatting_help_codefence_outer);
int numberedListItem = 1;
final String lists = getString(R.string.formatting_help_lists_body_1) + lineBreak +
@@ -144,18 +97,28 @@ public class FormattingHelpActivity extends BrandedActivity {
indention + indention + getString(R.string.formatting_help_javascript_2) + lineBreak +
getString(R.string.formatting_help_javascript_3) + lineBreak;
- return getString(R.string.formatting_help_title, getString(R.string.formatting_help_cbf_title)) + lineBreak +
- lineBreak +
- getString(R.string.formatting_help_cbf_body_1) + lineBreak +
- getString(R.string.formatting_help_cbf_body_2,
- getString(R.string.formatting_help_codefence_inline, getString(android.R.string.cut)),
- getString(R.string.formatting_help_codefence_inline, getString(android.R.string.copy)),
- getString(R.string.formatting_help_codefence_inline, getString(android.R.string.selectAll)),
- getString(R.string.formatting_help_codefence_inline, getString(R.string.simple_link)),
- getString(R.string.formatting_help_codefence_inline, getString(R.string.simple_checkbox))
- ) + lineBreak +
- lineBreak +
- divider + lineBreak +
+ final int column_count = 3;
+ final int row_count = 3;
+ final StringBuilder table = new StringBuilder();
+ table.append("|");
+ for (int i = 1; i <= column_count; i++) {
+ table.append(" ").append(getString(R.string.formatting_help_tables_column, i)).append(" |");
+ }
+ table.append("\n");
+ table.append("|");
+ for (int i = 0; i < column_count; i++) {
+ table.append(" --- |");
+ }
+ table.append("\n");
+ for (int i = 1; i <= row_count; i++) {
+ table.append("|");
+ for (int j = 1; j <= column_count; j++) {
+ table.append(" ").append(getString(R.string.formatting_help_tables_value, i * j)).append(" |");
+ }
+ table.append("\n");
+ }
+
+ return divider + lineBreak +
lineBreak +
getString(R.string.formatting_help_title, getString(R.string.formatting_help_text_title)) + lineBreak +
lineBreak +
@@ -209,14 +172,16 @@ public class FormattingHelpActivity extends BrandedActivity {
lineBreak +
getString(R.string.formatting_help_code_body_1) + lineBreak +
lineBreak +
- getString(R.string.formatting_help_codefence_inline_escaped, getString(R.string.formatting_help_code_javascript_inline)) + lineBreak +
+ getString(R.string.formatting_help_codefence_inline_escaped, getString(R.string.formatting_help_code_javascript_inline)) + " " + lineBreak +
getString(R.string.formatting_help_codefence_inline, getString(R.string.formatting_help_code_javascript_inline)) + lineBreak +
lineBreak +
getString(R.string.formatting_help_code_body_2) + lineBreak +
lineBreak +
- getString(R.string.formatting_help_codefence_escaped) + lineBreak +
+ outerCodefence + lineBreak +
+ codefence + lineBreak +
javascript +
- getString(R.string.formatting_help_codefence_escaped) + lineBreak +
+ codefence + lineBreak +
+ outerCodefence + lineBreak +
lineBreak +
codefence + lineBreak +
javascript +
@@ -224,9 +189,11 @@ public class FormattingHelpActivity extends BrandedActivity {
lineBreak +
getString(R.string.formatting_help_code_body_3) + lineBreak +
lineBreak +
- getString(R.string.formatting_help_codefence_javascript_escaped) + lineBreak +
+ outerCodefence + lineBreak +
+ getString(R.string.formatting_help_codefence_javascript) + lineBreak +
javascript +
- getString(R.string.formatting_help_codefence_escaped) + lineBreak +
+ codefence + lineBreak +
+ outerCodefence + lineBreak +
lineBreak +
getString(R.string.formatting_help_codefence_javascript) + lineBreak +
javascript +
@@ -234,14 +201,21 @@ public class FormattingHelpActivity extends BrandedActivity {
lineBreak +
divider + lineBreak +
lineBreak +
- getString(R.string.formatting_help_title, getString(R.string.formatting_help_unsupported_title)) + lineBreak +
+ getString(R.string.formatting_help_title, getString(R.string.formatting_help_tables_title)) + lineBreak +
+ lineBreak +
+ codefence + lineBreak +
+ table +
+ codefence + lineBreak +
lineBreak +
- getString(R.string.formatting_help_unsupported_body_1) + lineBreak +
+ table +
lineBreak +
- getString(R.string.formatting_help_ul, getString(R.string.formatting_help_unsupported_body_2)) + lineBreak +
- getString(R.string.formatting_help_ul, getString(R.string.formatting_help_unsupported_body_3)) + lineBreak +
+ divider + lineBreak +
lineBreak +
- getString(R.string.formatting_help_unsupported_body_4) + lineBreak;
+ getString(R.string.formatting_help_title, getString(R.string.formatting_help_images_title)) + lineBreak +
+ lineBreak +
+ codefence + lineBreak +
+ getString(R.string.formatting_help_image, getString(R.string.formatting_help_images_alt)) + lineBreak +
+ codefence + lineBreak;
}
@Override
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/NotesApplication.java b/app/src/main/java/it/niedermann/owncloud/notes/NotesApplication.java
index 1bc00ff3..852180b6 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/NotesApplication.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/NotesApplication.java
@@ -66,7 +66,7 @@ public class NotesApplication extends MultiDexApplication {
}
public static boolean isDarkThemeActive(Context context) {
- int uiMode = context.getResources().getConfiguration().uiMode;
+ final int uiMode = context.getResources().getConfiguration().uiMode;
return (uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java
index fb868bc0..5c5bf519 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java
@@ -5,8 +5,10 @@ import android.os.Bundle;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import com.google.android.material.tabs.TabLayoutMediator;
import it.niedermann.owncloud.notes.LockedActivity;
import it.niedermann.owncloud.notes.R;
@@ -16,6 +18,10 @@ import it.niedermann.owncloud.notes.databinding.ActivityAboutBinding;
public class AboutActivity extends LockedActivity {
private ActivityAboutBinding binding;
+ private final static int POS_CREDITS = 0;
+ private final static int POS_CONTRIB = 1;
+ private final static int POS_LICENSE = 2;
+ private final static int TOTAL_COUNT = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -25,8 +31,22 @@ public class AboutActivity extends LockedActivity {
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
- binding.pager.setAdapter(new TabsPagerAdapter(getSupportFragmentManager()));
- binding.tabs.setupWithViewPager(binding.pager);
+ binding.pager.setAdapter(new TabsStateAdapter(this));
+ // generate title based on given position
+ new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> {
+ switch (position) {
+ default: // Fall-through to credits tab
+ case POS_CREDITS:
+ tab.setText(R.string.about_credits_tab_title);
+ break;
+ case POS_CONTRIB:
+ tab.setText(R.string.about_contribution_tab_title);
+ break;
+ case POS_LICENSE:
+ tab.setText(R.string.about_license_tab_title);
+ break;
+ }
+ }).attach();
}
@Override
@@ -36,15 +56,15 @@ public class AboutActivity extends LockedActivity {
binding.tabs.setSelectedTabIndicatorColor(finalMainColor);
}
- private class TabsPagerAdapter extends FragmentPagerAdapter {
+ private static class TabsStateAdapter extends FragmentStateAdapter {
- TabsPagerAdapter(FragmentManager fragmentManager) {
- super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
+ TabsStateAdapter(FragmentActivity fa) {
+ super(fa);
}
@Override
- public int getCount() {
- return 3;
+ public int getItemCount() {
+ return TOTAL_COUNT;
}
/**
@@ -52,36 +72,17 @@ public class AboutActivity extends LockedActivity {
*/
@NonNull
@Override
- public Fragment getItem(int position) {
+ public Fragment createFragment(int position) {
switch (position) {
- case 1:
- return new AboutFragmentContributingTab();
-
- case 2:
- return new AboutFragmentLicenseTab();
-
- default:
+ default: // Fall-through to credits tab
+ case POS_CREDITS:
return new AboutFragmentCreditsTab();
- }
- }
- /**
- * generate title based on given position
- */
- @Override
- public CharSequence getPageTitle(int position) {
- switch (position) {
- case 0:
- return getString(R.string.about_credits_tab_title);
-
- case 1:
- return getString(R.string.about_contribution_tab_title);
-
- case 2:
- return getString(R.string.about_license_tab_title);
+ case POS_CONTRIB:
+ return new AboutFragmentContributingTab();
- default:
- return null;
+ case POS_LICENSE:
+ return new AboutFragmentLicenseTab();
}
}
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java
index 98a99b31..a22cabe9 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java
@@ -13,6 +13,8 @@ import android.widget.EditText;
import androidx.annotation.ColorInt;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.util.Pair;
import androidx.lifecycle.LiveData;
@@ -94,7 +96,7 @@ public class BrandingUtil {
Log.v(TAG, "--- Read: shared_preference_theme_main");
return sharedPreferences.getInt(pref_key_branding_main, context.getApplicationContext().getResources().getColor(R.color.defaultBrand));
} else {
- return context.getResources().getColor(R.color.defaultBrand);
+ return ContextCompat.getColor(context, R.color.defaultBrand);
}
}
@@ -110,12 +112,20 @@ public class BrandingUtil {
}
public static void saveBrandColors(@NonNull Context context, @ColorInt int mainColor, @ColorInt int textColor) {
+ final int previousMainColor = readBrandMainColor(context);
+ final int previousTextColor = readBrandTextColor(context);
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
Log.v(TAG, "--- Write: shared_preference_theme_main" + " | " + mainColor);
Log.v(TAG, "--- Write: shared_preference_theme_text" + " | " + textColor);
editor.putInt(pref_key_branding_main, mainColor);
editor.putInt(pref_key_branding_text, textColor);
editor.apply();
+ if (isBrandingEnabled(context) && context instanceof BrandedActivity) {
+ if (mainColor != previousMainColor || textColor != previousTextColor) {
+ final BrandedActivity activity = (BrandedActivity) context;
+ activity.runOnUiThread(() -> ActivityCompat.recreate(activity));
+ }
+ }
}
/**
@@ -123,7 +133,7 @@ public class BrandingUtil {
*/
@ColorInt
public static int getSecondaryForegroundColorDependingOnTheme(@NonNull Context context, @ColorInt int mainColor) {
- final int primaryColor = context.getResources().getColor(R.color.primary);
+ final int primaryColor = ContextCompat.getColor(context, R.color.primary);
final boolean isDarkTheme = NotesApplication.isDarkThemeActive(context);
if (isDarkTheme && !contrastRatioIsSufficient(mainColor, primaryColor)) {
Log.v(TAG, "Contrast ratio between brand color " + String.format("#%06X", (0xFFFFFF & mainColor)) + " and dark theme is too low. Falling back to WHITE as brand color.");
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java
index a6ae0d11..9b8fca09 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java
@@ -67,9 +67,7 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment
}
setSupportActionBar(binding.toolbar);
- if (!(fragment instanceof NoteReadonlyFragment)) {
- binding.toolbar.setOnClickListener((v) -> fragment.showEditTitleDialog());
- }
+ binding.toolbar.setOnClickListener((v) -> fragment.showEditTitleDialog());
}
@Override
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java
index 932c0d91..b2c92fd1 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java
@@ -60,23 +60,6 @@ public class NoteEditFragment extends SearchableBaseNoteFragment {
};
private TextWatcher textWatcher;
- public static NoteEditFragment newInstance(long accountId, long noteId) {
- NoteEditFragment f = new NoteEditFragment();
- Bundle b = new Bundle();
- b.putLong(PARAM_NOTE_ID, noteId);
- b.putLong(PARAM_ACCOUNT_ID, accountId);
- f.setArguments(b);
- return f;
- }
-
- public static NoteEditFragment newInstanceWithNewNote(Note newNote) {
- NoteEditFragment f = new NoteEditFragment();
- Bundle b = new Bundle();
- b.putSerializable(PARAM_NEWNOTE, newNote);
- f.setArguments(b);
- return f;
- }
-
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -166,9 +149,6 @@ public class NoteEditFragment extends SearchableBaseNoteFragment {
}
}
-// workaround for issue yydcdut/RxMarkdown#41
-// note.getNote().setContent(note.getContent().replace("\r\n", "\n"));
-
binding.editContent.setMarkdownString(note.getContent());
binding.editContent.setEnabled(true);
@@ -248,5 +228,23 @@ public class NoteEditFragment extends SearchableBaseNoteFragment {
public void applyBrand(int mainColor, int textColor) {
super.applyBrand(mainColor, textColor);
binding.editContent.setSearchColor(mainColor);
+ binding.editContent.setHighlightColor(getTextHighlightBackgroundColor(requireContext(), mainColor, colorPrimary, colorAccent));
+ }
+
+ public static BaseNoteFragment newInstance(long accountId, long noteId) {
+ final BaseNoteFragment fragment = new NoteEditFragment();
+ final Bundle args = new Bundle();
+ args.putLong(PARAM_NOTE_ID, noteId);
+ args.putLong(PARAM_ACCOUNT_ID, accountId);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ public static BaseNoteFragment newInstanceWithNewNote(CloudNote newNote) {
+ final BaseNoteFragment fragment = new NoteEditFragment();
+ final Bundle args = new Bundle();
+ args.putSerializable(PARAM_NEWNOTE, newNote);
+ fragment.setArguments(args);
+ return fragment;
}
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java
index 13b45bcb..572cccf1 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java
@@ -3,25 +3,20 @@ package it.niedermann.owncloud.notes.edit;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
-import android.net.Uri;
import android.os.Bundle;
import android.text.Layout;
-import android.text.SpannableString;
-import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
+import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
-import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.util.Consumer;
-import androidx.core.view.ViewCompat;
import androidx.preference.PreferenceManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
@@ -29,46 +24,23 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;
import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
-import com.yydcdut.markdown.MarkdownProcessor;
-import com.yydcdut.markdown.syntax.text.TextFactory;
-
-import java.util.HashSet;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.databinding.FragmentNotePreviewBinding;
-import it.niedermann.owncloud.notes.persistence.entity.Account;
-import it.niedermann.owncloud.notes.persistence.entity.Note;
-import it.niedermann.owncloud.notes.shared.util.MarkDownUtil;
-import it.niedermann.owncloud.notes.shared.util.NoteLinksUtils;
import it.niedermann.owncloud.notes.shared.util.SSOUtil;
-import it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor;
-import it.niedermann.owncloud.notes.shared.util.text.TextProcessorChain;
-import it.niedermann.owncloud.notes.shared.util.text.WwwLinksProcessor;
-
-import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.searchAndColor;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_CHECKED_MINUS;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_CHECKED_STAR;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_UNCHECKED_MINUS;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.CHECKBOX_UNCHECKED_STAR;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.parseCompat;
-import static it.niedermann.owncloud.notes.shared.util.NoteLinksUtils.extractNoteRemoteId;
+
+import static androidx.core.view.ViewCompat.isAttachedToWindow;
import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences;
public class NotePreviewFragment extends SearchableBaseNoteFragment implements OnRefreshListener {
+ private static final String TAG = NotePreviewFragment.class.getSimpleName();
+
private String changedText;
- private MarkdownProcessor markdownProcessor;
- private FragmentNotePreviewBinding binding;
- private boolean noteLoaded = false;
- public static NotePreviewFragment newInstance(long accountId, long noteId) {
- NotePreviewFragment f = new NotePreviewFragment();
- Bundle b = new Bundle();
- b.putLong(PARAM_NOTE_ID, noteId);
- b.putLong(PARAM_ACCOUNT_ID, accountId);
- f.setArguments(b);
- return f;
- }
+ protected FragmentNotePreviewBinding binding;
+
+ private boolean noteLoaded = false;
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
@@ -107,98 +79,52 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
}
@Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ binding.swiperefreshlayout.setOnRefreshListener(this);
+ binding.singleNoteContent.setMovementMethod(LinkMovementMethod.getInstance());
+
+ final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext());
+ binding.singleNoteContent.setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSizeFromPreferences(requireContext(), sp));
+ if (sp.getBoolean(getString(R.string.pref_key_font), false)) {
+ binding.singleNoteContent.setTypeface(Typeface.MONOSPACE);
+ }
+ }
+
+ @Override
protected void onNoteLoaded(Note note) {
noteLoaded = true;
- markdownProcessor = new MarkdownProcessor(requireContext());
- markdownProcessor.factory(TextFactory.create());
- markdownProcessor.config(
- MarkDownUtil.getMarkDownConfiguration(binding.singleNoteContent.getContext())
- .setOnTodoClickCallback((view, line, lineNumber) -> {
- try {
- String[] lines = TextUtils.split(note.getContent(), "\\r?\\n");
- /*
- * Workaround for RxMarkdown-bug:
- * When (un)checking a checkbox in a note which contains code-blocks, the "`"-characters get stripped out in the TextView and therefore the given lineNumber is wrong
- * Find number of lines starting with ``` before lineNumber
- */
- boolean inCodefence = false;
- for (int i = 0; i < lines.length; i++) {
- if (lines[i].startsWith("```")) {
- inCodefence = !inCodefence;
- lineNumber++;
- }
- if (inCodefence && TextUtils.isEmpty(lines[i])) {
- lineNumber++;
- }
- if (i == lineNumber) {
- break;
- }
- }
-
- /*
- * Workaround for multiple RxMarkdown-bugs:
- * 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(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(CHECKBOX_CHECKED_MINUS, CHECKBOX_UNCHECKED_MINUS);
- lines[lineNumber] = lines[lineNumber].replace(CHECKBOX_CHECKED_STAR, CHECKBOX_UNCHECKED_STAR);
- }
-
- changedText = TextUtils.join("\n", lines);
- binding.singleNoteContent.setText(parseCompat(markdownProcessor, changedText));
- saveNote(null);
- } catch (IndexOutOfBoundsException e) {
- Toast.makeText(getActivity(), R.string.checkbox_could_not_be_toggled, Toast.LENGTH_SHORT).show();
- e.printStackTrace();
- }
- return line;
- }
- )
- .setOnLinkClickCallback((view, link) -> {
- if (NoteLinksUtils.isNoteLink(link)) {
- final Intent intent = new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class)
- .putExtra(EditNoteActivity.PARAM_NOTE_ID, db.getNoteDao().getLocalIdByRemoteId(note.getAccountId(), extractNoteRemoteId(link)));
- startActivity(intent);
- } else {
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
- startActivity(browserIntent);
- }
- })
- .build());
-
- defaultTextProcessorChain(note, (chain) -> {
- try {
- binding.singleNoteContent.setText(parseCompat(markdownProcessor, chain.apply(note.getContent())));
- } catch (StringIndexOutOfBoundsException e) {
- // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668
- binding.singleNoteContent.setText(chain.apply(note.getContent()));
- Toast.makeText(binding.singleNoteContent.getContext(), R.string.could_not_load_preview_two_digit_numbered_list, Toast.LENGTH_LONG).show();
- e.printStackTrace();
- }
- changedText = note.getContent();
- binding.singleNoteContent.setMovementMethod(LinkMovementMethod.getInstance());
-
- binding.swiperefreshlayout.setOnRefreshListener(this);
+ registerInternalNoteLinkHandler();
+ changedText = note.getContent();
+ binding.singleNoteContent.setMarkdownString(note.getContent());
+ binding.singleNoteContent.getMarkdownString().observe(requireActivity(), (newContent) -> {
+ changedText = newContent.toString();
+ saveNote(null);
+ });
+ }
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext());
- binding.singleNoteContent.setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSizeFromPreferences(requireContext(), sp));
- if (sp.getBoolean(getString(R.string.pref_key_font), false)) {
- binding.singleNoteContent.setTypeface(Typeface.MONOSPACE);
+ protected void registerInternalNoteLinkHandler() {
+ binding.singleNoteContent.registerOnLinkClickCallback((link) -> {
+ try {
+ final long noteLocalId = db.getLocalIdByRemoteId(this.note.getAccountId(), Long.parseLong(link));
+ Log.i(TAG, "Found note for remoteId \"" + link + "\" in account \"" + this.note.getAccountId() + "\" with localId + \"" + noteLocalId + "\". Attempt to open " + EditNoteActivity.class.getSimpleName() + " for this note.");
+ startActivity(new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class).putExtra(EditNoteActivity.PARAM_NOTE_ID, noteLocalId));
+ return true;
+ } catch (NumberFormatException e) {
+ // Clicked link is not a long and therefore can't be a remote id.
+ } catch (IllegalArgumentException e) {
+ Log.i(TAG, "It looks like \"" + link + "\" might be a remote id of a note, but a note with this remote id could not be found in account \"" + note.getAccountId() + "\" .", e);
}
+ return false;
});
}
-
@Override
protected void colorWithText(@NonNull String newText, @Nullable Integer current, int mainColor, int textColor) {
- if (binding != null && ViewCompat.isAttachedToWindow(binding.singleNoteContent)) {
- binding.singleNoteContent.setText(
- searchAndColor(new SpannableString(parseCompat(markdownProcessor, getContent())), newText, requireContext(), current, mainColor, textColor),
- TextView.BufferType.SPANNABLE);
+ if (binding != null && isAttachedToWindow(binding.singleNoteContent)) {
+ binding.singleNoteContent.clearFocus();
+ binding.singleNoteContent.setSearchText(newText, current);
}
}
@@ -211,20 +137,18 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
public void onRefresh() {
if (noteLoaded && db.getNoteServerSyncHelper().isSyncPossible() && SSOUtil.isConfigured(getContext())) {
binding.swiperefreshlayout.setRefreshing(true);
- defaultTextProcessorChain(note, (chain) -> {
- try {
- Account account = db.getAccountDao().getAccountByName(SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext()).name);
- db.getNoteServerSyncHelper().addCallbackPull(account, () -> {
- note = db.getNoteDao().getNoteById(note.getId());
- changedText = note.getContent();
- binding.singleNoteContent.setText(parseCompat(markdownProcessor, chain.apply(note.getContent())));
- binding.swiperefreshlayout.setRefreshing(false);
- });
- db.getNoteServerSyncHelper().scheduleSync(account, false);
- } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) {
- e.printStackTrace();
- }
- });
+ try {
+ final Account account = db.getAccountDao().getAccountByName(SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext()).name);
+ db.getNoteServerSyncHelper().addCallbackPull(account, () -> {
+ note = db.getNoteDao().getNoteById(note.getId());
+ changedText = note.getContent();
+ binding.singleNoteContent.setMarkdownString(note.getContent());
+ binding.swiperefreshlayout.setRefreshing(false);
+ });
+ db.getNoteServerSyncHelper().scheduleSync(account, false);
+ } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) {
+ e.printStackTrace();
+ }
} else {
binding.swiperefreshlayout.setRefreshing(false);
Toast.makeText(requireContext(), getString(R.string.error_sync, getString(R.string.error_no_network)), Toast.LENGTH_LONG).show();
@@ -234,15 +158,16 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
@Override
public void applyBrand(int mainColor, int textColor) {
super.applyBrand(mainColor, textColor);
+ binding.singleNoteContent.setSearchColor(mainColor);
binding.singleNoteContent.setHighlightColor(getTextHighlightBackgroundColor(requireContext(), mainColor, colorPrimary, colorAccent));
}
- private void defaultTextProcessorChain(@NonNull Note note, @NonNull Consumer<TextProcessorChain> onChainReady) {
- new Thread(() -> {
- final TextProcessorChain chain = new TextProcessorChain();
- chain.add(new NoteLinksProcessor(new HashSet<>(db.getNoteDao().getRemoteIds(note.getAccountId()))));
- chain.add(new WwwLinksProcessor());
- requireActivity().runOnUiThread(() -> onChainReady.accept(chain));
- }).start();
+ public static BaseNoteFragment newInstance(long accountId, long noteId) {
+ final BaseNoteFragment fragment = new NotePreviewFragment();
+ final Bundle args = new Bundle();
+ args.putLong(PARAM_NOTE_ID, noteId);
+ args.putLong(PARAM_ACCOUNT_ID, accountId);
+ fragment.setArguments(args);
+ return fragment;
}
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java
index d64da549..d03374d8 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java
@@ -1,55 +1,18 @@
package it.niedermann.owncloud.notes.edit;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.graphics.Typeface;
-import android.net.Uri;
import android.os.Bundle;
-import android.text.Layout;
-import android.text.SpannableString;
-import android.text.method.LinkMovementMethod;
-import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ScrollView;
-import android.widget.TextView;
-import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.preference.PreferenceManager;
-
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import com.yydcdut.markdown.MarkdownProcessor;
-import com.yydcdut.markdown.syntax.text.TextFactory;
import it.niedermann.owncloud.notes.R;
-import it.niedermann.owncloud.notes.databinding.FragmentNotePreviewBinding;
-import it.niedermann.owncloud.notes.persistence.entity.Note;
import it.niedermann.owncloud.notes.shared.model.ISyncCallback;
-import it.niedermann.owncloud.notes.shared.util.MarkDownUtil;
-import it.niedermann.owncloud.notes.shared.util.NoteLinksUtils;
-
-import static androidx.core.view.ViewCompat.isAttachedToWindow;
-import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.searchAndColor;
-import static it.niedermann.owncloud.notes.shared.util.MarkDownUtil.parseCompat;
-import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences;
-
-public class NoteReadonlyFragment extends SearchableBaseNoteFragment {
-
- private MarkdownProcessor markdownProcessor;
- private FragmentNotePreviewBinding binding;
-
- public static NoteReadonlyFragment newInstance(String content) {
- NoteReadonlyFragment f = new NoteReadonlyFragment();
- Bundle b = new Bundle();
- b.putString(PARAM_CONTENT, content);
- f.setArguments(b);
- return f;
- }
+public class NoteReadonlyFragment extends NotePreviewFragment {
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
@@ -62,103 +25,45 @@ public class NoteReadonlyFragment extends SearchableBaseNoteFragment {
menu.findItem(R.id.menu_share).setVisible(false);
menu.findItem(R.id.menu_move).setVisible(false);
menu.findItem(R.id.menu_category).setVisible(false);
+ menu.findItem(R.id.menu_title).setVisible(false);
if (menu.findItem(MENU_ID_PIN) != null)
menu.findItem(MENU_ID_PIN).setVisible(false);
}
- @Override
- public ScrollView getScrollView() {
- return binding.scrollView;
- }
-
- @Override
- protected FloatingActionButton getSearchNextButton() {
- return binding.searchNext;
- }
-
- @Override
- protected FloatingActionButton getSearchPrevButton() {
- return binding.searchPrev;
- }
-
- @Override
- protected Layout getLayout() {
- binding.singleNoteContent.onPreDraw();
- return binding.singleNoteContent.getLayout();
- }
-
@Nullable
@Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup
- container, @Nullable Bundle savedInstanceState) {
- binding = FragmentNotePreviewBinding.inflate(inflater, container, false);
- return binding.getRoot();
- }
-
- @Override
- protected void onNoteLoaded(Note note) {
- markdownProcessor = new MarkdownProcessor(requireActivity());
- markdownProcessor.factory(TextFactory.create());
- markdownProcessor.config(
- MarkDownUtil.getMarkDownConfiguration(binding.singleNoteContent.getContext())
- .setOnLinkClickCallback((view, link) -> {
- if (NoteLinksUtils.isNoteLink(link)) {
- long noteRemoteId = NoteLinksUtils.extractNoteRemoteId(link);
- long noteLocalId = db.getNoteDao().getLocalIdByRemoteId(note.getAccountId(), noteRemoteId);
- Intent intent = new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class);
- intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, noteLocalId);
- startActivity(intent);
- } else {
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
- startActivity(browserIntent);
- }
- })
- .build());
- try {
- binding.singleNoteContent.setText(parseCompat(markdownProcessor, note.getContent()));
- onResume();
- } catch (StringIndexOutOfBoundsException e) {
- // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668
- binding.singleNoteContent.setText(note.getContent());
- Toast.makeText(binding.singleNoteContent.getContext(), R.string.could_not_load_preview_two_digit_numbered_list, Toast.LENGTH_LONG).show();
- e.printStackTrace();
- }
- binding.singleNoteContent.setMovementMethod(LinkMovementMethod.getInstance());
-
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ binding.singleNoteContent.setEnabled(false);
binding.swiperefreshlayout.setEnabled(false);
-
- SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext());
- binding.singleNoteContent.setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSizeFromPreferences(requireContext(), sp));
- if (sp.getBoolean(getString(R.string.pref_key_font), false)) {
- binding.singleNoteContent.setTypeface(Typeface.MONOSPACE);
- }
+ return binding.getRoot();
}
@Override
- public void onCloseNote() {
+ protected void registerInternalNoteLinkHandler() {
// Do nothing
}
@Override
- protected void saveNote(@Nullable ISyncCallback callback) {
+ public void showEditTitleDialog() {
// Do nothing
}
@Override
- protected void colorWithText(@NonNull String newText, @Nullable Integer current, int mainColor, int textColor) {
- if ((binding != null) && isAttachedToWindow(binding.singleNoteContent)) {
- binding.singleNoteContent.setText(searchAndColor(new SpannableString(parseCompat(markdownProcessor, getContent())), newText, requireContext(), current, mainColor, textColor), TextView.BufferType.SPANNABLE);
- }
+ public void onCloseNote() {
+ // Do nothing
}
@Override
- protected String getContent() {
- return note.getContent();
+ protected void saveNote(@Nullable ISyncCallback callback) {
+ // Do nothing
}
- @Override
- public void applyBrand(int mainColor, int textColor) {
- super.applyBrand(mainColor, textColor);
- binding.singleNoteContent.setHighlightColor(getTextHighlightBackgroundColor(requireContext(), mainColor, colorPrimary, colorAccent));
+ public static BaseNoteFragment newInstance(String content) {
+ final BaseNoteFragment fragment = new NoteReadonlyFragment();
+ final Bundle args = new Bundle();
+ args.putString(PARAM_CONTENT, content);
+ fragment.setArguments(args);
+ return fragment;
}
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java
index b41fc594..4b3bb9ba 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java
@@ -10,6 +10,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
+import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.RecyclerView;
@@ -50,17 +51,17 @@ public class CategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
switch (category.id) {
case addItemId:
- Drawable wrapDrawable = DrawableCompat.wrap(context.getResources().getDrawable(category.icon));
- DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(R.color.icon_color_default));
+ Drawable wrapDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, category.icon));
+ DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(context, R.color.icon_color_default));
categoryViewHolder.getIcon().setImageDrawable(wrapDrawable);
categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryAdded());
break;
case clearItemId:
- categoryViewHolder.getIcon().setImageDrawable(context.getResources().getDrawable(category.icon));
+ categoryViewHolder.getIcon().setImageDrawable(ContextCompat.getDrawable(context, category.icon));
categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryCleared());
break;
default:
- categoryViewHolder.getIcon().setImageDrawable(context.getResources().getDrawable(category.icon));
+ categoryViewHolder.getIcon().setImageDrawable(ContextCompat.getDrawable(context, category.icon));
categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryChosen(category.label));
break;
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java
index 624a0b9d..315fdc42 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java
@@ -19,6 +19,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.SearchView;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
+import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.view.GravityCompat;
@@ -588,7 +589,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
case SERVER_SETTINGS: {
// Recreate activity completely, because theme switching makes problems when only invalidating the views.
// @see https://github.com/stefan-niedermann/nextcloud-notes/issues/529
- recreate();
+ ActivityCompat.recreate(this);
break;
}
default: {
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java
index 88c88b8e..5addabfb 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java
@@ -12,6 +12,7 @@ import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
+import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.selection.SelectionTracker;
import androidx.recyclerview.widget.RecyclerView;
@@ -67,7 +68,7 @@ public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> i
public <T extends Context & NoteClickListener> ItemAdapter(@NonNull T context, boolean gridView) {
this.noteClickListener = context;
this.gridView = gridView;
- this.mainColor = context.getResources().getColor(R.color.defaultBrand);
+ this.mainColor = ContextCompat.getColor(context, R.color.defaultBrand);
this.textColor = Color.WHITE;
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
this.fontSize = getFontSizeFromPreferences(context, sp);
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java
index cdc18e3c..73002879 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java
@@ -18,6 +18,7 @@ import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
+import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.selection.ItemDetailsLookup;
import androidx.recyclerview.widget.RecyclerView;
@@ -113,7 +114,7 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder {
protected void bindSearchableContent(@NonNull Context context, @NonNull TextView textView, @Nullable CharSequence searchQuery, @NonNull String content, int mainColor) {
CharSequence processedContent = content;
if (!TextUtils.isEmpty(searchQuery)) {
- @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted);
+ @ColorInt final int searchBackground = ContextCompat.getColor(context, R.color.bg_highlighted);
@ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor);
// The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesFragment.java
index eeb7d007..017d5df5 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesFragment.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesFragment.java
@@ -7,6 +7,7 @@ import android.util.Log;
import androidx.annotation.ColorInt;
import androidx.annotation.Nullable;
+import androidx.core.app.ActivityCompat;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
@@ -49,7 +50,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra
final Boolean branding = (Boolean) newValue;
Log.v(TAG, "branding: " + branding);
requireActivity().setResult(Activity.RESULT_OK);
- requireActivity().recreate();
+ ActivityCompat.recreate(requireActivity());
return true;
});
} else {
@@ -94,7 +95,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra
themePref.setOnPreferenceChangeListener((preference, newValue) -> {
NotesApplication.setAppTheme(DarkModeSetting.valueOf((String) newValue));
requireActivity().setResult(Activity.RESULT_OK);
- requireActivity().recreate();
+ ActivityCompat.recreate(requireActivity());
return true;
});
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java
index fcd418e8..db696d85 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java
@@ -30,6 +30,7 @@ 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.Collection;
import java.util.List;
@@ -96,7 +97,7 @@ public class DisplayUtils {
this.mainColor = mainColor;
this.textColor = textColor;
this.current = current;
- this.highlightColor = context.getResources().getColor(R.color.bg_highlighted);
+ this.highlightColor = ContextCompat.getColor(context, R.color.bg_highlighted);
}
@Override
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/MarkDownUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/MarkDownUtil.java
deleted file mode 100644
index 43a8937e..00000000
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/MarkDownUtil.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package it.niedermann.owncloud.notes.shared.util;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.text.Spanned;
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-import androidx.core.content.res.ResourcesCompat;
-
-import com.yydcdut.markdown.MarkdownConfiguration;
-import com.yydcdut.markdown.MarkdownConfiguration.Builder;
-import com.yydcdut.markdown.MarkdownProcessor;
-import com.yydcdut.markdown.span.MDImageSpan;
-import com.yydcdut.markdown.theme.ThemeDefault;
-import com.yydcdut.markdown.theme.ThemeSonsOfObsidian;
-
-import it.niedermann.owncloud.notes.NotesApplication;
-import it.niedermann.owncloud.notes.R;
-
-/**
- * Created by stefan on 07.12.16.
- */
-
-@SuppressWarnings("WeakerAccess")
-public class MarkDownUtil {
-
- private static final String TAG = MarkDownUtil.class.getSimpleName();
-
- 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]";
-
- private static final String MD_IMAGE_WITH_EMPTY_DESCRIPTION = "![](";
- private static final String MD_IMAGE_WITH_SPACE_DESCRIPTION = "![ ](";
- private static final String[] MD_IMAGE_WITH_EMPTY_DESCRIPTION_ARRAY = new String[]{MD_IMAGE_WITH_EMPTY_DESCRIPTION};
- private static final String[] MD_IMAGE_WITH_SPACE_DESCRIPTION_ARRAY = new String[]{MD_IMAGE_WITH_SPACE_DESCRIPTION};
-
- /**
- * Ensures every instance of RxMD uses the same configuration
- *
- * @param context Context
- * @return RxMDConfiguration
- */
- public static Builder getMarkDownConfiguration(Context context) {
- return getMarkDownConfiguration(context, NotesApplication.isDarkThemeActive(context));
- }
-
- public static Builder getMarkDownConfiguration(Context context, Boolean darkTheme) {
- return new MarkdownConfiguration.Builder(context)
- .setUnOrderListColor(ResourcesCompat.getColor(context.getResources(),
- darkTheme ? R.color.widget_fg_dark_theme : R.color.widget_fg_default, null))
- .setHeader2RelativeSize(1.35f)
- .setHeader3RelativeSize(1.25f)
- .setHeader4RelativeSize(1.15f)
- .setHeader5RelativeSize(1.1f)
- .setHeader6RelativeSize(1.05f)
- .setHorizontalRulesHeight(2)
- .setCodeBgColor(darkTheme ? ResourcesCompat.getColor(context.getResources(), R.color.fg_default_high, null) : Color.LTGRAY)
- .setTheme(darkTheme ? new ThemeSonsOfObsidian() : new ThemeDefault())
- .setTodoColor(ResourcesCompat.getColor(context.getResources(),
- darkTheme ? R.color.widget_fg_dark_theme : R.color.widget_fg_default, null))
- .setTodoDoneColor(ResourcesCompat.getColor(context.getResources(),
- darkTheme ? R.color.widget_fg_dark_theme : R.color.widget_fg_default, null))
- .setLinkFontColor(ResourcesCompat.getColor(context.getResources(), R.color.defaultBrand, null))
- .setDefaultImageSize(400, 300);
- }
-
- /**
- * This is a compatibility-method that provides workarounds for several bugs in RxMarkdown
- * <p>
- * https://github.com/stefan-niedermann/nextcloud-notes/issues/772
- *
- * @param markdownProcessor RxMarkdown MarkdownProcessor instance
- * @param text CharSequence that should be parsed
- * @return the processed text but with several workarounds for Bugs in RxMarkdown
- */
- @NonNull
- public static CharSequence parseCompat(@NonNull final MarkdownProcessor markdownProcessor, CharSequence text) {
- if (TextUtils.isEmpty(text)) {
- return "";
- }
-
- while (TextUtils.indexOf(text, MD_IMAGE_WITH_EMPTY_DESCRIPTION) >= 0) {
- text = TextUtils.replace(text, MD_IMAGE_WITH_EMPTY_DESCRIPTION_ARRAY, MD_IMAGE_WITH_SPACE_DESCRIPTION_ARRAY);
- }
-
- return markdownProcessor.parse(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) {
- return lineStartsWithCheckbox(line, true) || lineStartsWithCheckbox(line, false);
- }
-
- 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 cursorPosition) {
- int startOfLine = cursorPosition;
- while (startOfLine > 0 && s.charAt(startOfLine - 1) != '\n') {
- startOfLine--;
- }
- return startOfLine;
- }
-
- public static int getEndOfLine(@NonNull CharSequence s, int cursorPosition) {
- int nextLinebreak = s.toString().indexOf('\n', cursorPosition);
- if (nextLinebreak > -1) {
- return nextLinebreak;
- }
- return cursorPosition;
- }
-}
-
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java
deleted file mode 100644
index 668d2746..00000000
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteLinksUtils.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package it.niedermann.owncloud.notes.shared.util;
-
-import it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor;
-
-public class NoteLinksUtils {
-
- /**
- * Tests if the given link is a note-link (which was transformed in {@link it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor}) or not
- *
- * @param link Link under test
- * @return true if the link is a note-link
- */
- public static boolean isNoteLink(String link) {
- return link.startsWith(NoteLinksProcessor.RELATIVE_LINK_WORKAROUND_PREFIX);
- }
-
- /**
- * Extracts the remoteId back from links that were transformed in {@link it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor}.
- *
- * @param link Link that was transformed in {@link it.niedermann.owncloud.notes.shared.util.text.NoteLinksProcessor}
- * @return the remoteId of the linked note
- */
- public static long extractNoteRemoteId(String link) {
- return Long.parseLong(link.replace(NoteLinksProcessor.RELATIVE_LINK_WORKAROUND_PREFIX, ""));
- }
-}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java
index 9c117190..8bf80cb9 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java
@@ -1,14 +1,10 @@
package it.niedermann.owncloud.notes.shared.util;
-import android.os.Build;
-import android.text.Html;
-import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
import androidx.annotation.NonNull;
-
-import static android.os.Build.VERSION_CODES.N;
+import androidx.core.text.HtmlCompat;
/**
* Some helper functionality in alike the Android support library.
@@ -28,24 +24,8 @@ public class SupportUtil {
* @param formatArgs Arguments for the string resource.
*/
public static void setHtml(@NonNull TextView view, int stringId, Object... formatArgs) {
- view.setText(SupportUtil.fromHtml(view.getResources().getString(stringId, formatArgs)));
+ view.setText(HtmlCompat.fromHtml(
+ view.getResources().getString(stringId, formatArgs), HtmlCompat.FROM_HTML_MODE_LEGACY));
view.setMovementMethod(LinkMovementMethod.getInstance());
}
-
- /**
- * Creates a {@link Spanned} from a HTML string on all SDK versions.
- *
- * @param source Source string with HTML markup
- * @return Spannable for using in a {@link TextView}
- * @see Html#fromHtml(String)
- * @see Html#fromHtml(String, int)
- */
- private static Spanned fromHtml(String source) {
- if (Build.VERSION.SDK_INT >= N) {
- return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
- } else {
- //noinspection deprecation
- return Html.fromHtml(source);
- }
- }
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java
deleted file mode 100644
index a8c6926e..00000000
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/NoteLinksProcessor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package it.niedermann.owncloud.notes.shared.util.text;
-
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class NoteLinksProcessor extends TextProcessor {
-
- private static final String TAG = NoteLinksProcessor.class.getSimpleName();
- public static final String RELATIVE_LINK_WORKAROUND_PREFIX = "https://nextcloudnotes/notes/";
-
- @VisibleForTesting
- private static final String linksThatLookLikeNoteLinksRegEx = "\\[[^]]*]\\((\\d+)\\)";
- private static final String replaceNoteRemoteIdsRegEx = "\\[([^\\]]*)\\]\\((%s)\\)";
-
- private Set<Long> existingNoteRemoteIds;
-
- public NoteLinksProcessor(Set<Long> existingNoteRemoteIds) {
- this.existingNoteRemoteIds = existingNoteRemoteIds;
- }
-
- /**
- * Replaces all links to other notes of the form `[<link-text>](<note-file-id>)`
- * in the markdown string with links to a dummy url.
- * <p>
- * Why is this needed?
- * See discussion in issue #623
- *
- * @return Markdown with all note-links replaced with dummy-url-links
- */
- @Override
- public String process(String s) {
- return replaceNoteLinksWithDummyUrls(s, existingNoteRemoteIds);
- }
-
- private static String replaceNoteLinksWithDummyUrls(String markdown, Set<Long> existingNoteRemoteIds) {
- Pattern noteLinkCandidates = Pattern.compile(linksThatLookLikeNoteLinksRegEx);
- Matcher matcher = noteLinkCandidates.matcher(markdown);
-
- Set<String> noteRemoteIdsToReplace = new HashSet<>();
- while (matcher.find()) {
- String presumedNoteId = matcher.group(1);
- try {
- if (presumedNoteId != null && existingNoteRemoteIds.contains(Long.parseLong(presumedNoteId))) {
- noteRemoteIdsToReplace.add(presumedNoteId);
- }
- } catch (NumberFormatException e) {
- Log.w(TAG, e);
- }
- }
-
- String noteRemoteIdsCondition = TextUtils.join("|", noteRemoteIdsToReplace);
- Pattern replacePattern = Pattern.compile(String.format(replaceNoteRemoteIdsRegEx, noteRemoteIdsCondition));
- Matcher replaceMatcher = replacePattern.matcher(markdown);
- return replaceMatcher.replaceAll(String.format("[$1](%s$2)", RELATIVE_LINK_WORKAROUND_PREFIX));
- }
-}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java
deleted file mode 100644
index cd17ad17..00000000
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessor.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package it.niedermann.owncloud.notes.shared.util.text;
-
-abstract public class TextProcessor {
- /**
- * Applies a specified transformation on a text string and returns the updated string.
- *
- * @param s Text to transform
- * @return Transformed text
- */
- abstract public String process(String s);
-} \ No newline at end of file
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java
deleted file mode 100644
index 70af737a..00000000
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/TextProcessorChain.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package it.niedermann.owncloud.notes.shared.util.text;
-
-import java.util.LinkedList;
-
-public class TextProcessorChain extends LinkedList<TextProcessor> {
- public String apply(String s) {
- for (TextProcessor textProcessor : this) {
- s = textProcessor.process(s);
- }
- return s;
- }
-}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/WwwLinksProcessor.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/WwwLinksProcessor.java
deleted file mode 100644
index 73cc5832..00000000
--- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/text/WwwLinksProcessor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package it.niedermann.owncloud.notes.shared.util.text;
-
-import java.util.regex.Pattern;
-
-public class WwwLinksProcessor extends TextProcessor {
-
- private static final String WWW_URLS_PROTOCOL_PREFIX = "https://";
- private static final String REGEX_REPLACE_WWW_URLS = "\\[([^]]*)]\\((www\\..+)\\)";
-
- /**
- * Prefixes all links, that not not start with a protocol identifier, but with "www." with http://
- * <p>
- * See https://github.com/stefan-niedermann/nextcloud-notes/issues/949
- *
- * @return Markdown with all pseudo-links replaced through actual HTTP-links
- */
- @Override
- public String process(String s) {
- return Pattern
- .compile(REGEX_REPLACE_WWW_URLS)
- .matcher(s)
- .replaceAll(String.format("[$1](%s$2)", WWW_URLS_PROTOCOL_PREFIX));
- }
-}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java
index 0c1ea28f..e4b60ef8 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java
@@ -11,6 +11,8 @@ import android.net.Uri;
import android.util.Log;
import android.widget.RemoteViews;
+import androidx.core.content.ContextCompat;
+
import it.niedermann.owncloud.notes.NotesApplication;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.branding.BrandingUtil;
@@ -85,7 +87,7 @@ public class NoteListWidget extends AppWidgetProvider {
views.setOnClickPendingIntent(R.id.widget_note_list_title_tv_dark, openAppI);
views.setOnClickPendingIntent(R.id.widget_note_list_create_icon_dark, newNoteI);
views.setPendingIntentTemplate(R.id.note_list_widget_lv_dark, templatePI);
- views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv_dark, serviceIntent);
+ views.setRemoteAdapter(R.id.note_list_widget_lv_dark, serviceIntent);
views.setEmptyView(R.id.note_list_widget_lv_dark, R.id.widget_note_list_placeholder_tv_dark);
awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv_dark);
if (BrandingUtil.isBrandingEnabled(context)) {
@@ -94,7 +96,7 @@ public class NoteListWidget extends AppWidgetProvider {
views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", localAccount.getTextColor());
views.setTextColor(R.id.widget_note_list_title_tv_dark, localAccount.getTextColor());
} else {
- views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand));
+ views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", ContextCompat.getColor(context, R.color.defaultBrand));
views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", Color.WHITE);
views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", Color.WHITE);
views.setTextColor(R.id.widget_note_list_title_tv_dark, Color.WHITE);
@@ -106,7 +108,7 @@ public class NoteListWidget extends AppWidgetProvider {
views.setOnClickPendingIntent(R.id.widget_note_list_title_tv, openAppI);
views.setOnClickPendingIntent(R.id.widget_note_list_create_icon, newNoteI);
views.setPendingIntentTemplate(R.id.note_list_widget_lv, templatePI);
- views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv, serviceIntent);
+ views.setRemoteAdapter(R.id.note_list_widget_lv, serviceIntent);
views.setEmptyView(R.id.note_list_widget_lv, R.id.widget_note_list_placeholder_tv);
awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv);
if (BrandingUtil.isBrandingEnabled(context)) {
@@ -115,7 +117,7 @@ public class NoteListWidget extends AppWidgetProvider {
views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", localAccount.getTextColor());
views.setTextColor(R.id.widget_note_list_title_tv, localAccount.getTextColor());
} else {
- views.setInt(R.id.widget_note_header, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand));
+ views.setInt(R.id.widget_note_header, "setBackgroundColor", ContextCompat.getColor(context, R.color.defaultBrand));
views.setInt(R.id.widget_note_header_icon, "setColorFilter", Color.WHITE);
views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", Color.WHITE);
views.setTextColor(R.id.widget_note_list_title_tv, Color.WHITE);
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java
index ea36d705..75afc57b 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java
@@ -101,12 +101,12 @@ public class SingleNoteWidgetFactory implements RemoteViewsService.RemoteViewsFa
if (darkModeActive) {
note_content = new RemoteViews(context.getPackageName(), R.layout.widget_single_note_content_dark);
note_content.setOnClickFillInIntent(R.id.single_note_content_tv_dark, fillInIntent);
- note_content.setTextViewText(R.id.single_note_content_tv_dark, MarkdownUtil.renderForWidget(context, note.getContent()));
+ note_content.setTextViewText(R.id.single_note_content_tv_dark, MarkdownUtil.renderForRemoteView(context, note.getContent()));
} else {
note_content = new RemoteViews(context.getPackageName(), R.layout.widget_single_note_content);
note_content.setOnClickFillInIntent(R.id.single_note_content_tv, fillInIntent);
- note_content.setTextViewText(R.id.single_note_content_tv, MarkdownUtil.renderForWidget(context, note.getContent()));
+ note_content.setTextViewText(R.id.single_note_content_tv, MarkdownUtil.renderForRemoteView(context, note.getContent()));
}
return note_content;