rounded corners for inset images!

This commit is contained in:
sk
2023-08-25 23:26:27 +02:00
parent aa9e66e6a2
commit ad96031aeb
6 changed files with 65 additions and 20 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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>

View File

@@ -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>