Skip to content
This repository was archived by the owner on Dec 16, 2023. It is now read-only.

Commit 9a40bd6

Browse files
committed
Use Koin for dependency injection
1 parent 52d4698 commit 9a40bd6

13 files changed

Lines changed: 112 additions & 58 deletions

File tree

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ dependencies {
6262
implementation deps.crashlytics
6363
debugImplementation deps.leakCanary
6464
releaseImplementation deps.leakCanaryNoOp
65+
implementation deps.koin
6566

6667
// Test libraries
6768
testImplementation deps.junit

app/src/main/java/com/marknkamau/justjava/JustJavaApp.kt

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
77
import com.marknjunge.core.auth.AuthService
88
import com.marknjunge.core.auth.AuthServiceImpl
99
import com.marknkamau.justjava.data.local.CartDatabase
10-
import com.marknkamau.justjava.data.local.PreferencesRepository
11-
import com.marknkamau.justjava.data.local.PreferencesRepositoryImpl
1210
import com.marknkamau.justjava.utils.NotificationHelper
1311
import timber.log.Timber
1412
import io.fabric.sdk.android.Fabric
@@ -18,16 +16,15 @@ import com.marknjunge.core.data.firebase.ClientDatabaseService
1816
import com.marknjunge.core.data.firebase.WriteListener
1917
import com.marknjunge.core.mpesa.MpesaInteractor
2018
import com.marknjunge.core.mpesa.MpesaInteractorImpl
19+
import com.marknkamau.justjava.di.appModule
2120
import com.squareup.leakcanary.LeakCanary
21+
import org.koin.android.ext.android.inject
22+
import org.koin.android.ext.koin.androidContext
23+
import org.koin.core.context.startKoin
2224

2325
class JustJavaApp : Application() {
24-
lateinit var preferencesRepo: PreferencesRepository
25-
lateinit var authService: AuthService
26-
lateinit var databaseService: ClientDatabaseService
27-
lateinit var cartDatabase: CartDatabase
28-
lateinit var notificationHelper: NotificationHelper
29-
lateinit var mpesaInteractor: MpesaInteractor
30-
lateinit var broadcastManager: androidx.localbroadcastmanager.content.LocalBroadcastManager
26+
private val authService: AuthService by inject()
27+
private val databaseService: ClientDatabaseService by inject()
3128

3229
override fun onCreate() {
3330
super.onCreate()
@@ -40,23 +37,17 @@ class JustJavaApp : Application() {
4037
return "Timber ${super.createStackElementTag(element)}.${element.methodName}"
4138
}
4239
})
43-
}else{
40+
} else {
4441
val fabric = Fabric.Builder(this)
4542
.kits(Crashlytics())
4643
.build()
4744
Fabric.with(fabric)
4845
}
4946

50-
preferencesRepo = PreferencesRepositoryImpl(PreferenceManager.getDefaultSharedPreferences(this))
51-
authService = AuthServiceImpl()
52-
databaseService = ClientDatabaseImpl()
53-
mpesaInteractor = MpesaInteractorImpl()
54-
55-
cartDatabase = Room.databaseBuilder(this, CartDatabase::class.java, "cart-db").build()
56-
57-
notificationHelper = NotificationHelper(this)
58-
59-
broadcastManager = androidx.localbroadcastmanager.content.LocalBroadcastManager.getInstance(this)
47+
startKoin {
48+
androidContext(this@JustJavaApp)
49+
modules(appModule)
50+
}
6051

6152
if (authService.isSignedIn()) {
6253
val user = authService.getCurrentUser()

app/src/main/java/com/marknkamau/justjava/data/network/MyFirebaseMessagingService.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package com.marknkamau.justjava.data.network
22

33
import android.content.Intent
4+
import androidx.localbroadcastmanager.content.LocalBroadcastManager
45
import com.google.firebase.messaging.FirebaseMessagingService
56
import com.google.firebase.messaging.RemoteMessage
7+
import com.marknjunge.core.auth.AuthService
8+
import com.marknjunge.core.data.firebase.ClientDatabaseService
69
import com.marknjunge.core.data.firebase.WriteListener
710
import com.marknkamau.justjava.JustJavaApp
11+
import com.marknkamau.justjava.utils.NotificationHelper
12+
import org.koin.android.ext.android.inject
13+
import org.koin.core.KoinComponent
814
import timber.log.Timber
915

1016
/**
@@ -13,11 +19,11 @@ import timber.log.Timber
1319
* https://github.com/MarkNjunge
1420
*/
1521

16-
class MyFirebaseMessagingService : FirebaseMessagingService() {
17-
private val notificationHelper by lazy { (application as JustJavaApp).notificationHelper }
18-
private val broadcastManager by lazy { (application as JustJavaApp).broadcastManager }
19-
private val authService by lazy { (application as JustJavaApp).authService }
20-
private val databaseService by lazy { (application as JustJavaApp).databaseService }
22+
class MyFirebaseMessagingService : FirebaseMessagingService(), KoinComponent {
23+
private val notificationHelper: NotificationHelper by inject()
24+
private val broadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
25+
private val authService: AuthService by inject()
26+
private val databaseService: ClientDatabaseService by inject()
2127

2228
companion object {
2329
const val MPESA_ORDER_PAID_ACTION = "mpesa"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.marknkamau.justjava.di
2+
3+
import android.preference.PreferenceManager
4+
import androidx.room.Room
5+
import com.marknjunge.core.auth.AuthService
6+
import com.marknjunge.core.auth.AuthServiceImpl
7+
import com.marknjunge.core.data.firebase.ClientDatabaseImpl
8+
import com.marknjunge.core.data.firebase.ClientDatabaseService
9+
import com.marknjunge.core.mpesa.MpesaInteractor
10+
import com.marknjunge.core.mpesa.MpesaInteractorImpl
11+
import com.marknkamau.justjava.data.local.CartDatabase
12+
import com.marknkamau.justjava.data.local.PreferencesRepository
13+
import com.marknkamau.justjava.data.local.PreferencesRepositoryImpl
14+
import com.marknkamau.justjava.utils.NotificationHelper
15+
import org.koin.android.ext.koin.androidContext
16+
import org.koin.dsl.module
17+
18+
val appModule = module {
19+
single<PreferencesRepository> { PreferencesRepositoryImpl(PreferenceManager.getDefaultSharedPreferences(androidContext())) }
20+
single<AuthService> { AuthServiceImpl() }
21+
single<ClientDatabaseService> { ClientDatabaseImpl() }
22+
single { Room.databaseBuilder(androidContext(), CartDatabase::class.java, "cart-db").build() }
23+
single { get<CartDatabase>().cartDao() }
24+
single { NotificationHelper(androidContext()) }
25+
single<MpesaInteractor> { MpesaInteractorImpl() }
26+
}

app/src/main/java/com/marknkamau/justjava/ui/BaseActivity.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,21 @@ import androidx.appcompat.app.AppCompatActivity
66
import android.view.Menu
77
import android.view.MenuItem
88
import android.widget.Toast
9+
import com.marknjunge.core.auth.AuthService
910
import com.marknkamau.justjava.JustJavaApp
1011
import com.marknkamau.justjava.R
12+
import com.marknkamau.justjava.data.local.PreferencesRepository
1113
import com.marknkamau.justjava.ui.about.AboutActivity
1214
import com.marknkamau.justjava.ui.cart.CartActivity
1315
import com.marknkamau.justjava.ui.checkout.CheckoutActivity
1416
import com.marknkamau.justjava.ui.login.LogInActivity
1517
import com.marknkamau.justjava.ui.profile.ProfileActivity
18+
import org.koin.android.ext.android.inject
1619

1720
abstract class BaseActivity : AppCompatActivity() {
1821

19-
private val authService by lazy { (application as JustJavaApp).authService }
20-
private val preferencesRepository by lazy { (application as JustJavaApp).preferencesRepo }
22+
private val authService: AuthService by inject()
23+
private val preferencesRepository: PreferencesRepository by inject()
2124

2225
override fun onCreateOptionsMenu(menu: Menu): Boolean {
2326
val inflater = menuInflater

app/src/main/java/com/marknkamau/justjava/ui/cart/CartActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@ import androidx.recyclerview.widget.LinearLayoutManager
1010
import androidx.recyclerview.widget.RecyclerView
1111
import com.marknkamau.justjava.JustJavaApp
1212
import com.marknkamau.justjava.R
13+
import com.marknkamau.justjava.data.local.CartDao
1314
import com.marknkamau.justjava.data.models.CartItem
1415
import com.marknkamau.justjava.ui.BaseActivity
1516
import com.marknkamau.justjava.ui.checkout.CheckoutActivity
1617
import kotlinx.android.synthetic.main.activity_cart.*
18+
import org.koin.android.ext.android.inject
1719

1820
class CartActivity : BaseActivity(), CartView {
1921
private lateinit var presenter: CartPresenter
2022
private lateinit var adapter: CartAdapter
21-
private val cartDao by lazy { (application as JustJavaApp).cartDatabase.cartDao() }
23+
private val cartDao: CartDao by inject()
2224

2325
override fun onCreate(savedInstanceState: Bundle?) {
2426
super.onCreate(savedInstanceState)

app/src/main/java/com/marknkamau/justjava/ui/checkout/CheckoutActivity.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@ import android.text.TextUtils
99
import android.view.View
1010
import android.widget.RadioButton
1111
import android.widget.Toast
12+
import com.marknjunge.core.auth.AuthService
13+
import com.marknjunge.core.data.firebase.ClientDatabaseService
1214
import com.marknkamau.justjava.JustJavaApp
1315
import com.marknkamau.justjava.R
1416
import com.marknjunge.core.model.Order
1517
import com.marknjunge.core.model.UserDetails
18+
import com.marknkamau.justjava.data.local.CartDao
19+
import com.marknkamau.justjava.data.local.PreferencesRepository
1620
import com.marknkamau.justjava.ui.BaseActivity
1721
import com.marknkamau.justjava.ui.login.LogInActivity
1822
import com.marknkamau.justjava.ui.main.MainActivity
1923
import com.marknkamau.justjava.ui.previousOrder.PreviousOrderActivity
2024
import com.marknkamau.justjava.utils.trimmedText
2125
import kotlinx.android.synthetic.main.activity_checkout.*
26+
import org.koin.android.ext.android.inject
2227
import java.util.*
2328

2429
class CheckoutActivity : BaseActivity(), CheckoutView {
@@ -28,19 +33,19 @@ class CheckoutActivity : BaseActivity(), CheckoutView {
2833
private lateinit var comments: String
2934
private lateinit var presenter: CheckoutPresenter
3035

36+
private val preferencesRepository: PreferencesRepository by inject()
37+
private val authService: AuthService by inject()
38+
private val databaseService: ClientDatabaseService by inject()
39+
private val cartDao: CartDao by inject()
40+
3141
private var payCash = true
3242
private val orderId = UUID.randomUUID().toString().replace("-", "").subSequence(0, 10).toString()
3343

3444
override fun onCreate(savedInstanceState: Bundle?) {
3545
super.onCreate(savedInstanceState)
3646
setContentView(R.layout.activity_checkout)
3747

38-
val authService = (application as JustJavaApp).authService
39-
val preferencesRepo = (application as JustJavaApp).preferencesRepo
40-
val database = (application as JustJavaApp).databaseService
41-
val cart = (application as JustJavaApp).cartDatabase.cartDao()
42-
43-
presenter = CheckoutPresenter(this, authService, preferencesRepo, database, cart)
48+
presenter = CheckoutPresenter(this, authService, preferencesRepository, databaseService, cartDao)
4449

4550
rgPayment.setOnCheckedChangeListener { _, checkedId ->
4651
val text = findViewById<RadioButton>(checkedId).text

app/src/main/java/com/marknkamau/justjava/ui/drinkdetails/DrinkDetailsActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import com.marknkamau.justjava.JustJavaApp
77

88
import com.marknkamau.justjava.R
99
import com.marknjunge.core.model.CoffeeDrink
10+
import com.marknkamau.justjava.data.local.CartDao
1011
import com.marknkamau.justjava.data.models.CartItem
1112
import com.marknkamau.justjava.ui.BaseActivity
1213
import com.squareup.picasso.Picasso
1314

1415
import kotlinx.android.synthetic.main.activity_drink_details.*
1516
import kotlinx.android.synthetic.main.content_drink_details.*
17+
import org.koin.android.ext.android.inject
1618

1719
class DrinkDetailsActivity : BaseActivity(), DrinkDetailsView, View.OnClickListener {
1820

@@ -23,13 +25,12 @@ class DrinkDetailsActivity : BaseActivity(), DrinkDetailsView, View.OnClickListe
2325
private lateinit var drink: CoffeeDrink
2426
private var quantity: Int = 0
2527
private lateinit var presenter: DrinkDetailsPresenter
28+
private val cartDao: CartDao by inject()
2629

2730
override fun onCreate(savedInstanceState: Bundle?) {
2831
super.onCreate(savedInstanceState)
2932
setContentView(R.layout.activity_drink_details)
3033

31-
val cartDao = (application as JustJavaApp).cartDatabase.cartDao()
32-
3334
presenter = DrinkDetailsPresenter(this, cartDao)
3435

3536
drink = intent.extras.getParcelable(DRINK_KEY) as CoffeeDrink

app/src/main/java/com/marknkamau/justjava/ui/login/LogInActivity.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,29 @@ import android.text.TextUtils
66
import android.view.View
77
import android.widget.Toast
88
import androidx.appcompat.app.AppCompatActivity
9+
import com.marknjunge.core.auth.AuthService
10+
import com.marknjunge.core.data.firebase.ClientDatabaseService
911
import com.marknkamau.justjava.JustJavaApp
1012
import com.marknkamau.justjava.R
13+
import com.marknkamau.justjava.data.local.PreferencesRepository
1114
import com.marknkamau.justjava.ui.signup.SignUpActivity
1215
import com.marknkamau.justjava.utils.trimmedText
1316
import kotlinx.android.synthetic.main.activity_log_in.*
17+
import org.koin.android.ext.android.inject
1418

1519
class LogInActivity : AppCompatActivity(), LogInView, View.OnClickListener {
1620
private lateinit var email: String
1721
private lateinit var presenter: LogInPresenter
1822

23+
private val preferencesRepository: PreferencesRepository by inject()
24+
private val authService: AuthService by inject()
25+
private val databaseService: ClientDatabaseService by inject()
26+
1927
override fun onCreate(savedInstanceState: Bundle?) {
2028
super.onCreate(savedInstanceState)
2129
setContentView(R.layout.activity_log_in)
2230

23-
val preferencesRepository = (application as JustJavaApp).preferencesRepo
24-
val authService = (application as JustJavaApp).authService
25-
val database = (application as JustJavaApp).databaseService
26-
27-
presenter = LogInPresenter(this, preferencesRepository, authService, database)
31+
presenter = LogInPresenter(this, preferencesRepository, authService, databaseService)
2832
presenter.checkSignInStatus()
2933

3034
btnLogin.setOnClickListener(this)

app/src/main/java/com/marknkamau/justjava/ui/previousOrder/PreviousOrderActivity.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,19 @@ import androidx.recyclerview.widget.LinearLayoutManager
1212
import android.view.View
1313
import android.widget.LinearLayout
1414
import android.widget.Toast
15+
import com.marknjunge.core.auth.AuthService
16+
import com.marknjunge.core.data.firebase.ClientDatabaseService
1517
import com.marknkamau.justjava.JustJavaApp
1618
import com.marknkamau.justjava.R
1719
import com.marknkamau.justjava.data.local.PreferencesRepository
1820
import com.marknjunge.core.model.Order
1921
import com.marknjunge.core.model.OrderItem
22+
import com.marknjunge.core.mpesa.MpesaInteractor
2023
import com.marknkamau.justjava.data.network.MyFirebaseMessagingService
2124
import com.marknkamau.justjava.utils.formatForApp
2225
import kotlinx.android.synthetic.main.activity_previous_order.*
2326
import kotlinx.android.synthetic.main.include_order_details.*
27+
import org.koin.android.ext.android.inject
2428
import timber.log.Timber
2529

2630
class PreviousOrderActivity : AppCompatActivity(), PreviousOrderView {
@@ -37,22 +41,22 @@ class PreviousOrderActivity : AppCompatActivity(), PreviousOrderView {
3741

3842
private lateinit var orderItemsAdapter: OrderItemsAdapter
3943
private lateinit var presenter: PreviousOrderPresenter
40-
private lateinit var broadcastManager: androidx.localbroadcastmanager.content.LocalBroadcastManager
4144
private lateinit var broadcastReceiver: BroadcastReceiver
42-
private lateinit var preferencesRepo: PreferencesRepository
4345
private lateinit var order: Order
4446

47+
private val preferencesRepository: PreferencesRepository by inject()
48+
private val authService: AuthService by inject()
49+
private val databaseService: ClientDatabaseService by inject()
50+
private val mpesaInteractor: MpesaInteractor by inject()
51+
private val broadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
52+
4553
override fun onCreate(savedInstanceState: Bundle?) {
4654
super.onCreate(savedInstanceState)
4755
setContentView(R.layout.activity_previous_order)
4856

49-
broadcastManager = (application as JustJavaApp).broadcastManager
5057
order = intent.getParcelableExtra(ORDER_KEY)
5158

52-
val mpesa = (application as JustJavaApp).mpesaInteractor
53-
preferencesRepo = (application as JustJavaApp).preferencesRepo
54-
val authService = (application as JustJavaApp).authService
55-
presenter = PreviousOrderPresenter(this, (application as JustJavaApp).databaseService, mpesa, authService)
59+
presenter = PreviousOrderPresenter(this, databaseService, mpesaInteractor, authService)
5660

5761
updateViews(order)
5862

@@ -132,7 +136,7 @@ class PreviousOrderActivity : AppCompatActivity(), PreviousOrderView {
132136
}
133137

134138
btnPay.setOnClickListener {
135-
val phoneNumber = preferencesRepo.getUserDetails().phone
139+
val phoneNumber = preferencesRepository.getUserDetails().phone
136140
val dialog = AlertDialog.Builder(this)
137141
.setMessage("Are you sure you want to pay Ksh. 1 using $phoneNumber?\nThe money will be automatically refunded by Safaricom the following day.")
138142
.setTitle("Confirm payment")

0 commit comments

Comments
 (0)