Skip to content

Commit

Permalink
For mozilla-mobile#17917: Use View binding in Login Exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
codrut.topliceanu authored and mergify[bot] committed Aug 20, 2021
1 parent c82af0a commit 34e0636
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.asLiveData
import androidx.lifecycle.lifecycleScope
import kotlinx.android.synthetic.main.fragment_exceptions.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.plus
import mozilla.components.lib.state.ext.consumeFrom
import org.mozilla.fenix.R
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.databinding.FragmentExceptionsBinding
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.showToolbar

Expand All @@ -39,8 +39,12 @@ class LoginExceptionsFragment : Fragment() {
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_exceptions, container, false)
): View {
val binding = FragmentExceptionsBinding.inflate(
inflater,
container,
false
)
exceptionsStore = StoreProvider.get(this) {
ExceptionsFragmentStore(
ExceptionsFragmentState(items = emptyList())
Expand All @@ -51,11 +55,11 @@ class LoginExceptionsFragment : Fragment() {
loginExceptionStorage = requireComponents.core.loginExceptionStorage
)
exceptionsView = LoginExceptionsView(
view.exceptionsLayout,
binding.exceptionsLayout,
exceptionsInteractor
)
subscribeToLoginExceptions()
return view
return binding.root
}

private fun subscribeToLoginExceptions() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ import org.mozilla.fenix.settings.logins.controller.SavedLoginsStorageController
import org.mozilla.fenix.settings.logins.createInitialLoginsListState
import org.mozilla.fenix.settings.logins.interactor.LoginDetailInteractor
import org.mozilla.fenix.settings.logins.togglePasswordReveal
import org.mozilla.fenix.settings.logins.view.LoginDetailView
import org.mozilla.fenix.settings.logins.view.LoginDetailsBindingDelegate

/**
* Displays saved login information for a single website.
Expand All @@ -56,7 +56,7 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) {
private val args by navArgs<LoginDetailFragmentArgs>()
private var login: SavedLogin? = null
private lateinit var savedLoginsStore: LoginsFragmentStore
private lateinit var loginDetailView: LoginDetailView
private lateinit var loginDetailsBindingDelegate: LoginDetailsBindingDelegate
private lateinit var interactor: LoginDetailInteractor
private lateinit var menu: Menu
private var deleteDialog: AlertDialog? = null
Expand All @@ -76,9 +76,7 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) {
createInitialLoginsListState(requireContext().settings())
)
}
loginDetailView = LoginDetailView(
view.findViewById(R.id.loginDetailLayout)
)
loginDetailsBindingDelegate = LoginDetailsBindingDelegate(binding)

return view
}
Expand All @@ -99,7 +97,7 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) {
interactor.onFetchLoginList(args.savedLoginId)

consumeFrom(savedLoginsStore) {
loginDetailView.update(it)
loginDetailsBindingDelegate.update(it)
login = savedLoginsStore.state.currentItem
setUpCopyButtons()
showToolbar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@

package org.mozilla.fenix.settings.logins.view

import android.view.ViewGroup
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.fragment_login_detail.*
import org.mozilla.fenix.databinding.FragmentLoginDetailBinding
import org.mozilla.fenix.settings.logins.LoginsListState

/**
* View that contains and configures the Login Details
*/
class LoginDetailView(override val containerView: ViewGroup) : LayoutContainer {
class LoginDetailsBindingDelegate(
private val binding: FragmentLoginDetailBinding
) {
fun update(login: LoginsListState) {
webAddressText.text = login.currentItem?.origin
usernameText.text = login.currentItem?.username
passwordText.text = login.currentItem?.password
binding.webAddressText.text = login.currentItem?.origin
binding.usernameText.text = login.currentItem?.username
binding.passwordText.text = login.currentItem?.password
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@ package org.mozilla.fenix.settings.logins

import android.view.LayoutInflater
import android.view.ViewGroup
import kotlinx.android.synthetic.main.fragment_login_detail.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.databinding.FragmentLoginDetailBinding
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.logins.view.LoginDetailView
import org.mozilla.fenix.settings.logins.view.LoginDetailsBindingDelegate

@RunWith(FenixRobolectricTestRunner::class)
class LoginDetailViewTest {
Expand All @@ -36,30 +35,31 @@ class LoginDetailViewTest {
)

private lateinit var view: ViewGroup
private lateinit var detailView: LoginDetailView
private lateinit var binding: FragmentLoginDetailBinding
private lateinit var detailsBindingDelegate: LoginDetailsBindingDelegate

@Before
fun setup() {
view = LayoutInflater.from(testContext).inflate(R.layout.fragment_login_detail, null)
.findViewById(R.id.loginDetailLayout)
detailView = LoginDetailView(view)
binding = FragmentLoginDetailBinding.inflate(LayoutInflater.from(testContext))
view = binding.loginDetailLayout
detailsBindingDelegate = LoginDetailsBindingDelegate(binding)
}

@Test
fun `bind currentItem`() {
detailView.update(state)
detailsBindingDelegate.update(state)

assertEquals("mozilla.org", view.webAddressText.text)
assertEquals("admin", view.usernameText.text)
assertEquals("password", view.passwordText.text)
assertEquals("mozilla.org", binding.webAddressText.text)
assertEquals("admin", binding.usernameText.text)
assertEquals("password", binding.passwordText.text)
}

@Test
fun `bind null currentItem`() {
detailView.update(state.copy(currentItem = null))
detailsBindingDelegate.update(state.copy(currentItem = null))

assertEquals("", view.webAddressText.text)
assertEquals("", view.usernameText.text)
assertEquals("", view.passwordText.text)
assertEquals("", binding.webAddressText.text)
assertEquals("", binding.usernameText.text)
assertEquals("", binding.passwordText.text)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,14 @@
package org.mozilla.fenix.settings.logins

import android.view.LayoutInflater
import android.view.View
import io.mockk.mockk
import io.mockk.verify
import kotlinx.android.synthetic.main.logins_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.databinding.LoginsItemBinding
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor
import org.mozilla.fenix.settings.logins.view.LoginsListViewHolder
Expand All @@ -30,36 +28,36 @@ class LoginsListViewHolderTest {
timeLastUsed = 100L
)

private lateinit var view: View
private lateinit var interactor: SavedLoginsInteractor
private lateinit var binding: LoginsItemBinding

@Before
fun setup() {
view = LayoutInflater.from(testContext).inflate(R.layout.logins_item, null)
binding = LoginsItemBinding.inflate(LayoutInflater.from(testContext))
interactor = mockk(relaxed = true)
}

@Test
fun `bind url and username`() {
val holder = LoginsListViewHolder(
view,
binding.root,
interactor
)
holder.bind(baseLogin)

assertEquals("mozilla.org", view.webAddressView.text)
assertEquals("admin", view.usernameView.text)
assertEquals("mozilla.org", binding.webAddressView.text)
assertEquals("admin", binding.usernameView.text)
}

@Test
fun `call interactor on click`() {
val holder = LoginsListViewHolder(
view,
binding.root,
interactor
)
holder.bind(baseLogin)

view.performClick()
binding.root.performClick()
verify { interactor.onItemClicked(baseLogin) }
}
}

0 comments on commit 34e0636

Please sign in to comment.