Skip to content

Commit c7cd1d1

Browse files
author
Melih Aksoy
committed
Reducing complexity & duplication
1 parent 4e0f1e0 commit c7cd1d1

File tree

4 files changed

+56
-50
lines changed

4 files changed

+56
-50
lines changed

core/src/main/kotlin/com/melih/core/base/lifecycle/BaseFragment.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import androidx.databinding.ViewDataBinding
1010
import androidx.fragment.app.Fragment
1111
import androidx.navigation.NavController
1212
import androidx.navigation.fragment.NavHostFragment
13+
import com.google.android.material.snackbar.Snackbar
14+
import com.melih.repository.interactors.base.Reason
15+
import kotlinx.coroutines.ExperimentalCoroutinesApi
1316

1417
/**
1518
* Parent of all fragments.
@@ -38,6 +41,17 @@ abstract class BaseFragment<T : ViewDataBinding> : Fragment() {
3841
return binding.root
3942
}
4043

44+
@ExperimentalCoroutinesApi
45+
protected fun showSnackbarWithAction(reason: Reason, block: () -> Unit) {
46+
Snackbar.make(
47+
binding.root,
48+
resources.getString(reason.messageRes),
49+
Snackbar.LENGTH_INDEFINITE
50+
).setAction(com.melih.core.R.string.retry) {
51+
block()
52+
}.show()
53+
}
54+
4155
@LayoutRes
4256
abstract fun getLayoutId(): Int
4357
// endregion
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.melih.core.extensions
2+
3+
fun CharSequence.containsIgnoreCase(other: CharSequence) = contains(other, true)

features/detail/src/main/kotlin/com/melih/detail/ui/DetailFragment.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.os.Bundle
44
import android.text.method.ScrollingMovementMethod
55
import android.view.View
66
import androidx.navigation.fragment.navArgs
7-
import com.google.android.material.snackbar.Snackbar
87
import com.melih.core.base.lifecycle.BaseDaggerFragment
98
import com.melih.core.extensions.createFor
109
import com.melih.core.extensions.observe
@@ -43,13 +42,9 @@ class DetailFragment : BaseDaggerFragment<DetailBinding>() {
4342

4443
// Observing error to show toast with retry action
4544
observe(viewModel.errorData) {
46-
Snackbar.make(
47-
binding.root,
48-
resources.getString(it.messageRes),
49-
Snackbar.LENGTH_INDEFINITE
50-
).setAction(com.melih.core.R.string.retry) {
45+
showSnackbarWithAction(it) {
5146
viewModel.retry()
52-
}.show()
47+
}
5348
}
5449

5550
observe(viewModel.successData) {

features/list/src/main/kotlin/com/melih/list/ui/LaunchesFragment.kt

Lines changed: 37 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@ import android.view.MenuInflater
66
import android.view.View
77
import androidx.appcompat.widget.SearchView
88
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
9-
import com.google.android.material.snackbar.Snackbar
109
import com.melih.core.actions.Actions
1110
import com.melih.core.base.lifecycle.BaseDaggerFragment
11+
import com.melih.core.extensions.containsIgnoreCase
1212
import com.melih.core.extensions.createFor
1313
import com.melih.core.extensions.observe
1414
import com.melih.list.R
1515
import com.melih.list.databinding.ListBinding
1616
import com.melih.repository.entities.LaunchEntity
1717
import com.melih.repository.interactors.base.Result
1818
import kotlinx.coroutines.ExperimentalCoroutinesApi
19-
import timber.log.Timber
2019

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

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

42+
observeDataChanges()
43+
}
44+
45+
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
46+
inflater.inflate(R.menu.menu_rocket_list, menu)
47+
48+
(menu.findItem(R.id.search).actionView as SearchView).apply {
49+
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
50+
51+
override fun onQueryTextSubmit(query: String?): Boolean {
52+
clearFocus()
53+
return true
54+
}
55+
56+
override fun onQueryTextChange(newText: String?): Boolean {
57+
launchesAdapter.submitList(filterItemListBy(newText))
58+
return true
59+
}
60+
})
61+
}
62+
63+
super.onCreateOptionsMenu(menu, inflater)
64+
}
65+
66+
@ExperimentalCoroutinesApi
67+
private fun observeDataChanges() {
68+
4369
// Observing state to show loading
4470
observe(viewModel.stateData) {
4571
binding.swipeRefreshLayout.isRefreshing = it is Result.State.Loading
4672
}
4773

4874
// Observing error to show toast with retry action
4975
observe(viewModel.errorData) {
50-
Snackbar.make(
51-
binding.root,
52-
resources.getString(it.messageRes),
53-
Snackbar.LENGTH_INDEFINITE
54-
).setAction(com.melih.core.R.string.retry) {
76+
showSnackbarWithAction(it) {
5577
viewModel.retry()
56-
}.show()
78+
}
5779
}
5880

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

6688
private fun onItemSelected(item: LaunchEntity) {
67-
Timber.i("${item.id}")
6889
startActivity(Actions.openDetailFor(item.id))
6990
}
7091

71-
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
72-
inflater.inflate(R.menu.menu_rocket_list, menu)
73-
74-
(menu.findItem(R.id.search).actionView as SearchView).apply {
75-
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
76-
77-
override fun onQueryTextSubmit(query: String?): Boolean {
78-
clearFocus()
79-
return true
80-
}
81-
82-
override fun onQueryTextChange(newText: String?): Boolean {
83-
launchesAdapter.submitList(
84-
if (!newText.isNullOrBlank()) {
85-
itemList.filter {
86-
it.rocket.name.contains(
87-
newText,
88-
true
89-
) || (it.missions.size > 0 && it.missions[0].description.contains(
90-
newText,
91-
true
92-
))
93-
}
94-
} else {
95-
itemList
96-
}
97-
)
98-
99-
return true
100-
}
101-
})
92+
private fun filterItemListBy(query: String?) =
93+
if (!query.isNullOrBlank()) {
94+
itemList.filter {
95+
it.rocket.name.containsIgnoreCase(query) || it.missions.any { it.description.containsIgnoreCase(query) }
96+
}
97+
} else {
98+
itemList
10299
}
103100

104-
super.onCreateOptionsMenu(menu, inflater)
105-
}
106-
107101
@ExperimentalCoroutinesApi
108102
override fun onRefresh() {
109103
viewModel.refresh()

0 commit comments

Comments
 (0)