diff --git a/tangem-demo/build.gradle b/tangem-demo/build.gradle index 18050d7ecf..baed8de1b6 100644 --- a/tangem-demo/build.gradle +++ b/tangem-demo/build.gradle @@ -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' } diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/BaseMvpBottomSheetDialog.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/BaseMvpBottomSheetDialog.kt new file mode 100644 index 0000000000..a25109f2fc --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/BaseMvpBottomSheetDialog.kt @@ -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 + 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 + + 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 bindView(id: Int): T { + return mainView.findViewById(id) as T + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/BaseMvpBottomSheetPresenter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/BaseMvpBottomSheetPresenter.kt new file mode 100644 index 0000000000..7fbd884534 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/BaseMvpBottomSheetPresenter.kt @@ -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 : MvpDlgPresenter, 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 + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/MvpDlgPresenter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/MvpDlgPresenter.kt new file mode 100644 index 0000000000..921f8bc74e --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/MvpDlgPresenter.kt @@ -0,0 +1,18 @@ +package com.tangem.tangemtest._arch.mvp.dialog + +/** +[REDACTED_AUTHOR] + */ +interface MvpDlgPresenter { + + fun attached(view: T) + fun contentViewSet() + + fun created() + fun started() + fun showed() + fun stopped() + fun dismissed() + fun cancelled() + fun detached() +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/MvpDlgView.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/MvpDlgView.kt new file mode 100644 index 0000000000..7f9467f6bd --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/dialog/MvpDlgView.kt @@ -0,0 +1,8 @@ +package com.tangem.tangemtest._arch.mvp.dialog + +import com.tangem.tangemtest._arch.mvp.view.MvpView + +/** +[REDACTED_AUTHOR] + */ +interface MvpDlgView : MvpView \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/BaseMvpPresenter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/BaseMvpPresenter.kt new file mode 100644 index 0000000000..99a5980e8a --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/BaseMvpPresenter.kt @@ -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 : MvpPresenter, 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 +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/DisposableHolder.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/DisposableHolder.kt new file mode 100644 index 0000000000..037fbefd08 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/DisposableHolder.kt @@ -0,0 +1,5 @@ +package com.tangem.tangemtest._arch.mvp.presenter + +interface DisposableHolder { + fun disposeAll() +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/MvpPresenter.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/MvpPresenter.kt new file mode 100644 index 0000000000..79c8b4da7f --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/presenter/MvpPresenter.kt @@ -0,0 +1,19 @@ +package com.tangem.tangemtest._arch.mvp.presenter + +import com.tangem.tangemtest._arch.mvp.view.MvpView + + +interface MvpPresenter { + + fun attached(view: T) + fun created() + fun createView() + fun viewCreated() + fun started() + fun resumed() + fun paused() + fun stopped() + fun destroyView() + fun viewDestroyed() + fun detached() +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/BaseMvpActivity.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/BaseMvpActivity.kt new file mode 100644 index 0000000000..946ff246ef --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/BaseMvpActivity.kt @@ -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? = null + + protected abstract fun initComponent() + protected abstract fun getMvpPresenter(): MvpPresenter? + + 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() + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/BaseMvpFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/BaseMvpFragment.kt new file mode 100644 index 0000000000..10ecdc6d32 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/BaseMvpFragment.kt @@ -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? = null + + protected abstract fun getMvpPresenter(): MvpPresenter? + + 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() + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/MvpView.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/MvpView.kt new file mode 100644 index 0000000000..14bbbdffcf --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/MvpView.kt @@ -0,0 +1,7 @@ +package com.tangem.tangemtest._arch.mvp.view + +/** +[REDACTED_AUTHOR] + */ + +interface MvpView \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/custom/BaseMvpCustomView.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/custom/BaseMvpCustomView.kt new file mode 100644 index 0000000000..58f7ed38ff --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/custom/BaseMvpCustomView.kt @@ -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( + protected val mainView: View, + protected val presenter: MvpPresenter +) : 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 bindView(id: Int): T { + return mainView.findViewById(id) as T + } +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/custom/MvpCustomView.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/custom/MvpCustomView.kt new file mode 100644 index 0000000000..d9862bcb84 --- /dev/null +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/_arch/mvp/view/custom/MvpCustomView.kt @@ -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() +} \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/BaseCardActionFragment.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/BaseCardActionFragment.kt index 34cff55ae5..b90ff4438a 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/BaseCardActionFragment.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/ui/BaseCardActionFragment.kt @@ -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] diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt index 407c9e2056..2c2043c885 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/card_use_cases/view_models/ParamsViewModel.kt @@ -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] diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/abstracts.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/abstracts.kt index b58468b10e..14d7dca27f 100644 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/abstracts.kt +++ b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/abstracts.kt @@ -3,6 +3,6 @@ package com.tangem.tangemtest.commons /** [REDACTED_AUTHOR] */ -interface LayoutHolder { - fun getLayoutId(): Int +interface OnBackPressHandler { + fun onBackPressed(): Boolean } \ No newline at end of file diff --git a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/threading.kt b/tangem-demo/src/main/java/com/tangem/tangemtest/commons/threading.kt deleted file mode 100644 index 0e7a797614..0000000000 --- a/tangem-demo/src/main/java/com/tangem/tangemtest/commons/threading.kt +++ /dev/null @@ -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) -} \ No newline at end of file