Merge remote-tracking branch 'tuskyapp/develop'

This commit is contained in:
kyori19 2020-01-11 22:46:31 +09:00
commit b2739828dc
26 changed files with 160 additions and 143 deletions

View File

@ -208,6 +208,7 @@ class TimelineDAOTest {
favouritesCount = 2 * statusId.toInt(), favouritesCount = 2 * statusId.toInt(),
reblogged = even, reblogged = even,
favourited = !even, favourited = !even,
bookmarked = false,
sensitive = even, sensitive = even,
spoilerText = "spoier$statusId", spoilerText = "spoier$statusId",
visibility = Status.Visibility.PRIVATE, visibility = Status.Visibility.PRIVATE,
@ -236,6 +237,7 @@ class TimelineDAOTest {
favouritesCount = 0, favouritesCount = 0,
reblogged = false, reblogged = false,
favourited = false, favourited = false,
bookmarked = false,
sensitive = false, sensitive = false,
spoilerText = null, spoilerText = null,
visibility = null, visibility = null,

View File

@ -20,7 +20,6 @@ import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
@ -41,6 +40,7 @@ import com.keylesspalace.tusky.db.TootDao;
import com.keylesspalace.tusky.db.TootEntity; import com.keylesspalace.tusky.db.TootEntity;
import com.keylesspalace.tusky.di.Injectable; import com.keylesspalace.tusky.di.Injectable;
import com.keylesspalace.tusky.util.SaveTootHelper; import com.keylesspalace.tusky.util.SaveTootHelper;
import com.keylesspalace.tusky.view.BackgroundMessageView;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -60,7 +60,7 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd
// ui // ui
private SavedTootAdapter adapter; private SavedTootAdapter adapter;
private TextView noContent; private BackgroundMessageView errorMessageView;
private List<TootEntity> toots = new ArrayList<>(); private List<TootEntity> toots = new ArrayList<>();
@Nullable @Nullable
@ -95,7 +95,7 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd
} }
RecyclerView recyclerView = findViewById(R.id.recyclerView); RecyclerView recyclerView = findViewById(R.id.recyclerView);
noContent = findViewById(R.id.no_content); errorMessageView = findViewById(R.id.errorMessageView);
recyclerView.setHasFixedSize(true); recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this); LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager); recyclerView.setLayoutManager(layoutManager);
@ -136,9 +136,10 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd
private void setNoContent(int size) { private void setNoContent(int size) {
if (size == 0) { if (size == 0) {
noContent.setVisibility(View.VISIBLE); errorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_saved_status, null);
errorMessageView.setVisibility(View.VISIBLE);
} else { } else {
noContent.setVisibility(View.INVISIBLE); errorMessageView.setVisibility(View.GONE);
} }
} }

View File

@ -28,10 +28,9 @@ import android.text.style.StyleSpan;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CompoundButton; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ToggleButton;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -336,7 +335,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
} }
private static class StatusNotificationViewHolder extends RecyclerView.ViewHolder private static class StatusNotificationViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, ToggleButton.OnCheckedChangeListener { implements View.OnClickListener {
private final TextView message; private final TextView message;
private final View statusNameBar; private final View statusNameBar;
private final TextView displayName; private final TextView displayName;
@ -346,8 +345,8 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
private final ImageView statusAvatar; private final ImageView statusAvatar;
private final ImageView notificationAvatar; private final ImageView notificationAvatar;
private final TextView contentWarningDescriptionTextView; private final TextView contentWarningDescriptionTextView;
private final ToggleButton contentWarningButton; private final Button contentWarningButton;
private final ToggleButton contentCollapseButton; // TODO: This code SHOULD be based on StatusBaseViewHolder private final Button contentCollapseButton; // TODO: This code SHOULD be based on StatusBaseViewHolder
private ConstraintLayout quoteContainer; private ConstraintLayout quoteContainer;
private StatusDisplayOptions statusDisplayOptions; private StatusDisplayOptions statusDisplayOptions;
@ -382,7 +381,6 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
itemView.setOnClickListener(this); itemView.setOnClickListener(this);
message.setOnClickListener(this); message.setOnClickListener(this);
statusContent.setOnClickListener(this); statusContent.setOnClickListener(this);
contentWarningButton.setOnCheckedChangeListener(this);
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());
} }
@ -488,6 +486,14 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
boolean hasSpoiler = !TextUtils.isEmpty(statusViewData.getSpoilerText()); boolean hasSpoiler = !TextUtils.isEmpty(statusViewData.getSpoilerText());
contentWarningDescriptionTextView.setVisibility(hasSpoiler ? View.VISIBLE : View.GONE); contentWarningDescriptionTextView.setVisibility(hasSpoiler ? View.VISIBLE : View.GONE);
contentWarningButton.setVisibility(hasSpoiler ? View.VISIBLE : View.GONE); contentWarningButton.setVisibility(hasSpoiler ? View.VISIBLE : View.GONE);
contentWarningButton.setOnClickListener(view -> {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
notificationActionListener.onExpandedChange(!statusViewData.isExpanded(), getAdapterPosition());
}
statusContent.setVisibility(statusViewData.isExpanded() ? View.GONE : View.VISIBLE);
});
setupContentAndSpoiler(notificationViewData, listener); setupContentAndSpoiler(notificationViewData, listener);
} }
@ -553,19 +559,19 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
List<Emoji> emojis = statusViewData.getStatusEmojis(); List<Emoji> emojis = statusViewData.getStatusEmojis();
if (statusViewData.isCollapsible() && (notificationViewData.isExpanded() || !hasSpoiler)) { if (statusViewData.isCollapsible() && (notificationViewData.isExpanded() || !hasSpoiler)) {
contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { contentCollapseButton.setOnClickListener(view -> {
int position = getAdapterPosition(); int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION && notificationActionListener != null) { if (position != RecyclerView.NO_POSITION && notificationActionListener != null) {
notificationActionListener.onNotificationContentCollapsedChange(isChecked, position); notificationActionListener.onNotificationContentCollapsedChange(statusViewData.isCollapsed(), position);
} }
}); });
contentCollapseButton.setVisibility(View.VISIBLE); contentCollapseButton.setVisibility(View.VISIBLE);
if (statusViewData.isCollapsed()) { if (statusViewData.isCollapsed()) {
contentCollapseButton.setChecked(true); contentCollapseButton.setText(R.string.status_content_warning_show_more);
statusContent.setFilters(COLLAPSE_INPUT_FILTER); statusContent.setFilters(COLLAPSE_INPUT_FILTER);
} else { } else {
contentCollapseButton.setChecked(false); contentCollapseButton.setText(R.string.status_content_warning_show_less);
statusContent.setFilters(NO_INPUT_FILTER); statusContent.setFilters(NO_INPUT_FILTER);
} }
} else { } else {
@ -584,12 +590,5 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
setQuoteContainer(statusViewData.getQuote(), listener); setQuoteContainer(statusViewData.getQuote(), listener);
} }
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
notificationActionListener.onExpandedChange(isChecked, getAdapterPosition());
}
statusContent.setVisibility(isChecked ? View.VISIBLE : View.GONE);
}
} }
} }

View File

@ -15,7 +15,6 @@ import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ToggleButton;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -26,6 +25,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.google.android.material.button.MaterialButton;
import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.entity.Attachment; import com.keylesspalace.tusky.entity.Attachment;
import com.keylesspalace.tusky.entity.Attachment.Focus; import com.keylesspalace.tusky.entity.Attachment.Focus;
@ -79,7 +79,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
private TextView sensitiveMediaWarning; private TextView sensitiveMediaWarning;
private View sensitiveMediaShow; private View sensitiveMediaShow;
protected TextView[] mediaLabels; protected TextView[] mediaLabels;
private ToggleButton contentWarningButton; private MaterialButton contentWarningButton;
private ImageView avatarInset; private ImageView avatarInset;
public ImageView avatar; public ImageView avatar;
@ -184,7 +184,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
} }
public void toggleContentWarning() { public void toggleContentWarning() {
contentWarningButton.toggle(); contentWarningButton.performClick();
} }
protected void setSpoilerAndContent(boolean expanded, protected void setSpoilerAndContent(boolean expanded,
@ -205,18 +205,28 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
contentWarningDescription.setText(emojiSpoiler); contentWarningDescription.setText(emojiSpoiler);
contentWarningDescription.setVisibility(View.VISIBLE); contentWarningDescription.setVisibility(View.VISIBLE);
contentWarningButton.setVisibility(View.VISIBLE); contentWarningButton.setVisibility(View.VISIBLE);
contentWarningButton.setChecked(expanded); setContentWarningButtonText(expanded);
contentWarningButton.setOnCheckedChangeListener((buttonView, isChecked) -> { contentWarningButton.setOnClickListener( view -> {
contentWarningDescription.invalidate(); contentWarningDescription.invalidate();
if (getAdapterPosition() != RecyclerView.NO_POSITION) { if (getAdapterPosition() != RecyclerView.NO_POSITION) {
listener.onExpandedChange(isChecked, getAdapterPosition()); listener.onExpandedChange(!expanded, getAdapterPosition());
} }
this.setTextVisible(isChecked, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote); setContentWarningButtonText(!expanded);
this.setTextVisible(!expanded, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote);
}); });
this.setTextVisible(expanded, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote); this.setTextVisible(expanded, content, mentions, emojis, poll, statusDisplayOptions, listener, removeQuote);
} }
} }
private void setContentWarningButtonText(boolean expanded) {
if(expanded) {
contentWarningButton.setText(R.string.status_content_warning_show_less);
} else {
contentWarningButton.setText(R.string.status_content_warning_show_more);
}
}
private void setTextVisible(boolean expanded, private void setTextVisible(boolean expanded,
Spanned content, Spanned content,
Status.Mention[] mentions, Status.Mention[] mentions,
@ -566,16 +576,12 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
setAttachmentClickListener(imageView, listener, i, attachment, true); setAttachmentClickListener(imageView, listener, i, attachment, true);
} }
final String hiddenContentText;
if (sensitive) { if (sensitive) {
hiddenContentText = context.getString(R.string.status_sensitive_media_title); sensitiveMediaWarning.setText(R.string.status_sensitive_media_title);
} else { } else {
hiddenContentText = context.getString(R.string.status_media_hidden_title); sensitiveMediaWarning.setText(R.string.status_media_hidden_title);
} }
sensitiveMediaWarning.setText(HtmlUtils.fromHtml(hiddenContentText));
sensitiveMediaWarning.setVisibility(showingContent ? View.GONE : View.VISIBLE); sensitiveMediaWarning.setVisibility(showingContent ? View.GONE : View.VISIBLE);
sensitiveMediaShow.setVisibility(showingContent ? View.VISIBLE : View.GONE); sensitiveMediaShow.setVisibility(showingContent ? View.VISIBLE : View.GONE);
sensitiveMediaShow.setOnClickListener(v -> { sensitiveMediaShow.setOnClickListener(v -> {

View File

@ -19,8 +19,8 @@ import android.content.Context;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ToggleButton;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -38,7 +38,7 @@ public class StatusViewHolder extends StatusBaseViewHolder {
private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0]; private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0];
private TextView statusInfo; private TextView statusInfo;
private ToggleButton contentCollapseButton; private Button contentCollapseButton;
public StatusViewHolder(View itemView) { public StatusViewHolder(View itemView) {
super(itemView); super(itemView);
@ -96,18 +96,18 @@ public class StatusViewHolder extends StatusBaseViewHolder {
private void setupCollapsedState(final StatusViewData.Concrete status, final StatusActionListener listener) { private void setupCollapsedState(final StatusViewData.Concrete status, final StatusActionListener listener) {
/* input filter for TextViews have to be set before text */ /* input filter for TextViews have to be set before text */
if (status.isCollapsible() && (status.isExpanded() || TextUtils.isEmpty(status.getSpoilerText()))) { if (status.isCollapsible() && (status.isExpanded() || TextUtils.isEmpty(status.getSpoilerText()))) {
contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { contentCollapseButton.setOnClickListener(view -> {
int position = getAdapterPosition(); int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) if (position != RecyclerView.NO_POSITION)
listener.onContentCollapsedChange(isChecked, position); listener.onContentCollapsedChange(!status.isCollapsed(), position);
}); });
contentCollapseButton.setVisibility(View.VISIBLE); contentCollapseButton.setVisibility(View.VISIBLE);
if (status.isCollapsed()) { if (status.isCollapsed()) {
contentCollapseButton.setChecked(true); contentCollapseButton.setText(R.string.status_content_warning_show_more);
content.setFilters(COLLAPSE_INPUT_FILTER); content.setFilters(COLLAPSE_INPUT_FILTER);
} else { } else {
contentCollapseButton.setChecked(false); contentCollapseButton.setText(R.string.status_content_warning_show_less);
content.setFilters(NO_INPUT_FILTER); content.setFilters(NO_INPUT_FILTER);
} }
} else { } else {

View File

@ -19,9 +19,9 @@ import android.content.Context;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ToggleButton;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -41,7 +41,7 @@ public class ConversationViewHolder extends StatusBaseViewHolder {
private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0]; private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0];
private TextView conversationNameTextView; private TextView conversationNameTextView;
private ToggleButton contentCollapseButton; private Button contentCollapseButton;
private ImageView[] avatars; private ImageView[] avatars;
private StatusDisplayOptions statusDisplayOptions; private StatusDisplayOptions statusDisplayOptions;
@ -145,18 +145,18 @@ public class ConversationViewHolder extends StatusBaseViewHolder {
private void setupCollapsedState(boolean collapsible, boolean collapsed, boolean expanded, String spoilerText, final StatusActionListener listener) { private void setupCollapsedState(boolean collapsible, boolean collapsed, boolean expanded, String spoilerText, final StatusActionListener listener) {
/* input filter for TextViews have to be set before text */ /* input filter for TextViews have to be set before text */
if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) { if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) {
contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { contentCollapseButton.setOnClickListener(view -> {
int position = getAdapterPosition(); int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) if (position != RecyclerView.NO_POSITION)
listener.onContentCollapsedChange(isChecked, position); listener.onContentCollapsedChange(!collapsed, position);
}); });
contentCollapseButton.setVisibility(View.VISIBLE); contentCollapseButton.setVisibility(View.VISIBLE);
if (collapsed) { if (collapsed) {
contentCollapseButton.setChecked(true); contentCollapseButton.setText(R.string.status_content_warning_show_more);
content.setFilters(COLLAPSE_INPUT_FILTER); content.setFilters(COLLAPSE_INPUT_FILTER);
} else { } else {
contentCollapseButton.setChecked(false); contentCollapseButton.setText(R.string.status_content_warning_show_less);
content.setFilters(NO_INPUT_FILTER); content.setFilters(NO_INPUT_FILTER);
} }
} else { } else {

View File

@ -94,13 +94,15 @@ class StatusViewHolder(
itemView.statusContentWarningDescription.text = emojiSpoiler itemView.statusContentWarningDescription.text = emojiSpoiler
itemView.statusContentWarningDescription.show() itemView.statusContentWarningDescription.show()
itemView.statusContentWarningButton.show() itemView.statusContentWarningButton.show()
itemView.statusContentWarningButton.isChecked = viewState.isContentShow(status.id, true) setContentWarningButtonText(viewState.isContentShow(status.id, true))
itemView.statusContentWarningButton.setOnCheckedChangeListener { _, isViewChecked -> itemView.statusContentWarningButton.setOnClickListener {
status()?.let { status -> status()?.let { status ->
val contentShown = viewState.isContentShow(status.id, true)
itemView.statusContentWarningDescription.invalidate() itemView.statusContentWarningDescription.invalidate()
viewState.setContentShow(status.id, isViewChecked) viewState.setContentShow(status.id, !contentShown)
setTextVisible(isViewChecked, status.content, status.mentions, status.emojis, adapterHandler, setTextVisible(!contentShown, status.content, status.mentions, status.emojis, adapterHandler,
status.quote != null) status.quote != null)
setContentWarningButtonText(!contentShown)
} }
} }
setTextVisible(viewState.isContentShow(status.id, true), status.content, status.mentions, status.emojis, adapterHandler, setTextVisible(viewState.isContentShow(status.id, true), status.content, status.mentions, status.emojis, adapterHandler,
@ -109,6 +111,13 @@ class StatusViewHolder(
} }
} }
private fun setContentWarningButtonText(contentShown: Boolean) {
if(contentShown) {
itemView.statusContentWarningButton.setText(R.string.status_content_warning_show_less)
} else {
itemView.statusContentWarningButton.setText(R.string.status_content_warning_show_more)
}
}
private fun setTextVisible(expanded: Boolean, private fun setTextVisible(expanded: Boolean,
content: Spanned, content: Spanned,
@ -148,19 +157,19 @@ class StatusViewHolder(
private fun setupCollapsedState(collapsible: Boolean, collapsed: Boolean, expanded: Boolean, spoilerText: String) { private fun setupCollapsedState(collapsible: Boolean, collapsed: Boolean, expanded: Boolean, spoilerText: String) {
/* input filter for TextViews have to be set before text */ /* input filter for TextViews have to be set before text */
if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) { if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) {
itemView.buttonToggleContent.setOnCheckedChangeListener { _, isChecked -> itemView.buttonToggleContent.setOnClickListener{
status()?.let { status -> status()?.let { status ->
viewState.setCollapsed(status.id, isChecked) viewState.setCollapsed(status.id, !collapsed)
updateTextView() updateTextView()
} }
} }
itemView.buttonToggleContent.show() itemView.buttonToggleContent.show()
if (collapsed) { if (collapsed) {
itemView.buttonToggleContent.isChecked = true itemView.buttonToggleContent.setText(R.string.status_content_show_more)
itemView.statusContent.filters = COLLAPSE_INPUT_FILTER itemView.statusContent.filters = COLLAPSE_INPUT_FILTER
} else { } else {
itemView.buttonToggleContent.isChecked = false itemView.buttonToggleContent.setText(R.string.status_content_show_less)
itemView.statusContent.filters = NO_INPUT_FILTER itemView.statusContent.filters = NO_INPUT_FILTER
} }
} else { } else {

View File

@ -95,6 +95,7 @@ public abstract class SFragment extends BaseFragment implements Injectable {
private static List<Filter> filters; private static List<Filter> filters;
private boolean filterRemoveRegex; private boolean filterRemoveRegex;
private Matcher filterRemoveRegexMatcher; private Matcher filterRemoveRegexMatcher;
private static Matcher alphanumeric = Pattern.compile("^\\w+$").matcher("");
@Inject @Inject
public MastodonApi mastodonApi; public MastodonApi mastodonApi;
@ -550,8 +551,11 @@ public abstract class SFragment extends BaseFragment implements Injectable {
} }
private static String filterToRegexToken(Filter filter) { private static String filterToRegexToken(Filter filter) {
String phrase = Pattern.quote(filter.getPhrase()); String phrase = filter.getPhrase();
return filter.getWholeWord() ? String.format("(^|\\W)%s($|\\W)", phrase) : phrase; String quotedPhrase = Pattern.quote(phrase);
return (filter.getWholeWord() && alphanumeric.reset(phrase).matches()) ? // "whole word" should only apply to alphanumeric filters, #1543
String.format("(^|\\W)%s($|\\W)", quotedPhrase) :
quotedPhrase;
} }
public static void flushFilters() { public static void flushFilters() {

View File

@ -6,9 +6,9 @@ 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;
import android.widget.ToggleButton;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.google.android.material.button.MaterialButton;
import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.entity.Account; import com.keylesspalace.tusky.entity.Account;
import com.keylesspalace.tusky.entity.Emoji; import com.keylesspalace.tusky.entity.Emoji;
@ -27,7 +27,7 @@ public class QuoteInlineHelper {
private TextView quoteDisplayName; private TextView quoteDisplayName;
private TextView quoteUsername; private TextView quoteUsername;
private TextView quoteContentWarningDescription; private TextView quoteContentWarningDescription;
private ToggleButton quoteContentWarningButton; private MaterialButton quoteContentWarningButton;
private TextView quoteContent; private TextView quoteContent;
private TextView quoteMedia; private TextView quoteMedia;
@ -82,11 +82,19 @@ public class QuoteInlineHelper {
quoteContentWarningDescription.setText(emojiSpoiler); quoteContentWarningDescription.setText(emojiSpoiler);
quoteContentWarningDescription.setVisibility(View.VISIBLE); quoteContentWarningDescription.setVisibility(View.VISIBLE);
quoteContentWarningButton.setVisibility(View.VISIBLE); quoteContentWarningButton.setVisibility(View.VISIBLE);
quoteContentWarningButton.setChecked(false); quoteContentWarningButton.setOnClickListener(v
quoteContentWarningButton.setOnCheckedChangeListener((buttonView, isChecked) -> setContentVisibility(!(quoteContent.getVisibility() == View.VISIBLE)));
-> quoteContent.setVisibility(isChecked ? View.VISIBLE : View.GONE)); setContentVisibility(false);
quoteContent.setVisibility(View.GONE); }
private void setContentVisibility(boolean show) {
if (show) {
quoteContent.setVisibility(View.VISIBLE);
quoteContentWarningButton.setText(R.string.status_content_warning_show_less);
} else {
quoteContent.setVisibility(View.GONE);
quoteContentWarningButton.setText(R.string.status_content_warning_show_more);
}
} }
private void hideSpoilerText() { private void hideSpoilerText() {

View File

@ -3,4 +3,4 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/poll_option_shape" android:drawable="@drawable/poll_option_shape"
android:clipOrientation="horizontal" android:clipOrientation="horizontal"
android:gravity="left|clip_horizontal|fill_vertical"/> android:gravity="start|clip_horizontal|fill_vertical"/>

View File

@ -2,5 +2,6 @@
<shape <shape
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<corners android:radius="6dp"/>
<solid android:color="?attr/pollOptionBackgroundColor" /> <solid android:color="?attr/pollOptionBackgroundColor" />
</shape> </shape>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_background_dark" />
<corners android:radius="4dp" />
</shape>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#dedede" />
<corners android:radius="4dp" />
</shape>

View File

@ -14,19 +14,21 @@
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<TextView
android:id="@+id/no_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/no_content"
android:visibility="invisible" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
<com.keylesspalace.tusky.view.BackgroundMessageView
android:id="@+id/errorMessageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@android:color/transparent"
android:visibility="gone"
tools:src="@drawable/elephant_error"
tools:visibility="visible" />
</RelativeLayout> </RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -136,13 +136,13 @@
tools:text="content warning which is very long and it doesn't fit" tools:text="content warning which is very long and it doesn't fit"
tools:visibility="visible" /> tools:visibility="visible" />
<ToggleButton <Button
android:id="@+id/status_content_warning_button" android:id="@+id/status_content_warning_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
@ -150,12 +150,11 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_warning_show_more"
android:textOn="@string/status_content_warning_show_less"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/status_display_name" app:layout_constraintStart_toStartOf="@id/status_display_name"
app:layout_constraintTop_toBottomOf="@id/status_content_warning_description" app:layout_constraintTop_toBottomOf="@id/status_content_warning_description"
tools:text="@string/status_content_warning_show_more"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
@ -172,13 +171,13 @@
app:layout_constraintTop_toBottomOf="@id/status_content_warning_button" app:layout_constraintTop_toBottomOf="@id/status_content_warning_button"
tools:text="This is a status" /> tools:text="This is a status" />
<ToggleButton <Button
android:id="@+id/button_toggle_content" android:id="@+id/button_toggle_content"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
@ -186,12 +185,11 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_show_less"
android:textOn="@string/status_content_show_more"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/status_display_name" app:layout_constraintStart_toStartOf="@id/status_display_name"
app:layout_constraintTop_toBottomOf="@id/status_content" app:layout_constraintTop_toBottomOf="@id/status_content"
tools:text="@string/status_content_show_less"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
@ -225,7 +223,6 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<com.keylesspalace.tusky.view.MediaPreviewImageView <com.keylesspalace.tusky.view.MediaPreviewImageView
android:id="@+id/status_media_preview_2" android:id="@+id/status_media_preview_2"
android:layout_width="0dp" android:layout_width="0dp"
@ -384,7 +381,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_media_label_2" /> app:layout_constraintTop_toBottomOf="@id/status_media_label_2" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
@ -398,13 +394,12 @@
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" />
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton --> <Button
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/status_poll_button" android:id="@+id/status_poll_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:background="?attr/content_warning_button"
android:gravity="center" android:gravity="center"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"

View File

@ -17,6 +17,7 @@
android:paddingTop="2dp" android:paddingTop="2dp"
android:paddingEnd="6dp" android:paddingEnd="6dp"
android:paddingBottom="2dp" android:paddingBottom="2dp"
android:textAlignment="viewStart"
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
tools:text="40%" /> tools:text="40%" />

View File

@ -28,13 +28,13 @@
tools:text="content warning which is very long and it doesn't fit" tools:text="content warning which is very long and it doesn't fit"
tools:visibility="visible" /> tools:visibility="visible" />
<ToggleButton <Button
android:id="@+id/statusContentWarningButton" android:id="@+id/statusContentWarningButton"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
@ -42,12 +42,11 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_warning_show_more"
android:textOn="@string/status_content_warning_show_less"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/guideBegin" app:layout_constraintStart_toStartOf="@id/guideBegin"
app:layout_constraintTop_toBottomOf="@id/statusContentWarningDescription" app:layout_constraintTop_toBottomOf="@id/statusContentWarningDescription"
tools:text="@string/status_content_warning_show_more"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
@ -62,13 +61,13 @@
app:layout_constraintStart_toStartOf="@id/guideBegin" app:layout_constraintStart_toStartOf="@id/guideBegin"
app:layout_constraintTop_toBottomOf="@id/statusContentWarningButton" /> app:layout_constraintTop_toBottomOf="@id/statusContentWarningButton" />
<ToggleButton <Button
android:id="@+id/buttonToggleContent" android:id="@+id/buttonToggleContent"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
@ -76,12 +75,11 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_show_less"
android:textOn="@string/status_content_show_more"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/guideBegin" app:layout_constraintStart_toStartOf="@id/guideBegin"
app:layout_constraintTop_toBottomOf="@id/statusContent" app:layout_constraintTop_toBottomOf="@id/statusContent"
tools:text="@string/status_content_show_less"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout

View File

@ -118,13 +118,13 @@
tools:text="content warning which is very long and it doesn't fit" tools:text="content warning which is very long and it doesn't fit"
tools:visibility="visible" /> tools:visibility="visible" />
<ToggleButton <Button
android:id="@+id/status_content_warning_button" android:id="@+id/status_content_warning_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
@ -139,6 +139,7 @@
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/status_display_name" app:layout_constraintStart_toStartOf="@id/status_display_name"
app:layout_constraintTop_toBottomOf="@id/status_content_warning_description" app:layout_constraintTop_toBottomOf="@id/status_content_warning_description"
tools:text="@string/status_content_warning_show_more"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
@ -157,13 +158,13 @@
app:layout_constraintTop_toBottomOf="@id/status_content_warning_button" app:layout_constraintTop_toBottomOf="@id/status_content_warning_button"
tools:text="This is a status" /> tools:text="This is a status" />
<ToggleButton <Button
android:id="@+id/button_toggle_content" android:id="@+id/button_toggle_content"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
@ -172,12 +173,11 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_show_less"
android:textOn="@string/status_content_show_more"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/status_display_name" app:layout_constraintStart_toStartOf="@id/status_display_name"
app:layout_constraintTop_toBottomOf="@id/status_content" app:layout_constraintTop_toBottomOf="@id/status_content"
tools:text="@string/status_content_show_less"
tools:visibility="visible" /> tools:visibility="visible" />
<include <include
@ -399,13 +399,12 @@
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" />
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton --> <Button
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/status_poll_button" android:id="@+id/status_poll_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:background="?attr/content_warning_button"
android:gravity="center" android:gravity="center"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"

View File

@ -93,13 +93,13 @@
app:layout_constraintTop_toBottomOf="@id/status_avatar" app:layout_constraintTop_toBottomOf="@id/status_avatar"
tools:text="CW this is a long long long long long long long long content warning" /> tools:text="CW this is a long long long long long long long long content warning" />
<ToggleButton <com.google.android.material.button.MaterialButton
android:id="@+id/status_content_warning_button" android:id="@+id/status_content_warning_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:background="?attr/content_warning_button"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:minWidth="160dp" android:minWidth="160dp"
android:minHeight="0dp" android:minHeight="0dp"
@ -108,11 +108,10 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_warning_show_more"
android:textOn="@string/status_content_warning_show_less"
android:textSize="?attr/status_text_large" android:textSize="?attr/status_text_large"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/status_content_warning_description" /> app:layout_constraintTop_toBottomOf="@+id/status_content_warning_description"
tools:text="@string/status_content_warning_show_more" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
android:id="@+id/status_content" android:id="@+id/status_content"
@ -399,7 +398,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_media_label_2" /> app:layout_constraintTop_toBottomOf="@id/status_media_label_2" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
@ -413,13 +411,12 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_media_preview_container" /> app:layout_constraintTop_toBottomOf="@id/status_media_preview_container" />
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton --> <Button
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/status_poll_button" android:id="@+id/status_poll_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:background="?attr/content_warning_button"
android:gravity="center" android:gravity="center"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"

View File

@ -83,7 +83,7 @@
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
tools:text="Example CW text" /> tools:text="Example CW text" />
<ToggleButton <Button
android:id="@+id/notification_content_warning_button" android:id="@+id/notification_content_warning_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -91,7 +91,6 @@
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:layout_toEndOf="@id/notification_status_avatar" android:layout_toEndOf="@id/notification_status_avatar"
android:background="?attr/content_warning_button"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
@ -99,8 +98,8 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_warning_show_more" tools:text="@string/status_content_warning_show_more"
android:textOn="@string/status_content_warning_show_less" style="@style/TuskyButton.Outlined"
android:textSize="?attr/status_text_medium" /> android:textSize="?attr/status_text_medium" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView
@ -116,8 +115,7 @@
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
tools:text="Example status here" /> tools:text="Example status here" />
<Button
<ToggleButton
android:id="@+id/button_toggle_notification_content" android:id="@+id/button_toggle_notification_content"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -125,7 +123,6 @@
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:layout_toEndOf="@id/notification_status_avatar" android:layout_toEndOf="@id/notification_status_avatar"
android:background="?attr/content_warning_button"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
@ -133,8 +130,8 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_show_less" tools:text="@string/status_content_show_less"
android:textOn="@string/status_content_show_more" style="@style/TuskyButton.Outlined"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" /> android:visibility="gone" />

View File

@ -71,11 +71,11 @@
tools:text="CW" tools:text="CW"
tools:visibility="visible" /> tools:visibility="visible" />
<ToggleButton <Button
android:id="@+id/status_quote_inline_content_warning_button" android:id="@+id/status_quote_inline_content_warning_button"
style="@style/TuskyButton.Outlined"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/content_warning_button"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:minWidth="150dp" android:minWidth="150dp"
android:minHeight="0dp" android:minHeight="0dp"
@ -84,12 +84,11 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:textAllCaps="true" android:textAllCaps="true"
android:textOff="@string/status_content_warning_show_more"
android:textOn="@string/status_content_warning_show_less"
android:textSize="?attr/status_text_medium" android:textSize="?attr/status_text_medium"
android:visibility="gone" android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/status_quote_inline_content_warning_description" app:layout_constraintStart_toEndOf="@id/status_quote_inline_content_warning_description"
app:layout_constraintTop_toTopOf="@id/status_quote_inline_content_warning_description" app:layout_constraintTop_toTopOf="@id/status_quote_inline_content_warning_description"
tools:text="@string/status_content_warning_show_more"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView <androidx.emoji.widget.EmojiTextView

View File

@ -38,7 +38,6 @@
<item name="status_favourite_inactive_drawable">@drawable/favourite_inactive_dark</item> <item name="status_favourite_inactive_drawable">@drawable/favourite_inactive_dark</item>
<item name="status_quote_drawable">@drawable/ic_quote_24dp</item> <item name="status_quote_drawable">@drawable/ic_quote_24dp</item>
<item name="status_quote_disabled_drawable">@drawable/ic_quote_disabled_24dp</item> <item name="status_quote_disabled_drawable">@drawable/ic_quote_disabled_24dp</item>
<item name="content_warning_button">@drawable/toggle_small</item>
<item name="sensitive_media_warning_background_color">#80000000</item> <item name="sensitive_media_warning_background_color">#80000000</item>
<item name="media_preview_unloaded_drawable">@drawable/media_preview_unloaded_dark</item> <item name="media_preview_unloaded_drawable">@drawable/media_preview_unloaded_dark</item>
<item name="android:listDivider">@drawable/status_divider_dark</item> <item name="android:listDivider">@drawable/status_divider_dark</item>

View File

@ -23,7 +23,6 @@
<attr name="status_favourite_inactive_drawable" format="reference" /> <attr name="status_favourite_inactive_drawable" format="reference" />
<attr name="status_quote_drawable" format="reference" /> <attr name="status_quote_drawable" format="reference" />
<attr name="status_quote_disabled_drawable" format="reference" /> <attr name="status_quote_disabled_drawable" format="reference" />
<attr name="content_warning_button" format="reference" />
<attr name="sensitive_media_warning_background_color" format="reference|color" /> <attr name="sensitive_media_warning_background_color" format="reference|color" />
<attr name="media_preview_unloaded_drawable" format="reference" /> <attr name="media_preview_unloaded_drawable" format="reference" />
<attr name="conversation_thread_line_drawable" format="reference" /> <attr name="conversation_thread_line_drawable" format="reference" />

View File

@ -332,8 +332,6 @@
<string name="state_follow_requested">Follow requested</string> <string name="state_follow_requested">Follow requested</string>
<string name="no_content">no content</string>
<!--These are for timestamps on statuses. For example: "16s" or "2d"--> <!--These are for timestamps on statuses. For example: "16s" or "2d"-->
<string name="abbreviated_in_years">in %dy</string> <string name="abbreviated_in_years">in %dy</string>
<string name="abbreviated_in_days">in %dd</string> <string name="abbreviated_in_days">in %dd</string>
@ -574,6 +572,7 @@
<string name="edit_poll">Edit</string> <string name="edit_poll">Edit</string>
<string name="post_lookup_error_format">Error looking up post %s</string> <string name="post_lookup_error_format">Error looking up post %s</string>
<string name="no_saved_status">You don\'t have any drafts.</string>
<string name="no_scheduled_status">You don\'t have any scheduled statuses.</string> <string name="no_scheduled_status">You don\'t have any scheduled statuses.</string>
</resources> </resources>

View File

@ -90,7 +90,6 @@
<item name="status_favourite_inactive_drawable">@drawable/favourite_inactive_light</item> <item name="status_favourite_inactive_drawable">@drawable/favourite_inactive_light</item>
<item name="status_quote_drawable">@drawable/ic_quote_24dp</item> <item name="status_quote_drawable">@drawable/ic_quote_24dp</item>
<item name="status_quote_disabled_drawable">@drawable/ic_quote_disabled_24dp</item> <item name="status_quote_disabled_drawable">@drawable/ic_quote_disabled_24dp</item>
<item name="content_warning_button">@drawable/toggle_small_light</item>
<item name="sensitive_media_warning_background_color">#80B0B0B0</item> <item name="sensitive_media_warning_background_color">#80B0B0B0</item>
<item name="media_preview_unloaded_drawable">@drawable/media_preview_unloaded_light</item> <item name="media_preview_unloaded_drawable">@drawable/media_preview_unloaded_light</item>
<item name="android:listDivider">@drawable/status_divider_light</item> <item name="android:listDivider">@drawable/status_divider_light</item>

View File

@ -86,6 +86,14 @@ class FilterTest {
expiresAt = null, expiresAt = null,
irreversible = false, irreversible = false,
wholeWord = true wholeWord = true
),
Filter(
id = "123",
phrase = "@twitter.com",
context = listOf(Filter.HOME),
expiresAt = null,
irreversible = false,
wholeWord = true
) )
) )
) )
@ -145,7 +153,7 @@ class FilterTest {
} }
@Test @Test
fun shouldNotFilter_whenContentDoesNotMAtchWholeWord() { fun shouldNotFilter_whenContentDoesNotMatchWholeWord() {
assertFalse(fragment.shouldFilterStatus( assertFalse(fragment.shouldFilterStatus(
mockStatus(content = "one two badWholeWordTest three") mockStatus(content = "one two badWholeWordTest three")
)) ))
@ -172,6 +180,13 @@ class FilterTest {
)) ))
} }
@Test
fun shouldFilterPartialWord_whenWholeWordFilterContainsNonAlphanumericCharacters() {
assertTrue(fragment.shouldFilterStatus(
mockStatus(content = "one two someone@twitter.com three")
))
}
private fun mockStatus( private fun mockStatus(
content: String = "", content: String = "",
spoilerText: String = "", spoilerText: String = "",