Add bot indicator overlay to avatars (#1173)

* Add bot indicator overlay to avatars

* Add bot overlay to account list in search view

* Add preference for bot avatar overlay
This commit is contained in:
Levi Bard 2019-04-09 20:13:25 +02:00 committed by Konrad Pozniak
parent 63e4c1d4e0
commit 391cd12974
13 changed files with 115 additions and 34 deletions

View file

@ -143,6 +143,9 @@ class PreferencesActivity : BaseActivity(), SharedPreferences.OnSharedPreference
"absoluteTimeView" -> { "absoluteTimeView" -> {
restartActivitiesOnExit = true restartActivitiesOnExit = true
} }
"showBotOverlay" -> {
restartActivitiesOnExit = true
}
"language" -> { "language" -> {
restartActivitiesOnExit = true restartActivitiesOnExit = true
this.restartCurrentActivity() this.restartCurrentActivity()

View file

@ -2,6 +2,8 @@ package com.keylesspalace.tusky.adapter;
import android.content.Context; import android.content.Context;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.preference.PreferenceManager;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -17,13 +19,17 @@ class AccountViewHolder extends RecyclerView.ViewHolder {
private TextView username; private TextView username;
private TextView displayName; private TextView displayName;
private ImageView avatar; private ImageView avatar;
private ImageView avatarInset;
private String accountId; private String accountId;
private boolean showBotOverlay;
AccountViewHolder(View itemView) { AccountViewHolder(View itemView) {
super(itemView); super(itemView);
username = itemView.findViewById(R.id.account_username); username = itemView.findViewById(R.id.account_username);
displayName = itemView.findViewById(R.id.account_display_name); displayName = itemView.findViewById(R.id.account_display_name);
avatar = itemView.findViewById(R.id.account_avatar); avatar = itemView.findViewById(R.id.account_avatar);
avatarInset = itemView.findViewById(R.id.account_avatar_inset);
showBotOverlay = PreferenceManager.getDefaultSharedPreferences(itemView.getContext()).getBoolean("showBotOverlay", true);
} }
void setupWithAccount(Account account) { void setupWithAccount(Account account) {
@ -38,6 +44,13 @@ class AccountViewHolder extends RecyclerView.ViewHolder {
.load(account.getAvatar()) .load(account.getAvatar())
.placeholder(R.drawable.avatar_default) .placeholder(R.drawable.avatar_default)
.into(avatar); .into(avatar);
if (showBotOverlay && account.getBot()) {
avatarInset.setVisibility(View.VISIBLE);
avatarInset.setImageResource(R.drawable.ic_bot_24dp);
avatarInset.setBackgroundColor(0x50ffffff);
} else {
avatarInset.setVisibility(View.GONE);
}
} }
void setupActionListener(final AccountActionListener listener) { void setupActionListener(final AccountActionListener listener) {

View file

@ -2,6 +2,7 @@ package com.keylesspalace.tusky.adapter;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.preference.PreferenceManager;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
@ -62,6 +63,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
private View sensitiveMediaShow; private View sensitiveMediaShow;
protected TextView mediaLabel; protected TextView mediaLabel;
private ToggleButton contentWarningButton; private ToggleButton contentWarningButton;
protected ImageView avatarInset;
public ImageView avatar; public ImageView avatar;
public TextView timestampInfo; public TextView timestampInfo;
@ -71,6 +73,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
private boolean useAbsoluteTime; private boolean useAbsoluteTime;
private SimpleDateFormat shortSdf; private SimpleDateFormat shortSdf;
private SimpleDateFormat longSdf; private SimpleDateFormat longSdf;
private boolean showBotOverlay;
private final NumberFormat numberFormat = NumberFormat.getNumberInstance(); private final NumberFormat numberFormat = NumberFormat.getNumberInstance();
@ -82,7 +85,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
content = itemView.findViewById(R.id.status_content); content = itemView.findViewById(R.id.status_content);
avatar = itemView.findViewById(R.id.status_avatar); avatar = itemView.findViewById(R.id.status_avatar);
replyButton = itemView.findViewById(R.id.status_reply); replyButton = itemView.findViewById(R.id.status_reply);
reblogButton = itemView.findViewById(R.id.status_reblog); reblogButton = itemView.findViewById(R.id.status_inset);
favouriteButton = itemView.findViewById(R.id.status_favourite); favouriteButton = itemView.findViewById(R.id.status_favourite);
moreButton = itemView.findViewById(R.id.status_more); moreButton = itemView.findViewById(R.id.status_more);
reblogged = false; reblogged = false;
@ -104,10 +107,12 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
mediaLabel = itemView.findViewById(R.id.status_media_label); mediaLabel = itemView.findViewById(R.id.status_media_label);
contentWarningDescription = itemView.findViewById(R.id.status_content_warning_description); contentWarningDescription = itemView.findViewById(R.id.status_content_warning_description);
contentWarningButton = itemView.findViewById(R.id.status_content_warning_button); contentWarningButton = itemView.findViewById(R.id.status_content_warning_button);
avatarInset = itemView.findViewById(R.id.status_avatar_inset);
this.useAbsoluteTime = useAbsoluteTime; this.useAbsoluteTime = useAbsoluteTime;
shortSdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); shortSdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
longSdf = new SimpleDateFormat("MM/dd HH:mm:ss", Locale.getDefault()); longSdf = new SimpleDateFormat("MM/dd HH:mm:ss", Locale.getDefault());
showBotOverlay = PreferenceManager.getDefaultSharedPreferences(itemView.getContext()).getBoolean("showBotOverlay", true);
} }
protected abstract int getMediaPreviewHeight(Context context); protected abstract int getMediaPreviewHeight(Context context);
@ -173,7 +178,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
} }
} }
protected void setAvatar(String url, @Nullable String rebloggedUrl) { protected void setAvatar(String url, @Nullable String rebloggedUrl, boolean isBot) {
if (TextUtils.isEmpty(url)) { if (TextUtils.isEmpty(url)) {
avatar.setImageResource(R.drawable.avatar_default); avatar.setImageResource(R.drawable.avatar_default);
} else { } else {
@ -182,6 +187,14 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
.placeholder(R.drawable.avatar_default) .placeholder(R.drawable.avatar_default)
.into(avatar); .into(avatar);
} }
if (showBotOverlay && isBot && TextUtils.isEmpty(rebloggedUrl)) {
avatarInset.setVisibility(View.VISIBLE);
avatarInset.setImageResource(R.drawable.ic_bot_24dp);
avatarInset.setBackgroundColor(0x50ffffff);
} else {
avatarInset.setVisibility(View.GONE);
}
} }
protected void setCreatedAt(@Nullable Date createdAt) { protected void setCreatedAt(@Nullable Date createdAt) {
@ -555,7 +568,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
setUsername(status.getNickname()); setUsername(status.getNickname());
setCreatedAt(status.getCreatedAt()); setCreatedAt(status.getCreatedAt());
setIsReply(status.getInReplyToId() != null); setIsReply(status.getInReplyToId() != null);
setAvatar(status.getAvatar(), status.getRebloggedAvatar()); setAvatar(status.getAvatar(), status.getRebloggedAvatar(), status.isBot());
setReblogged(status.isReblogged()); setReblogged(status.isReblogged());
setFavourited(status.isFavourited()); setFavourited(status.isFavourited());
List<Attachment> attachments = status.getAttachments(); List<Attachment> attachments = status.getAttachments();

View file

@ -17,6 +17,7 @@ package com.keylesspalace.tusky.adapter;
import android.content.Context; import android.content.Context;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -36,35 +37,28 @@ public class StatusViewHolder extends StatusBaseViewHolder {
private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE}; private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE};
private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0]; private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0];
private ImageView avatarReblog;
private TextView rebloggedBar; private TextView rebloggedBar;
private ToggleButton contentCollapseButton; private ToggleButton contentCollapseButton;
StatusViewHolder(View itemView, boolean useAbsoluteTime) { StatusViewHolder(View itemView, boolean useAbsoluteTime) {
super(itemView, useAbsoluteTime); super(itemView, useAbsoluteTime);
avatarReblog = itemView.findViewById(R.id.status_avatar_reblog);
rebloggedBar = itemView.findViewById(R.id.status_reblogged); rebloggedBar = itemView.findViewById(R.id.status_reblogged);
contentCollapseButton = itemView.findViewById(R.id.button_toggle_content); contentCollapseButton = itemView.findViewById(R.id.button_toggle_content);
} }
@Override @Override
protected void setAvatar(String url, @Nullable String rebloggedUrl) { protected void setAvatar(String url, @Nullable String rebloggedUrl, boolean isBot) {
super.setAvatar(url, rebloggedUrl); super.setAvatar(url, rebloggedUrl, isBot);
Context context = avatar.getContext(); Context context = avatar.getContext();
boolean hasReblog = rebloggedUrl != null && !rebloggedUrl.isEmpty();
int padding = hasReblog ? Utils.dpToPx(context, 12) : 0;
avatar.setPaddingRelative(0, 0, padding, padding); if (!TextUtils.isEmpty(rebloggedUrl)) {
int padding = Utils.dpToPx(context, 12);
if (hasReblog) { avatar.setPaddingRelative(0, 0, padding, padding);
avatarReblog.setVisibility(View.VISIBLE); avatarInset.setVisibility(View.VISIBLE);
Picasso.with(context) Picasso.with(context)
.load(rebloggedUrl) .load(rebloggedUrl)
.placeholder(R.drawable.avatar_default) .placeholder(R.drawable.avatar_default)
.into(avatarReblog); .into(avatarInset);
} else {
avatarReblog.setVisibility(View.GONE);
} }
} }

View file

@ -63,6 +63,8 @@ public final class ViewDataUtils {
SmartLengthInputFilter.LENGTH_DEFAULT SmartLengthInputFilter.LENGTH_DEFAULT
)) ))
.setCollapsed(true) .setCollapsed(true)
.setIsBot(visibleStatus.getAccount().getBot())
.createStatusViewData(); .createStatusViewData();
} }

View file

@ -87,6 +87,7 @@ public abstract class StatusViewData {
private final Card card; private final Card card;
private final boolean isCollapsible; /** Whether the status meets the requirement to be collapse */ private final boolean isCollapsible; /** Whether the status meets the requirement to be collapse */
final boolean isCollapsed; /** Whether the status is shown partially or fully */ final boolean isCollapsed; /** Whether the status is shown partially or fully */
private final boolean isBot;
public Concrete(String id, Spanned content, boolean reblogged, boolean favourited, public Concrete(String id, Spanned content, boolean reblogged, boolean favourited,
@Nullable String spoilerText, Status.Visibility visibility, List<Attachment> attachments, @Nullable String spoilerText, Status.Visibility visibility, List<Attachment> attachments,
@ -95,7 +96,7 @@ public abstract class StatusViewData {
Date createdAt, int reblogsCount, int favouritesCount, @Nullable String inReplyToId, Date createdAt, int reblogsCount, int favouritesCount, @Nullable String inReplyToId,
@Nullable Status.Mention[] mentions, String senderId, boolean rebloggingEnabled, @Nullable Status.Mention[] mentions, String senderId, boolean rebloggingEnabled,
Status.Application application, List<Emoji> statusEmojis, List<Emoji> accountEmojis, @Nullable Card card, Status.Application application, List<Emoji> statusEmojis, List<Emoji> accountEmojis, @Nullable Card card,
boolean isCollapsible, boolean isCollapsed) { boolean isCollapsible, boolean isCollapsed, boolean isBot) {
this.id = id; this.id = id;
if (Build.VERSION.SDK_INT == 23) { if (Build.VERSION.SDK_INT == 23) {
// https://github.com/tuskyapp/Tusky/issues/563 // https://github.com/tuskyapp/Tusky/issues/563
@ -131,6 +132,7 @@ public abstract class StatusViewData {
this.card = card; this.card = card;
this.isCollapsible = isCollapsible; this.isCollapsible = isCollapsible;
this.isCollapsed = isCollapsed; this.isCollapsed = isCollapsed;
this.isBot = isBot;
} }
public String getId() { public String getId() {
@ -179,6 +181,8 @@ public abstract class StatusViewData {
return isShowingContent; return isShowingContent;
} }
public boolean isBot(){ return isBot; }
@Nullable @Nullable
public String getRebloggedAvatar() { public String getRebloggedAvatar() {
return rebloggedAvatar; return rebloggedAvatar;
@ -277,6 +281,7 @@ public abstract class StatusViewData {
isSensitive == concrete.isSensitive && isSensitive == concrete.isSensitive &&
isExpanded == concrete.isExpanded && isExpanded == concrete.isExpanded &&
isShowingContent == concrete.isShowingContent && isShowingContent == concrete.isShowingContent &&
isBot == concrete.isBot &&
reblogsCount == concrete.reblogsCount && reblogsCount == concrete.reblogsCount &&
favouritesCount == concrete.favouritesCount && favouritesCount == concrete.favouritesCount &&
rebloggingEnabled == concrete.rebloggingEnabled && rebloggingEnabled == concrete.rebloggingEnabled &&
@ -402,6 +407,7 @@ public abstract class StatusViewData {
private Card card; private Card card;
private boolean isCollapsible; /** Whether the status meets the requirement to be collapsed */ private boolean isCollapsible; /** Whether the status meets the requirement to be collapsed */
private boolean isCollapsed; /** Whether the status is shown partially or fully */ private boolean isCollapsed; /** Whether the status is shown partially or fully */
private boolean isBot;
public Builder() { public Builder() {
} }
@ -435,6 +441,7 @@ public abstract class StatusViewData {
card = viewData.getCard(); card = viewData.getCard();
isCollapsible = viewData.isCollapsible(); isCollapsible = viewData.isCollapsible();
isCollapsed = viewData.isCollapsed(); isCollapsed = viewData.isCollapsed();
isBot = viewData.isBot();
} }
public Builder setId(String id) { public Builder setId(String id) {
@ -497,6 +504,11 @@ public abstract class StatusViewData {
return this; return this;
} }
public Builder setIsBot(boolean isBot) {
this.isBot = isBot;
return this;
}
public Builder setUserFullName(String userFullName) { public Builder setUserFullName(String userFullName) {
this.userFullName = userFullName; this.userFullName = userFullName;
return this; return this;
@ -600,7 +612,7 @@ public abstract class StatusViewData {
attachments, rebloggedByUsername, rebloggedAvatar, isSensitive, isExpanded, attachments, rebloggedByUsername, rebloggedAvatar, isSensitive, isExpanded,
isShowingContent, userFullName, nickname, avatar, createdAt, reblogsCount, isShowingContent, userFullName, nickname, avatar, createdAt, reblogsCount,
favouritesCount, inReplyToId, mentions, senderId, rebloggingEnabled, application, favouritesCount, inReplyToId, mentions, senderId, rebloggingEnabled, application,
statusEmojis, accountEmojis, card, isCollapsible, isCollapsed); statusEmojis, accountEmojis, card, isCollapsible, isCollapsed, isBot);
} }
} }
} }

View file

@ -0,0 +1,8 @@
<!-- drawable/robot.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="#000" android:pathData="M12,2A2,2 0 0,1 14,4C14,4.74 13.6,5.39 13,5.73V7H14A7,7 0 0,1 21,14H22A1,1 0 0,1 23,15V18A1,1 0 0,1 22,19H21V20A2,2 0 0,1 19,22H5A2,2 0 0,1 3,20V19H2A1,1 0 0,1 1,18V15A1,1 0 0,1 2,14H3A7,7 0 0,1 10,7H11V5.73C10.4,5.39 10,4.74 10,4A2,2 0 0,1 12,2M7.5,13A2.5,2.5 0 0,0 5,15.5A2.5,2.5 0 0,0 7.5,18A2.5,2.5 0 0,0 10,15.5A2.5,2.5 0 0,0 7.5,13M16.5,13A2.5,2.5 0 0,0 14,15.5A2.5,2.5 0 0,0 16.5,18A2.5,2.5 0 0,0 19,15.5A2.5,2.5 0 0,0 16.5,13Z" />
</vector>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/account_container" android:id="@+id/account_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="72dp" android:layout_height="72dp"
@ -12,14 +13,31 @@
android:id="@+id/account_avatar" android:id="@+id/account_avatar"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_centerVertical="true" android:foregroundGravity="center_vertical"
android:layout_marginEnd="24dp" /> android:layout_marginEnd="24dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<com.keylesspalace.tusky.view.RoundedImageView
android:id="@+id/account_avatar_inset"
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@null"
android:importantForAccessibility="no"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/account_avatar"
app:layout_constraintEnd_toEndOf="@id/account_avatar"
tools:src="@color/accent"
tools:visibility="visible" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_toEndOf="@id/account_avatar" app:layout_constraintStart_toEndOf="@id/account_avatar"
android:gravity="center_vertical" android:gravity="center_vertical"
android:layout_marginStart="14dp"
android:orientation="vertical"> android:orientation="vertical">
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
@ -45,4 +63,4 @@
</LinearLayout> </LinearLayout>
</RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -69,7 +69,7 @@
tools:src="@drawable/avatar_default" /> tools:src="@drawable/avatar_default" />
<com.keylesspalace.tusky.view.RoundedImageView <com.keylesspalace.tusky.view.RoundedImageView
android:id="@+id/status_avatar_reblog" android:id="@+id/status_avatar_inset"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:contentDescription="@null" android:contentDescription="@null"

View file

@ -44,7 +44,7 @@
tools:src="@drawable/avatar_default" /> tools:src="@drawable/avatar_default" />
<com.keylesspalace.tusky.view.RoundedImageView <com.keylesspalace.tusky.view.RoundedImageView
android:id="@+id/status_avatar_reblog" android:id="@+id/status_avatar_inset"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:contentDescription="@null" android:contentDescription="@null"
@ -338,14 +338,14 @@
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:padding="4dp" android:padding="4dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/status_reblog" app:layout_constraintEnd_toStartOf="@id/status_inset"
app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="@id/status_display_name" app:layout_constraintStart_toStartOf="@id/status_display_name"
app:layout_constraintTop_toBottomOf="@id/status_media_preview_container" app:layout_constraintTop_toBottomOf="@id/status_media_preview_container"
app:srcCompat="@drawable/ic_reply_24dp" /> app:srcCompat="@drawable/ic_reply_24dp" />
<at.connyduck.sparkbutton.SparkButton <at.connyduck.sparkbutton.SparkButton
android:id="@+id/status_reblog" android:id="@+id/status_inset"
android:layout_width="30dp" android:layout_width="30dp"
android:layout_height="30dp" android:layout_height="30dp"
android:clipToPadding="false" android:clipToPadding="false"
@ -370,8 +370,8 @@
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:padding="4dp" android:padding="4dp"
app:layout_constraintEnd_toStartOf="@id/status_more" app:layout_constraintEnd_toStartOf="@id/status_more"
app:layout_constraintStart_toEndOf="@id/status_reblog" app:layout_constraintStart_toEndOf="@id/status_inset"
app:layout_constraintTop_toTopOf="@id/status_reblog" app:layout_constraintTop_toTopOf="@id/status_inset"
sparkbutton:activeImage="?attr/status_favourite_active_drawable" sparkbutton:activeImage="?attr/status_favourite_active_drawable"
sparkbutton:iconSize="28dp" sparkbutton:iconSize="28dp"
sparkbutton:inactiveImage="?attr/status_favourite_inactive_drawable" sparkbutton:inactiveImage="?attr/status_favourite_inactive_drawable"

View file

@ -24,6 +24,18 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/avatar_default" /> tools:src="@drawable/avatar_default" />
<com.keylesspalace.tusky.view.RoundedImageView
android:id="@+id/status_avatar_inset"
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@null"
android:importantForAccessibility="no"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/status_avatar"
app:layout_constraintEnd_toEndOf="@id/status_avatar"
tools:src="@color/accent"
tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
android:id="@+id/status_display_name" android:id="@+id/status_display_name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -408,14 +420,14 @@
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:padding="4dp" android:padding="4dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/status_reblog" app:layout_constraintEnd_toStartOf="@id/status_inset"
app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_buttons_divider" app:layout_constraintTop_toBottomOf="@id/status_buttons_divider"
app:srcCompat="@drawable/ic_reply_24dp" /> app:srcCompat="@drawable/ic_reply_24dp" />
<at.connyduck.sparkbutton.SparkButton <at.connyduck.sparkbutton.SparkButton
android:id="@+id/status_reblog" android:id="@+id/status_inset"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:clipToPadding="false" android:clipToPadding="false"
@ -440,8 +452,8 @@
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:padding="4dp" android:padding="4dp"
app:layout_constraintEnd_toStartOf="@id/status_more" app:layout_constraintEnd_toStartOf="@id/status_more"
app:layout_constraintStart_toEndOf="@id/status_reblog" app:layout_constraintStart_toEndOf="@id/status_inset"
app:layout_constraintTop_toTopOf="@id/status_reblog" app:layout_constraintTop_toTopOf="@id/status_inset"
sparkbutton:activeImage="?attr/status_favourite_active_drawable" sparkbutton:activeImage="?attr/status_favourite_active_drawable"
sparkbutton:iconSize="28dp" sparkbutton:iconSize="28dp"
sparkbutton:inactiveImage="?attr/status_favourite_inactive_drawable" sparkbutton:inactiveImage="?attr/status_favourite_inactive_drawable"

View file

@ -470,5 +470,6 @@
<string name="compose_shortcut_long_label">Compose Toot</string> <string name="compose_shortcut_long_label">Compose Toot</string>
<string name="compose_shortcut_short_label">Compose</string> <string name="compose_shortcut_short_label">Compose</string>
<string name="pref_title_bot_overlay">Show indicator for bots</string>
</resources> </resources>

View file

@ -46,6 +46,11 @@
android:key="absoluteTimeView" android:key="absoluteTimeView"
android:title="@string/pref_title_absolute_time" /> android:title="@string/pref_title_absolute_time" />
<SwitchPreference
android:defaultValue="true"
android:key="showBotOverlay"
android:title="@string/pref_title_bot_overlay" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory