diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt index f22b1c418..faecdd921 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolder.kt @@ -5,6 +5,9 @@ package org.mozilla.fenix.tabstray.viewholders import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.TextView import androidx.annotation.CallSuper import androidx.recyclerview.widget.RecyclerView import org.mozilla.fenix.R @@ -23,10 +26,13 @@ abstract class BaseBrowserTabViewHolder( ) : AbstractTrayViewHolder(containerView) { private val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item) + private val emptyList: TextView = itemView.findViewById(R.id.tab_tray_empty_view) + abstract val emptyStringText: String init { trayList.interactor = interactor trayList.tabsTrayStore = tabsTrayStore + emptyList.text = emptyStringText } @CallSuper @@ -36,11 +42,21 @@ abstract class BaseBrowserTabViewHolder( ) { adapter.registerAdapterDataObserver(OneTimeAdapterObserver(adapter) { trayList.scrollToPosition(currentTabIndex) + updateTrayVisibility(adapter.itemCount) }) - trayList.layoutManager = layoutManager trayList.adapter = adapter } + + private fun updateTrayVisibility(size: Int) { + if (size == 0) { + trayList.visibility = GONE + emptyList.visibility = VISIBLE + } else { + trayList.visibility = VISIBLE + emptyList.visibility = GONE + } + } } /** diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt index 99702c526..61a1f1a4e 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/NormalBrowserTabViewHolder.kt @@ -37,6 +37,9 @@ class NormalBrowserTabViewHolder( override val selectedItems: Set get() = store.state.mode.selectedTabs + override val emptyStringText: String + get() = itemView.resources.getString(R.string.no_open_tabs_description) + override fun bind( adapter: RecyclerView.Adapter, layoutManager: RecyclerView.LayoutManager diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt index e5017ff10..b49bc8fc1 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/PrivateBrowserTabViewHolder.kt @@ -23,6 +23,9 @@ class PrivateBrowserTabViewHolder( interactor, currentTabIndex ) { + override val emptyStringText: String + get() = itemView.resources.getString(R.string.no_private_tabs_description) + companion object { const val LAYOUT_ID = R.layout.private_browser_tray_list } diff --git a/app/src/main/res/layout/component_tabstray2.xml b/app/src/main/res/layout/component_tabstray2.xml index 45960d613..81fab8e3b 100644 --- a/app/src/main/res/layout/component_tabstray2.xml +++ b/app/src/main/res/layout/component_tabstray2.xml @@ -32,23 +32,6 @@ android:visibility="gone" app:layout_constraintTop_toBottomOf="@+id/topBar" /> - - - + android:layout_height="match_parent"> + + + + + diff --git a/app/src/main/res/layout/private_browser_tray_list.xml b/app/src/main/res/layout/private_browser_tray_list.xml index bd746632a..21ce16541 100644 --- a/app/src/main/res/layout/private_browser_tray_list.xml +++ b/app/src/main/res/layout/private_browser_tray_list.xml @@ -1,6 +1,24 @@ - + android:layout_height="match_parent"> + + + + + diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolderTest.kt new file mode 100644 index 000000000..9e1c31af1 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/tabstray/viewholders/BaseBrowserTabViewHolderTest.kt @@ -0,0 +1,79 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.tabstray.viewholders + +import android.view.LayoutInflater +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import io.mockk.mockk +import mozilla.components.concept.tabstray.Tabs +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.tabstray.TabsTrayInteractor +import org.mozilla.fenix.tabstray.TabsTrayStore +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList +import org.mozilla.fenix.tabstray.browser.BrowserTabsAdapter +import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor +import org.mozilla.fenix.tabstray.browser.createTab + +@RunWith(FenixRobolectricTestRunner::class) +class BaseBrowserTabViewHolderTest { + val store: TabsTrayStore = TabsTrayStore() + val interactor = mockk(relaxed = true) + val browserTrayInteractor = mockk(relaxed = true) + val adapter = BrowserTabsAdapter(testContext, browserTrayInteractor, store) + + @Test + fun `WHEN tabs inserted THEN show tray`() { + val itemView = + LayoutInflater.from(testContext).inflate(R.layout.normal_browser_tray_list, null) + val viewHolder = NormalBrowserTabViewHolder(itemView, store, interactor, 5) + val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item) + val emptyList: TextView = itemView.findViewById(R.id.tab_tray_empty_view) + + viewHolder.bind(adapter, LinearLayoutManager(testContext)) + + adapter.updateTabs( + Tabs( + list = listOf( + createTab("tab1") + ), + selectedIndex = 0 + ) + ) + adapter.onTabsInserted(0, 1) + + assertTrue(trayList.visibility == VISIBLE) + assertTrue(emptyList.visibility == GONE) + } + + @Test + fun `WHEN no tabs THEN show empty view`() { + val itemView = + LayoutInflater.from(testContext).inflate(R.layout.normal_browser_tray_list, null) + val viewHolder = NormalBrowserTabViewHolder(itemView, store, interactor, 5) + val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item) + val emptyList: TextView = itemView.findViewById(R.id.tab_tray_empty_view) + + viewHolder.bind(adapter, LinearLayoutManager(testContext)) + + adapter.updateTabs( + Tabs( + list = emptyList(), + selectedIndex = 0 + ) + ) + adapter.onTabsInserted(0, 0) + + assertTrue(trayList.visibility == GONE) + assertTrue(emptyList.visibility == VISIBLE) + } +}