diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-01-05 21:46:46 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-01-05 21:46:46 +0300 |
commit | efa1a8f9cbf786b7c391dbbf07dd8aa78e0ccac4 (patch) | |
tree | c4057a69238a41492cd1119d31378b5380c71a3b /app/src/main/java | |
parent | 0fe4b5b4b101e6a303e9b9629d38dace6de2651f (diff) | |
parent | 8fdbd61b683444df52bdc0e2209b2254013f8fc9 (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')
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; |