Updated on 2026-08-14

This commit is contained in:
Tangem 2020-03-17 17:37:33 +03:00
parent 26993f16bb
commit adb12edd24
17 changed files with 485 additions and 34 deletions

View file

@ -51,4 +51,8 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.github.gbIxaHue:eu4d:0.2.3'
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
}

View file

@ -0,0 +1,71 @@
package com.tangem.tangemtest._arch.mvp.dialog
import android.content.Context
import android.os.Bundle
import android.view.View
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.tangem.tangemtest.commons.OnBackPressHandler
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
/**
[REDACTED_AUTHOR]
*/
abstract class BaseMvpBottomSheetDialog(
context: Context
) : BottomSheetDialog(context), MvpDlgView, LayoutHolder {
protected val presenter: MvpDlgPresenter<MvpDlgView>
protected val mainView: View
init {
initComponent()
presenter = getMvpPresenter()
presenter.attached(this)
mainView = layoutInflater.inflate(getLayoutId(), null, false)
setContentView(mainView)
presenter.contentViewSet()
}
abstract fun initComponent()
abstract fun getMvpPresenter(): MvpDlgPresenter<MvpDlgView>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter.created()
}
override fun onStart() {
super.onStart()
presenter.started()
}
override fun show() {
super.show()
presenter.showed()
}
override fun onStop() {
super.onStop()
presenter.stopped()
}
override fun dismiss() {
super.dismiss()
presenter.dismissed()
}
override fun cancel() {
super.cancel()
presenter.cancelled()
presenter.detached()
}
override fun onBackPressed() {
super.onBackPressed()
(presenter as? OnBackPressHandler)?.onBackPressed()
}
protected fun <T : View> bindView(id: Int): T {
return mainView.findViewById(id) as T
}
}

View file

@ -0,0 +1,64 @@
package com.tangem.tangemtest._arch.mvp.dialog
import com.tangem.tangemtest.commons.OnBackPressHandler
import io.reactivex.disposables.CompositeDisposable
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
open class BaseMvpBottomSheetPresenter<View : MvpDlgView> : MvpDlgPresenter<View>, OnBackPressHandler {
protected var view: View? = null
protected val stopDisposable = CompositeDisposable()
protected val dismissDisposable = CompositeDisposable()
protected val cancelDisposable = CompositeDisposable()
override fun attached(view: View) {
Log.d(this, "mvpView attached")
this.view = view
}
override fun contentViewSet() {
Log.d(this, "contentViewSet")
}
override fun created() {
Log.d(this, "created")
}
override fun started() {
Log.d(this, "started")
}
override fun showed() {
Log.d(this, "showed")
}
override fun stopped() {
Log.d(this, "stoped")
stopDisposable.clear()
}
override fun dismissed() {
Log.d(this, "dismissed")
dismissDisposable.clear()
}
override fun cancelled() {
Log.d(this, "cancelled")
cancelDisposable.clear()
}
override fun detached() {
Log.d(this, "detached")
view = null
}
override fun onBackPressed(): Boolean {
Log.d(this, "onBackPressed")
return true
}
}

View file

@ -0,0 +1,18 @@
package com.tangem.tangemtest._arch.mvp.dialog
/**
[REDACTED_AUTHOR]
*/
interface MvpDlgPresenter<T : MvpDlgView> {
fun attached(view: T)
fun contentViewSet()
fun created()
fun started()
fun showed()
fun stopped()
fun dismissed()
fun cancelled()
fun detached()
}

View file

@ -0,0 +1,8 @@
package com.tangem.tangemtest._arch.mvp.dialog
import com.tangem.tangemtest._arch.mvp.view.MvpView
/**
[REDACTED_AUTHOR]
*/
interface MvpDlgView : MvpView

View file

@ -0,0 +1,76 @@
package com.tangem.tangemtest._arch.mvp.presenter
import com.tangem.tangemtest._arch.mvp.view.MvpView
import com.tangem.tangemtest.commons.OnBackPressHandler
import io.reactivex.disposables.CompositeDisposable
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
abstract class BaseMvpPresenter<View : MvpView> : MvpPresenter<View>, OnBackPressHandler, DisposableHolder {
protected var view: View? = null
protected val pauseDisposable = CompositeDisposable()
protected val stopDisposable = CompositeDisposable()
protected val destroyDisposable = CompositeDisposable()
override fun attached(view: View) {
Log.d(this, "attached")
this.view = view
}
override fun created() {
Log.d(this, "created")
}
override fun createView() {
Log.d(this, "createView")
}
override fun viewCreated() {
Log.d(this, "viewCreated")
}
override fun started() {
Log.d(this, "started")
}
override fun resumed() {
Log.d(this, "resumed")
}
override fun paused() {
Log.d(this, "paused")
pauseDisposable.clear()
}
override fun stopped() {
Log.d(this, "stopped")
stopDisposable.clear()
}
override fun destroyView() {
Log.d(this, "destroyView")
destroyDisposable.clear()
}
override fun viewDestroyed() {
Log.d(this, "viewDestroyed")
}
override fun detached() {
Log.d(this, "detached")
this.view = null
}
override fun disposeAll() {
pauseDisposable.clear()
stopDisposable.clear()
destroyDisposable.clear()
}
override fun onBackPressed(): Boolean = true
}

View file

@ -0,0 +1,5 @@
package com.tangem.tangemtest._arch.mvp.presenter
interface DisposableHolder {
fun disposeAll()
}

View file

@ -0,0 +1,19 @@
package com.tangem.tangemtest._arch.mvp.presenter
import com.tangem.tangemtest._arch.mvp.view.MvpView
interface MvpPresenter<T : MvpView> {
fun attached(view: T)
fun created()
fun createView()
fun viewCreated()
fun started()
fun resumed()
fun paused()
fun stopped()
fun destroyView()
fun viewDestroyed()
fun detached()
}

View file

@ -0,0 +1,55 @@
package com.tangem.tangemtest._arch.mvp.view
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.tangem.tangemtest._arch.mvp.presenter.MvpPresenter
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
/**
[REDACTED_AUTHOR]
*/
abstract class BaseMvpActivity : AppCompatActivity(), MvpView, LayoutHolder {
protected var presenter: MvpPresenter<in MvpView>? = null
protected abstract fun initComponent()
protected abstract fun getMvpPresenter(): MvpPresenter<in MvpView>?
override fun onCreate(savedInstanceState: Bundle?) {
initComponent()
presenter = getMvpPresenter()
presenter?.attached(this)
super.onCreate(savedInstanceState)
presenter?.created()
setContentView(getLayoutId())
presenter?.createView()
presenter?.viewCreated()
}
override fun onStart() {
super.onStart()
presenter?.started()
}
override fun onResume() {
super.onResume()
presenter?.resumed()
}
override fun onPause() {
super.onPause()
presenter?.paused()
}
override fun onStop() {
super.onStop()
presenter?.stopped()
}
override fun onDestroy() {
presenter?.destroyView()
super.onDestroy()
presenter?.viewDestroyed()
presenter?.detached()
}
}

View file

@ -0,0 +1,85 @@
package com.tangem.tangemtest._arch.mvp.view
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.tangem.tangemtest._arch.mvp.presenter.MvpPresenter
import com.tangem.tangemtest.commons.OnBackPressHandler
/**
[REDACTED_AUTHOR]
*/
abstract class BaseMvpFragment : Fragment(), MvpView, OnBackPressHandler {
protected lateinit var mainView: View
protected var presenter: MvpPresenter<in MvpView>? = null
protected abstract fun getMvpPresenter(): MvpPresenter<in MvpView>?
override fun onAttach(context: Context) {
super.onAttach(context)
presenter = getMvpPresenter()
presenter?.attached(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter?.created()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
mainView = super.onCreateView(inflater, container, savedInstanceState)!!
presenter?.createView()
return mainView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
presenter?.viewCreated()
}
override fun onStart() {
super.onStart()
presenter?.started()
}
override fun onResume() {
super.onResume()
presenter?.resumed()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> onBackPressed()
}
return super.onOptionsItemSelected(item)
}
override fun onBackPressed()
: Boolean = (presenter as? OnBackPressHandler)?.onBackPressed() ?: false
override fun onPause() {
super.onPause()
presenter?.paused()
}
override fun onStop() {
super.onStop()
presenter?.stopped()
}
override fun onDestroyView() {
presenter?.destroyView()
super.onDestroyView()
presenter?.viewDestroyed()
}
override fun onDetach() {
super.onDetach()
presenter?.detached()
}
}

View file

@ -0,0 +1,7 @@
package com.tangem.tangemtest._arch.mvp.view
/**
[REDACTED_AUTHOR]
*/
interface MvpView

View file

@ -0,0 +1,51 @@
package com.tangem.tangemtest._arch.mvp.view.custom
import android.view.View
import com.tangem.tangemtest._arch.mvp.presenter.MvpPresenter
import com.tangem.tangemtest._arch.mvp.view.MvpView
/**
[REDACTED_AUTHOR]
*/
open class BaseMvpCustomView<in V : MvpView>(
protected val mainView: View,
protected val presenter: MvpPresenter<in V>
) : MvpCustomView {
override fun onViewCreated() {
presenter.created()
presenter.viewCreated()
}
override fun onStart() {
presenter.started()
}
override fun onResume() {
presenter.resumed()
}
override fun onPause() {
presenter.paused()
}
override fun onStop() {
presenter.stopped()
}
override fun onDestroyView() {
presenter.destroyView()
}
override fun onViewDestroyed() {
presenter.viewDestroyed()
}
override fun onDetach() {
presenter.detached()
}
protected fun <T> bindView(id: Int): T {
return mainView.findViewById<View>(id) as T
}
}

View file

@ -0,0 +1,18 @@
package com.tangem.tangemtest._arch.mvp.view.custom
import com.tangem.tangemtest._arch.mvp.view.MvpView
/**
[REDACTED_AUTHOR]
*/
interface MvpCustomView : MvpView {
fun onViewCreated()
fun onStart()
fun onResume()
fun onPause()
fun onStop()
fun onDestroyView()
fun onViewDestroyed()
fun onDetach()
}

View file

@ -16,8 +16,8 @@ import com.tangem.tangemtest.R
import com.tangem.tangemtest.card_use_cases.ui.widgets.ParameterWidget
import com.tangem.tangemtest.card_use_cases.view_models.ParamsViewModel
import com.tangem.tangemtest.commons.Action
import com.tangem.tangemtest.commons.LayoutHolder
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
/**
[REDACTED_AUTHOR]

View file

@ -13,10 +13,10 @@ import com.tangem.tangemtest.card_use_cases.models.params.manager.ParamsManager
import com.tangem.tangemtest.card_use_cases.models.params.manager.ParamsManagerFactory
import com.tangem.tangemtest.commons.Action
import com.tangem.tangemtest.commons.performAction
import com.tangem.tangemtest.commons.postUI
import com.tangem.tasks.ScanEvent
import com.tangem.tasks.TaskError
import com.tangem.tasks.TaskEvent
import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
/**
[REDACTED_AUTHOR]

View file

@ -3,6 +3,6 @@ package com.tangem.tangemtest.commons
/**
[REDACTED_AUTHOR]
*/
interface LayoutHolder {
fun getLayoutId(): Int
interface OnBackPressHandler {
fun onBackPressed(): Boolean
}

View file

@ -1,30 +0,0 @@
package com.tangem.tangemtest.commons
import android.os.Handler
import android.os.HandlerThread
import android.os.Looper
/**
[REDACTED_AUTHOR]
*/
object Threading {
val uiHandler: Handler = Handler(Looper.getMainLooper())
val workHandler: Handler = Handler(HandlerThread("Application worker thread").apply { start() }.looper)
fun postInCurrentThread(msTime: Long, func: () -> Unit) {
Handler().postDelayed({ func() }, msTime)
}
}
fun post(msTime: Long, func: () -> Unit) {
Threading.postInCurrentThread(msTime, func)
}
fun postUI(msTime: Long = 0, func: () -> Unit) {
if (msTime > 0) Threading.uiHandler.postDelayed({ func() }, msTime) else Threading.uiHandler.post(func)
}
fun postWork(msTime: Long = 0, func: () -> Unit) {
if (msTime > 0) Threading.workHandler.postDelayed({ func() }, msTime) else Threading.workHandler.post(func)
}