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

Commit 6b58c7b

Browse files
committed
Update firestore interaction
- Replace listeners with coroutines - Split services into by resource, instead of by app
1 parent 688d4e0 commit 6b58c7b

35 files changed

Lines changed: 516 additions & 705 deletions

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,26 @@ import com.marknjunge.core.auth.AuthService
55
import timber.log.Timber
66
import io.fabric.sdk.android.Fabric
77
import com.crashlytics.android.Crashlytics
8-
import com.marknjunge.core.data.firebase.ClientDatabaseService
9-
import com.marknjunge.core.data.firebase.WriteListener
8+
import com.marknjunge.core.data.firebase.UserService
109
import com.marknjunge.core.di.authModule
1110
import com.marknjunge.core.di.databaseModule
1211
import com.marknjunge.core.di.mpesaModule
1312
import com.marknkamau.justjava.di.appModule
13+
import kotlinx.coroutines.CoroutineScope
14+
import kotlinx.coroutines.Dispatchers
15+
import kotlinx.coroutines.Job
16+
import kotlinx.coroutines.launch
1417
import org.koin.android.ext.android.inject
1518
import org.koin.android.ext.koin.androidContext
1619
import org.koin.core.context.startKoin
20+
import java.lang.Exception
1721

1822
class JustJavaApp : Application() {
1923
private val authService: AuthService by inject()
20-
private val databaseService: ClientDatabaseService by inject()
24+
private val userService: UserService by inject()
25+
26+
private val job = Job()
27+
private val scope = CoroutineScope(Dispatchers.IO + job)
2128

2229
override fun onCreate() {
2330
super.onCreate()
@@ -43,16 +50,15 @@ class JustJavaApp : Application() {
4350
if (authService.isSignedIn()) {
4451
val user = authService.getCurrentUser()
4552

46-
databaseService.updateUserFcmToken(user.userId, object : WriteListener {
47-
override fun onError(reason: String) {
48-
Timber.e(reason)
49-
}
50-
51-
override fun onSuccess() {
53+
scope.launch {
54+
try {
55+
userService.updateUserFcmToken(user.userId)
5256
Timber.i("FCM token saved")
57+
} catch (e: Exception) {
58+
Timber.e(e)
5359
}
60+
}
5461

55-
})
5662
}
5763
}
5864

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
55
import com.google.firebase.messaging.FirebaseMessagingService
66
import com.google.firebase.messaging.RemoteMessage
77
import com.marknjunge.core.auth.AuthService
8-
import com.marknjunge.core.data.firebase.ClientDatabaseService
9-
import com.marknjunge.core.data.firebase.WriteListener
10-
import com.marknkamau.justjava.JustJavaApp
8+
import com.marknjunge.core.data.firebase.UserService
119
import com.marknkamau.justjava.utils.NotificationHelper
10+
import kotlinx.coroutines.CoroutineScope
11+
import kotlinx.coroutines.Dispatchers
12+
import kotlinx.coroutines.Job
13+
import kotlinx.coroutines.launch
1214
import org.koin.android.ext.android.inject
1315
import org.koin.core.KoinComponent
1416
import timber.log.Timber
17+
import java.lang.Exception
1518

1619
/**
1720
* Created by Mark Njung'e.
@@ -23,7 +26,9 @@ class MyFirebaseMessagingService : FirebaseMessagingService(), KoinComponent {
2326
private val notificationHelper: NotificationHelper by inject()
2427
private val broadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
2528
private val authService: AuthService by inject()
26-
private val databaseService: ClientDatabaseService by inject()
29+
private val userService: UserService by inject()
30+
31+
private val scope = CoroutineScope(Dispatchers.IO + Job())
2732

2833
companion object {
2934
const val MPESA_ORDER_PAID_ACTION = "mpesa"
@@ -37,7 +42,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService(), KoinComponent {
3742

3843
remoteMessage.data?.let {
3944
Timber.d(it.toString())
40-
when(it["reason"]){
45+
when (it["reason"]) {
4146
"completed-order" -> {
4247
notificationHelper.showCompletedOrderNotification()
4348
}
@@ -48,7 +53,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService(), KoinComponent {
4853
// Send local broadcast so that if the user is on the order's page, the status updates
4954
if (it["status"] == "completed") {
5055
val intent = Intent(MPESA_ORDER_PAID_ACTION)
51-
intent.putExtra(ORDER_ID, it["orderId"])
56+
intent.putExtra(ORDER_ID, it["orderId"])
5257
broadcastManager.sendBroadcast(intent)
5358
}
5459
}
@@ -57,19 +62,17 @@ class MyFirebaseMessagingService : FirebaseMessagingService(), KoinComponent {
5762
}
5863

5964
override fun onNewToken(token: String) {
60-
if (authService.isSignedIn()){
65+
if (authService.isSignedIn()) {
6166
val user = authService.getCurrentUser()
6267

63-
databaseService.updateUserFcmToken(user.userId, object : WriteListener {
64-
override fun onError(reason: String) {
65-
Timber.e(reason)
66-
}
67-
68-
override fun onSuccess() {
68+
scope.launch {
69+
try {
70+
userService.updateUserFcmToken(user.userId)
6971
Timber.i("FCM token saved")
72+
} catch (e: Exception) {
73+
Timber.e(e)
7074
}
71-
72-
})
75+
}
7376
}
7477
}
7578
}

app/src/main/java/com/marknkamau/justjava/di/Modules.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ val appModule = module {
3838
factory { (view: CartView) -> CartPresenter(view, get(), Dispatchers.Main) }
3939
factory { (view: CheckoutView) -> CheckoutPresenter(view, get(), get(), get(), get(), Dispatchers.Main) }
4040
factory { (view: PreviousOrderView) -> PreviousOrderPresenter(view, get(), get(), get(), Dispatchers.Main) }
41-
factory { (view: ProfileView) -> ProfilePresenter(view, get(), get(), get(), Dispatchers.Main) }
41+
factory { (view: ProfileView) -> ProfilePresenter(view, get(), get(), get(), get(), Dispatchers.Main) }
4242
}

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,15 @@ 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
1412
import com.marknkamau.justjava.R
1513
import com.marknjunge.core.model.Order
1614
import com.marknjunge.core.model.UserDetails
17-
import com.marknkamau.justjava.data.local.CartDao
18-
import com.marknkamau.justjava.data.local.PreferencesRepository
1915
import com.marknkamau.justjava.ui.BaseActivity
2016
import com.marknkamau.justjava.ui.login.LogInActivity
2117
import com.marknkamau.justjava.ui.main.MainActivity
2218
import com.marknkamau.justjava.ui.previousOrder.PreviousOrderActivity
2319
import com.marknkamau.justjava.utils.trimmedText
2420
import kotlinx.android.synthetic.main.activity_checkout.*
25-
import kotlinx.coroutines.Dispatchers
2621
import org.koin.android.ext.android.inject
2722
import org.koin.core.parameter.parametersOf
2823
import java.util.*

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

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.marknkamau.justjava.ui.checkout
22

33
import com.marknjunge.core.auth.AuthService
4-
import com.marknjunge.core.data.firebase.ClientDatabaseService
5-
import com.marknjunge.core.data.firebase.WriteListener
4+
import com.marknjunge.core.data.firebase.OrderService
65
import com.marknkamau.justjava.data.local.CartDao
76
import com.marknkamau.justjava.data.local.PreferencesRepository
87
import com.marknjunge.core.model.OrderItem
@@ -15,7 +14,7 @@ import kotlinx.coroutines.launch
1514
internal class CheckoutPresenter(private val view: CheckoutView,
1615
private val auth: AuthService,
1716
private val preferences: PreferencesRepository,
18-
private val database: ClientDatabaseService,
17+
private val orderService: OrderService,
1918
private val cart: CartDao,
2019
mainDispatcher: CoroutineDispatcher
2120
) : BasePresenter(mainDispatcher) {
@@ -52,21 +51,18 @@ internal class CheckoutPresenter(private val view: CheckoutView,
5251
orderItems.add(it.toOrderItem())
5352
}
5453

55-
database.placeNewOrder(order, orderItems, object : WriteListener {
56-
override fun onSuccess() {
57-
uiScope.launch {
58-
cart.deleteAll()
59-
view.hideUploadBar()
60-
view.displayMessage("Order placed")
61-
view.finishActivity(order)
62-
}
63-
}
54+
uiScope.launch {
55+
try {
56+
orderService.placeNewOrder(order, orderItems)
6457

65-
override fun onError(reason: String) {
58+
cart.deleteAll()
59+
view.hideUploadBar()
60+
view.displayMessage("Order placed")
61+
view.finishActivity(order)
62+
} catch (e: Exception) {
6663
view.hideUploadBar()
67-
view.displayMessage(reason)
64+
view.displayMessage(e.message)
6865
}
69-
})
70-
66+
}
7167
}
7268
}

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,10 @@ 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
11-
import com.marknkamau.justjava.JustJavaApp
129
import com.marknkamau.justjava.R
13-
import com.marknkamau.justjava.data.local.PreferencesRepository
1410
import com.marknkamau.justjava.ui.signup.SignUpActivity
1511
import com.marknkamau.justjava.utils.trimmedText
1612
import kotlinx.android.synthetic.main.activity_log_in.*
17-
import kotlinx.coroutines.Dispatchers
1813
import org.koin.android.ext.android.inject
1914
import org.koin.core.parameter.parametersOf
2015

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

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.marknkamau.justjava.ui.login
22

33
import com.marknkamau.justjava.data.local.PreferencesRepository
4-
import com.marknjunge.core.model.UserDetails
54
import com.marknjunge.core.auth.AuthService
6-
import com.marknjunge.core.data.firebase.ClientDatabaseService
7-
import com.marknjunge.core.data.firebase.WriteListener
5+
import com.marknjunge.core.data.firebase.UserService
86
import com.marknkamau.justjava.ui.BasePresenter
97
import kotlinx.coroutines.CoroutineDispatcher
108
import kotlinx.coroutines.launch
@@ -13,7 +11,7 @@ import timber.log.Timber
1311
internal class LogInPresenter(private val view: LogInView,
1412
private val preferences: PreferencesRepository,
1513
private val auth: AuthService,
16-
private val database: ClientDatabaseService,
14+
private val userService: UserService,
1715
mainDispatcher: CoroutineDispatcher
1816
) : BasePresenter(mainDispatcher) {
1917

@@ -38,30 +36,29 @@ internal class LogInPresenter(private val view: LogInView,
3836
}
3937

4038
private fun getUserDefaults(id: String) {
41-
database.getUserDefaults(id, object : ClientDatabaseService.UserDetailsListener {
42-
override fun onSuccess(userDetails: UserDetails) {
39+
uiScope.launch {
40+
try {
41+
val userDetails = userService.getUserDetails(id)
42+
4343
preferences.saveUserDetails(userDetails)
4444
view.dismissDialog()
4545
view.displayMessage("Sign in successful")
4646
view.finishSignIn()
47+
} catch (e: Exception) {
48+
view.displayMessage(e.message)
4749
}
48-
49-
override fun onError(reason: String) {
50-
view.displayMessage(reason)
51-
}
52-
})
50+
}
5351
}
5452

5553
private fun setFcmToken() {
56-
database.updateUserFcmToken(auth.getCurrentUser().userId, object : WriteListener {
57-
override fun onError(reason: String) {
58-
Timber.e(reason)
59-
}
60-
61-
override fun onSuccess() {
54+
uiScope.launch {
55+
try {
56+
userService.updateUserFcmToken(auth.getCurrentUser().userId)
6257
Timber.i("FCM token saved")
58+
} catch (e: Exception) {
59+
Timber.e(e)
6360
}
64-
})
61+
}
6562
}
6663

6764

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,14 @@ import androidx.appcompat.app.AlertDialog
1111
import android.view.View
1212
import android.widget.LinearLayout
1313
import android.widget.Toast
14-
import com.marknjunge.core.auth.AuthService
15-
import com.marknjunge.core.data.firebase.ClientDatabaseService
1614
import com.marknkamau.justjava.R
1715
import com.marknkamau.justjava.data.local.PreferencesRepository
1816
import com.marknjunge.core.model.Order
1917
import com.marknjunge.core.model.OrderItem
20-
import com.marknjunge.core.mpesa.MpesaInteractor
2118
import com.marknkamau.justjava.data.network.MyFirebaseMessagingService
2219
import com.marknkamau.justjava.utils.formatForApp
2320
import kotlinx.android.synthetic.main.activity_previous_order.*
2421
import kotlinx.android.synthetic.main.include_order_details.*
25-
import kotlinx.coroutines.Dispatchers
2622
import org.koin.android.ext.android.inject
2723
import org.koin.core.parameter.parametersOf
2824
import timber.log.Timber

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

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ package com.marknkamau.justjava.ui.previousOrder
22

33
import com.google.firebase.iid.FirebaseInstanceId
44
import com.marknjunge.core.mpesa.MpesaInteractor
5-
import com.marknjunge.core.model.Order
6-
import com.marknjunge.core.model.OrderItem
75
import com.marknjunge.core.auth.AuthService
8-
import com.marknjunge.core.data.firebase.ClientDatabaseService
6+
import com.marknjunge.core.data.firebase.OrderService
97
import com.marknkamau.justjava.ui.BasePresenter
108
import kotlinx.coroutines.*
119
import kotlinx.coroutines.tasks.await
@@ -18,36 +16,36 @@ import timber.log.Timber
1816
*/
1917

2018
class PreviousOrderPresenter(private val view: PreviousOrderView,
21-
private val databaseService: ClientDatabaseService,
19+
private val orderService: OrderService,
2220
private val mpesaInteractor: MpesaInteractor,
2321
private val authService: AuthService,
2422
mainDispatcher: CoroutineDispatcher
2523
) : BasePresenter(mainDispatcher) {
2624

2725
fun getOrderDetails(orderId: String) {
28-
databaseService.getOrder(orderId, object : ClientDatabaseService.OrderListener {
29-
override fun onSuccess(order: Order) {
30-
view.displayOrder(order)
31-
}
26+
uiScope.launch {
27+
try {
28+
val order = orderService.getOrder(orderId)
3229

33-
override fun onError(reason: String) {
34-
Timber.e(reason)
35-
view.displayMessage(reason)
30+
view.displayOrder(order)
31+
} catch (e: Exception) {
32+
Timber.e(e)
33+
view.displayMessage(e.message)
3634
}
37-
})
35+
}
3836
}
3937

4038
fun getOrderItems(orderId: String) {
41-
databaseService.getOrderItems(orderId, object : ClientDatabaseService.OrderItemsListener {
42-
override fun onSuccess(items: List<OrderItem>) {
43-
view.displayOrderItems(items)
44-
}
39+
uiScope.launch {
40+
try {
41+
val orderItems = orderService.getOrderItems(orderId)
42+
view.displayOrderItems(orderItems)
43+
} catch (e: Exception) {
44+
Timber.e(e)
45+
view.displayMessage(e.message)
4546

46-
override fun onError(reason: String) {
47-
Timber.e(reason)
48-
view.displayMessage(reason)
4947
}
50-
})
48+
}
5149
}
5250

5351
fun makeMpesaPayment(total: Int, phoneNumber: String, orderId: String) {

0 commit comments

Comments
 (0)