Skip to content

Commit 1b794d4

Browse files
authored
Merge pull request #1 from eadm/presentation-1.1
presentation/base/1.1.1
2 parents 1c016ee + 82d1368 commit 1b794d4

8 files changed

Lines changed: 101 additions & 31 deletions

File tree

dependencies.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ext.versions = [
66
viewNavigationName : '1.0.2',
77
viewInjectionName : '1.0.0',
88

9-
presentationBaseName : '1.0.0',
9+
presentationBaseName : '1.1.1',
1010

1111
minSdk : 16,
1212
targetSdk : 28,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ru.nobird.android.presentation.base
2+
3+
import androidx.annotation.CallSuper
4+
5+
class DefaultPresenterViewContainer<V> : PresenterViewContainer<V> {
6+
@Volatile
7+
override var view: V? = null
8+
private set
9+
10+
@CallSuper
11+
override fun attachView(view: V) {
12+
val previousView = this.view
13+
14+
check(previousView == null) { "Previous view is not detached! previousView = $previousView" }
15+
16+
this.view = view
17+
}
18+
19+
@CallSuper
20+
override fun detachView(view: V) {
21+
val previousView = this.view
22+
23+
check(previousView === view) { "Unexpected view! previousView = $previousView, getView to unbind = $view" }
24+
25+
this.view = null
26+
}
27+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ru.nobird.android.presentation.base
2+
3+
import android.os.Bundle
4+
import androidx.annotation.CallSuper
5+
import androidx.lifecycle.ViewModel
6+
import io.reactivex.disposables.CompositeDisposable
7+
8+
abstract class DisposableViewModel : ViewModel() {
9+
protected val compositeDisposable = CompositeDisposable()
10+
11+
protected open val nestedDisposables: List<DisposableViewModel> = emptyList()
12+
13+
@CallSuper
14+
override fun onCleared() {
15+
nestedDisposables.forEach { it.onCleared() }
16+
compositeDisposable.dispose()
17+
}
18+
19+
@CallSuper
20+
open fun onSaveInstanceState(outState: Bundle) {
21+
nestedDisposables.forEachIndexed { index, nestedPresenter ->
22+
val bundle = Bundle()
23+
nestedPresenter.onSaveInstanceState(bundle)
24+
25+
outState.putBundle("${nestedPresenter::class.java.canonicalName}:$index", bundle)
26+
}
27+
}
28+
29+
@CallSuper
30+
open fun onRestoreInstanceState(savedInstanceState: Bundle) {
31+
nestedDisposables.forEachIndexed { index, nestedPresenter ->
32+
savedInstanceState
33+
.getBundle("${nestedPresenter::class.java.canonicalName}:$index")
34+
?.let(nestedPresenter::onRestoreInstanceState)
35+
}
36+
}
37+
}
Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,25 @@
11
package ru.nobird.android.presentation.base
22

3-
import android.os.Bundle
43
import androidx.annotation.CallSuper
5-
import androidx.lifecycle.ViewModel
6-
import io.reactivex.disposables.CompositeDisposable
4+
import ru.nobird.android.presentation.base.delegate.PresenterDelegate
75

8-
abstract class PresenterBase<V> : ViewModel() {
9-
protected val compositeDisposable = CompositeDisposable()
6+
abstract class PresenterBase<V>(
7+
private val presenterViewContainer: PresenterViewContainer<V> = DefaultPresenterViewContainer()
8+
) : DisposableViewModel(), PresenterViewContainer<V> by presenterViewContainer {
9+
protected open val delegates: List<PresenterDelegate<in V>> = emptyList()
1010

11-
@Volatile
12-
var view: V? = null
13-
private set
11+
override val nestedDisposables: List<DisposableViewModel>
12+
get() = delegates
1413

1514
@CallSuper
16-
open fun attachView(view: V) {
17-
val previousView = this.view
18-
19-
check(previousView == null) { "Previous view is not detached! previousView = $previousView" }
20-
21-
this.view = view
15+
override fun attachView(view: V) {
16+
presenterViewContainer.attachView(view)
17+
delegates.forEach { it.attachView(view) }
2218
}
2319

2420
@CallSuper
25-
open fun detachView(view: V) {
26-
val previousView = this.view
27-
28-
if (previousView === view) {
29-
this.view = null
30-
} else {
31-
throw IllegalStateException("Unexpected view! previousView = $previousView, getView to unbind = $view")
32-
}
21+
override fun detachView(view: V) {
22+
delegates.forEach { it.detachView(view) }
23+
presenterViewContainer.detachView(view)
3324
}
34-
35-
@CallSuper
36-
override fun onCleared() {
37-
compositeDisposable.dispose()
38-
}
39-
40-
open fun onSaveInstanceState(outState: Bundle) {}
41-
open fun onRestoreInstanceState(savedInstanceState: Bundle) {}
4225
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ru.nobird.android.presentation.base
2+
3+
interface PresenterContract<V> {
4+
fun attachView(view: V)
5+
fun detachView(view: V)
6+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package ru.nobird.android.presentation.base
2+
3+
interface PresenterViewContainer<V> : ViewContainer<V>, PresenterContract<V>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package ru.nobird.android.presentation.base
2+
3+
interface ViewContainer<V> {
4+
val view: V?
5+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ru.nobird.android.presentation.base.delegate
2+
3+
import ru.nobird.android.presentation.base.DisposableViewModel
4+
import ru.nobird.android.presentation.base.PresenterContract
5+
6+
abstract class PresenterDelegate<V> : PresenterContract<V>, DisposableViewModel() {
7+
override fun attachView(view: V) {}
8+
override fun detachView(view: V) {}
9+
}

0 commit comments

Comments
 (0)