Skip to content

Commit 0b59180

Browse files
arkadiuszpalkaPiotrBandurski
authored andcommitted
refactor: remove fragmentation, add view-binding, add nav component
1 parent 79ece5a commit 0b59180

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+336
-882
lines changed

app/build.gradle

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ android {
3636
}
3737
}
3838

39+
buildFeatures {
40+
viewBinding true
41+
}
42+
3943
lintOptions {
4044
lintConfig file("$rootDir/scripts/lint-rules.xml")
4145
}
@@ -72,7 +76,6 @@ dependencies {
7276

7377
// Utility
7478
implementation deps.utility.apache_lang
75-
implementation deps.utility.fragmentation
7679

7780
// AndroidX
7881
implementation deps.androidx.appcompat
@@ -82,5 +85,8 @@ dependencies {
8285
implementation deps.androidx.material
8386
implementation deps.androidx.multidex
8487
implementation deps.androidx.annotation
88+
implementation deps.androidx.nav_runtime
89+
implementation deps.androidx.nav_fragment
90+
implementation deps.androidx.nav_ui_ktx
8591
implementation "androidx.lifecycle:lifecycle-common:2.2.0"
8692
}

app/src/main/java/pl/valueadd/mvi/example/application/MviApplication.kt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package pl.valueadd.mvi.example.application
33
import androidx.multidex.MultiDexApplication
44
import pl.valueadd.mvi.example.presentation.PresentationModule
55
import pl.valueadd.mvi.example.utility.dependencyinjection.DependencyUtil
6-
import me.yokeyword.fragmentation.Fragmentation
7-
import pl.valueadd.mvi.example.BuildConfig
86
import toothpick.config.Module
97

108
class MviApplication : MultiDexApplication() {
@@ -13,14 +11,6 @@ class MviApplication : MultiDexApplication() {
1311
super.onCreate()
1412

1513
initToothpick()
16-
17-
Fragmentation.builder()
18-
.stackViewMode(Fragmentation.BUBBLE)
19-
.debug(BuildConfig.DEBUG)
20-
.handleException {
21-
// TODO Crashlytics log exception...
22-
}
23-
.install()
2414
}
2515

2616
private fun initToothpick() =

app/src/main/java/pl/valueadd/mvi/example/presentation/base/AbstractActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package pl.valueadd.mvi.example.presentation.base
22

33
import android.os.Bundle
4+
import androidx.viewbinding.ViewBinding
45
import pl.valueadd.mvi.activity.BaseActivity
56
import pl.valueadd.mvi.example.application.ActivityModule
67
import pl.valueadd.mvi.example.utility.dependencyinjection.DependencyUtil
78

8-
abstract class AbstractActivity : BaseActivity() {
9+
abstract class AbstractActivity<Binding : ViewBinding> :
10+
BaseActivity<Binding>() {
911

1012
override fun onCreate(savedInstanceState: Bundle?) {
1113
DependencyUtil.openScopeAndInject(this, ActivityModule(this))

app/src/main/java/pl/valueadd/mvi/example/presentation/base/AbstractBackFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package pl.valueadd.mvi.example.presentation.base
22

33
import android.os.Bundle
4-
import androidx.annotation.LayoutRes
4+
import androidx.viewbinding.ViewBinding
55
import pl.valueadd.mvi.example.utility.dependencyinjection.DependencyUtil
66
import pl.valueadd.mvi.fragment.back.BackFragment
77

8-
abstract class AbstractBackFragment(@LayoutRes layoutId: Int) : BackFragment(layoutId) {
8+
abstract class AbstractBackFragment<Binding : ViewBinding> : BackFragment<Binding>() {
99

1010
override fun onCreate(savedInstanceState: Bundle?) {
1111
DependencyUtil.inject(requireActivity(), this)

app/src/main/java/pl/valueadd/mvi/example/presentation/base/AbstractBackMviFragment.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package pl.valueadd.mvi.example.presentation.base
22

33
import android.os.Bundle
4-
import androidx.annotation.LayoutRes
4+
import androidx.viewbinding.ViewBinding
55
import pl.valueadd.mvi.IBaseViewState
66
import pl.valueadd.mvi.example.utility.dependencyinjection.DependencyUtil
77
import pl.valueadd.mvi.fragment.back.BackMviFragment
88
import pl.valueadd.mvi.fragment.delegate.fragment.MviFragmentSaveInstanceStateDelegateImpl
99
import pl.valueadd.mvi.presenter.BaseMviPresenter
1010
import pl.valueadd.mvi.presenter.IBaseView
1111

12-
abstract class AbstractBackMviFragment<V : IBaseView<VS, *>, VS : IBaseViewState, VI : IBaseView.IBaseIntent, P : BaseMviPresenter<VS, *, *, V>>(@LayoutRes layoutId: Int) :
13-
BackMviFragment<V, VS, VI, P>(layoutId) {
12+
abstract class AbstractBackMviFragment<V : IBaseView<VS, *>, VS : IBaseViewState, VI : IBaseView.IBaseIntent, P : BaseMviPresenter<VS, *, *, V>, Binding :
13+
ViewBinding> :
14+
BackMviFragment<V, VS, VI, P, Binding>() {
1415

1516
protected val restoredViewState: VS?
1617
get() = mviDelegate.restoredViewState

app/src/main/java/pl/valueadd/mvi/example/presentation/base/AbstractBaseFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package pl.valueadd.mvi.example.presentation.base
22

33
import android.os.Bundle
4-
import androidx.annotation.LayoutRes
4+
import androidx.viewbinding.ViewBinding
55
import pl.valueadd.mvi.example.utility.dependencyinjection.DependencyUtil
66
import pl.valueadd.mvi.fragment.base.BaseFragment
77

8-
abstract class AbstractBaseFragment(@LayoutRes layoutId: Int) : BaseFragment(layoutId) {
8+
abstract class AbstractBaseFragment<Binding : ViewBinding> : BaseFragment<Binding>() {
99

1010
override fun onCreate(savedInstanceState: Bundle?) {
1111
DependencyUtil.inject(requireActivity(), this)

app/src/main/java/pl/valueadd/mvi/example/presentation/base/AbstractBaseMviFragment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package pl.valueadd.mvi.example.presentation.base
22

33
import android.os.Bundle
4-
import androidx.annotation.LayoutRes
4+
import androidx.viewbinding.ViewBinding
55
import pl.valueadd.mvi.IBaseViewState
66
import pl.valueadd.mvi.example.utility.dependencyinjection.DependencyUtil
77
import pl.valueadd.mvi.fragment.base.BaseMviFragment
88
import pl.valueadd.mvi.fragment.delegate.fragment.MviFragmentSaveInstanceStateDelegateImpl
99
import pl.valueadd.mvi.presenter.BaseMviPresenter
1010
import pl.valueadd.mvi.presenter.IBaseView
1111

12-
abstract class AbstractBaseMviFragment<V : IBaseView<VS, *>, VS : IBaseViewState, VI : IBaseView.IBaseIntent, P : BaseMviPresenter<VS, *, *, V>>(@LayoutRes layoutId: Int) :
13-
BaseMviFragment<V, VS, VI, P>(layoutId) {
12+
abstract class AbstractBaseMviFragment<V : IBaseView<VS, *>, VS : IBaseViewState, VI : IBaseView.IBaseIntent, P : BaseMviPresenter<VS, *, *, V>, Binding : ViewBinding> :
13+
BaseMviFragment<V, VS, VI, P, Binding>() {
1414

1515
protected val restoredViewState: VS?
1616
get() = mviDelegate.restoredViewState
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
package pl.valueadd.mvi.example.presentation.base
22

3+
import android.util.Log
34
import io.reactivex.android.schedulers.AndroidSchedulers
4-
import pl.valueadd.mvi.IBaseViewState
55
import pl.valueadd.mvi.presenter.BaseMviPresenter
66
import pl.valueadd.mvi.presenter.IBasePartialState
77
import pl.valueadd.mvi.presenter.IBaseView
8+
import pl.valueadd.mvi.presenter.IBaseViewState
89

910
abstract class AbstractPresenter<VS : IBaseViewState, PS : IBasePartialState, VI : IBaseView.IBaseIntent, V : IBaseView<VS, VI>> :
10-
BaseMviPresenter<VS, PS, VI, V>(AndroidSchedulers.mainThread())
11+
BaseMviPresenter<VS, PS, VI, V>(AndroidSchedulers.mainThread()) {
12+
13+
override fun onError(throwable: Throwable) {
14+
super.onError(throwable)
15+
Log.e(this::class.java.simpleName, "MVI has an error: ${throwable.message}", throwable)
16+
}
17+
}
Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,43 @@
11
package pl.valueadd.mvi.example.presentation.main
22

33
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.NavHostFragment
6+
import androidx.navigation.ui.setupWithNavController
7+
import pl.valueadd.mvi.activity.ActivityBindingInflater
8+
import pl.valueadd.mvi.example.R
9+
import pl.valueadd.mvi.example.databinding.MainActivityBinding
410
import pl.valueadd.mvi.example.presentation.base.AbstractActivity
5-
import pl.valueadd.mvi.example.presentation.main.root.RootFragment
611

7-
class MainActivity : AbstractActivity() {
12+
class MainActivity : AbstractActivity<MainActivityBinding>() {
13+
14+
override val bindingInflater: ActivityBindingInflater<MainActivityBinding>
15+
get() = MainActivityBinding::inflate
16+
17+
private val navController
18+
get() = (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController
819

920
override fun onCreate(savedInstanceState: Bundle?) {
1021
super.onCreate(savedInstanceState)
1122

1223
loadRootFragment()
1324
}
1425

15-
private fun loadRootFragment() {
16-
val fragment = findFragment(RootFragment::class.java)
26+
private val topDestinationIds: Set<Int> = setOf(
27+
R.id.firstFragment,
28+
R.id.secondFragment,
29+
R.id.thirdFragment
30+
)
31+
32+
private fun loadRootFragment(): Unit = with(requireBinding) {
33+
bottomNavigation.setupWithNavController(navController)
1734

18-
if (fragment == null) {
19-
loadRootFragment(fragmentContainer, RootFragment.createInstance())
35+
navController.addOnDestinationChangedListener { _, destination, _ ->
36+
if (destination.id !in topDestinationIds) {
37+
bottomNavigation.visibility = View.GONE
38+
} else {
39+
bottomNavigation.visibility = View.VISIBLE
40+
}
2041
}
2142
}
2243
}

app/src/main/java/pl/valueadd/mvi/example/presentation/main/about/AboutFragment.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
package pl.valueadd.mvi.example.presentation.main.about
22

3+
import androidx.appcompat.widget.Toolbar
34
import io.reactivex.Observable
45
import pl.valueadd.mvi.example.R
6+
import pl.valueadd.mvi.example.databinding.FragmentAboutBinding
57
import pl.valueadd.mvi.example.presentation.base.AbstractBackMviFragment
8+
import pl.valueadd.mvi.fragment.base.FragmentBindingInflater
69
import pl.valueadd.mvi.presenter.IBaseView
710
import javax.inject.Inject
811

912
class AboutFragment :
10-
AbstractBackMviFragment<AboutView, AboutViewState, IBaseView.IBaseIntent, AboutPresenter>(R.layout.fragment_about),
13+
AbstractBackMviFragment<AboutView, AboutViewState, IBaseView.IBaseIntent, AboutPresenter, FragmentAboutBinding>(),
1114
AboutView {
1215

16+
override val navigationIcon: Int
17+
get() = R.drawable.ic_arrow_back_white_24dp
18+
19+
override val toolbarNavigation: Toolbar
20+
get() = requireBinding.baseAppBarLayout.baseToolbar
21+
22+
override val bindingInflater: FragmentBindingInflater<FragmentAboutBinding>
23+
get() = FragmentAboutBinding::inflate
24+
1325
companion object {
1426

1527
fun createInstance(): AboutFragment =

0 commit comments

Comments
 (0)