From 54b3d1f8cdff2422e01509796bf0845b2c077fba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A9lanie=20Chauvel=20=28ariasuni=29?=
 <perso@hack-libre.org>
Date: Thu, 19 Dec 2019 18:35:55 +0100
Subject: [PATCH] Add close icon to tabs in Tabs account preferences page
 (#1588)

* Add close icon to tabs in Tabs account preferences page

* Improve code according to code review
---
 .../keylesspalace/tusky/ComposeActivity.java  |  4 +--
 .../tusky/TabPreferenceActivity.kt            | 17 +++++++----
 .../keylesspalace/tusky/adapter/TabAdapter.kt | 30 +++++++++++++++----
 .../main/res/layout/item_tab_preference.xml   | 22 ++++++++++++--
 app/src/main/res/values-night/styles.xml      |  2 +-
 app/src/main/res/values/attrs.xml             |  2 +-
 app/src/main/res/values/colors.xml            |  4 +--
 app/src/main/res/values/styles.xml            |  2 +-
 8 files changed, 62 insertions(+), 21 deletions(-)

diff --git a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java
index c1ab87a6..60b9324b 100644
--- a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java
@@ -1289,7 +1289,7 @@ public final class ComposeActivity
     private void enableButton(ImageButton button, boolean clickable, boolean colorActive) {
         button.setEnabled(clickable);
         ThemeUtils.setDrawableTint(this, button.getDrawable(),
-                colorActive ? android.R.attr.textColorTertiary : R.attr.compose_media_button_disabled_tint);
+                colorActive ? android.R.attr.textColorTertiary : R.attr.image_button_disabled_tint);
     }
 
     private void enablePollButton(boolean enable) {
@@ -1298,7 +1298,7 @@ public final class ComposeActivity
         if(enable) {
             textColor = ThemeUtils.getColor(this, android.R.attr.textColorTertiary);
         } else {
-            textColor = ThemeUtils.getColor(this, R.attr.compose_media_button_disabled_tint);
+            textColor = ThemeUtils.getColor(this, R.attr.image_button_disabled_tint);
         }
         actionAddPoll.setTextColor(textColor);
         actionAddPoll.getCompoundDrawablesRelative()[0].setColorFilter(textColor, PorterDuff.Mode.SRC_IN);
diff --git a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
index fe8783ac..f7b38055 100644
--- a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
@@ -41,6 +41,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
 import io.reactivex.schedulers.Schedulers
 import kotlinx.android.synthetic.main.activity_tab_preference.*
 import kotlinx.android.synthetic.main.toolbar_basic.*
+import kotlinx.android.synthetic.main.item_tab_preference.view.removeButton
 import java.util.regex.Pattern
 import javax.inject.Inject
 
@@ -76,7 +77,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
         }
 
         currentTabs = (accountManager.activeAccount?.tabPreferences ?: emptyList()).toMutableList()
-        currentTabsAdapter = TabAdapter(currentTabs, false, this)
+        currentTabsAdapter = TabAdapter(currentTabs, false, this, currentTabs.size <= MIN_TAB_COUNT)
         currentTabsRecyclerView.adapter = currentTabsAdapter
         currentTabsRecyclerView.layoutManager = LinearLayoutManager(this)
         currentTabsRecyclerView.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
@@ -109,10 +110,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
             }
 
             override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
-                currentTabs.removeAt(viewHolder.adapterPosition)
-                currentTabsAdapter.notifyItemRemoved(viewHolder.adapterPosition)
-                updateAvailableTabs()
-                saveTabs()
+                onTabRemoved(viewHolder.adapterPosition)
             }
 
             override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
@@ -168,6 +166,13 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
         saveTabs()
     }
 
+    override fun onTabRemoved(position: Int) {
+        currentTabs.removeAt(position)
+        currentTabsAdapter.notifyItemRemoved(position)
+        updateAvailableTabs()
+        saveTabs()
+    }
+
     override fun onActionChipClicked(tab: TabData) {
         showEditHashtagDialog(tab)
     }
@@ -273,7 +278,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
         addTabAdapter.updateData(addableTabs)
 
         maxTabsInfo.visible(addableTabs.size == 0 || currentTabs.size >= MAX_TAB_COUNT)
-
+        currentTabsAdapter.setRemoveButtonVisible(currentTabs.size > MIN_TAB_COUNT);
     }
 
     override fun onStartDelete(viewHolder: RecyclerView.ViewHolder) {
diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt
index a1689819..bc252ab9 100644
--- a/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt
@@ -32,14 +32,16 @@ import kotlinx.android.synthetic.main.item_tab_preference.view.*
 
 interface ItemInteractionListener {
     fun onTabAdded(tab: TabData)
+    fun onTabRemoved(position: Int)
     fun onStartDelete(viewHolder: RecyclerView.ViewHolder)
     fun onStartDrag(viewHolder: RecyclerView.ViewHolder)
     fun onActionChipClicked(tab: TabData)
 }
 
 class TabAdapter(private var data: List<TabData>,
-                 private val small: Boolean = false,
-                 private val listener: ItemInteractionListener? = null) : RecyclerView.Adapter<TabAdapter.ViewHolder>() {
+                 private val small: Boolean,
+                 private val listener: ItemInteractionListener,
+                 private var removeButtonEnabled: Boolean = false) : RecyclerView.Adapter<TabAdapter.ViewHolder>() {
 
     fun updateData(newData: List<TabData>) {
         this.data = newData
@@ -67,17 +69,28 @@ class TabAdapter(private var data: List<TabData>,
         holder.itemView.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(iconDrawable, null, null, null)
         if (small) {
             holder.itemView.textView.setOnClickListener {
-                listener?.onTabAdded(data[position])
+                listener.onTabAdded(data[position])
             }
         }
         holder.itemView.imageView?.setOnTouchListener { _, event ->
             if (event.action == MotionEvent.ACTION_DOWN) {
-                listener?.onStartDrag(holder)
+                listener.onStartDrag(holder)
                 true
             } else {
                 false
             }
         }
+        holder.itemView.removeButton?.setOnClickListener {
+            listener.onTabRemoved(holder.adapterPosition)
+        }
+        if (holder.itemView.removeButton != null) {
+            holder.itemView.removeButton.isEnabled = removeButtonEnabled
+            ThemeUtils.setDrawableTint(
+                holder.itemView.context,
+                holder.itemView.removeButton.drawable,
+                (if (removeButtonEnabled) android.R.attr.textColorTertiary else R.attr.image_button_disabled_tint)
+            )
+        }
 
         if (!small) {
 
@@ -89,7 +102,7 @@ class TabAdapter(private var data: List<TabData>,
 
                 holder.itemView.actionChip.chipIcon = context.getDrawable(R.drawable.ic_edit_chip)
                 holder.itemView.actionChip.setOnClickListener {
-                    listener?.onActionChipClicked(data[position])
+                    listener.onActionChipClicked(data[position])
                 }
 
             } else {
@@ -102,5 +115,12 @@ class TabAdapter(private var data: List<TabData>,
         return data.size
     }
 
+    fun setRemoveButtonVisible(enabled: Boolean) {
+        if (removeButtonEnabled != enabled) {
+            removeButtonEnabled = enabled
+            notifyDataSetChanged()
+        }
+    }
+
     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
 }
diff --git a/app/src/main/res/layout/item_tab_preference.xml b/app/src/main/res/layout/item_tab_preference.xml
index e76c2399..deebdb90 100644
--- a/app/src/main/res/layout/item_tab_preference.xml
+++ b/app/src/main/res/layout/item_tab_preference.xml
@@ -7,7 +7,7 @@
     android:background="?android:colorBackground"
     android:orientation="horizontal"
     android:paddingStart="16dp"
-    android:paddingTop="16dp"
+    android:paddingTop="8dp"
     android:paddingEnd="16dp">
 
     <ImageView
@@ -15,6 +15,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="end"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
         android:src="@drawable/ic_drag_indicator_24dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
@@ -24,6 +26,8 @@
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="8dp"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
         android:layout_weight="1"
         android:drawablePadding="12dp"
         android:textColor="?android:attr/textColorSecondary"
@@ -32,10 +36,23 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toEndOf="@id/imageView"
         app:layout_constraintTop_toTopOf="parent"
-        app:layout_goneMarginBottom="16dp"
+        app:layout_goneMarginBottom="8dp"
         tools:drawableStart="@drawable/ic_home_24dp"
         tools:text="Home" />
 
+    <ImageButton
+        android:id="@+id/removeButton"
+        style="?attr/image_button_style"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:layout_gravity="end"
+        android:layout_marginTop="4dp"
+        android:background="?attr/selectableItemBackgroundBorderless"
+        android:contentDescription="@string/action_delete"
+        android:src="@drawable/ic_clear_24dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
     <com.google.android.material.chip.ChipGroup
         android:id="@+id/chipGroup"
         android:layout_width="match_parent"
@@ -56,4 +73,3 @@
     </com.google.android.material.chip.ChipGroup>
 
 </androidx.constraintlayout.widget.ConstraintLayout>
-
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
index 643a4206..90e692c4 100644
--- a/app/src/main/res/values-night/styles.xml
+++ b/app/src/main/res/values-night/styles.xml
@@ -47,7 +47,7 @@
         <item name="account_toolbar_icon_tint_collapsed">@color/account_toolbar_icon_collapsed_dark</item>
 
         <item name="compose_close_button_tint">@color/toolbar_icon_dark</item>
-        <item name="compose_media_button_disabled_tint">@color/compose_media_button_disabled_dark</item>
+        <item name="image_button_disabled_tint">@color/image_button_disabled_dark</item>
         <item name="compose_content_warning_bar_background">@drawable/border_background_dark</item>
         <item name="compose_reply_content_background">@color/compose_reply_content_background_dark</item>
 
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 46395bb9..2be80485 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -30,7 +30,7 @@
     <attr name="account_toolbar_icon_tint_uncollapsed" format="reference|color" />
     <attr name="account_toolbar_icon_tint_collapsed" format="reference|color" />
     <attr name="compose_close_button_tint" format="reference|color" />
-    <attr name="compose_media_button_disabled_tint" format="reference|color" />
+    <attr name="image_button_disabled_tint" format="reference|color" />
     <attr name="compose_content_warning_bar_background" format="reference" />
     <attr name="compose_reply_content_background" format="reference|color" />
     <attr name="report_status_background_color" format="reference|color" />
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 92770f4c..35a972cd 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -26,7 +26,7 @@
     <color name="status_divider_dark">#2f3441</color>
     <color name="tab_page_margin_dark">#1a1c23</color>
     <color name="account_toolbar_icon_collapsed_dark">#ffffff</color>
-    <color name="compose_media_button_disabled_dark">#586173</color>
+    <color name="image_button_disabled_dark">#586173</color>
     <color name="custom_tab_toolbar_dark">#313543</color>
     <color name="compose_reply_content_background_dark">#373c4b</color>
     <color name="autocomplete_divider_dark">#424a5b</color>
@@ -54,7 +54,7 @@
     <color name="status_divider_light">#cfcfcf</color>
     <color name="tab_page_margin_light">#cfcfcf</color>
     <color name="account_toolbar_icon_collapsed_light">#DE000000</color>
-    <color name="compose_media_button_disabled_light">#a3a5ab</color>
+    <color name="image_button_disabled_light">#a3a5ab</color>
     <color name="report_status_background_light">#EFEFEF</color>
     <color name="custom_tab_toolbar_light">#ffffff</color>
     <color name="compose_reply_content_background_light">#e0e1e6</color>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 5eb6c78b..8251dfd6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -105,7 +105,7 @@
         </item>
 
         <item name="compose_close_button_tint">@color/toolbar_icon_light</item>
-        <item name="compose_media_button_disabled_tint">@color/compose_media_button_disabled_light
+        <item name="image_button_disabled_tint">@color/image_button_disabled_light
         </item>
         <item name="compose_content_warning_bar_background">@drawable/border_background_light</item>
         <item name="compose_reply_content_background">