Skip to content

Commit

Permalink
Merge pull request #1 from eadm/presentation-1.1
Browse files Browse the repository at this point in the history
presentation/base/1.1.1
  • Loading branch information
eadm authored Jun 13, 2020
2 parents 1c016ee + 82d1368 commit 1b794d4
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 31 deletions.
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) {}
}

0 comments on commit 1b794d4

Please sign in to comment.