diff --git a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
index 7821762fddeff95589c0bb5a25398d793cf03fd3..2390d1e8f250bb8e7657402d1234609d202ca627 100644
--- a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
@@ -16,6 +16,7 @@ import android.view.ViewGroup
 import android.widget.ImageButton
 import android.widget.TextView
 import android.widget.Toast
+import androidx.activity.OnBackPressedCallback
 import androidx.appcompat.app.AppCompatActivity
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.view.ViewCompat
@@ -66,6 +67,13 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 	private var isOnBack: Boolean = false
 	private val connectionRequiredFragmentIds: MutableList<Int> = mutableListOf()
 	private var hasMovedFromConnectionLostFragment: Boolean = false
+	private val onBackPressedCallback =
+		object : OnBackPressedCallback(true) {
+			override fun handleOnBackPressed() {
+				isOnBack = true
+				navController.popBackStack()
+			}
+		}
 
 	private val expiryReceiver = ExpiryBroadcastReceiver()
 
@@ -184,10 +192,13 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 		).show()
 	}
 
+	override fun getOnBackPressedCallback(): OnBackPressedCallback {
+		return onBackPressedCallback
+	}
+
 	private fun addConnectionRequiredFragment(fragmentId: Int) {
 		this.connectionRequiredFragmentIds.add(fragmentId)
 	}
-	
 	override fun getEmail(): String {
 		return PreferencesManager.getString(this, "email") ?: ""
 	}
@@ -214,6 +225,8 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 	private fun configureNavigation() {
 		this.addConnectionRequiredFragment(R.id.scanReceiptFragment)
 
+		onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
+
 		val navbar = findViewById<BottomNavigationView>(R.id.navbar)
 		val navHostFragment =
 			supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
@@ -231,11 +244,6 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 
 			destinationListeners.forEach { it.invoke(destination.id) }
 
-			if (destination.id != R.id.connectionLostFragment) {
-				isOnConnectionLostFragment = false
-				hasMovedFromConnectionLostFragment = true
-			}
-
 			// handle back navigation
 			// IMPORTANT: must be checked before isConnectionLost condition
 			if (isOnBack) {
@@ -248,9 +256,15 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 				isOnBack = false
 			}
 
+			// update states
+			if (destination.id != R.id.connectionLostFragment) {
+				isOnConnectionLostFragment = false
+				hasMovedFromConnectionLostFragment = true
+			}
+
 			// remove old ConnectionLostFragment
-			if ((isOnConnectionLostFragment || hasMovedFromConnectionLostFragment)
-				&& destination.id == R.id.connectionLostFragment
+			if ((isOnConnectionLostFragment || hasMovedFromConnectionLostFragment) &&
+				destination.id == R.id.connectionLostFragment
 			) {
 				navController.popBackStack()
 				return@addOnDestinationChangedListener
@@ -348,7 +362,7 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 					if (isConnectionlost) {
 						showToast(
 							"Connection found",
-							Toast.LENGTH_SHORT
+							Toast.LENGTH_SHORT,
 						)
 					}
 
@@ -369,7 +383,7 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 
 						showToast(
 							"Connection lost",
-							Toast.LENGTH_SHORT
+							Toast.LENGTH_SHORT,
 						)
 					}
 				}
@@ -400,7 +414,7 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 		setContentView(binding.root)
 
 		// initialize viewmodel
-		val factory = TransactionViewModelFactory(application as MainApplication, "13521148")
+		val factory = TransactionViewModelFactory(application as MainApplication, getNIM())
 		transactionViewModel = ViewModelProvider(this, factory)[TransactionViewModel::class.java]
 
 		// initialize fragment id tracking
diff --git a/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt b/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt
index aa12d3d66111fd886e1933ecadfcb87ffde29353..71b43952dad5fd8ad5f132d71d13277ad9a7ff3c 100644
--- a/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt
+++ b/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt
@@ -3,6 +3,7 @@ package com.example.bondoman.views.utils.interfaces
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewGroup.LayoutParams
+import androidx.activity.OnBackPressedCallback
 
 interface ParentActivityService {
 	fun appendLayout(view: View)
@@ -53,4 +54,6 @@ interface ParentActivityService {
 	fun getEmail(): String
 
 	fun getNIM(): String
+
+	fun getOnBackPressedCallback(): OnBackPressedCallback
 }