From 887e68700a1324c338e3d26dda8d814c05bfdb4b Mon Sep 17 00:00:00 2001 From: Vavassor Date: Wed, 1 Feb 2017 17:01:34 -0500 Subject: [PATCH] Made wrapping behaviour of long names and long content warnings better on timelines. --- .../com/keylesspalace/tusky/FlowLayout.java | 90 +++++++++++++++++++ app/src/main/res/layout/item_status.xml | 20 ++--- app/src/main/res/values/attrs.xml | 7 ++ 3 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/keylesspalace/tusky/FlowLayout.java create mode 100644 app/src/main/res/values/attrs.xml diff --git a/app/src/main/java/com/keylesspalace/tusky/FlowLayout.java b/app/src/main/java/com/keylesspalace/tusky/FlowLayout.java new file mode 100644 index 00000000..08ceb2fb --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/FlowLayout.java @@ -0,0 +1,90 @@ +package com.keylesspalace.tusky; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class FlowLayout extends ViewGroup { + private int paddingHorizontal; // internal padding between child views + private int paddingVertical; // + private int totalHeight; + + public FlowLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public FlowLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = context.getTheme().obtainStyledAttributes( + attrs, R.styleable.FlowLayout, 0, 0); + try { + paddingHorizontal = a.getDimensionPixelSize( + R.styleable.FlowLayout_paddingHorizontal, 0); + paddingVertical = a.getDimensionPixelSize(R.styleable.FlowLayout_paddingVertical, 0); + } finally { + a.recycle(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + assert (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED); + int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); + int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom(); + int count = getChildCount(); + int x = getPaddingLeft(); + int y = getPaddingTop(); + int childHeightMeasureSpec; + if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); + } else { + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + } + totalHeight = 0; + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + if (child.getVisibility() != GONE) { + child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), + childHeightMeasureSpec); + int childwidth = child.getMeasuredWidth(); + totalHeight = Math.max(totalHeight, child.getMeasuredHeight() + paddingVertical); + if (x + childwidth > width) { + x = getPaddingLeft(); + y += totalHeight; + } + x += childwidth + paddingHorizontal; + } + } + if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) { + height = y + totalHeight; + } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { + if (y + totalHeight < height) { + height = y + totalHeight; + } + } + height += 5; // Fudge to avoid clipping bottom of last row. + setMeasuredDimension(width, height); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final int width = r - l; + int x = getPaddingLeft(); + int y = getPaddingTop(); + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child.getVisibility() != GONE) { + int childWidth = child.getMeasuredWidth(); + int childHeight = child.getMeasuredHeight(); + if (x + childWidth > width) { + x = getPaddingLeft(); + y += totalHeight; + } + child.layout(x, y, x + childWidth, y + childHeight); + x += childWidth + paddingHorizontal; + } + } + } +} diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml index 0071d197..a89d5430 100644 --- a/app/src/main/res/layout/item_status.xml +++ b/app/src/main/res/layout/item_status.xml @@ -39,8 +39,7 @@ android:layout_below="@+id/status_boosted" android:padding="@dimen/status_avatar_padding" /> - + android:paddingLeft="@dimen/status_username_left_margin" /> + android:paddingLeft="@dimen/status_since_created_left_margin" /> - + - + android:id="@+id/status_content_warning_description" + android:paddingRight="8dp"/> + android:padding="4dp" /> - + + + + + + + \ No newline at end of file