diff options
author | Sergei Kozelko <KozelkoS@yandex.ru> | 2022-09-09 05:34:00 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-09 05:34:00 +0000 |
commit | e0cf4ec485414ab91ed4c751743730a14ebb0ddc (patch) | |
tree | e1f8d322cba29253dd097c535170be32fad091f0 /app | |
parent | 401dba6d83052cf0c9c60a74e8460e356f39bcb2 (diff) | |
download | infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.tar infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.tar.gz infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.tar.bz2 infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.tar.lz infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.tar.xz infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.tar.zst infinity-for-reddit-e0cf4ec485414ab91ed4c751743730a14ebb0ddc.zip |
Fix markdown in rules screen (#1050)
* Display tables in rules screen
* Parse spoiler and headings in rules screen
Diffstat (limited to '')
3 files changed, 63 insertions, 18 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/RulesActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/RulesActivity.java index f7ab30ad..21bf5f85 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/RulesActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/RulesActivity.java @@ -20,6 +20,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; import com.r0adkll.slidr.Slidr; +import com.r0adkll.slidr.model.SlidrInterface; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -87,8 +88,9 @@ public class RulesActivity extends BaseActivity { applyCustomTheme(); + SlidrInterface slidrInterface = null; if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) { - Slidr.attach(this); + slidrInterface = Slidr.attach(this); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -119,7 +121,7 @@ public class RulesActivity extends BaseActivity { mSubredditName = getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME); - mAdapter = new RulesRecyclerViewAdapter(this, mCustomThemeWrapper); + mAdapter = new RulesRecyclerViewAdapter(this, mCustomThemeWrapper, slidrInterface); recyclerView.setAdapter(mAdapter); FetchRules.fetchRules(mExecutor, new Handler(), mRetrofit, mSubredditName, new FetchRules.FetchRulesListener() { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java index abbfc00c..33c3dd81 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/RulesRecyclerViewAdapter.java @@ -11,8 +11,13 @@ import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; +import com.r0adkll.slidr.model.SlidrInterface; + +import org.commonmark.ext.gfm.tables.TableBlock; + import java.util.ArrayList; import butterknife.BindView; @@ -30,6 +35,9 @@ import io.noties.markwon.inlineparser.HtmlInlineProcessor; import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin; import io.noties.markwon.linkify.LinkifyPlugin; import io.noties.markwon.movement.MovementMethodPlugin; +import io.noties.markwon.recycler.MarkwonAdapter; +import io.noties.markwon.recycler.table.TableEntry; +import io.noties.markwon.recycler.table.TableEntryPlugin; import me.saket.bettermovementmethod.BetterLinkMovementMethod; import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.Rule; @@ -37,18 +45,28 @@ import ml.docilealligator.infinityforreddit.activities.BaseActivity; import ml.docilealligator.infinityforreddit.activities.LinkResolverActivity; import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; +import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; +import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager; +import ml.docilealligator.infinityforreddit.markdown.RedditHeadingPlugin; +import ml.docilealligator.infinityforreddit.markdown.SpoilerParserPlugin; import ml.docilealligator.infinityforreddit.markdown.SuperscriptInlineProcessor; import ml.docilealligator.infinityforreddit.utils.Utils; public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecyclerViewAdapter.RuleViewHolder> { private BaseActivity activity; private Markwon markwon; + @Nullable + private final SlidrInterface slidrInterface; private ArrayList<Rule> rules; private int mPrimaryTextColor; - private int mSecondaryTextColor; - public RulesRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper) { + public RulesRecyclerViewAdapter(@NonNull BaseActivity activity, + @NonNull CustomThemeWrapper customThemeWrapper, + @Nullable SlidrInterface slidrInterface) { this.activity = activity; + this.slidrInterface = slidrInterface; + mPrimaryTextColor = customThemeWrapper.getPrimaryTextColor(); + int spoilerBackgroundColor = mPrimaryTextColor | 0xFF000000; markwon = Markwon.builder(activity) .usePlugin(MarkwonInlineParserPlugin.create(plugin -> { plugin.excludeInlineProcessor(AutolinkInlineProcessor.class); @@ -101,10 +119,11 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler return true; }))) .usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS)) + .usePlugin(SpoilerParserPlugin.create(mPrimaryTextColor, spoilerBackgroundColor)) + .usePlugin(RedditHeadingPlugin.create()) .usePlugin(StrikethroughPlugin.create()) + .usePlugin(TableEntryPlugin.create(activity)) .build(); - mPrimaryTextColor = customThemeWrapper.getPrimaryTextColor(); - mSecondaryTextColor = customThemeWrapper.getSecondaryTextColor(); } @NonNull @@ -115,11 +134,14 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler @Override public void onBindViewHolder(@NonNull RuleViewHolder holder, int position) { - holder.shortNameTextView.setText(rules.get(holder.getBindingAdapterPosition()).getShortName()); - if (rules.get(holder.getBindingAdapterPosition()).getDescriptionHtml() == null) { + Rule rule = rules.get(holder.getBindingAdapterPosition()); + holder.shortNameTextView.setText(rule.getShortName()); + if (rule.getDescriptionHtml() == null) { holder.descriptionMarkwonView.setVisibility(View.GONE); } else { - markwon.setMarkdown(holder.descriptionMarkwonView, rules.get(holder.getBindingAdapterPosition()).getDescriptionHtml()); + holder.markwonAdapter.setMarkdown(markwon, rule.getDescriptionHtml()); + //noinspection NotifyDatasetChanged + holder.markwonAdapter.notifyDataSetChanged(); } } @@ -143,18 +165,41 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler @BindView(R.id.short_name_text_view_item_rule) TextView shortNameTextView; @BindView(R.id.description_markwon_view_item_rule) - TextView descriptionMarkwonView; + RecyclerView descriptionMarkwonView; + @NonNull + final MarkwonAdapter markwonAdapter; RuleViewHolder(@NonNull View itemView) { super(itemView); ButterKnife.bind(this, itemView); shortNameTextView.setTextColor(mPrimaryTextColor); - descriptionMarkwonView.setTextColor(mSecondaryTextColor); if (activity.typeface != null) { shortNameTextView.setTypeface(activity.typeface); - descriptionMarkwonView.setTypeface(activity.typeface); } + markwonAdapter = MarkwonAdapter.builder(R.layout.adapter_default_entry, R.id.text) + .include(TableBlock.class, TableEntry.create(builder -> builder + .tableLayout(R.layout.adapter_table_block, R.id.table_layout) + .textLayoutIsRoot(R.layout.view_table_entry_cell))) + .build(); + LinearLayoutManagerBugFixed linearLayoutManager = new MarkwonLinearLayoutManager(activity, + new MarkwonLinearLayoutManager.HorizontalScrollViewScrolledListener() { + @Override + public void onScrolledLeft() { + if (slidrInterface != null) { + slidrInterface.lock(); + } + } + + @Override + public void onScrolledRight() { + if (slidrInterface != null) { + slidrInterface.unlock(); + } + } + }); + descriptionMarkwonView.setLayoutManager(linearLayoutManager); + descriptionMarkwonView.setAdapter(markwonAdapter); } } } diff --git a/app/src/main/res/layout/item_rule.xml b/app/src/main/res/layout/item_rule.xml index 1003f6c5..e420f45d 100644 --- a/app/src/main/res/layout/item_rule.xml +++ b/app/src/main/res/layout/item_rule.xml @@ -11,14 +11,12 @@ android:textSize="?attr/title_font_16" android:fontFamily="?attr/font_family" /> - <TextView + <androidx.recyclerview.widget.RecyclerView android:id="@+id/description_markwon_view_item_rule" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingBottom="16dp" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:textSize="?attr/content_font_default" - android:fontFamily="?attr/font_family" /> + android:paddingBottom="8dp" + android:paddingStart="8dp" + android:paddingEnd="8dp"/> </LinearLayout>
\ No newline at end of file |