Skip to content

Reducing complexity & duplication #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions core/src/main/kotlin/com/melih/core/base/lifecycle/BaseFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.snackbar.Snackbar
import com.melih.repository.interactors.base.Reason
import kotlinx.coroutines.ExperimentalCoroutinesApi

/**
* Parent of all fragments.
Expand Down Expand Up @@ -38,6 +41,17 @@ abstract class BaseFragment<T : ViewDataBinding> : Fragment() {
return binding.root
}

@ExperimentalCoroutinesApi
protected fun showSnackbarWithAction(reason: Reason, block: () -> Unit) {
Snackbar.make(
binding.root,
resources.getString(reason.messageRes),
Snackbar.LENGTH_INDEFINITE
).setAction(com.melih.core.R.string.retry) {
block()
}.show()
}

@LayoutRes
abstract fun getLayoutId(): Int
// endregion
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.melih.core.extensions

fun CharSequence.containsIgnoreCase(other: CharSequence) = contains(other, true)
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import android.view.View
import androidx.navigation.fragment.navArgs
import com.google.android.material.snackbar.Snackbar
import com.melih.core.base.lifecycle.BaseDaggerFragment
import com.melih.core.extensions.createFor
import com.melih.core.extensions.observe
Expand Down Expand Up @@ -43,13 +42,9 @@ class DetailFragment : BaseDaggerFragment<DetailBinding>() {

// Observing error to show toast with retry action
observe(viewModel.errorData) {
Snackbar.make(
binding.root,
resources.getString(it.messageRes),
Snackbar.LENGTH_INDEFINITE
).setAction(com.melih.core.R.string.retry) {
showSnackbarWithAction(it) {
viewModel.retry()
}.show()
}
}

observe(viewModel.successData) {
Expand Down
80 changes: 37 additions & 43 deletions features/list/src/main/kotlin/com/melih/list/ui/LaunchesFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,16 @@ import android.view.MenuInflater
import android.view.View
import androidx.appcompat.widget.SearchView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.snackbar.Snackbar
import com.melih.core.actions.Actions
import com.melih.core.base.lifecycle.BaseDaggerFragment
import com.melih.core.extensions.containsIgnoreCase
import com.melih.core.extensions.createFor
import com.melih.core.extensions.observe
import com.melih.list.R
import com.melih.list.databinding.ListBinding
import com.melih.repository.entities.LaunchEntity
import com.melih.repository.interactors.base.Result
import kotlinx.coroutines.ExperimentalCoroutinesApi
import timber.log.Timber

class LaunchesFragment : BaseDaggerFragment<ListBinding>(), SwipeRefreshLayout.OnRefreshListener {

Expand All @@ -40,20 +39,43 @@ class LaunchesFragment : BaseDaggerFragment<ListBinding>(), SwipeRefreshLayout.O
binding.rocketList.adapter = launchesAdapter
binding.swipeRefreshLayout.setOnRefreshListener(this)

observeDataChanges()
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_rocket_list, menu)

(menu.findItem(R.id.search).actionView as SearchView).apply {
setOnQueryTextListener(object : SearchView.OnQueryTextListener {

override fun onQueryTextSubmit(query: String?): Boolean {
clearFocus()
return true
}

override fun onQueryTextChange(newText: String?): Boolean {
launchesAdapter.submitList(filterItemListBy(newText))
return true
}
})
}

super.onCreateOptionsMenu(menu, inflater)
}

@ExperimentalCoroutinesApi
private fun observeDataChanges() {

// Observing state to show loading
observe(viewModel.stateData) {
binding.swipeRefreshLayout.isRefreshing = it is Result.State.Loading
}

// Observing error to show toast with retry action
observe(viewModel.errorData) {
Snackbar.make(
binding.root,
resources.getString(it.messageRes),
Snackbar.LENGTH_INDEFINITE
).setAction(com.melih.core.R.string.retry) {
showSnackbarWithAction(it) {
viewModel.retry()
}.show()
}
}

observe(viewModel.successData) {
Expand All @@ -64,46 +86,18 @@ class LaunchesFragment : BaseDaggerFragment<ListBinding>(), SwipeRefreshLayout.O
}

private fun onItemSelected(item: LaunchEntity) {
Timber.i("${item.id}")
startActivity(Actions.openDetailFor(item.id))
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_rocket_list, menu)

(menu.findItem(R.id.search).actionView as SearchView).apply {
setOnQueryTextListener(object : SearchView.OnQueryTextListener {

override fun onQueryTextSubmit(query: String?): Boolean {
clearFocus()
return true
}

override fun onQueryTextChange(newText: String?): Boolean {
launchesAdapter.submitList(
if (!newText.isNullOrBlank()) {
itemList.filter {
it.rocket.name.contains(
newText,
true
) || (it.missions.size > 0 && it.missions[0].description.contains(
newText,
true
))
}
} else {
itemList
}
)

return true
}
})
private fun filterItemListBy(query: String?) =
if (!query.isNullOrBlank()) {
itemList.filter {
it.rocket.name.containsIgnoreCase(query) || it.missions.any { it.description.containsIgnoreCase(query) }
}
} else {
itemList
}

super.onCreateOptionsMenu(menu, inflater)
}

@ExperimentalCoroutinesApi
override fun onRefresh() {
viewModel.refresh()
Expand Down