From 9d65b2ace1891fa76dcb08566f4938b5a902114d Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Mon, 6 Jan 2020 16:16:54 +0100 Subject: [PATCH 1/5] Filters: Make behavior of "whole word" filters consistent with the web UI when filters are non-alphanumeric (#1623) * Fix tests build * Make behavior of non-alphanumeric whole-word filters consistent with the web UI. Fixes #1543 * Fix typo in filter tests --- .../com/keylesspalace/tusky/TimelineDAOTest.kt | 2 ++ .../keylesspalace/tusky/fragment/SFragment.java | 8 ++++++-- .../java/com/keylesspalace/tusky/FilterTest.kt | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) 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/fragment/SFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java index 6e7164389..bbee3c07e 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; @@ -520,8 +521,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/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 = "", From bec1ce8b09fa5bd124a78a0e8b75f4f775bdae96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9lanie=20Chauvel=20=28ariasuni=29?= Date: Mon, 6 Jan 2020 18:24:54 +0100 Subject: [PATCH 2/5] Display Elephant with better message in Drafts screen when there are none (#1619) * Display Elephant with better message in Drafts screen when there are none * Remove unused import --- .../tusky/SavedTootActivity.java | 11 +++++----- .../main/res/layout/activity_saved_toot.xml | 20 ++++++++++--------- app/src/main/res/values/strings.xml | 3 +-- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java index c40639c2d..21cc9399e 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/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/values/strings.xml b/app/src/main/res/values/strings.xml index 3d8efafcd..21bd1e3ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -306,8 +306,6 @@ Follow requested - no content - in %dy in %dd @@ -546,6 +544,7 @@ Edit Error looking up post %s + You don\'t have any drafts. You don\'t have any scheduled statuses. From 441a1c1f953ea2311efc2ad85894d59f3bd96708 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Tue, 7 Jan 2020 19:38:08 +0100 Subject: [PATCH 3/5] remove redundant toHtml from StatusBaseViewHolder (#1625) --- .../keylesspalace/tusky/adapter/StatusBaseViewHolder.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 6c4ed2b37..fe63c9ae8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -473,16 +473,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 -> { From b87a1711f2d23413a09b1f2b56226bf653c2a69d Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Tue, 7 Jan 2020 19:38:32 +0100 Subject: [PATCH 4/5] give poll result backgrounds a rounded shape (#1626) * give poll result backgrounds a rounded shape * fix rtl layout of poll options --- app/src/main/res/drawable/poll_option_background.xml | 2 +- app/src/main/res/drawable/poll_option_shape.xml | 1 + app/src/main/res/layout/item_poll.xml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) 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/layout/item_poll.xml b/app/src/main/res/layout/item_poll.xml index 844f7b4a5..a6d97d982 100644 --- a/app/src/main/res/layout/item_poll.xml +++ b/app/src/main/res/layout/item_poll.xml @@ -17,6 +17,7 @@ android:paddingTop="2dp" android:paddingEnd="6dp" android:paddingBottom="2dp" + android:textAlignment="viewStart" android:textColor="?android:attr/textColorPrimary" android:textSize="?attr/status_text_medium" tools:text="40%" /> From e5b78f65cf61f3ded18f2ded93cd57b8c0af42c9 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Tue, 7 Jan 2020 19:40:52 +0100 Subject: [PATCH 5/5] use material buttons in timeline (#1627) * use material buttons in timeline * remove wrong switch option --- .../tusky/adapter/NotificationsAdapter.java | 33 +++++++++---------- .../tusky/adapter/StatusBaseViewHolder.java | 24 ++++++++++---- .../tusky/adapter/StatusViewHolder.java | 12 +++---- .../conversation/ConversationViewHolder.java | 12 +++---- .../report/adapter/StatusViewHolder.kt | 25 +++++++++----- app/src/main/res/drawable/toggle_small.xml | 6 ---- .../main/res/drawable/toggle_small_light.xml | 6 ---- app/src/main/res/layout/item_conversation.xml | 21 +++++------- .../main/res/layout/item_report_status.xml | 14 ++++---- app/src/main/res/layout/item_status.xml | 17 +++++----- .../main/res/layout/item_status_detailed.xml | 15 ++++----- .../res/layout/item_status_notification.xml | 15 ++++----- app/src/main/res/values-night/styles.xml | 1 - app/src/main/res/values/attrs.xml | 1 - app/src/main/res/values/styles.xml | 1 - 15 files changed, 96 insertions(+), 107 deletions(-) delete mode 100644 app/src/main/res/drawable/toggle_small.xml delete mode 100644 app/src/main/res/drawable/toggle_small_light.xml 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 433676f01..35a5526af 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; @@ -332,7 +331,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; @@ -342,8 +341,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 StatusDisplayOptions statusDisplayOptions; private String accountId; @@ -375,7 +374,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()); } @@ -481,6 +479,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); } @@ -537,19 +543,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 { @@ -565,12 +571,5 @@ public class NotificationsAdapter extends RecyclerView.Adapter { contentWarningDescriptionTextView.setText(emojifiedContentWarning); } - @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 fe63c9ae8..b22ebd07c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -13,7 +13,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; @@ -23,6 +22,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; @@ -73,7 +73,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; @@ -173,7 +173,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } public void toggleContentWarning() { - contentWarningButton.toggle(); + contentWarningButton.performClick(); } protected void setSpoilerAndContent(boolean expanded, @@ -193,18 +193,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); + setContentWarningButtonText(!expanded); + + this.setTextVisible(!expanded, content, mentions, emojis, poll, statusDisplayOptions, listener); }); this.setTextVisible(expanded, content, mentions, emojis, poll, statusDisplayOptions, listener); } } + 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, 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 c0e1a3d26..365575994 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 2007c2acc..b4120ca8c 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 @@ -93,12 +93,14 @@ 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) + setContentWarningButtonText(!contentShown) } } setTextVisible(viewState.isContentShow(status.id, true), status.content, status.mentions, status.emojis, adapterHandler) @@ -106,6 +108,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, @@ -144,19 +153,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/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/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" /> - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@+id/status_content_warning_description" + tools:text="@string/status_content_warning_show_more" /> - - - - - - diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index c53c519de..e9164b53c 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -35,7 +35,6 @@ @drawable/reblog_direct_dark @drawable/favourite_active_dark @drawable/favourite_inactive_dark - @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 2be804853..b37506635 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -20,7 +20,6 @@ - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8a73ad682..a13eed14e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -87,7 +87,6 @@ @drawable/reblog_direct_light @drawable/favourite_active_light @drawable/favourite_inactive_light - @drawable/toggle_small_light #80B0B0B0 @drawable/media_preview_unloaded_light @drawable/status_divider_light