Skip to content
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
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ ext.versions = [
viewNavigationName : '1.0.2',
viewInjectionName : '1.0.0',

presentationBaseName : '1.0.0',
presentationBaseName : '1.1.1',

minSdk : 16,
targetSdk : 28,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ru.nobird.android.presentation.base

import androidx.annotation.CallSuper

class DefaultPresenterViewContainer<V> : PresenterViewContainer<V> {
@Volatile
override var view: V? = null
private set

@CallSuper
override fun attachView(view: V) {
val previousView = this.view

check(previousView == null) { "Previous view is not detached! previousView = $previousView" }

this.view = view
}

@CallSuper
override fun detachView(view: V) {
val previousView = this.view

check(previousView === view) { "Unexpected view! previousView = $previousView, getView to unbind = $view" }

this.view = null
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.nobird.android.presentation.base

import android.os.Bundle
import androidx.annotation.CallSuper
import androidx.lifecycle.ViewModel
import io.reactivex.disposables.CompositeDisposable

abstract class DisposableViewModel : ViewModel() {
protected val compositeDisposable = CompositeDisposable()

protected open val nestedDisposables: List<DisposableViewModel> = emptyList()

@CallSuper
override fun onCleared() {
nestedDisposables.forEach { it.onCleared() }
compositeDisposable.dispose()
}

@CallSuper
open fun onSaveInstanceState(outState: Bundle) {
nestedDisposables.forEachIndexed { index, nestedPresenter ->
val bundle = Bundle()
nestedPresenter.onSaveInstanceState(bundle)

outState.putBundle("${nestedPresenter::class.java.canonicalName}:$index", bundle)
}
}

@CallSuper
open fun onRestoreInstanceState(savedInstanceState: Bundle) {
nestedDisposables.forEachIndexed { index, nestedPresenter ->
savedInstanceState
.getBundle("${nestedPresenter::class.java.canonicalName}:$index")
?.let(nestedPresenter::onRestoreInstanceState)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,42 +1,25 @@
package ru.nobird.android.presentation.base

import android.os.Bundle
import androidx.annotation.CallSuper
import androidx.lifecycle.ViewModel
import io.reactivex.disposables.CompositeDisposable
import ru.nobird.android.presentation.base.delegate.PresenterDelegate

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

@Volatile
var view: V? = null
private set
override val nestedDisposables: List<DisposableViewModel>
get() = delegates

@CallSuper
open fun attachView(view: V) {
val previousView = this.view

check(previousView == null) { "Previous view is not detached! previousView = $previousView" }

this.view = view
override fun attachView(view: V) {
presenterViewContainer.attachView(view)
delegates.forEach { it.attachView(view) }
}

@CallSuper
open fun detachView(view: V) {
val previousView = this.view

if (previousView === view) {
this.view = null
} else {
throw IllegalStateException("Unexpected view! previousView = $previousView, getView to unbind = $view")
}
override fun detachView(view: V) {
delegates.forEach { it.detachView(view) }
presenterViewContainer.detachView(view)
}

@CallSuper
override fun onCleared() {
compositeDisposable.dispose()
}

open fun onSaveInstanceState(outState: Bundle) {}
open fun onRestoreInstanceState(savedInstanceState: Bundle) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.nobird.android.presentation.base

interface PresenterContract<V> {
fun attachView(view: V)
fun detachView(view: V)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.nobird.android.presentation.base

interface PresenterViewContainer<V> : ViewContainer<V>, PresenterContract<V>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.nobird.android.presentation.base

interface ViewContainer<V> {
val view: V?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.nobird.android.presentation.base.delegate

import ru.nobird.android.presentation.base.DisposableViewModel
import ru.nobird.android.presentation.base.PresenterContract

abstract class PresenterDelegate<V> : PresenterContract<V>, DisposableViewModel() {
override fun attachView(view: V) {}
override fun detachView(view: V) {}
}