1
0
Fork 0

For #3563. Use `ListAdapter` for App Share list.

master
Denys M 2019-10-01 16:01:02 +04:00 committed by Emily Kager
parent e55eda30fb
commit a4439ff373
4 changed files with 32 additions and 31 deletions

View File

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

View File

@ -8,10 +8,10 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
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 org.mozilla.fenix.R
import org.mozilla.fenix.share.listadapters.AppShareAdapter
import org.mozilla.fenix.share.listadapters.AppShareOption
/**
* Callbacks for possible user interactions on the [ShareCloseView]
@ -24,19 +24,20 @@ class ShareToAppsView(
override val containerView: ViewGroup,
interactor: ShareToAppsInteractor
) : LayoutContainer {
private val adapter = AppShareAdapter(interactor)
init {
LayoutInflater.from(containerView.context)
.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
appsList.visibility = View.VISIBLE
with(appsList.adapter as AppShareAdapter) {
updateData(targets)
}
adapter.submitList(targets)
}
}

View File

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

View File

@ -28,26 +28,25 @@ import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
@Config(application = TestApplication::class)
class AppShareAdapterTest {
private val appOptions = mutableListOf(
AppShareOption("App 0", mockk(), "package 0", "activity 0"),
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)
@Test
fun `updateData should replace all previous data with argument and call notifyDataSetChanged()`() {
// Used AppShareAdapter as a spy to ease testing of notifyDataSetChanged()
fun `updateData should call submitList()`() {
// Used AppShareAdapter as a spy to ease testing of submitList()
// and appOptionsEmpty to be able to record them being called
val adapter = spyk(AppShareAdapter(mockk(), appOptionsEmpty))
every { adapter.notifyDataSetChanged() } just Runs
val adapter = spyk(AppShareAdapter(mockk()).apply { submitList(appOptionsEmpty) })
every { adapter.submitList(any()) } just Runs
adapter.updateData(appOptions)
adapter.submitList(appOptions)
verifyOrder {
appOptionsEmpty.clear()
appOptionsEmpty.addAll(appOptions)
adapter.notifyDataSetChanged()
adapter.submitList(appOptions)
}
}
@ -60,7 +59,7 @@ class AppShareAdapterTest {
@Test
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)
}
@ -89,7 +88,7 @@ class AppShareAdapterTest {
@Test
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 itemView: ViewGroup = mockk(relaxed = true)
every { parentView.context } returns testContext