collapse long posts

This commit is contained in:
sk 2023-02-03 23:40:20 +01:00
parent 847d966daa
commit ec9d41fbbd
8 changed files with 136 additions and 19 deletions

View File

@ -41,6 +41,7 @@ public class GlobalUserPreferences{
public static boolean enablePreReleases; public static boolean enablePreReleases;
public static boolean prefixRepliesWithRe; public static boolean prefixRepliesWithRe;
public static boolean bottomEncoding; public static boolean bottomEncoding;
public static boolean collapseLongPosts;
public static String publishButtonText; public static String publishButtonText;
public static ThemePreference theme; public static ThemePreference theme;
public static ColorPreference color; public static ColorPreference color;
@ -87,6 +88,7 @@ public class GlobalUserPreferences{
enablePreReleases=prefs.getBoolean("enablePreReleases", false); enablePreReleases=prefs.getBoolean("enablePreReleases", false);
prefixRepliesWithRe=prefs.getBoolean("prefixRepliesWithRe", false); prefixRepliesWithRe=prefs.getBoolean("prefixRepliesWithRe", false);
bottomEncoding=prefs.getBoolean("bottomEncoding", false); bottomEncoding=prefs.getBoolean("bottomEncoding", false);
collapseLongPosts=prefs.getBoolean("collapseLongPosts", true);
publishButtonText=prefs.getString("publishButtonText", ""); publishButtonText=prefs.getString("publishButtonText", "");
theme=ThemePreference.values()[prefs.getInt("theme", 0)]; theme=ThemePreference.values()[prefs.getInt("theme", 0)];
recentLanguages=fromJson(prefs.getString("recentLanguages", null), recentLanguagesType, new HashMap<>()); recentLanguages=fromJson(prefs.getString("recentLanguages", null), recentLanguagesType, new HashMap<>());
@ -125,6 +127,7 @@ public class GlobalUserPreferences{
.putBoolean("showNoAltIndicator", showNoAltIndicator) .putBoolean("showNoAltIndicator", showNoAltIndicator)
.putBoolean("enablePreReleases", enablePreReleases) .putBoolean("enablePreReleases", enablePreReleases)
.putBoolean("prefixRepliesWithRe", prefixRepliesWithRe) .putBoolean("prefixRepliesWithRe", prefixRepliesWithRe)
.putBoolean("collapseLongPosts", collapseLongPosts)
.putString("publishButtonText", publishButtonText) .putString("publishButtonText", publishButtonText)
.putBoolean("bottomEncoding", bottomEncoding) .putBoolean("bottomEncoding", bottomEncoding)
.putInt("theme", theme.ordinal()) .putInt("theme", theme.ordinal())

View File

@ -239,6 +239,10 @@ public class SettingsFragment extends MastodonToolbarFragment{
GlobalUserPreferences.showNoAltIndicator=i.checked; GlobalUserPreferences.showNoAltIndicator=i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();
})); }));
items.add(new SwitchItem(R.string.sk_settings_collapse_long_posts, R.drawable.ic_fluent_more_horizontal_24_regular, GlobalUserPreferences.collapseLongPosts, i->{
GlobalUserPreferences.collapseLongPosts=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{ items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{
GlobalUserPreferences.translateButtonOpenedOnly=i.checked; GlobalUserPreferences.translateButtonOpenedOnly=i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();

View File

@ -8,6 +8,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Button; import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -50,6 +51,7 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
public boolean translated = false; public boolean translated = false;
public TranslatedStatus translation = null; public TranslatedStatus translation = null;
private AccountSession session; private AccountSession session;
private boolean textIsRevealed;
public static final Pattern BOTTOM_TEXT_PATTERN = Pattern.compile("(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️)(?:\uD83D\uDC49\uD83D\uDC48(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️))*\uD83D\uDC49\uD83D\uDC48"); public static final Pattern BOTTOM_TEXT_PATTERN = Pattern.compile("(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️)(?:\uD83D\uDC49\uD83D\uDC48(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️))*\uD83D\uDC49\uD83D\uDC48");
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){ public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){
@ -88,10 +90,14 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
public static class Holder extends StatusDisplayItem.Holder<TextStatusDisplayItem> implements ImageLoaderViewHolder{ public static class Holder extends StatusDisplayItem.Holder<TextStatusDisplayItem> implements ImageLoaderViewHolder{
private final LinkedTextView text; private final LinkedTextView text;
private final LinearLayout spoilerHeader; private final LinearLayout spoilerHeader;
private final TextView spoilerTitle, spoilerTitleInline, translateInfo; private final TextView spoilerTitle, spoilerTitleInline, translateInfo, readMore;
private final View spoilerOverlay, borderTop, borderBottom, textWrap, translateWrap, translateProgress; private final View spoilerOverlay, borderTop, borderBottom, textWrap, translateWrap, translateProgress, spaceBelowText;
private final int backgroundColor, borderColor; private final int backgroundColor, borderColor;
private final Button translateButton; private final Button translateButton;
private final ScrollView textScrollView;
private final float textMaxHeight, textCollapsedHeight;
private final LinearLayout.LayoutParams collapseParams, wrapParams;
public Holder(Activity activity, ViewGroup parent){ public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_text, parent); super(activity, R.layout.display_item_text, parent);
@ -110,6 +116,14 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
itemView.setOnClickListener(v->item.parentFragment.onRevealSpoilerClick(this)); itemView.setOnClickListener(v->item.parentFragment.onRevealSpoilerClick(this));
backgroundColor=UiUtils.getThemeColor(activity, R.attr.colorBackgroundLight); backgroundColor=UiUtils.getThemeColor(activity, R.attr.colorBackgroundLight);
borderColor=UiUtils.getThemeColor(activity, R.attr.colorPollVoted); borderColor=UiUtils.getThemeColor(activity, R.attr.colorPollVoted);
textScrollView=findViewById(R.id.text_scroll_view);
readMore=findViewById(R.id.read_more);
spaceBelowText=findViewById(R.id.space_below_text);
textMaxHeight=activity.getResources().getDimension(R.dimen.text_max_height);
textCollapsedHeight=activity.getResources().getDimension(R.dimen.text_collapsed_height);
collapseParams=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) textCollapsedHeight);
wrapParams=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
readMore.setOnClickListener(this::onClickReadMore);
} }
@Override @Override
@ -118,6 +132,9 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
? HtmlParser.parse(item.translation.content, item.status.emojis, item.status.mentions, item.status.tags, item.parentFragment.getAccountID()) ? HtmlParser.parse(item.translation.content, item.status.emojis, item.status.mentions, item.status.tags, item.parentFragment.getAccountID())
: item.text); : item.text);
text.setTextIsSelectable(item.textSelectable); text.setTextIsSelectable(item.textSelectable);
if (item.textSelectable) {
textScrollView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
}
spoilerTitleInline.setTextIsSelectable(item.textSelectable); spoilerTitleInline.setTextIsSelectable(item.textSelectable);
text.setInvalidateOnEveryFrame(false); text.setInvalidateOnEveryFrame(false);
spoilerTitleInline.setBackgroundColor(item.inset ? 0 : backgroundColor); spoilerTitleInline.setBackgroundColor(item.inset ? 0 : backgroundColor);
@ -151,14 +168,13 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
instanceInfo.v2.configuration.translation.enabled; instanceInfo.v2.configuration.translation.enabled;
boolean isBottomText = BOTTOM_TEXT_PATTERN.matcher(item.status.getStrippedText()).find(); boolean isBottomText = BOTTOM_TEXT_PATTERN.matcher(item.status.getStrippedText()).find();
translateWrap.setVisibility((isBottomText || ( boolean translateVisible = (isBottomText || (
translateEnabled && translateEnabled &&
!item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) && !item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) &&
item.status.language != null && item.status.language != null &&
(item.session.preferences == null || !item.status.language.equalsIgnoreCase(item.session.preferences.postingDefaultLanguage)))) (item.session.preferences == null || !item.status.language.equalsIgnoreCase(item.session.preferences.postingDefaultLanguage))))
&& (!GlobalUserPreferences.translateButtonOpenedOnly || item.textSelectable) && (!GlobalUserPreferences.translateButtonOpenedOnly || item.textSelectable);
? View.VISIBLE : View.GONE translateWrap.setVisibility(translateVisible ? View.VISIBLE : View.GONE);
);
translateButton.setText(item.translated ? R.string.sk_translate_show_original : R.string.sk_translate_post); translateButton.setText(item.translated ? R.string.sk_translate_show_original : R.string.sk_translate_post);
translateInfo.setText(item.translated ? itemView.getResources().getString(R.string.sk_translated_using, isBottomText ? "bottom-java" : item.translation.provider) : ""); translateInfo.setText(item.translated ? itemView.getResources().getString(R.string.sk_translated_using, isBottomText ? "bottom-java" : item.translation.provider) : "");
translateButton.setOnClickListener(v->{ translateButton.setOnClickListener(v->{
@ -203,6 +219,29 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
rebind(); rebind();
} }
}); });
readMore.setText(item.textIsRevealed ? R.string.sk_collapse : R.string.sk_expand);
spaceBelowText.setVisibility(translateVisible ? View.VISIBLE : View.GONE);
if (!GlobalUserPreferences.collapseLongPosts) {
textScrollView.setLayoutParams(wrapParams);
readMore.setVisibility(View.GONE);
}
if (GlobalUserPreferences.collapseLongPosts) text.post(() -> {
boolean tooBig = text.getMeasuredHeight() > textMaxHeight;
boolean inTimeline = !item.textSelectable;
boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText);
boolean expandable = inTimeline && tooBig && !hasSpoiler;
readMore.setVisibility(expandable ? View.VISIBLE : View.GONE);
textScrollView.setLayoutParams(expandable && !item.textIsRevealed ? collapseParams : wrapParams);
if (expandable && !translateVisible) spaceBelowText.setVisibility(View.VISIBLE);
});
}
private void onClickReadMore(View v) {
item.textIsRevealed = !item.textIsRevealed;
rebind();
} }
@Override @Override

View File

@ -0,0 +1,30 @@
package org.joinmastodon.android.ui.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
public class UntouchableScrollView extends ScrollView {
public UntouchableScrollView(Context context) {
super(context);
}
public UntouchableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UntouchableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public UntouchableScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return false;
}
}

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M7.75 12c0 0.966-0.784 1.75-1.75 1.75S4.25 12.966 4.25 12 5.034 10.25 6 10.25 7.75 11.034 7.75 12zm6 0c0 0.966-0.784 1.75-1.75 1.75s-1.75-0.784-1.75-1.75 0.784-1.75 1.75-1.75 1.75 0.784 1.75 1.75zM18 13.75c0.966 0 1.75-0.784 1.75-1.75s-0.784-1.75-1.75-1.75-1.75 0.784-1.75 1.75 0.784 1.75 1.75 1.75z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@ -44,19 +44,47 @@
android:background="?attr/colorPollVoted"/> android:background="?attr/colorPollVoted"/>
</LinearLayout> </LinearLayout>
<org.joinmastodon.android.ui.views.LinkedTextView <org.joinmastodon.android.ui.views.UntouchableScrollView
android:id="@+id/text" android:id="@+id/text_scroll_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="16dp" android:paddingHorizontal="16dp"
android:textSize="16sp" android:requiresFadingEdge="vertical"
android:textAppearance="@style/m3_body_large"/> android:scrollbars="none"
android:fadingEdgeLength="36dp">
<org.joinmastodon.android.ui.views.LinkedTextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textAppearance="@style/m3_body_large"/>
</org.joinmastodon.android.ui.views.UntouchableScrollView>
<Space
android:id="@+id/space_below_text"
android:layout_width="match_parent"
android:layout_height="8dp"
android:visibility="gone" />
<Button
android:id="@+id/read_more"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_text_button"
android:textColor="?android:textColorSecondary"
android:layout_marginHorizontal="16dp"
android:paddingHorizontal="8dp"
android:textAppearance="@style/m3_label_medium"
android:textAllCaps="true"
android:text="@string/sk_expand"
android:visibility="gone" />
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout <org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
android:id="@+id/translate_wrap" android:id="@+id/translate_wrap"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:visibility="gone"> android:visibility="gone">
@ -68,8 +96,7 @@
android:clipToPadding="false"> android:clipToPadding="false">
<org.joinmastodon.android.ui.views.ProgressBarButton <org.joinmastodon.android.ui.views.ProgressBarButton
android:id="@+id/translate_btn" android:id="@+id/translate_btn"
style="?secondaryButtonStyle" android:background="@drawable/bg_text_button"
android:background="?android:selectableItemBackground"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -88,13 +115,16 @@
android:visibility="gone"/> android:visibility="gone"/>
</FrameLayout> </FrameLayout>
<Space
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView <TextView
android:id="@+id/translate_info" android:id="@+id/translate_info"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:layout_weight="1"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
android:textAlignment="textEnd" android:textAlignment="textEnd"
tools:text="Translated using TranslateEngine" /> tools:text="Translated using TranslateEngine" />
@ -129,4 +159,4 @@
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="text_max_height">300dp</dimen>
<dimen name="text_collapsed_height">150dp</dimen>
</resources>

View File

@ -253,4 +253,7 @@
<string name="sk_notify_poll_results">Poll results</string> <string name="sk_notify_poll_results">Poll results</string>
<string name="sk_settings_prefix_reply_cw_with_re">Prefix reply CW with “re:”</string> <string name="sk_settings_prefix_reply_cw_with_re">Prefix reply CW with “re:”</string>
<string name="sk_filtered">Filtered: %s</string> <string name="sk_filtered">Filtered: %s</string>
<string name="sk_expand">Expand</string>
<string name="sk_collapse">Collapse</string>
<string name="sk_settings_collapse_long_posts">Collapse long posts</string>
</resources> </resources>