From e5b78f65cf61f3ded18f2ded93cd57b8c0af42c9 Mon Sep 17 00:00:00 2001
From: Konrad Pozniak <connyduck@users.noreply.github.com>
Date: Tue, 7 Jan 2020 19:40:52 +0100
Subject: [PATCH] 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 433676f0..35a5526a 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<Emoji> 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 fe63c9ae..b22ebd07 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 40800fa9..56cef6ee 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 c0e1a3d2..36557599 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 2007c2ac..b4120ca8 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 bf55fff0..00000000
--- a/app/src/main/res/drawable/toggle_small.xml
+++ /dev/null
@@ -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>
\ 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 5f27f87a..00000000
--- a/app/src/main/res/drawable/toggle_small_light.xml
+++ /dev/null
@@ -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>
\ 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 49fcd65e..df82c654 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" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/status_content_warning_button"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:minWidth="150dp"
         android:minHeight="0dp"
         android:paddingLeft="16dp"
@@ -150,12 +150,11 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         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:visibility="gone"
         app:layout_constraintStart_toStartOf="@id/status_display_name"
         app:layout_constraintTop_toBottomOf="@id/status_content_warning_description"
+        tools:text="@string/status_content_warning_show_more"
         tools:visibility="visible" />
 
     <androidx.emoji.widget.EmojiTextView
@@ -172,13 +171,13 @@
         app:layout_constraintTop_toBottomOf="@id/status_content_warning_button"
         tools:text="This is a status" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/button_toggle_content"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:minWidth="150dp"
         android:minHeight="0dp"
         android:paddingLeft="16dp"
@@ -186,12 +185,11 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         android:textAllCaps="true"
-        android:textOff="@string/status_content_show_less"
-        android:textOn="@string/status_content_show_more"
         android:textSize="?attr/status_text_medium"
         android:visibility="gone"
         app:layout_constraintStart_toStartOf="@id/status_display_name"
         app:layout_constraintTop_toBottomOf="@id/status_content"
+        tools:text="@string/status_content_show_less"
         tools:visibility="visible" />
 
     <androidx.constraintlayout.widget.ConstraintLayout
@@ -225,7 +223,6 @@
             app:layout_constraintTop_toTopOf="parent"
             tools:ignore="ContentDescription" />
 
-
         <com.keylesspalace.tusky.view.MediaPreviewImageView
             android:id="@+id/status_media_preview_2"
             android:layout_width="0dp"
@@ -384,7 +381,6 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@id/status_media_label_2" />
 
-
     </androidx.constraintlayout.widget.ConstraintLayout>
 
     <androidx.recyclerview.widget.RecyclerView
@@ -398,13 +394,12 @@
         app:layout_constraintStart_toStartOf="@id/status_display_name"
         app:layout_constraintTop_toBottomOf="@id/status_media_preview_container" />
 
-    <!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
-    <androidx.appcompat.widget.AppCompatButton
+    <Button
         android:id="@+id/status_poll_button"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
-        android:background="?attr/content_warning_button"
         android:gravity="center"
         android:minWidth="150dp"
         android:minHeight="0dp"
diff --git a/app/src/main/res/layout/item_report_status.xml b/app/src/main/res/layout/item_report_status.xml
index a84a3257..3f9fc25e 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" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/statusContentWarningButton"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:minWidth="150dp"
         android:minHeight="0dp"
         android:paddingLeft="16dp"
@@ -42,12 +42,11 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         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:visibility="gone"
         app:layout_constraintStart_toStartOf="@id/guideBegin"
         app:layout_constraintTop_toBottomOf="@id/statusContentWarningDescription"
+        tools:text="@string/status_content_warning_show_more"
         tools:visibility="visible" />
 
     <androidx.emoji.widget.EmojiTextView
@@ -62,13 +61,13 @@
         app:layout_constraintStart_toStartOf="@id/guideBegin"
         app:layout_constraintTop_toBottomOf="@id/statusContentWarningButton" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/buttonToggleContent"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:minWidth="150dp"
         android:minHeight="0dp"
         android:paddingLeft="16dp"
@@ -76,12 +75,11 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         android:textAllCaps="true"
-        android:textOff="@string/status_content_show_less"
-        android:textOn="@string/status_content_show_more"
         android:textSize="?attr/status_text_medium"
         android:visibility="gone"
         app:layout_constraintStart_toStartOf="@id/guideBegin"
         app:layout_constraintTop_toBottomOf="@id/statusContent"
+        tools:text="@string/status_content_show_less"
         tools:visibility="visible" />
 
     <androidx.constraintlayout.widget.ConstraintLayout
diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml
index bbed3e03..17b1551b 100644
--- a/app/src/main/res/layout/item_status.xml
+++ b/app/src/main/res/layout/item_status.xml
@@ -117,13 +117,13 @@
         tools:text="content warning which is very long and it doesn't fit"
         tools:visibility="visible" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/status_content_warning_button"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:importantForAccessibility="no"
         android:minWidth="150dp"
         android:minHeight="0dp"
@@ -138,6 +138,7 @@
         android:visibility="gone"
         app:layout_constraintStart_toStartOf="@id/status_display_name"
         app:layout_constraintTop_toBottomOf="@id/status_content_warning_description"
+        tools:text="@string/status_content_warning_show_more"
         tools:visibility="visible" />
 
     <androidx.emoji.widget.EmojiTextView
@@ -156,13 +157,13 @@
         app:layout_constraintTop_toBottomOf="@id/status_content_warning_button"
         tools:text="This is a status" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/button_toggle_content"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:importantForAccessibility="no"
         android:minWidth="150dp"
         android:minHeight="0dp"
@@ -171,12 +172,11 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         android:textAllCaps="true"
-        android:textOff="@string/status_content_show_less"
-        android:textOn="@string/status_content_show_more"
         android:textSize="?attr/status_text_medium"
         android:visibility="gone"
         app:layout_constraintStart_toStartOf="@id/status_display_name"
         app:layout_constraintTop_toBottomOf="@id/status_content"
+        tools:text="@string/status_content_show_less"
         tools:visibility="visible" />
 
     <androidx.constraintlayout.widget.ConstraintLayout
@@ -386,13 +386,12 @@
         app:layout_constraintStart_toStartOf="@id/status_display_name"
         app:layout_constraintTop_toBottomOf="@id/status_media_preview_container" />
 
-    <!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
-    <androidx.appcompat.widget.AppCompatButton
+    <Button
         android:id="@+id/status_poll_button"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
-        android:background="?attr/content_warning_button"
         android:gravity="center"
         android:minWidth="150dp"
         android:minHeight="0dp"
diff --git a/app/src/main/res/layout/item_status_detailed.xml b/app/src/main/res/layout/item_status_detailed.xml
index b2accd48..60f9c679 100644
--- a/app/src/main/res/layout/item_status_detailed.xml
+++ b/app/src/main/res/layout/item_status_detailed.xml
@@ -93,13 +93,13 @@
         app:layout_constraintTop_toBottomOf="@id/status_avatar"
         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"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
-        android:background="?attr/content_warning_button"
         android:importantForAccessibility="no"
         android:minWidth="160dp"
         android:minHeight="0dp"
@@ -108,11 +108,10 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         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"
         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
         android:id="@+id/status_content"
@@ -387,7 +386,6 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@id/status_media_label_2" />
 
-
     </androidx.constraintlayout.widget.ConstraintLayout>
 
     <androidx.recyclerview.widget.RecyclerView
@@ -401,13 +399,12 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/status_media_preview_container" />
 
-    <!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
-    <androidx.appcompat.widget.AppCompatButton
+    <Button
         android:id="@+id/status_poll_button"
+        style="@style/TuskyButton.Outlined"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="4dp"
-        android:background="?attr/content_warning_button"
         android:gravity="center"
         android:minWidth="150dp"
         android:minHeight="0dp"
diff --git a/app/src/main/res/layout/item_status_notification.xml b/app/src/main/res/layout/item_status_notification.xml
index 94f40c45..ecf84ab5 100644
--- a/app/src/main/res/layout/item_status_notification.xml
+++ b/app/src/main/res/layout/item_status_notification.xml
@@ -83,7 +83,7 @@
         android:textSize="?attr/status_text_medium"
         tools:text="Example CW text" />
 
-    <ToggleButton
+    <Button
         android:id="@+id/notification_content_warning_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
@@ -91,7 +91,6 @@
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
         android:layout_toEndOf="@id/notification_status_avatar"
-        android:background="?attr/content_warning_button"
         android:minWidth="150dp"
         android:minHeight="0dp"
         android:paddingLeft="16dp"
@@ -99,8 +98,8 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         android:textAllCaps="true"
-        android:textOff="@string/status_content_warning_show_more"
-        android:textOn="@string/status_content_warning_show_less"
+        tools:text="@string/status_content_warning_show_more"
+        style="@style/TuskyButton.Outlined"
         android:textSize="?attr/status_text_medium" />
 
     <androidx.emoji.widget.EmojiTextView
@@ -116,8 +115,7 @@
         android:textSize="?attr/status_text_medium"
         tools:text="Example status here" />
 
-
-    <ToggleButton
+    <Button
         android:id="@+id/button_toggle_notification_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
@@ -125,7 +123,6 @@
         android:layout_marginTop="4dp"
         android:layout_marginBottom="4dp"
         android:layout_toEndOf="@id/notification_status_avatar"
-        android:background="?attr/content_warning_button"
         android:minWidth="150dp"
         android:minHeight="0dp"
         android:paddingLeft="16dp"
@@ -133,8 +130,8 @@
         android:paddingRight="16dp"
         android:paddingBottom="4dp"
         android:textAllCaps="true"
-        android:textOff="@string/status_content_show_less"
-        android:textOn="@string/status_content_show_more"
+        tools:text="@string/status_content_show_less"
+        style="@style/TuskyButton.Outlined"
         android:textSize="?attr/status_text_medium"
         android:visibility="gone" />
 
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
index c53c519d..e9164b53 100644
--- a/app/src/main/res/values-night/styles.xml
+++ b/app/src/main/res/values-night/styles.xml
@@ -35,7 +35,6 @@
         <item name="status_reblog_direct_drawable">@drawable/reblog_direct_dark</item>
         <item name="status_favourite_active_drawable">@drawable/favourite_active_dark</item>
         <item name="status_favourite_inactive_drawable">@drawable/favourite_inactive_dark</item>
-        <item name="content_warning_button">@drawable/toggle_small</item>
         <item name="sensitive_media_warning_background_color">#80000000</item>
         <item name="media_preview_unloaded_drawable">@drawable/media_preview_unloaded_dark</item>
         <item name="android:listDivider">@drawable/status_divider_dark</item>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 2be80485..b3750663 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -20,7 +20,6 @@
     <attr name="status_reblog_direct_drawable" format="reference" />
     <attr name="status_favourite_active_drawable" format="reference" />
     <attr name="status_favourite_inactive_drawable" format="reference" />
-    <attr name="content_warning_button" format="reference" />
     <attr name="sensitive_media_warning_background_color" format="reference|color" />
     <attr name="media_preview_unloaded_drawable" format="reference" />
     <attr name="conversation_thread_line_drawable" format="reference" />
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 8a73ad68..a13eed14 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -87,7 +87,6 @@
         <item name="status_reblog_direct_drawable">@drawable/reblog_direct_light</item>
         <item name="status_favourite_active_drawable">@drawable/favourite_active_light</item>
         <item name="status_favourite_inactive_drawable">@drawable/favourite_inactive_light</item>
-        <item name="content_warning_button">@drawable/toggle_small_light</item>
         <item name="sensitive_media_warning_background_color">#80B0B0B0</item>
         <item name="media_preview_unloaded_drawable">@drawable/media_preview_unloaded_light</item>
         <item name="android:listDivider">@drawable/status_divider_light</item>