Skip to content

Commit

Permalink
build: koin 3.2.2 (#56)
Browse files Browse the repository at this point in the history
* build: koin 3.2.2

* build: koin 3.2.2

* build: koin 3.2.2
  • Loading branch information
hoc081098 authored Oct 9, 2022
1 parent a338077 commit 939b9cb
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 98 deletions.
5 changes: 3 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,9 @@ dependencies {
implementation 'com.jakewharton.threetenabp:threetenabp:1.3.1'

// koin
implementation 'org.koin:koin-android:2.2.0-beta-1'
implementation 'org.koin:koin-androidx-scope:2.2.0-beta-1'
final koinVersion= "3.2.2"
implementation "io.insert-koin:koin-core:$koinVersion"
implementation "io.insert-koin:koin-android:$koinVersion"

// view pager indicator
implementation 'com.tbuonomo.andrui:viewpagerdotsindicator:4.1.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import io.reactivex.CompletableObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import org.koin.core.KoinComponent
import org.koin.core.inject
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

class CancelNotificationReceiver : BroadcastReceiver(), KoinComponent {
private val settingPreferences by inject<SettingPreferences>()
Expand Down
30 changes: 15 additions & 15 deletions app/src/main/java/com/hoc/weatherapp/initializer/KoinInitializer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,39 @@ import com.hoc.weatherapp.utils.debug
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.Koin
import org.koin.core.KoinApplication
import org.koin.core.context.KoinContextHandler
import org.koin.core.context.startKoin
import org.koin.core.context.GlobalContext
import org.koin.core.logger.Level

@Suppress("unused")
class KoinInitializer : Initializer<Koin> {
@ExperimentalStdlibApi
override fun create(context: Context): Koin {
debug("KoinInitializer", "Initializer")
return (context.applicationContext as Application).startKoinIfNeeded()
return context.startKoinIfNeeded()
}

override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()
}

@OptIn(ExperimentalStdlibApi::class)
fun Application.startKoinIfNeeded(): Koin {
return KoinContextHandler.getOrNull() ?: startKoin {
fun Context.startKoinIfNeeded(): Koin {
val app = applicationContext as Application

return GlobalContext.getOrNull() ?: GlobalContext.startKoin {
androidLogger(
if (BuildConfig.DEBUG) Level.DEBUG
else Level.NONE
if (BuildConfig.DEBUG) Level.DEBUG
else Level.NONE
)

androidContext(this@startKoinIfNeeded)
androidContext(app)

modules(
listOf(
retrofitModule,
dataSourceModule,
sharePrefUtilModule,
presenterModule
)
listOf(
retrofitModule,
dataSourceModule,
sharePrefUtilModule,
presenterModule
)
)
}.koin
}
26 changes: 0 additions & 26 deletions app/src/main/java/com/hoc/weatherapp/ui/BaseMviActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,39 +16,18 @@ import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
import io.reactivex.rxkotlin.addTo
import io.reactivex.rxkotlin.subscribeBy
import org.koin.android.ext.android.getKoin
import org.koin.android.ext.android.inject
import org.koin.core.qualifier.TypeQualifier
import org.koin.core.scope.Scope
import org.koin.ext.getFullName
import kotlin.LazyThreadSafetyMode.NONE

@ExperimentalStdlibApi
abstract class BaseMviActivity<V : MvpView, P : MviPresenter<V, *>>(
@LayoutRes private val contentLayoutId: Int,
private val noActionBar: Boolean = true,
private val createScope: Boolean = false,
) : MviActivity<V, P>() {

val lifecycleScope: Scope by lazy(NONE) {
check(createScope) { "createScope must be true when accessing lifecycleScope" }

getKoin().createScope(
this::class.getFullName() + "@" + System.identityHashCode(this),
TypeQualifier(this::class),
this
)
}

private val settings by inject<SettingPreferences>()
private val compositeDisposable = CompositeDisposable()

@CallSuper
override fun onCreate(savedInstanceState: Bundle?) {
if (createScope) {
getKoin()._logger.debug("Open activity scope: $lifecycleScope")
}

setTheme(settings.darkThemePreference.value, noActionBar)

super.onCreate(savedInstanceState)
Expand All @@ -61,11 +40,6 @@ abstract class BaseMviActivity<V : MvpView, P : MviPresenter<V, *>>(
override fun onDestroy() {
super.onDestroy()
compositeDisposable.clear()

if (createScope) {
getKoin()._logger.debug("Close activity scope: $lifecycleScope")
lifecycleScope.close()
}
}
}

Expand Down
6 changes: 0 additions & 6 deletions app/src/main/java/com/hoc/weatherapp/ui/BaseMviFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@ package com.hoc.weatherapp.ui

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import com.hannesdorfmann.mosby3.mvi.MviFragment
import com.hannesdorfmann.mosby3.mvi.MviPresenter
import com.hannesdorfmann.mosby3.mvp.MvpView
import io.reactivex.Single
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.coroutines.resume

abstract class BaseMviFragment<V: MvpView, P : MviPresenter<V, *>>(
@LayoutRes private val contentLayoutId: Int
Expand Down
15 changes: 11 additions & 4 deletions app/src/main/java/com/hoc/weatherapp/ui/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,15 @@ import com.hoc081098.viewbindingdelegate.viewBinding
import io.reactivex.Observable
import io.reactivex.schedulers.Schedulers
import io.reactivex.subjects.PublishSubject
import org.koin.android.ext.android.get
import org.koin.android.scope.AndroidScopeComponent
import org.koin.androidx.scope.createActivityRetainedScope
import org.koin.core.scope.Scope

@ExperimentalStdlibApi
class MainActivity : BaseMviActivity<MainContract.View, MainPresenter>(
contentLayoutId = R.layout.activity_main,
createScope = true
), MainContract.View {
contentLayoutId = R.layout.activity_main
), MainContract.View, AndroidScopeComponent {
private val binding by viewBinding<ActivityMainBinding>()

private var mediaPlayer: MediaPlayer? = null
Expand All @@ -62,7 +65,11 @@ class MainActivity : BaseMviActivity<MainContract.View, MainPresenter>(
private var target1: CustomViewTarget<*, *>? = null
private var target2: CustomViewTarget<*, *>? = null

override var scope: Scope? = null

override fun onCreate(savedInstanceState: Bundle?) {
createActivityRetainedScope()

super.onCreate(savedInstanceState)

window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
Expand Down Expand Up @@ -267,7 +274,7 @@ class MainActivity : BaseMviActivity<MainContract.View, MainPresenter>(
enableIndicatorAndViewPager(false)
}

override fun createPresenter() = lifecycleScope.get<MainPresenter>()
override fun createPresenter() = get<MainPresenter>()
}

@WorkerThread
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@ package com.hoc.weatherapp.ui.main.fivedayforecast

import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.hannesdorfmann.mosby3.mvi.MviFragment
import com.hoc.weatherapp.R
import com.hoc.weatherapp.databinding.FragmentDailyWeatherBinding
import com.hoc.weatherapp.ui.BaseMviFragment
import com.hoc.weatherapp.ui.main.MainActivity
import com.hoc.weatherapp.ui.main.fivedayforecast.DailyWeatherContract.RefreshIntent
import com.hoc.weatherapp.utils.debug
import com.hoc.weatherapp.utils.snackBar
Expand All @@ -26,10 +22,12 @@ import io.reactivex.rxkotlin.addTo
import io.reactivex.rxkotlin.cast
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.subjects.PublishSubject
import org.koin.android.ext.android.get

@ExperimentalStdlibApi
class DailyWeatherFragment : BaseMviFragment<DailyWeatherContract.View, DailyWeatherPresenter>(R.layout.fragment_daily_weather),
DailyWeatherContract.View {
class DailyWeatherFragment :
BaseMviFragment<DailyWeatherContract.View, DailyWeatherPresenter>(R.layout.fragment_daily_weather),
DailyWeatherContract.View {
private val binding by viewBinding<FragmentDailyWeatherBinding>()

private var errorSnackBar: Snackbar? = null
Expand All @@ -41,13 +39,13 @@ class DailyWeatherFragment : BaseMviFragment<DailyWeatherContract.View, DailyWea

override fun refreshDailyWeatherIntent(): Observable<RefreshIntent> {
return binding.swipeRefreshLayout.refreshes()
.map { RefreshIntent.UserRefreshIntent }
.cast<RefreshIntent>()
.mergeWith(initialRefreshSubject)
.doOnNext { debug("refreshDailyWeatherIntent", "_daily_weather_") }
.map { RefreshIntent.UserRefreshIntent }
.cast<RefreshIntent>()
.mergeWith(initialRefreshSubject)
.doOnNext { debug("refreshDailyWeatherIntent", "_daily_weather_") }
}

override fun createPresenter() = (requireActivity() as MainActivity).lifecycleScope.get<DailyWeatherPresenter>()
override fun createPresenter() = requireActivity().get<DailyWeatherPresenter>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Expand All @@ -59,13 +57,13 @@ class DailyWeatherFragment : BaseMviFragment<DailyWeatherContract.View, DailyWea
adapter = dailyWeatherAdapter

DividerItemDecoration(context, linearLayoutManager.orientation)
.apply {
ContextCompat.getDrawable(
context,
R.drawable.daily_weather_divider
)?.let(::setDrawable)
}
.let(::addItemDecoration)
.apply {
ContextCompat.getDrawable(
context,
R.drawable.daily_weather_divider
)?.let(::setDrawable)
}
.let(::addItemDecoration)
addItemDecoration(HeaderItemDecoration(dailyWeatherAdapter))
}
}
Expand All @@ -74,17 +72,17 @@ class DailyWeatherFragment : BaseMviFragment<DailyWeatherContract.View, DailyWea
super.onResume()
initialRefreshSubject.onNext(RefreshIntent.InitialRefreshIntent)
dailyWeatherAdapter
.clickObservable
.subscribeBy(onNext = ::showDetail)
.addTo(compositeDisposable)
.clickObservable
.subscribeBy(onNext = ::showDetail)
.addTo(compositeDisposable)
}

private fun showDetail(item: DailyWeatherListItem.Weather) {
val context = requireContext()
context.startActivity(
Intent(context, DailyDetailActivity::class.java).apply {
putExtra(DailyDetailActivity.ITEM_KEY, item)
}
Intent(context, DailyDetailActivity::class.java).apply {
putExtra(DailyDetailActivity.ITEM_KEY, item)
}
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ class HeaderItemDecoration<VB : ViewBinding>(private val listener: StickyHeaderI

val childInContact = getChildInContact(parent, headerView.bottom)

if (childInContact != null && listener.isHeader(parent.getChildAdapterPosition(childInContact))) {
if (childInContact != null
&& parent.getChildAdapterPosition(childInContact)
.let { it != RecyclerView.NO_POSITION && listener.isHeader(it) }
) {
moveHeader(c, headerView, childInContact)
return
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import com.hoc.weatherapp.utils.debug
import com.hoc.weatherapp.utils.showNotificationIfEnabled
import com.hoc.weatherapp.worker.WorkerUtil.cancelUpdateCurrentWeatherWorkRequest
import io.reactivex.Single
import org.koin.core.KoinComponent
import org.koin.core.inject
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.threeten.bp.LocalDateTime

class UpdateCurrentWeatherWorker(
Expand All @@ -28,7 +28,7 @@ class UpdateCurrentWeatherWorker(
private val settingPreferences by inject<SettingPreferences>()

init {
(applicationContext as Application).startKoinIfNeeded()
applicationContext.startKoinIfNeeded()
}

@ExperimentalStdlibApi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,16 @@ import android.content.Context
import androidx.work.RxWorker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import com.hoc.weatherapp.BuildConfig
import com.hoc.weatherapp.data.FiveDayForecastRepository
import com.hoc.weatherapp.data.NoSelectedCityException
import com.hoc.weatherapp.initializer.startKoinIfNeeded
import com.hoc.weatherapp.koin.dataSourceModule
import com.hoc.weatherapp.koin.presenterModule
import com.hoc.weatherapp.koin.retrofitModule
import com.hoc.weatherapp.koin.sharePrefUtilModule
import com.hoc.weatherapp.utils.WEATHER_NOTIFICATION_ID
import com.hoc.weatherapp.utils.cancelNotificationById
import com.hoc.weatherapp.utils.debug
import com.hoc.weatherapp.worker.WorkerUtil.cancelUpdateDailyWeatherWorkRequest
import io.reactivex.Single
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.KoinComponent
import org.koin.core.context.KoinContextHandler
import org.koin.core.context.startKoin
import org.koin.core.get
import org.koin.core.inject
import org.koin.core.logger.Level
import org.koin.dsl.koinApplication
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.threeten.bp.LocalDateTime

class UpdateDailyWeatherWorker(
Expand All @@ -36,7 +24,7 @@ class UpdateDailyWeatherWorker(
private val fiveDayForecastRepository by inject<FiveDayForecastRepository>()

init {
(applicationContext as Application).startKoinIfNeeded()
applicationContext.startKoinIfNeeded()
}

override fun createWork(): Single<Result> {
Expand Down

0 comments on commit 939b9cb

Please sign in to comment.