rounded corners for inset images!
This commit is contained in:
@@ -6,6 +6,7 @@ import android.net.Uri;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
@@ -13,12 +14,14 @@ import org.joinmastodon.android.R;
|
|||||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||||
import org.joinmastodon.android.model.Card;
|
import org.joinmastodon.android.model.Card;
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
|
import org.joinmastodon.android.ui.OutlineProviders;
|
||||||
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
|
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
|
||||||
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
|
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
|
||||||
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
||||||
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
||||||
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||||
private final Status status;
|
private final Status status;
|
||||||
@@ -51,6 +54,7 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
|||||||
public static class Holder extends StatusDisplayItem.Holder<LinkCardStatusDisplayItem> implements ImageLoaderViewHolder{
|
public static class Holder extends StatusDisplayItem.Holder<LinkCardStatusDisplayItem> implements ImageLoaderViewHolder{
|
||||||
private final TextView title, description, domain;
|
private final TextView title, description, domain;
|
||||||
private final ImageView photo;
|
private final ImageView photo;
|
||||||
|
private final View inner;
|
||||||
private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable();
|
private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable();
|
||||||
private boolean didClear;
|
private boolean didClear;
|
||||||
|
|
||||||
@@ -60,7 +64,8 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
|||||||
description=findViewById(R.id.description);
|
description=findViewById(R.id.description);
|
||||||
domain=findViewById(R.id.domain);
|
domain=findViewById(R.id.domain);
|
||||||
photo=findViewById(R.id.photo);
|
photo=findViewById(R.id.photo);
|
||||||
findViewById(R.id.inner).setOnClickListener(this::onClick);
|
inner=findViewById(R.id.inner);
|
||||||
|
inner.setOnClickListener(this::onClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -84,6 +89,15 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
|||||||
photo.setImageDrawable(crossfadeDrawable);
|
photo.setImageDrawable(crossfadeDrawable);
|
||||||
didClear=false;
|
didClear=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if there's no image, we don't want to cover the inset borders
|
||||||
|
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams) inner.getLayoutParams();
|
||||||
|
int margin=item.inset && item.imgRequest == null ? V.dp(1) : 0;
|
||||||
|
params.setMargins(margin, 0, margin, margin);
|
||||||
|
|
||||||
|
boolean insetAndLast=item.inset && isLastDisplayItemForStatus();
|
||||||
|
inner.setClipToOutline(insetAndLast);
|
||||||
|
inner.setOutlineProvider(insetAndLast ? OutlineProviders.bottomRoundedRect(12) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.joinmastodon.android.R;
|
|||||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||||
import org.joinmastodon.android.model.Attachment;
|
import org.joinmastodon.android.model.Attachment;
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
|
import org.joinmastodon.android.ui.OutlineProviders;
|
||||||
import org.joinmastodon.android.ui.PhotoLayoutHelper;
|
import org.joinmastodon.android.ui.PhotoLayoutHelper;
|
||||||
import org.joinmastodon.android.ui.drawables.SpoilerStripesDrawable;
|
import org.joinmastodon.android.ui.drawables.SpoilerStripesDrawable;
|
||||||
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
|
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
|
||||||
@@ -210,6 +211,10 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
|||||||
sensitiveText.setText(R.string.media_hidden);
|
sensitiveText.setText(R.string.media_hidden);
|
||||||
else
|
else
|
||||||
sensitiveText.setText(R.string.sensitive_content_explain);
|
sensitiveText.setText(R.string.sensitive_content_explain);
|
||||||
|
|
||||||
|
boolean insetAndLast=item.inset && isLastDisplayItemForStatus();
|
||||||
|
wrapper.setClipToOutline(insetAndLast);
|
||||||
|
wrapper.setOutlineProvider(insetAndLast ? OutlineProviders.bottomRoundedRect(12) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -388,6 +388,43 @@ public abstract class StatusDisplayItem{
|
|||||||
item.parentFragment.onItemClick(item.parentID);
|
item.parentFragment.onItemClick(item.parentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<StatusDisplayItem> getNextVisibleDisplayItem(){
|
||||||
|
Optional<StatusDisplayItem> next=getNextDisplayItem();
|
||||||
|
for(int offset=1; next.isPresent(); next=getDisplayItemOffset(++offset)){
|
||||||
|
if(!next.map(n->
|
||||||
|
(n instanceof EmojiReactionsStatusDisplayItem e && e.isHidden()) ||
|
||||||
|
(n instanceof DummyStatusDisplayItem)
|
||||||
|
).orElse(false)) return next;
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
// int nextNextPos=getAbsoluteAdapterPosition() + 2;
|
||||||
|
// if(next.map(n->n instanceof EmojiReactionsStatusDisplayItem e && e.isHidden()).orElse(false)){
|
||||||
|
// List<StatusDisplayItem> displayItems=item.parentFragment.getDisplayItems();
|
||||||
|
// return displayItems.size() > nextNextPos
|
||||||
|
// ? Optional.of(displayItems.get(nextNextPos))
|
||||||
|
// : Optional.empty();
|
||||||
|
// }else{
|
||||||
|
// return next;
|
||||||
|
// }
|
||||||
|
public Optional<StatusDisplayItem> getNextDisplayItem(){
|
||||||
|
return getDisplayItemOffset(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<StatusDisplayItem> getDisplayItemOffset(int offset){
|
||||||
|
int nextPos=getAbsoluteAdapterPosition() + offset;
|
||||||
|
List<StatusDisplayItem> displayItems=item.parentFragment.getDisplayItems();
|
||||||
|
return displayItems.size() > nextPos
|
||||||
|
? Optional.of(displayItems.get(nextPos))
|
||||||
|
: Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLastDisplayItemForStatus(){
|
||||||
|
return getNextVisibleDisplayItem()
|
||||||
|
.map(n->!n.parentID.equals(item.parentID))
|
||||||
|
.orElse(true);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled(){
|
public boolean isEnabled(){
|
||||||
return item.parentFragment.isItemEnabled(item.parentID);
|
return item.parentFragment.isItemEnabled(item.parentID);
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ import org.joinmastodon.android.ui.utils.UiUtils;
|
|||||||
import org.joinmastodon.android.ui.views.LinkedTextView;
|
import org.joinmastodon.android.ui.views.LinkedTextView;
|
||||||
import org.joinmastodon.android.utils.StatusTextEncoder;
|
import org.joinmastodon.android.utils.StatusTextEncoder;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -196,21 +194,13 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
|||||||
|
|
||||||
readMore.setText(item.status.textExpanded ? R.string.sk_collapse : R.string.sk_expand);
|
readMore.setText(item.status.textExpanded ? R.string.sk_collapse : R.string.sk_expand);
|
||||||
|
|
||||||
// remove additional padding when (transparently padded) translate button is visible
|
StatusDisplayItem next=getNextVisibleDisplayItem().orElse(null);
|
||||||
int nextPos=getAbsoluteAdapterPosition() + 1;
|
int bottomPadding=next instanceof FooterStatusDisplayItem
|
||||||
int bottomPadding=V.dp(12);
|
? V.dp(6)
|
||||||
List<StatusDisplayItem> displayItems=item.parentFragment.getDisplayItems();
|
: (!item.inset && next instanceof DummyStatusDisplayItem) ||
|
||||||
if(displayItems.size() > nextPos){
|
next instanceof EmojiReactionsStatusDisplayItem e && !e.isHidden()
|
||||||
StatusDisplayItem next=displayItems.get(nextPos);
|
? 0
|
||||||
if(next instanceof EmojiReactionsStatusDisplayItem e && e.isHidden()){
|
: V.dp(12);
|
||||||
next=displayItems.size() > ++nextPos ? displayItems.get(nextPos) : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(next instanceof FooterStatusDisplayItem) bottomPadding=V.dp(6);
|
|
||||||
else if((!item.inset && next instanceof DummyStatusDisplayItem)
|
|
||||||
|| next instanceof EmojiReactionsStatusDisplayItem e && !e.isHidden()
|
|
||||||
) bottomPadding=0;
|
|
||||||
}
|
|
||||||
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), bottomPadding);
|
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), bottomPadding);
|
||||||
|
|
||||||
if (!GlobalUserPreferences.collapseLongPosts) {
|
if (!GlobalUserPreferences.collapseLongPosts) {
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
<item android:id="@android:id/mask">
|
<item android:id="@android:id/mask">
|
||||||
<shape>
|
<shape>
|
||||||
<solid android:color="#000"/>
|
<solid android:color="#000"/>
|
||||||
<corners android:radius="4dp"/>
|
|
||||||
</shape>
|
</shape>
|
||||||
</item>
|
</item>
|
||||||
</ripple>
|
</ripple>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
<item name="colorBoost">?colorM3Primary</item>
|
<item name="colorBoost">?colorM3Primary</item>
|
||||||
<item name="colorPoll">@color/bookmark_selected</item>
|
<item name="colorPoll">@color/bookmark_selected</item>
|
||||||
<item name="colorTabBarAlpha">#14000000</item>
|
<item name="colorTabBarAlpha">#14000000</item>
|
||||||
<item name="colorFilledCardAlpha">#30000000</item>
|
<item name="colorFilledCardAlpha">#22000000</item>
|
||||||
|
|
||||||
<item name="colorM3DisabledBackground">#1F1F1F1F</item>
|
<item name="colorM3DisabledBackground">#1F1F1F1F</item>
|
||||||
<item name="colorM3Error">#B3261E</item>
|
<item name="colorM3Error">#B3261E</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user