feat: collapse long description
This commit is contained in:
@@ -16,6 +16,8 @@ import android.view.ViewOutlineProvider;
|
|||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ScrollView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -68,12 +70,15 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
private Instance instance;
|
private Instance instance;
|
||||||
private String extendedDescription;
|
private String extendedDescription;
|
||||||
private CoverImageView cover;
|
private CoverImageView cover;
|
||||||
private TextView uri, description;
|
private TextView uri, description, readMore;
|
||||||
|
|
||||||
private Button timelineButton, pinButton, rulesButton, serversButton;
|
private Button timelineButton, pinButton, rulesButton, serversButton;
|
||||||
|
|
||||||
|
private View spaceBelowText;
|
||||||
private final CoverOverlayGradientDrawable coverGradient=new CoverOverlayGradientDrawable();
|
private final CoverOverlayGradientDrawable coverGradient=new CoverOverlayGradientDrawable();
|
||||||
|
|
||||||
|
private ScrollView textScrollView;
|
||||||
private float titleTransY;
|
private float titleTransY;
|
||||||
private int statusBarHeight;
|
|
||||||
|
|
||||||
private String accountID;
|
private String accountID;
|
||||||
private Account account;
|
private Account account;
|
||||||
@@ -81,6 +86,7 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
private final ArrayList<AccountField> fields=new ArrayList<>();
|
private final ArrayList<AccountField> fields=new ArrayList<>();
|
||||||
|
|
||||||
private boolean refreshing;
|
private boolean refreshing;
|
||||||
|
private boolean isExpanded = false;
|
||||||
private boolean updatedTimelines = false;
|
private boolean updatedTimelines = false;
|
||||||
|
|
||||||
private static final int MAX_FIELDS=4;
|
private static final int MAX_FIELDS=4;
|
||||||
@@ -91,6 +97,9 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
private MetadataAdapter adapter;
|
private MetadataAdapter adapter;
|
||||||
private ListImageLoaderWrapper imgLoader;
|
private ListImageLoaderWrapper imgLoader;
|
||||||
|
|
||||||
|
private float textMaxHeight, textCollapsedHeight;
|
||||||
|
private LinearLayout.LayoutParams collapseParams, wrapParams;
|
||||||
|
|
||||||
public InstanceInfoFragment(){
|
public InstanceInfoFragment(){
|
||||||
super(R.layout.loader_fragment_overlay_toolbar);
|
super(R.layout.loader_fragment_overlay_toolbar);
|
||||||
}
|
}
|
||||||
@@ -126,6 +135,13 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
rulesButton=content.findViewById(R.id.rules_btn);
|
rulesButton=content.findViewById(R.id.rules_btn);
|
||||||
serversButton=content.findViewById(R.id.servers_btn);
|
serversButton=content.findViewById(R.id.servers_btn);
|
||||||
list=content.findViewById(R.id.metadata);
|
list=content.findViewById(R.id.metadata);
|
||||||
|
textScrollView=content.findViewById(R.id.text_scroll_view);
|
||||||
|
readMore=content.findViewById(R.id.read_more);
|
||||||
|
spaceBelowText=content.findViewById(R.id.space_below_text);
|
||||||
|
textMaxHeight=getActivity().getResources().getDimension(R.dimen.text_max_height);
|
||||||
|
textCollapsedHeight=getActivity().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);
|
||||||
|
|
||||||
cover.setForeground(coverGradient);
|
cover.setForeground(coverGradient);
|
||||||
cover.setOutlineProvider(new ViewOutlineProvider(){
|
cover.setOutlineProvider(new ViewOutlineProvider(){
|
||||||
@@ -140,6 +156,7 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
rulesButton.setOnClickListener(this::onRulesButtonClick);
|
rulesButton.setOnClickListener(this::onRulesButtonClick);
|
||||||
serversButton.setOnClickListener(this::onSeversButtonClick);
|
serversButton.setOnClickListener(this::onSeversButtonClick);
|
||||||
cover.setOnClickListener(this::onCoverClick);
|
cover.setOnClickListener(this::onCoverClick);
|
||||||
|
readMore.setOnClickListener(this::onReadMoreClick);
|
||||||
|
|
||||||
if(loaded){
|
if(loaded){
|
||||||
bindHeaderView();
|
bindHeaderView();
|
||||||
@@ -245,9 +262,9 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onApplyWindowInsets(WindowInsets insets){
|
public void onApplyWindowInsets(WindowInsets insets){
|
||||||
statusBarHeight=insets.getSystemWindowInsetTop();
|
int statusBarHeight = insets.getSystemWindowInsetTop();
|
||||||
if(contentView!=null){
|
if(contentView!=null){
|
||||||
((ViewGroup.MarginLayoutParams) getToolbar().getLayoutParams()).topMargin=statusBarHeight;
|
((ViewGroup.MarginLayoutParams) getToolbar().getLayoutParams()).topMargin= statusBarHeight;
|
||||||
}
|
}
|
||||||
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
|
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
|
||||||
}
|
}
|
||||||
@@ -259,8 +276,18 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
uri.setText(instance.title);
|
uri.setText(instance.title);
|
||||||
setTitle(instance.title);
|
setTitle(instance.title);
|
||||||
|
|
||||||
|
//set description text and collapse
|
||||||
updateDescription();
|
updateDescription();
|
||||||
|
|
||||||
|
textScrollView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||||
|
|
||||||
|
readMore.setText(isExpanded ? R.string.sk_collapse : R.string.sk_expand);
|
||||||
|
description.post(() -> {
|
||||||
|
readMore.setVisibility(View.VISIBLE);
|
||||||
|
textScrollView.setLayoutParams(isExpanded ? wrapParams : collapseParams);
|
||||||
|
spaceBelowText.setVisibility(View.VISIBLE);
|
||||||
|
});
|
||||||
|
|
||||||
fields.clear();
|
fields.clear();
|
||||||
|
|
||||||
|
|
||||||
@@ -312,6 +339,10 @@ public class InstanceInfoFragment extends LoaderFragment {
|
|||||||
protected int getToolbarResource(){
|
protected int getToolbarResource(){
|
||||||
return R.layout.profile_toolbar;
|
return R.layout.profile_toolbar;
|
||||||
}
|
}
|
||||||
|
private void onReadMoreClick(View view) {
|
||||||
|
isExpanded = !isExpanded;
|
||||||
|
bindHeaderView();
|
||||||
|
}
|
||||||
|
|
||||||
private void onTimelineButtonClick(View view) {
|
private void onTimelineButtonClick(View view) {
|
||||||
Bundle args=new Bundle();
|
Bundle args=new Bundle();
|
||||||
|
|||||||
@@ -22,35 +22,70 @@
|
|||||||
android:contentDescription="@string/profile_header"
|
android:contentDescription="@string/profile_header"
|
||||||
android:scaleType="centerCrop" />
|
android:scaleType="centerCrop" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
<TextView
|
android:id="@+id/text_wrap"
|
||||||
android:id="@+id/uri"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/cover"
|
android:layout_below="@id/cover"
|
||||||
android:layout_alignParentStart="true"
|
android:layout_alignParentStart="true"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:orientation="vertical">
|
||||||
android:layout_marginTop="12dp"
|
|
||||||
android:textAlignment="viewStart"
|
<TextView
|
||||||
android:textAppearance="@style/m3_headline_small"
|
android:id="@+id/uri"
|
||||||
tools:text="floss.social" />
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textAppearance="@style/m3_headline_small"
|
||||||
|
tools:text="floss.social" />
|
||||||
|
|
||||||
|
|
||||||
<org.joinmastodon.android.ui.views.LinkedTextView
|
<org.joinmastodon.android.ui.views.UntouchableScrollView
|
||||||
android:id="@+id/description"
|
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:layout_below="@id/uri"
|
android:fadingEdgeLength="36dp"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:requiresFadingEdge="vertical"
|
||||||
android:textAppearance="@style/m3_body_large"
|
android:scrollbars="none">
|
||||||
android:textSize="16sp"
|
|
||||||
tools:text="Founder, CEO and lead developer @Mastodon, Germany." />
|
<org.joinmastodon.android.ui.views.LinkedTextView
|
||||||
|
android:id="@+id/description"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:textAppearance="@style/m3_body_large"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</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:layout_marginHorizontal="16dp"
|
||||||
|
android:background="@drawable/bg_text_button"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:paddingHorizontal="8dp"
|
||||||
|
android:text="@string/sk_expand"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:textAppearance="@style/m3_label_medium"
|
||||||
|
android:textColor="?android:textColorSecondary"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/border_top"
|
android:id="@+id/border_top"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0.5dp"
|
android:layout_height="0.5dp"
|
||||||
android:layout_below="@id/description"
|
android:layout_below="@id/text_wrap"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:background="?attr/colorPollVoted" />
|
android:background="?attr/colorPollVoted" />
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user