diff --git a/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt b/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt index d8b70aade..241781b6d 100644 --- a/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt +++ b/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt @@ -208,6 +208,7 @@ class TimelineDAOTest { favouritesCount = 2 * statusId.toInt(), reblogged = even, favourited = !even, + bookmarked = false, sensitive = even, spoilerText = "spoier$statusId", visibility = Status.Visibility.PRIVATE, @@ -236,6 +237,7 @@ class TimelineDAOTest { favouritesCount = 0, reblogged = false, favourited = false, + bookmarked = false, sensitive = false, spoilerText = null, visibility = null, diff --git a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java index 8f16726cf..78437c802 100644 --- a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java @@ -20,7 +20,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.view.MenuItem; import android.view.View; -import android.widget.TextView; import androidx.annotation.Nullable; 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.di.Injectable; import com.keylesspalace.tusky.util.SaveTootHelper; +import com.keylesspalace.tusky.view.BackgroundMessageView; import java.lang.ref.WeakReference; import java.lang.reflect.Type; @@ -60,7 +60,7 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd // ui private SavedTootAdapter adapter; - private TextView noContent; + private BackgroundMessageView errorMessageView; private List toots = new ArrayList<>(); @Nullable @@ -95,7 +95,7 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd } RecyclerView recyclerView = findViewById(R.id.recyclerView); - noContent = findViewById(R.id.no_content); + errorMessageView = findViewById(R.id.errorMessageView); recyclerView.setHasFixedSize(true); LinearLayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); @@ -136,9 +136,10 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd private void setNoContent(int size) { 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 { - noContent.setVisibility(View.INVISIBLE); + errorMessageView.setVisibility(View.GONE); } } diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java b/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java index 8cf689ba0..6988e9e5b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java @@ -28,10 +28,9 @@ import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.CompoundButton; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -import android.widget.ToggleButton; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -336,7 +335,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter { } private static class StatusNotificationViewHolder extends RecyclerView.ViewHolder - implements View.OnClickListener, ToggleButton.OnCheckedChangeListener { + implements View.OnClickListener { private final TextView message; private final View statusNameBar; private final TextView displayName; @@ -346,8 +345,8 @@ public class NotificationsAdapter extends RecyclerView.Adapter { private final ImageView statusAvatar; private final ImageView notificationAvatar; private final TextView contentWarningDescriptionTextView; - private final ToggleButton contentWarningButton; - private final ToggleButton contentCollapseButton; // TODO: This code SHOULD be based on StatusBaseViewHolder + private final Button contentWarningButton; + private final Button contentCollapseButton; // TODO: This code SHOULD be based on StatusBaseViewHolder private ConstraintLayout quoteContainer; private StatusDisplayOptions statusDisplayOptions; @@ -382,7 +381,6 @@ public class NotificationsAdapter extends RecyclerView.Adapter { itemView.setOnClickListener(this); message.setOnClickListener(this); statusContent.setOnClickListener(this); - contentWarningButton.setOnCheckedChangeListener(this); shortSdf = new SimpleDateFormat("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()); contentWarningDescriptionTextView.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); } @@ -553,19 +559,19 @@ public class NotificationsAdapter extends RecyclerView.Adapter { List emojis = statusViewData.getStatusEmojis(); if (statusViewData.isCollapsible() && (notificationViewData.isExpanded() || !hasSpoiler)) { - contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { + contentCollapseButton.setOnClickListener(view -> { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION && notificationActionListener != null) { - notificationActionListener.onNotificationContentCollapsedChange(isChecked, position); + notificationActionListener.onNotificationContentCollapsedChange(statusViewData.isCollapsed(), position); } }); contentCollapseButton.setVisibility(View.VISIBLE); if (statusViewData.isCollapsed()) { - contentCollapseButton.setChecked(true); + contentCollapseButton.setText(R.string.status_content_warning_show_more); statusContent.setFilters(COLLAPSE_INPUT_FILTER); } else { - contentCollapseButton.setChecked(false); + contentCollapseButton.setText(R.string.status_content_warning_show_less); statusContent.setFilters(NO_INPUT_FILTER); } } else { @@ -584,12 +590,5 @@ public class NotificationsAdapter extends RecyclerView.Adapter { 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); - } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 55de772ee..0da575027 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -15,7 +15,6 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import android.widget.ToggleButton; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; @@ -26,6 +25,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; +import com.google.android.material.button.MaterialButton; import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.entity.Attachment; import com.keylesspalace.tusky.entity.Attachment.Focus; @@ -79,7 +79,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { private TextView sensitiveMediaWarning; private View sensitiveMediaShow; protected TextView[] mediaLabels; - private ToggleButton contentWarningButton; + private MaterialButton contentWarningButton; private ImageView avatarInset; public ImageView avatar; @@ -184,7 +184,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } public void toggleContentWarning() { - contentWarningButton.toggle(); + contentWarningButton.performClick(); } protected void setSpoilerAndContent(boolean expanded, @@ -205,18 +205,28 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { contentWarningDescription.setText(emojiSpoiler); contentWarningDescription.setVisibility(View.VISIBLE); contentWarningButton.setVisibility(View.VISIBLE); - contentWarningButton.setChecked(expanded); - contentWarningButton.setOnCheckedChangeListener((buttonView, isChecked) -> { + setContentWarningButtonText(expanded); + contentWarningButton.setOnClickListener( view -> { contentWarningDescription.invalidate(); 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); } } + 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, Spanned content, Status.Mention[] mentions, @@ -566,16 +576,12 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { setAttachmentClickListener(imageView, listener, i, attachment, true); } - - final String hiddenContentText; if (sensitive) { - hiddenContentText = context.getString(R.string.status_sensitive_media_title); + sensitiveMediaWarning.setText(R.string.status_sensitive_media_title); } 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); sensitiveMediaShow.setVisibility(showingContent ? View.VISIBLE : View.GONE); sensitiveMediaShow.setOnClickListener(v -> { diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java index 40800fa98..56cef6ee1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java @@ -19,8 +19,8 @@ import android.content.Context; import android.text.InputFilter; import android.text.TextUtils; import android.view.View; +import android.widget.Button; import android.widget.TextView; -import android.widget.ToggleButton; import androidx.annotation.Nullable; 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 TextView statusInfo; - private ToggleButton contentCollapseButton; + private Button contentCollapseButton; public StatusViewHolder(View itemView) { super(itemView); @@ -96,18 +96,18 @@ public class StatusViewHolder extends StatusBaseViewHolder { private void setupCollapsedState(final StatusViewData.Concrete status, final StatusActionListener listener) { /* input filter for TextViews have to be set before text */ if (status.isCollapsible() && (status.isExpanded() || TextUtils.isEmpty(status.getSpoilerText()))) { - contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { + contentCollapseButton.setOnClickListener(view -> { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION) - listener.onContentCollapsedChange(isChecked, position); + listener.onContentCollapsedChange(!status.isCollapsed(), position); }); contentCollapseButton.setVisibility(View.VISIBLE); if (status.isCollapsed()) { - contentCollapseButton.setChecked(true); + contentCollapseButton.setText(R.string.status_content_warning_show_more); content.setFilters(COLLAPSE_INPUT_FILTER); } else { - contentCollapseButton.setChecked(false); + contentCollapseButton.setText(R.string.status_content_warning_show_less); content.setFilters(NO_INPUT_FILTER); } } else { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java index 2dd4197a6..1d4be8d83 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java @@ -19,9 +19,9 @@ import android.content.Context; import android.text.InputFilter; import android.text.TextUtils; import android.view.View; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -import android.widget.ToggleButton; 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 TextView conversationNameTextView; - private ToggleButton contentCollapseButton; + private Button contentCollapseButton; private ImageView[] avatars; 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) { /* input filter for TextViews have to be set before text */ if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) { - contentCollapseButton.setOnCheckedChangeListener((buttonView, isChecked) -> { + contentCollapseButton.setOnClickListener(view -> { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION) - listener.onContentCollapsedChange(isChecked, position); + listener.onContentCollapsedChange(!collapsed, position); }); contentCollapseButton.setVisibility(View.VISIBLE); if (collapsed) { - contentCollapseButton.setChecked(true); + contentCollapseButton.setText(R.string.status_content_warning_show_more); content.setFilters(COLLAPSE_INPUT_FILTER); } else { - contentCollapseButton.setChecked(false); + contentCollapseButton.setText(R.string.status_content_warning_show_less); content.setFilters(NO_INPUT_FILTER); } } else { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt index 91e2084ab..ab9de0d84 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt @@ -94,13 +94,15 @@ class StatusViewHolder( itemView.statusContentWarningDescription.text = emojiSpoiler itemView.statusContentWarningDescription.show() itemView.statusContentWarningButton.show() - itemView.statusContentWarningButton.isChecked = viewState.isContentShow(status.id, true) - itemView.statusContentWarningButton.setOnCheckedChangeListener { _, isViewChecked -> + setContentWarningButtonText(viewState.isContentShow(status.id, true)) + itemView.statusContentWarningButton.setOnClickListener { status()?.let { status -> + val contentShown = viewState.isContentShow(status.id, true) itemView.statusContentWarningDescription.invalidate() - viewState.setContentShow(status.id, isViewChecked) - setTextVisible(isViewChecked, status.content, status.mentions, status.emojis, adapterHandler, + viewState.setContentShow(status.id, !contentShown) + setTextVisible(!contentShown, status.content, status.mentions, status.emojis, adapterHandler, status.quote != null) + setContentWarningButtonText(!contentShown) } } 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, content: Spanned, @@ -148,19 +157,19 @@ class StatusViewHolder( private fun setupCollapsedState(collapsible: Boolean, collapsed: Boolean, expanded: Boolean, spoilerText: String) { /* input filter for TextViews have to be set before text */ if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) { - itemView.buttonToggleContent.setOnCheckedChangeListener { _, isChecked -> + itemView.buttonToggleContent.setOnClickListener{ status()?.let { status -> - viewState.setCollapsed(status.id, isChecked) + viewState.setCollapsed(status.id, !collapsed) updateTextView() } } itemView.buttonToggleContent.show() if (collapsed) { - itemView.buttonToggleContent.isChecked = true + itemView.buttonToggleContent.setText(R.string.status_content_show_more) itemView.statusContent.filters = COLLAPSE_INPUT_FILTER } else { - itemView.buttonToggleContent.isChecked = false + itemView.buttonToggleContent.setText(R.string.status_content_show_less) itemView.statusContent.filters = NO_INPUT_FILTER } } else { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java index 6723787f7..0a5e2d71e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java @@ -95,6 +95,7 @@ public abstract class SFragment extends BaseFragment implements Injectable { private static List filters; private boolean filterRemoveRegex; private Matcher filterRemoveRegexMatcher; + private static Matcher alphanumeric = Pattern.compile("^\\w+$").matcher(""); @Inject public MastodonApi mastodonApi; @@ -550,8 +551,11 @@ public abstract class SFragment extends BaseFragment implements Injectable { } private static String filterToRegexToken(Filter filter) { - String phrase = Pattern.quote(filter.getPhrase()); - return filter.getWholeWord() ? String.format("(^|\\W)%s($|\\W)", phrase) : phrase; + String phrase = filter.getPhrase(); + 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() { diff --git a/app/src/main/java/net/accelf/yuito/QuoteInlineHelper.java b/app/src/main/java/net/accelf/yuito/QuoteInlineHelper.java index 68cb81db4..7ee23004e 100644 --- a/app/src/main/java/net/accelf/yuito/QuoteInlineHelper.java +++ b/app/src/main/java/net/accelf/yuito/QuoteInlineHelper.java @@ -6,9 +6,9 @@ import android.text.TextUtils; import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import android.widget.ToggleButton; import com.bumptech.glide.Glide; +import com.google.android.material.button.MaterialButton; import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.entity.Account; import com.keylesspalace.tusky.entity.Emoji; @@ -27,7 +27,7 @@ public class QuoteInlineHelper { private TextView quoteDisplayName; private TextView quoteUsername; private TextView quoteContentWarningDescription; - private ToggleButton quoteContentWarningButton; + private MaterialButton quoteContentWarningButton; private TextView quoteContent; private TextView quoteMedia; @@ -82,11 +82,19 @@ public class QuoteInlineHelper { quoteContentWarningDescription.setText(emojiSpoiler); quoteContentWarningDescription.setVisibility(View.VISIBLE); quoteContentWarningButton.setVisibility(View.VISIBLE); - quoteContentWarningButton.setChecked(false); - quoteContentWarningButton.setOnCheckedChangeListener((buttonView, isChecked) - -> quoteContent.setVisibility(isChecked ? View.VISIBLE : View.GONE)); - quoteContent.setVisibility(View.GONE); + quoteContentWarningButton.setOnClickListener(v + -> setContentVisibility(!(quoteContent.getVisibility() == View.VISIBLE))); + setContentVisibility(false); + } + 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() { diff --git a/app/src/main/res/drawable/poll_option_background.xml b/app/src/main/res/drawable/poll_option_background.xml index 48c9d3b61..90aa51d4a 100644 --- a/app/src/main/res/drawable/poll_option_background.xml +++ b/app/src/main/res/drawable/poll_option_background.xml @@ -3,4 +3,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/poll_option_shape" android:clipOrientation="horizontal" - android:gravity="left|clip_horizontal|fill_vertical"/> \ No newline at end of file + android:gravity="start|clip_horizontal|fill_vertical"/> \ No newline at end of file diff --git a/app/src/main/res/drawable/poll_option_shape.xml b/app/src/main/res/drawable/poll_option_shape.xml index 018d6ea78..281c4c835 100644 --- a/app/src/main/res/drawable/poll_option_shape.xml +++ b/app/src/main/res/drawable/poll_option_shape.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/app/src/main/res/drawable/toggle_small.xml b/app/src/main/res/drawable/toggle_small.xml deleted file mode 100644 index bf55fff06..000000000 --- a/app/src/main/res/drawable/toggle_small.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/toggle_small_light.xml b/app/src/main/res/drawable/toggle_small_light.xml deleted file mode 100644 index 5f27f87a2..000000000 --- a/app/src/main/res/drawable/toggle_small_light.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_saved_toot.xml b/app/src/main/res/layout/activity_saved_toot.xml index 67bd5762f..1771135e7 100644 --- a/app/src/main/res/layout/activity_saved_toot.xml +++ b/app/src/main/res/layout/activity_saved_toot.xml @@ -14,19 +14,21 @@ android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml index 49fcd65e0..df82c654f 100644 --- a/app/src/main/res/layout/item_conversation.xml +++ b/app/src/main/res/layout/item_conversation.xml @@ -136,13 +136,13 @@ tools:text="content warning which is very long and it doesn't fit" tools:visibility="visible" /> - - - - - - diff --git a/app/src/main/res/layout/item_report_status.xml b/app/src/main/res/layout/item_report_status.xml index a84a3257b..3f9fc25e5 100644 --- a/app/src/main/res/layout/item_report_status.xml +++ b/app/src/main/res/layout/item_report_status.xml @@ -28,13 +28,13 @@ tools:text="content warning which is very long and it doesn't fit" tools:visibility="visible" /> - - - - - - - + app:layout_constraintTop_toBottomOf="@+id/status_content_warning_description" + tools:text="@string/status_content_warning_show_more" /> - - - - - - diff --git a/app/src/main/res/layout/view_quote_inline.xml b/app/src/main/res/layout/view_quote_inline.xml index 45b302077..6cbfee167 100644 --- a/app/src/main/res/layout/view_quote_inline.xml +++ b/app/src/main/res/layout/view_quote_inline.xml @@ -71,11 +71,11 @@ tools:text="CW" tools:visibility="visible" /> - @drawable/favourite_inactive_dark @drawable/ic_quote_24dp @drawable/ic_quote_disabled_24dp - @drawable/toggle_small #80000000 @drawable/media_preview_unloaded_dark @drawable/status_divider_dark diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index bcccc59e6..aa01cc730 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -23,7 +23,6 @@ - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 420a827b8..6959f9d61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -332,8 +332,6 @@ Follow requested - no content - in %dy in %dd @@ -574,6 +572,7 @@ Edit Error looking up post %s + You don\'t have any drafts. You don\'t have any scheduled statuses. diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 30bb69f9d..7298a8835 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -90,7 +90,6 @@ @drawable/favourite_inactive_light @drawable/ic_quote_24dp @drawable/ic_quote_disabled_24dp - @drawable/toggle_small_light #80B0B0B0 @drawable/media_preview_unloaded_light @drawable/status_divider_light diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt index b766cd2f8..c94f26330 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt @@ -86,6 +86,14 @@ class FilterTest { expiresAt = null, irreversible = false, 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 - fun shouldNotFilter_whenContentDoesNotMAtchWholeWord() { + fun shouldNotFilter_whenContentDoesNotMatchWholeWord() { assertFalse(fragment.shouldFilterStatus( 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( content: String = "", spoilerText: String = "",