diff --git a/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt b/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt index 8867f5bbc..2e7671055 100644 --- a/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/share/listadapters/ShareTabsAdapter.kt @@ -33,7 +33,11 @@ class ShareTabsAdapter : class ShareTabViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: ShareData) = with(itemView) { - context.components.core.icons.loadIntoView(itemView.share_tab_favicon, item.url.orEmpty()) + val url = item.url + if (!url.isNullOrEmpty()) { + context.components.core.icons.loadIntoView(itemView.share_tab_favicon, url) + } + itemView.share_tab_title.text = item.title itemView.share_tab_url.text = item.url } diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index 394ae35c9..9b7dea5c7 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -8,15 +8,13 @@ import android.content.Context import android.view.View import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat.getColor -import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat -import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.account_share_list_item.view.* import mozilla.components.concept.sync.DeviceType import org.mozilla.fenix.R -import org.mozilla.fenix.utils.Do import org.mozilla.fenix.share.ShareToAccountDevicesInteractor import org.mozilla.fenix.share.listadapters.SyncShareOption +import org.mozilla.fenix.utils.Do class AccountDeviceViewHolder( itemView: View, @@ -52,7 +50,7 @@ class AccountDeviceViewHolder( itemView.deviceIcon.apply { setImageResource(drawableRes) - background.colorFilter = createBlendModeColorFilterCompat(getColor(context, colorRes), SRC_IN) + background.setTint(getColor(context, colorRes)) drawable.setTint(getColor(context, R.color.device_foreground)) } itemView.isClickable = option != SyncShareOption.Offline diff --git a/app/src/test/java/org/mozilla/fenix/share/ShareCloseViewTest.kt b/app/src/test/java/org/mozilla/fenix/share/ShareCloseViewTest.kt new file mode 100644 index 000000000..cc36a961f --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/share/ShareCloseViewTest.kt @@ -0,0 +1,43 @@ +/* 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.share + +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.recyclerview.widget.LinearLayoutManager +import io.mockk.mockk +import io.mockk.verify +import kotlinx.android.synthetic.main.share_close.view.* +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.share.listadapters.ShareTabsAdapter + +@RunWith(FenixRobolectricTestRunner::class) +class ShareCloseViewTest { + + private lateinit var container: ViewGroup + private lateinit var interactor: ShareCloseInteractor + + @Before + fun setup() { + container = FrameLayout(testContext) + interactor = mockk(relaxUnitFun = true) + } + + @Test + fun `binds adapter and close button`() { + ShareCloseView(container, interactor) + + assertTrue(container.shared_site_list.layoutManager is LinearLayoutManager) + assertTrue(container.shared_site_list.adapter is ShareTabsAdapter) + + container.closeButton.performClick() + verify { interactor.onShareClosed() } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolderTest.kt new file mode 100644 index 000000000..4a183f365 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolderTest.kt @@ -0,0 +1,126 @@ +/* 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.share.viewholders + +import android.view.LayoutInflater +import io.mockk.Called +import io.mockk.mockk +import io.mockk.verify +import kotlinx.android.synthetic.main.account_share_list_item.view.* +import mozilla.components.concept.sync.Device +import mozilla.components.concept.sync.DeviceType +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.share.ShareToAccountDevicesInteractor +import org.mozilla.fenix.share.listadapters.SyncShareOption + +@RunWith(FenixRobolectricTestRunner::class) +class AccountDeviceViewHolderTest { + + private val baseDevice = Device( + id = "", + displayName = "", + deviceType = DeviceType.UNKNOWN, + isCurrentDevice = true, + lastAccessTime = 0L, + capabilities = emptyList(), + subscriptionExpired = false, + subscription = null + ) + private lateinit var viewHolder: AccountDeviceViewHolder + private lateinit var interactor: ShareToAccountDevicesInteractor + + @Before + fun setup() { + interactor = mockk(relaxUnitFun = true) + + val view = LayoutInflater.from(testContext).inflate(AccountDeviceViewHolder.LAYOUT_ID, null) + viewHolder = AccountDeviceViewHolder(view, interactor) + } + + @Test + fun `bind SignIn option`() { + viewHolder.bind(SyncShareOption.SignIn) + assertEquals("Sign in to Sync", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor.onSignIn() } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } + + @Test + fun `bind Reconnect option`() { + viewHolder.bind(SyncShareOption.Reconnect) + assertEquals("Reconnect to Sync", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor.onReauth() } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } + + @Test + fun `bind Offline option`() { + viewHolder.bind(SyncShareOption.Offline) + assertEquals("Offline", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor wasNot Called } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } + + @Test + fun `bind AddNewDevice option`() { + viewHolder.bind(SyncShareOption.AddNewDevice) + assertEquals("Connect another device", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor.onAddNewDevice() } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } + + @Test + fun `bind SendAll option`() { + val devices = listOf(mockk()) + viewHolder.bind(SyncShareOption.SendAll(devices)) + assertEquals("Send to all devices", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor.onShareToAllDevices(devices) } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } + + @Test + fun `bind mobile SingleDevice option`() { + val device = baseDevice.copy( + deviceType = DeviceType.MOBILE, + displayName = "Mobile" + ) + viewHolder.bind(SyncShareOption.SingleDevice(device)) + assertEquals("Mobile", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor.onShareToDevice(device) } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } + + @Test + fun `bind desktop SingleDevice option`() { + val device = baseDevice.copy( + deviceType = DeviceType.DESKTOP, + displayName = "Desktop" + ) + viewHolder.bind(SyncShareOption.SingleDevice(device)) + assertEquals("Desktop", viewHolder.itemView.deviceName.text) + + viewHolder.itemView.performClick() + verify { interactor.onShareToDevice(device) } + assertFalse(viewHolder.itemView.hasOnClickListeners()) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/share/viewholders/AppViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/share/viewholders/AppViewHolderTest.kt new file mode 100644 index 000000000..f43081830 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/share/viewholders/AppViewHolderTest.kt @@ -0,0 +1,67 @@ +/* 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.share.viewholders + +import android.view.LayoutInflater +import androidx.appcompat.content.res.AppCompatResources.getDrawable +import io.mockk.Called +import io.mockk.mockk +import io.mockk.verify +import kotlinx.android.synthetic.main.app_share_list_item.view.* +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.share.ShareToAppsInteractor +import org.mozilla.fenix.share.listadapters.AppShareOption + +@RunWith(FenixRobolectricTestRunner::class) +class AppViewHolderTest { + + private lateinit var viewHolder: AppViewHolder + private lateinit var interactor: ShareToAppsInteractor + + @Before + fun setup() { + interactor = mockk(relaxUnitFun = true) + + val view = LayoutInflater.from(testContext).inflate(AppViewHolder.LAYOUT_ID, null) + viewHolder = AppViewHolder(view, interactor) + } + + @Test + fun `bind app share option`() { + val app = AppShareOption( + name = "Pocket", + icon = getDrawable(testContext, R.drawable.ic_pocket)!!, + packageName = "com.mozilla.pocket", + activityName = "MainActivity" + ) + viewHolder.bind(app) + + assertEquals("Pocket", viewHolder.itemView.appName.text) + assertEquals(app.icon, viewHolder.itemView.appIcon.drawable) + } + + @Test + fun `trigger interactor if application is bound`() { + val app = AppShareOption( + name = "Pocket", + icon = getDrawable(testContext, R.drawable.ic_pocket)!!, + packageName = "com.mozilla.pocket", + activityName = "MainActivity" + ) + + viewHolder.itemView.performClick() + verify { interactor wasNot Called } + + viewHolder.bind(app) + viewHolder.itemView.performClick() + verify { interactor.onShareToApp(app) } + } +}