diff --git a/androidApp/src/main/java/land/moka/kmm/androidApp/ui/profile/ProfileLayout.kt b/androidApp/src/main/java/land/moka/kmm/androidApp/ui/profile/ProfileLayout.kt index 2bd61e3..d2e802f 100644 --- a/androidApp/src/main/java/land/moka/kmm/androidApp/ui/profile/ProfileLayout.kt +++ b/androidApp/src/main/java/land/moka/kmm/androidApp/ui/profile/ProfileLayout.kt @@ -4,9 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.lifecycle.LifecycleObserver -import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager @@ -25,11 +22,12 @@ import land.moka.kmm.androidApp.ui.profile.adapter.OverviewAdapter import land.moka.kmm.androidApp.ui.profile.adapter.RepositoryAdapter import land.moka.kmm.androidApp.util.load import land.moka.kmm.shared.app.viewmodel.profile.ProfileViewModel +import land.moka.kmm.shared.base.BaseScopedFragment import land.moka.kmm.shared.di.scope.ProfileContainer import land.moka.kmm.shared.model.Repository import moka.land.base.* -class ProfileLayout : Fragment() { +class ProfileLayout : BaseScopedFragment(_Application.container, ProfileContainer) { private val _view by lazy { LayoutProfileBinding.inflate(layoutInflater) } @@ -41,7 +39,6 @@ class ProfileLayout : Fragment() { @InternalCoroutinesApi override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - ProfileContainer.onCreate(_Application.container) initLayout() bindEvent() @@ -53,11 +50,6 @@ class ProfileLayout : Fragment() { return _view.root } - override fun onDestroy() { - ProfileContainer.onDestroy(_Application.container) - super.onDestroy() - } - private fun initLayout() { viewModel.selectTab(ProfileViewModel.Tab.Overview) diff --git a/androidApp/src/main/java/land/moka/kmm/androidApp/ui/repository/RepositoryLayout.kt b/androidApp/src/main/java/land/moka/kmm/androidApp/ui/repository/RepositoryLayout.kt index 276a4ee..f24ab63 100644 --- a/androidApp/src/main/java/land/moka/kmm/androidApp/ui/repository/RepositoryLayout.kt +++ b/androidApp/src/main/java/land/moka/kmm/androidApp/ui/repository/RepositoryLayout.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -12,9 +11,10 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import land.moka.androidApp.databinding.LayoutRepositoryBinding import land.moka.kmm.androidApp._Application +import land.moka.kmm.shared.base.BaseScopedFragment import land.moka.kmm.shared.di.scope.RepositoryContainer -class RepositoryLayout : Fragment() { +class RepositoryLayout : BaseScopedFragment(_Application.container, RepositoryContainer) { private val _view by lazy { LayoutRepositoryBinding.inflate(layoutInflater) } private val viewModel by lazy { _Application.container.getContainer().viewModel } @@ -22,7 +22,6 @@ class RepositoryLayout : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - RepositoryContainer.onCreate(_Application.container) initLayout() bindEvent() @@ -34,11 +33,6 @@ class RepositoryLayout : Fragment() { return _view.root } - override fun onDestroy() { - RepositoryContainer.onDestroy(_Application.container) - super.onDestroy() - } - private fun initLayout() { _view.textViewName.text = " " _view.textViewDescription.text = " " diff --git a/build.gradle.kts b/build.gradle.kts index c695725..e7d4c3f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ buildscript { mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:4.1.0-rc03") + classpath("com.android.tools.build:gradle:4.1.1") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0") classpath("com.codingfeline.buildkonfig:buildkonfig-gradle-plugin:0.7.0") diff --git a/iosApp/iosApp.xcworkspace/xcuserdata/moka.xcuserdatad/UserInterfaceState.xcuserstate b/iosApp/iosApp.xcworkspace/xcuserdata/moka.xcuserdatad/UserInterfaceState.xcuserstate index 2fec5f7..b37e6d3 100644 Binary files a/iosApp/iosApp.xcworkspace/xcuserdata/moka.xcuserdatad/UserInterfaceState.xcuserstate and b/iosApp/iosApp.xcworkspace/xcuserdata/moka.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseFragment.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseFragment.kt new file mode 100644 index 0000000..7085824 --- /dev/null +++ b/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseFragment.kt @@ -0,0 +1,34 @@ +package land.moka.kmm.shared.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import land.moka.kmm.shared.lib.log.Log + +open class BaseFragment : Fragment() { + + private val TAG = javaClass.simpleName + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + Log.print("$TAG onCreateView is called 🐳") + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun onResume() { + super.onResume() + Log.print("$TAG onResume is called 🐳") + } + + override fun onStop() { + super.onStop() + Log.print("$TAG onStop is called 🐳") + } + + override fun onDestroyView() { + super.onDestroyView() + Log.print("$TAG onDestroyView is called 🐳") + } + +} diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseScopedActivity.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseScopedActivity.kt new file mode 100644 index 0000000..7be92fa --- /dev/null +++ b/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseScopedActivity.kt @@ -0,0 +1,20 @@ +package land.moka.kmm.shared.base + +import android.os.Bundle +import androidx.fragment.app.FragmentActivity +import land.moka.kmm.shared.di.AppContainer +import land.moka.kmm.shared.di.scope.index.BaseScope + +open class BaseScopedActivity(var container: AppContainer, var scope: BaseScope) : FragmentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + scope.create(container) + super.onCreate(savedInstanceState) + } + + override fun onDestroy() { + scope.destroy(container) + super.onDestroy() + } + +} diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseScopedFragment.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseScopedFragment.kt new file mode 100644 index 0000000..d79cfb1 --- /dev/null +++ b/shared/src/androidMain/kotlin/land/moka/kmm/shared/base/BaseScopedFragment.kt @@ -0,0 +1,22 @@ +package land.moka.kmm.shared.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import land.moka.kmm.shared.di.AppContainer +import land.moka.kmm.shared.di.scope.index.BaseScope + +open class BaseScopedFragment(var container: AppContainer, var scope: BaseScope) : BaseFragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + scope.create(this.container) + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun onDestroyView() { + scope.destroy(this.container) + super.onDestroyView() + } + +} diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/util/AppContextProvider.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/AppContextProvider.kt similarity index 98% rename from shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/util/AppContextProvider.kt rename to shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/AppContextProvider.kt index 56fe395..1702d09 100644 --- a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/util/AppContextProvider.kt +++ b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/AppContextProvider.kt @@ -1,4 +1,4 @@ -package land.moka.kmm.shared.lib.util +package land.moka.kmm.shared.lib import android.annotation.SuppressLint import android.app.Activity diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/DEBUG.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/Debug.kt similarity index 100% rename from shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/DEBUG.kt rename to shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/Debug.kt diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt index 1753625..47c2473 100644 --- a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt +++ b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt @@ -5,8 +5,8 @@ import android.util.Log actual class Log { actual companion object { - actual fun e(message: String) { - Log.wtf("ERROR", message) + actual fun print(message: String) { + Log.wtf("✏️✏️", message) } } diff --git a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/preferecne/Preference.kt b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/preferecne/Preference.kt index ac4d08a..da596d7 100644 --- a/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/preferecne/Preference.kt +++ b/shared/src/androidMain/kotlin/land/moka/kmm/shared/lib/preferecne/Preference.kt @@ -2,7 +2,7 @@ package land.moka.kmm.shared.lib.preferecne import android.content.Context import android.content.SharedPreferences -import land.moka.kmm.shared.lib.util.application +import land.moka.kmm.shared.lib.application actual class Preference { diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/AppContainer.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/AppContainer.kt index 493f1ff..6d7bc5f 100644 --- a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/AppContainer.kt +++ b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/AppContainer.kt @@ -1,17 +1,18 @@ package land.moka.kmm.shared.di -import land.moka.kmm.shared.di.module.databaseModule +import land.moka.kmm.shared.di.module.appModule import land.moka.kmm.shared.di.module.networkModule import land.moka.kmm.shared.di.module.viewModelModules import land.moka.kmm.shared.di.scope.index.Container import org.kodein.di.DI import org.kodein.di.direct +import org.kodein.di.instance class AppContainer private constructor() { private val di = DI { import(networkModule) - import(databaseModule) + import(appModule) import(viewModelModules) } val directDI = di.direct @@ -22,10 +23,22 @@ class AppContainer private constructor() { // setup container } + /** + * for android build + */ + + inline fun get(): T { + return directDI.instance() + } + inline fun getContainer(): T { // for android build return childContainers[T::class.simpleName] as? T ?: throw Exception("ChildContainer::onCreate(container: Container) must be called 👻") } + /** + * for iOS build + */ + fun getContainer(name: String): T { // for iOS build return childContainers[name] as? T ?: throw Exception("ChildContainer::onCreate(container: Container) must be called 👻") } diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/module/DatabaseModule.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/module/AppModule.kt similarity index 76% rename from shared/src/commonMain/kotlin/land/moka/kmm/shared/di/module/DatabaseModule.kt rename to shared/src/commonMain/kotlin/land/moka/kmm/shared/di/module/AppModule.kt index 684f37a..c27cef2 100644 --- a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/module/DatabaseModule.kt +++ b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/module/AppModule.kt @@ -5,8 +5,8 @@ import org.kodein.di.DI import org.kodein.di.bind import org.kodein.di.singleton -val databaseModule = DI.Module("database") { +val appModule = DI.Module("app") { bind() with singleton { - Preference() + Preference("moka-pref") } } diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/ProfileContainer+Scope.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/ProfileContainer+Scope.kt index 596040c..6aa42c0 100644 --- a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/ProfileContainer+Scope.kt +++ b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/ProfileContainer+Scope.kt @@ -3,20 +3,20 @@ package land.moka.kmm.shared.di.scope import land.moka.kmm.shared.app.viewmodel.profile.ProfileViewModel import land.moka.kmm.shared.di.AppContainer import land.moka.kmm.shared.di.scope.index.Container -import land.moka.kmm.shared.di.scope.index.Scope +import land.moka.kmm.shared.di.scope.index.BaseScope import org.kodein.di.instance class ProfileContainer( var viewModel: ProfileViewModel ) : Container { - companion object : Scope { + companion object : BaseScope { - override fun onCreate(container: AppContainer) { + override fun create(container: AppContainer) { container.childContainers[ProfileContainer::class.simpleName ?: "ProfileContainer"] = ProfileContainer(container.directDI.instance()) } - override fun onDestroy(container: AppContainer) { + override fun destroy(container: AppContainer) { container.childContainers.remove(ProfileContainer::class.simpleName ?: "ProfileContainer") } diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/RepositoryContainer+Scope.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/RepositoryContainer+Scope.kt index 328a213..c9077af 100644 --- a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/RepositoryContainer+Scope.kt +++ b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/RepositoryContainer+Scope.kt @@ -3,20 +3,20 @@ package land.moka.kmm.shared.di.scope import land.moka.kmm.shared.app.viewmodel.repository.RepositoryViewModel import land.moka.kmm.shared.di.AppContainer import land.moka.kmm.shared.di.scope.index.Container -import land.moka.kmm.shared.di.scope.index.Scope +import land.moka.kmm.shared.di.scope.index.BaseScope import org.kodein.di.instance class RepositoryContainer( var viewModel: RepositoryViewModel ) : Container { - companion object : Scope { + companion object : BaseScope { - override fun onCreate(container: AppContainer) { + override fun create(container: AppContainer) { container.childContainers[RepositoryContainer::class.simpleName ?: "RepositoryContainer"] = RepositoryContainer(container.directDI.instance()) } - override fun onDestroy(container: AppContainer) { + override fun destroy(container: AppContainer) { container.childContainers.remove(RepositoryContainer::class.simpleName ?: "RepositoryContainer") } diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/index/BaseScope.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/index/BaseScope.kt new file mode 100644 index 0000000..28ffac9 --- /dev/null +++ b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/index/BaseScope.kt @@ -0,0 +1,11 @@ +package land.moka.kmm.shared.di.scope.index + +import land.moka.kmm.shared.di.AppContainer + +interface BaseScope { + + fun create(container: AppContainer) + + fun destroy(container: AppContainer) + +} diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/index/Scope.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/index/Scope.kt deleted file mode 100644 index 137de1f..0000000 --- a/shared/src/commonMain/kotlin/land/moka/kmm/shared/di/scope/index/Scope.kt +++ /dev/null @@ -1,11 +0,0 @@ -package land.moka.kmm.shared.di.scope.index - -import land.moka.kmm.shared.di.AppContainer - -interface Scope { - - fun onCreate(container: AppContainer) - - fun onDestroy(container: AppContainer) - -} diff --git a/shared/src/commonMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt b/shared/src/commonMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt index a6a299a..8841ee2 100644 --- a/shared/src/commonMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt +++ b/shared/src/commonMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt @@ -3,7 +3,7 @@ package land.moka.kmm.shared.lib.log expect class Log { companion object { - fun e(message: String) + fun print(message: String) } } \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/ApiUtil.kt b/shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/ApiUtil.kt index 92abf57..a558099 100644 --- a/shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/ApiUtil.kt +++ b/shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/ApiUtil.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.single import kotlinx.coroutines.launch +import land.moka.kmm.shared.lib.MainLoopDispatcher import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine diff --git a/shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/MainLoopDispatcher.kt b/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/MainLoopDispatcher.kt similarity index 96% rename from shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/MainLoopDispatcher.kt rename to shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/MainLoopDispatcher.kt index 9da5404..5410e87 100644 --- a/shared/src/iosMain/kotlin/land/moka/kmm/shared/app/network/MainLoopDispatcher.kt +++ b/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/MainLoopDispatcher.kt @@ -1,4 +1,4 @@ -package land.moka.kmm.shared.app.network +package land.moka.kmm.shared.lib import kotlinx.coroutines.* import platform.darwin.* diff --git a/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt b/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt index 681ba5b..f4627b7 100644 --- a/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt +++ b/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/log/Log.kt @@ -3,8 +3,8 @@ package land.moka.kmm.shared.lib.log actual class Log { actual companion object { - actual fun e(message: String) { - print(" ✏️ $message\n") + actual fun print(message: String) { + kotlin.io.print(" ✏️ $message\n") } } diff --git a/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/util/Delay.kt b/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/util/Delay.kt index 3baece2..157a274 100644 --- a/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/util/Delay.kt +++ b/shared/src/iosMain/kotlin/land/moka/kmm/shared/lib/util/Delay.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import land.moka.kmm.shared.app.network.MainLoopDispatcher +import land.moka.kmm.shared.lib.MainLoopDispatcher import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine