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

Commit 0e698b8

Browse files
committed
Handle rejected session-id
When the API response is "Invalid session-id", the app signs the user out locally. If the current activity requires authentication, MainActivity is started with no back stack.
1 parent 221d06b commit 0e698b8

20 files changed

Lines changed: 101 additions & 54 deletions

File tree

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ dependencies {
6262

6363
// ViewModel
6464
implementation Dependencies.viewModelKtx
65+
// Lifecycle
66+
implementation Dependencies.lifecycleRuntimeKtx
6567

6668
// Room
6769
implementation Dependencies.roomRuntime

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import androidx.appcompat.app.AppCompatActivity
77
import com.marknjunge.core.data.local.PreferencesRepository
88
import com.marknkamau.justjava.R
99
import com.marknkamau.justjava.ui.about.AboutActivity
10+
import com.marknkamau.justjava.ui.base.BaseActivity
1011
import com.marknkamau.justjava.ui.cart.CartActivity
1112
import com.marknkamau.justjava.ui.login.SignInActivity
1213
import com.marknkamau.justjava.ui.profile.ProfileActivity
1314
import org.koin.android.ext.android.inject
1415

15-
abstract class ToolbarActivity : AppCompatActivity() {
16+
abstract class ToolbarActivity : BaseActivity() {
1617

1718
private val preferencesRepository: PreferencesRepository by inject()
1819

app/src/main/java/com/marknkamau/justjava/ui/addAddress/AddAddressActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.google.android.libraries.places.widget.AutocompleteSupportFragment
2323
import com.google.android.libraries.places.widget.listener.PlaceSelectionListener
2424
import com.marknjunge.core.data.model.Address
2525
import com.marknkamau.justjava.R
26+
import com.marknkamau.justjava.ui.base.BaseActivity
2627
import com.marknkamau.justjava.utils.trimmedText
2728
import kotlinx.android.synthetic.main.activity_add_address.*
2829
import kotlinx.coroutines.CoroutineScope
@@ -31,7 +32,7 @@ import kotlinx.coroutines.launch
3132
import kotlinx.coroutines.tasks.await
3233
import timber.log.Timber
3334

34-
class AddAddressActivity : AppCompatActivity(), OnMapReadyCallback {
35+
class AddAddressActivity : BaseActivity(), OnMapReadyCallback {
3536

3637
companion object {
3738
const val ADDRESS_KEY = "address"

app/src/main/java/com/marknkamau/justjava/ui/addressBook/AddressBookActivity.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ import com.marknjunge.core.data.model.Address
1919
import com.marknjunge.core.data.model.Resource
2020
import com.marknkamau.justjava.R
2121
import com.marknkamau.justjava.ui.addAddress.AddAddressActivity
22+
import com.marknkamau.justjava.ui.base.BaseActivity
2223
import com.marknkamau.justjava.utils.BaseRecyclerViewAdapter
2324
import com.marknkamau.justjava.utils.toast
2425
import kotlinx.android.synthetic.main.activity_address_book.*
2526
import kotlinx.android.synthetic.main.item_address.view.*
2627
import org.koin.androidx.viewmodel.ext.android.viewModel
2728

28-
class AddressBookActivity : AppCompatActivity() {
29+
class AddressBookActivity : BaseActivity() {
2930

3031
private val addressBookViewModel: AddressBookViewModel by viewModel()
3132
private val ADD_ADDRESS_REQ = 99
3233
private lateinit var adapter: BaseRecyclerViewAdapter<Address>
34+
override var requiresSignedIn = true
3335

3436
override fun onCreate(savedInstanceState: Bundle?) {
3537
super.onCreate(savedInstanceState)
@@ -58,7 +60,7 @@ class AddressBookActivity : AppCompatActivity() {
5860
addressBookViewModel.addAddress(address).observe(this, Observer { resource ->
5961
when (resource) {
6062
is Resource.Success -> addressBookViewModel.getAddresses()
61-
is Resource.Failure -> toast(resource.response.message)
63+
is Resource.Failure -> handleApiError(resource)
6264
}
6365
})
6466
}
@@ -102,9 +104,7 @@ class AddressBookActivity : AppCompatActivity() {
102104
adapter.setItems(resource.data.address)
103105
}
104106
}
105-
is Resource.Failure -> {
106-
toast(resource.response.message)
107-
}
107+
is Resource.Failure -> handleApiError(resource)
108108
}
109109
})
110110
}
@@ -113,7 +113,7 @@ class AddressBookActivity : AppCompatActivity() {
113113
addressBookViewModel.deleteAddress(address).observe(this, Observer { resource ->
114114
when (resource) {
115115
is Resource.Success -> addressBookViewModel.getAddresses()
116-
is Resource.Failure -> toast(resource.response.message)
116+
is Resource.Failure -> handleApiError(resource)
117117
}
118118
})
119119
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.marknkamau.justjava.ui.base
2+
3+
import android.content.Intent
4+
import androidx.appcompat.app.AppCompatActivity
5+
import androidx.core.app.TaskStackBuilder
6+
import androidx.lifecycle.lifecycleScope
7+
import com.marknjunge.core.data.model.Resource
8+
import com.marknjunge.core.data.repository.AuthRepository
9+
import com.marknkamau.justjava.ui.main.MainActivity
10+
import com.marknkamau.justjava.utils.toast
11+
import kotlinx.coroutines.launch
12+
import org.koin.android.ext.android.inject
13+
14+
abstract class BaseActivity : AppCompatActivity() {
15+
private val authRepository: AuthRepository by inject()
16+
protected open var requiresSignedIn = false
17+
18+
protected fun handleApiError(resource: Resource.Failure<Any>) {
19+
if (resource.response.message == "Invalid session-id") {
20+
lifecycleScope.launch {
21+
authRepository.signOutLocally()
22+
toast("You have been signed out")
23+
if (requiresSignedIn) {
24+
goToMainActivityNoStack()
25+
}
26+
}
27+
} else {
28+
toast(resource.response.message)
29+
}
30+
}
31+
32+
private fun goToMainActivityNoStack() {
33+
val intent = Intent(this, MainActivity::class.java)
34+
TaskStackBuilder.create(this)
35+
.addNextIntentWithParentStack(intent)
36+
.startActivities()
37+
}
38+
39+
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,7 @@ class CartActivity : ToolbarActivity() {
190190
// TODO Handle changed products
191191
}
192192
}
193-
is Resource.Failure -> {
194-
Toast.makeText(this@CartActivity, resource.response.message, Toast.LENGTH_SHORT).show()
195-
}
193+
is Resource.Failure -> handleApiError(resource)
196194
}
197195
})
198196
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.marknjunge.core.data.model.Resource
1616
import com.marknjunge.core.data.model.User
1717
import com.marknkamau.justjava.R
1818
import com.marknkamau.justjava.ui.addAddress.AddAddressActivity
19+
import com.marknkamau.justjava.ui.base.BaseActivity
1920
import com.marknkamau.justjava.ui.login.SignInActivity
2021
import com.marknkamau.justjava.ui.main.MainActivity
2122
import com.marknkamau.justjava.ui.orderDetail.OrderDetailActivity
@@ -25,13 +26,14 @@ import com.marknkamau.justjava.utils.trimmedText
2526
import kotlinx.android.synthetic.main.activity_checkout.*
2627
import org.koin.androidx.viewmodel.ext.android.viewModel
2728

28-
class CheckoutActivity : AppCompatActivity() {
29+
class CheckoutActivity : BaseActivity() {
2930

3031
private val checkoutViewModel: CheckoutViewModel by viewModel()
3132
private lateinit var paymentMethod: PaymentMethod
3233
private var deliveryAddress: Address? = null
3334
private lateinit var user: User
3435
private val ADD_ADDRESS_REQ = 99
36+
override var requiresSignedIn = true
3537

3638
@SuppressLint("DefaultLocale")
3739
override fun onCreate(savedInstanceState: Bundle?) {
@@ -87,7 +89,7 @@ class CheckoutActivity : AppCompatActivity() {
8789

8890
loadAddressList()
8991
}
90-
is Resource.Failure -> toast(resource.response.message)
92+
is Resource.Failure -> handleApiError(resource)
9193
}
9294
})
9395
}
@@ -172,9 +174,7 @@ class CheckoutActivity : AppCompatActivity() {
172174
.addNextIntentWithParentStack(intent)
173175
.startActivities()
174176
}
175-
is Resource.Failure -> {
176-
toast(resource.response.message)
177-
}
177+
is Resource.Failure -> handleApiError(resource)
178178
}
179179
})
180180

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import com.google.android.gms.auth.api.signin.GoogleSignInClient
1414
import com.google.android.gms.common.api.ApiException
1515
import com.marknjunge.core.data.model.Resource
1616
import com.marknkamau.justjava.R
17+
import com.marknkamau.justjava.ui.base.BaseActivity
1718
import com.marknkamau.justjava.ui.signup.SignUpActivity
1819
import com.marknkamau.justjava.utils.*
1920
import kotlinx.android.synthetic.main.activity_sign_in.*
2021
import org.koin.android.ext.android.inject
2122
import org.koin.androidx.viewmodel.ext.android.viewModel
2223
import timber.log.Timber
2324

24-
class SignInActivity : AppCompatActivity() {
25+
class SignInActivity : BaseActivity() {
2526

2627
private val RC_SIGN_IN = 99
2728
private val googleSignInClient: GoogleSignInClient by inject()
@@ -103,7 +104,7 @@ class SignInActivity : AppCompatActivity() {
103104
signInViewModel.requestPasswordReset(email).observe(this, Observer { resource ->
104105
when (resource) {
105106
is Resource.Success -> toast("A password reset email has been sent")
106-
is Resource.Failure -> toast(resource.response.message, Toast.LENGTH_LONG)
107+
is Resource.Failure -> handleApiError(resource)
107108
}
108109
})
109110
}
@@ -112,20 +113,16 @@ class SignInActivity : AppCompatActivity() {
112113
signInViewModel.signIn(etEmail.trimmedText, etPassword.trimmedText).observe(this, Observer { resource ->
113114
when (resource) {
114115
is Resource.Success -> finish()
115-
is Resource.Failure -> toast(resource.response.message)
116+
is Resource.Failure -> handleApiError(resource)
116117
}
117118
})
118119
}
119120

120121
private fun signInWithGoogle(idToken: String) {
121122
signInViewModel.signInWithGoogle(idToken).observe(this, Observer { resource ->
122123
when (resource) {
123-
is Resource.Success -> {
124-
finish()
125-
}
126-
is Resource.Failure -> {
127-
toast(resource.response.message)
128-
}
124+
is Resource.Success -> finish()
125+
is Resource.Failure -> handleApiError(resource)
129126
}
130127
})
131128
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ import androidx.recyclerview.widget.DividerItemDecoration
88
import androidx.recyclerview.widget.LinearLayoutManager
99
import androidx.recyclerview.widget.RecyclerView
1010
import androidx.transition.TransitionManager
11-
import com.marknjunge.core.data.model.Resource
1211
import com.marknjunge.core.data.model.Product
12+
import com.marknjunge.core.data.model.Resource
1313
import com.marknkamau.justjava.R
1414
import com.marknkamau.justjava.ui.ToolbarActivity
1515
import com.marknkamau.justjava.ui.productDetails.ProductDetailsActivity
1616
import com.marknkamau.justjava.utils.BaseRecyclerViewAdapter
1717
import com.marknkamau.justjava.utils.CurrencyFormatter
18-
import com.marknkamau.justjava.utils.toast
1918
import com.squareup.picasso.Picasso
2019
import kotlinx.android.synthetic.main.activity_main.*
2120
import kotlinx.android.synthetic.main.item_product.view.*
@@ -74,7 +73,7 @@ class MainActivity : ToolbarActivity() {
7473
}
7574
is Resource.Failure -> {
7675
layoutFailed.visibility = View.VISIBLE
77-
toast(resource.response.message)
76+
handleApiError(resource)
7877
}
7978
}
8079

app/src/main/java/com/marknkamau/justjava/ui/orderDetail/OrderDetailActivity.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView
1616
import com.marknjunge.core.data.model.*
1717
import com.marknkamau.justjava.R
1818
import com.marknkamau.justjava.data.network.JustJavaFirebaseMessagingService
19+
import com.marknkamau.justjava.ui.base.BaseActivity
1920
import com.marknkamau.justjava.ui.payCard.PayCardActivity
2021
import com.marknkamau.justjava.ui.payMpesa.PayMpesaActivity
2122
import com.marknkamau.justjava.utils.BaseRecyclerViewAdapter
@@ -29,12 +30,13 @@ import kotlinx.android.synthetic.main.item_order_item.view.*
2930
import org.koin.androidx.viewmodel.ext.android.viewModel
3031
import timber.log.Timber
3132

32-
class OrderDetailActivity : AppCompatActivity() {
33+
class OrderDetailActivity : BaseActivity() {
3334

3435
private val orderDetailViewModel: OrderDetailViewModel by viewModel()
3536
private lateinit var order: Order
3637
private val broadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
3738
private lateinit var broadcastReceiver: BroadcastReceiver
39+
override var requiresSignedIn = true
3840

3941
companion object {
4042
const val ORDER_ID_KEY = "order_id"
@@ -116,7 +118,7 @@ class OrderDetailActivity : AppCompatActivity() {
116118
contentOrderDetails.visibility = View.VISIBLE
117119
displayOrderDetails(resource.data)
118120
}
119-
is Resource.Failure -> toast(resource.response.message)
121+
is Resource.Failure -> handleApiError(resource)
120122
}
121123
})
122124
}
@@ -142,9 +144,7 @@ class OrderDetailActivity : AppCompatActivity() {
142144
order = order.copy(paymentMethod = paymentMethod)
143145
displayOrderDetails(order)
144146
}
145-
is Resource.Failure -> {
146-
toast(resource.response.message)
147-
}
147+
is Resource.Failure -> handleApiError(resource)
148148
}
149149
})
150150
}

0 commit comments

Comments
 (0)