From 81a04c8977753d2fd1be97f585b0e6c41695fe71 Mon Sep 17 00:00:00 2001 From: UlrichKu Date: Wed, 11 Oct 2023 09:54:01 +0200 Subject: [PATCH] 2512: Allow more than 5 tabs (#4051) Fixes #2512 ![grafik](https://github.com/tuskyapp/Tusky/assets/1618905/f8199d10-e26a-4f14-93c3-95cb890ea663) Can add an arbitrary number of tabs. Graphical behavior is unchanged for small numbers: the whole space if filled with the tabs - they are enlarged if needed. If there are more the mode switches to "scrollable". This does not, however, look very differently (see screenshot with the current tab scrolled out). --------- Co-authored-by: Konrad Pozniak --- .../tusky/TabPreferenceActivity.kt | 9 ---- .../tusky/view/AdaptiveTabLayout.kt | 41 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 8 ++-- .../res/layout/activity_tab_preference.xml | 11 +---- app/src/main/res/values/strings.xml | 4 -- 5 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/keylesspalace/tusky/view/AdaptiveTabLayout.kt diff --git a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt index 4d91fd1a6..f830f397b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt @@ -164,18 +164,12 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene toggleFab(false) } - binding.maxTabsInfo.text = resources.getQuantityString(R.plurals.max_tab_number_reached, MAX_TAB_COUNT, MAX_TAB_COUNT) - updateAvailableTabs() onBackPressedDispatcher.addCallback(onFabDismissedCallback) } override fun onTabAdded(tab: TabData) { - if (currentTabs.size >= MAX_TAB_COUNT) { - return - } - toggleFab(false) if (tab.id == HASHTAG) { @@ -395,8 +389,6 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene addableTabs.add(createTabDataFromId(LIST)) addTabAdapter.updateData(addableTabs) - - binding.maxTabsInfo.visible(addableTabs.size == 0 || currentTabs.size >= MAX_TAB_COUNT) currentTabsAdapter.setRemoveButtonVisible(currentTabs.size > MIN_TAB_COUNT) } @@ -429,6 +421,5 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene companion object { private const val MIN_TAB_COUNT = 2 - private const val MAX_TAB_COUNT = 5 } } diff --git a/app/src/main/java/com/keylesspalace/tusky/view/AdaptiveTabLayout.kt b/app/src/main/java/com/keylesspalace/tusky/view/AdaptiveTabLayout.kt new file mode 100644 index 000000000..800165f90 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/view/AdaptiveTabLayout.kt @@ -0,0 +1,41 @@ +package com.keylesspalace.tusky.view + +import android.content.Context +import android.util.AttributeSet +import android.view.ViewGroup +import com.google.android.material.tabs.TabLayout + +/** + * Workaround for "auto" mode not behaving as expected. + * + * Switches the tab display mode depending on available size: start out with "scrollable" but + * if there is enough room switch to "fixed" (and re-measure). + * + * Idea taken from https://stackoverflow.com/a/44894143 + */ +class AdaptiveTabLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : TabLayout(context, attrs, defStyleAttr) { + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + tabMode = MODE_SCROLLABLE // make sure to only measure the "minimum width" + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + + if (tabCount < 2) { + return + } + + val tabLayout = getChildAt(0) as ViewGroup + var widthOfAllTabs = 0 + for (i in 0 until tabLayout.childCount) { + widthOfAllTabs += tabLayout.getChildAt(i).measuredWidth + } + if (widthOfAllTabs <= measuredWidth) { + // fill all space if there is enough room + tabMode = MODE_FIXED + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8082e0ce6..8ea5e9b3b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -38,14 +38,14 @@ app:contentInsetStartWithNavigation="0dp" app:navigationContentDescription="@string/action_open_drawer"> - + app:tabMode="scrollable" /> @@ -67,13 +67,13 @@ app:contentInsetStartWithNavigation="0dp" app:fabAlignmentMode="end"> - + app:tabMode="scrollable" /> diff --git a/app/src/main/res/layout/activity_tab_preference.xml b/app/src/main/res/layout/activity_tab_preference.xml index cd6bce8d2..c29b95bfe 100644 --- a/app/src/main/res/layout/activity_tab_preference.xml +++ b/app/src/main/res/layout/activity_tab_preference.xml @@ -1,7 +1,6 @@ @@ -53,14 +52,6 @@ android:layout_height="wrap_content" android:overScrollMode="never" /> - - - \ 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 48a812989..51679ed88 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -559,10 +559,6 @@ %1$s %1$s and %2$s %1$s, %2$s and %3$d more - - maximum of %1$d tab reached - maximum of %1$d tabs reached - Media: %s