[fenix] For https://github.com/mozilla-mobile/fenix/issues/3563. Use `ListAdapter` for App Share list.

pull/600/head
Denys M 5 years ago committed by Emily Kager
parent a179403303
commit 55f265945f

@ -157,7 +157,7 @@ class ShareFragment : AppCompatDialogFragment() {
val devicesShareOptions = devicesListDeferred.await() val devicesShareOptions = devicesListDeferred.await()
shareToAccountDevicesView.setSharetargets(devicesShareOptions) shareToAccountDevicesView.setSharetargets(devicesShareOptions)
val appsToShareTo = appsListDeferred.await() val appsToShareTo = appsListDeferred.await()
shareToAppsView.setSharetargets(appsToShareTo) shareToAppsView.setShareTargets(appsToShareTo)
} }
} }

@ -8,10 +8,10 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import kotlinx.android.extensions.LayoutContainer import kotlinx.android.extensions.LayoutContainer
import org.mozilla.fenix.R
import org.mozilla.fenix.share.listadapters.AppShareOption
import kotlinx.android.synthetic.main.share_to_apps.* import kotlinx.android.synthetic.main.share_to_apps.*
import org.mozilla.fenix.R
import org.mozilla.fenix.share.listadapters.AppShareAdapter import org.mozilla.fenix.share.listadapters.AppShareAdapter
import org.mozilla.fenix.share.listadapters.AppShareOption
/** /**
* Callbacks for possible user interactions on the [ShareCloseView] * Callbacks for possible user interactions on the [ShareCloseView]
@ -24,19 +24,20 @@ class ShareToAppsView(
override val containerView: ViewGroup, override val containerView: ViewGroup,
interactor: ShareToAppsInteractor interactor: ShareToAppsInteractor
) : LayoutContainer { ) : LayoutContainer {
private val adapter = AppShareAdapter(interactor)
init { init {
LayoutInflater.from(containerView.context) LayoutInflater.from(containerView.context)
.inflate(R.layout.share_to_apps, containerView, true) .inflate(R.layout.share_to_apps, containerView, true)
appsList.adapter = AppShareAdapter(interactor) appsList.adapter = adapter
} }
fun setSharetargets(targets: List<AppShareOption>) { fun setShareTargets(targets: List<AppShareOption>) {
progressBar.visibility = View.GONE progressBar.visibility = View.GONE
appsList.visibility = View.VISIBLE appsList.visibility = View.VISIBLE
with(appsList.adapter as AppShareAdapter) { adapter.submitList(targets)
updateData(targets)
}
} }
} }

@ -7,14 +7,14 @@ package org.mozilla.fenix.share.listadapters
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import org.mozilla.fenix.share.ShareToAppsInteractor import org.mozilla.fenix.share.ShareToAppsInteractor
import org.mozilla.fenix.share.viewholders.AppViewHolder import org.mozilla.fenix.share.viewholders.AppViewHolder
class AppShareAdapter( class AppShareAdapter(
private val interactor: ShareToAppsInteractor, private val interactor: ShareToAppsInteractor
private val applications: MutableList<AppShareOption> = mutableListOf() ) : ListAdapter<AppShareOption, AppViewHolder>(DiffCallback) {
) : RecyclerView.Adapter<AppViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder {
val view = LayoutInflater.from(parent.context) val view = LayoutInflater.from(parent.context)
@ -23,17 +23,18 @@ class AppShareAdapter(
return AppViewHolder(view, interactor) return AppViewHolder(view, interactor)
} }
override fun getItemCount(): Int = applications.size
override fun onBindViewHolder(holder: AppViewHolder, position: Int) { override fun onBindViewHolder(holder: AppViewHolder, position: Int) {
holder.bind(applications[position]) holder.bind(getItem(position))
} }
}
fun updateData(applications: List<AppShareOption>) { private object DiffCallback : DiffUtil.ItemCallback<AppShareOption>() {
this.applications.clear()
this.applications.addAll(applications) override fun areItemsTheSame(oldItem: AppShareOption, newItem: AppShareOption) =
notifyDataSetChanged() oldItem.packageName == newItem.packageName
}
override fun areContentsTheSame(oldItem: AppShareOption, newItem: AppShareOption) =
oldItem == newItem
} }
data class AppShareOption( data class AppShareOption(

@ -28,26 +28,25 @@ import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
@Config(application = TestApplication::class) @Config(application = TestApplication::class)
class AppShareAdapterTest { class AppShareAdapterTest {
private val appOptions = mutableListOf( private val appOptions = mutableListOf(
AppShareOption("App 0", mockk(), "package 0", "activity 0"), AppShareOption("App 0", mockk(), "package 0", "activity 0"),
AppShareOption("App 1", mockk(), "package 1", "activity 1") AppShareOption("App 1", mockk(), "package 1", "activity 1")
) )
private val appOptionsEmpty = mutableListOf<AppShareOption>() private val appOptionsEmpty = emptyList<AppShareOption>()
private val interactor: ShareInteractor = mockk(relaxed = true) private val interactor: ShareInteractor = mockk(relaxed = true)
@Test @Test
fun `updateData should replace all previous data with argument and call notifyDataSetChanged()`() { fun `updateData should call submitList()`() {
// Used AppShareAdapter as a spy to ease testing of notifyDataSetChanged() // Used AppShareAdapter as a spy to ease testing of submitList()
// and appOptionsEmpty to be able to record them being called // and appOptionsEmpty to be able to record them being called
val adapter = spyk(AppShareAdapter(mockk(), appOptionsEmpty)) val adapter = spyk(AppShareAdapter(mockk()).apply { submitList(appOptionsEmpty) })
every { adapter.notifyDataSetChanged() } just Runs every { adapter.submitList(any()) } just Runs
adapter.updateData(appOptions) adapter.submitList(appOptions)
verifyOrder { verifyOrder {
appOptionsEmpty.clear() adapter.submitList(appOptions)
appOptionsEmpty.addAll(appOptions)
adapter.notifyDataSetChanged()
} }
} }
@ -60,7 +59,7 @@ class AppShareAdapterTest {
@Test @Test
fun `getItemCount after updateData() call should return the the passed in list's size`() { fun `getItemCount after updateData() call should return the the passed in list's size`() {
val adapter = AppShareAdapter(mockk(), appOptions) val adapter = AppShareAdapter(mockk()).apply { submitList(appOptions) }
assertThat(adapter.itemCount).isEqualTo(2) assertThat(adapter.itemCount).isEqualTo(2)
} }
@ -89,7 +88,7 @@ class AppShareAdapterTest {
@Test @Test
fun `the adapter binds the right item to a ViewHolder`() { fun `the adapter binds the right item to a ViewHolder`() {
val adapter = AppShareAdapter(interactor, appOptions) val adapter = AppShareAdapter(interactor).apply { submitList(appOptions) }
val parentView: ViewGroup = mockk(relaxed = true) val parentView: ViewGroup = mockk(relaxed = true)
val itemView: ViewGroup = mockk(relaxed = true) val itemView: ViewGroup = mockk(relaxed = true)
every { parentView.context } returns testContext every { parentView.context } returns testContext

Loading…
Cancel
Save