diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/GraphFragment.kt b/app/src/main/java/com/example/if3210_2024_android_aab/GraphFragment.kt
index 76b6f0e7ae513f193fb4871c87b5aac166e24d1c..4ee8e064cbff09d66db424a64e25363d1f738906 100644
--- a/app/src/main/java/com/example/if3210_2024_android_aab/GraphFragment.kt
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/GraphFragment.kt
@@ -67,13 +67,15 @@ class GraphFragment : Fragment() {
             transactions -> transactions?.let {
 
                 it.forEach{
-                    if (it.getIsPemasukan() == true){
-                        pemasukanCount += it.getNominal()!!.toFloat()
-                    } else {
-                        pengeluaranCount += it.getNominal()!!.toFloat()
-                    }
-                    if (it == transactions[transactions.size-1]){
-                        bindPieChart(pemasukanCount, pengeluaranCount)
+                    if (!it.getEmail()!!.isNullOrBlank() && !SharedPreference.getEmail(requireContext()).isNullOrBlank() && it.getEmail()!! == SharedPreference.getEmail(requireContext())) {
+                        if (it.getIsPemasukan() == true){
+                            pemasukanCount += it.getNominal()!!.toFloat()
+                        } else {
+                            pengeluaranCount += it.getNominal()!!.toFloat()
+                        }
+                        if (it == transactions[transactions.size-1]){
+                            bindPieChart(pemasukanCount, pengeluaranCount)
+                        }
                     }
                 }
             }
diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt b/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt
index 1192c8d4bad6e214be200a04da0ab704a67995d9..d8b80abe1c161c72994ef0ebbd7f654221c5f4dc 100644
--- a/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt
@@ -4,8 +4,10 @@ import android.content.Intent
 import android.content.IntentFilter
 import androidx.appcompat.app.AppCompatActivity
 import android.os.Bundle
+import android.os.Handler
 //import kotlinx.android.synthetic.main.activity_main.*
 import android.widget.LinearLayout
+import android.widget.Toast
 import androidx.activity.viewModels
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
@@ -17,6 +19,13 @@ import androidx.fragment.app.Fragment
 import com.google.android.material.bottomnavigation.BottomNavigationView
 import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.launch
+import com.example.if3210_2024_android_aab.api.ApiConfig
+import com.example.if3210_2024_android_aab.model.ResponseToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import java.sql.Date
+import java.util.Objects
 
 class MainActivity : AppCompatActivity() {
 //    val transactionList = ArrayList<Transaction>()
@@ -34,6 +43,7 @@ class MainActivity : AppCompatActivity() {
     private val scanFragment = ScanFragment()
     private val graphFragment = GraphFragment()
     private val randomizeTransactionReceiver = RandomizeTransactionReceiver(transactionFragment)
+    private var handler: Handler? = null
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         registerReceiver(
@@ -47,6 +57,8 @@ class MainActivity : AppCompatActivity() {
             startActivity(intent)
         }
 
+        startChecking()
+
         connectivityObserver = NetworkConnectivityObserver(applicationContext)
 
         scope.launch {
@@ -120,6 +132,7 @@ class MainActivity : AppCompatActivity() {
     override fun onDestroy() {
         super.onDestroy()
         unregisterReceiver(randomizeTransactionReceiver)
+        stopChecking()
     }
 
     private fun showAlertDialog(title: String, message: String) {
@@ -147,6 +160,48 @@ class MainActivity : AppCompatActivity() {
 ////            }
 //        }
 //    }
+    private val checkToken = object : Runnable {
+        override fun run() {
+            ApiConfig.instanceRetrofit.token("Bearer " + SharedPreference.getToken(this@MainActivity)).enqueue(object:
+                Callback<ResponseToken> {
+                override fun onResponse(call: Call<ResponseToken>, response: Response<ResponseToken>) {
+                    if (response != null) {
+                        if (!response.isSuccessful) {
+                            Toast.makeText(this@MainActivity, response.message(), Toast.LENGTH_SHORT).show()
+                        }
+                        else {
+                            val currentTime = java.util.Date().time / 1000
+                            val expirationTime = response.body()!!.iat / 1000
+                            if (expirationTime < currentTime) {
+                                SharedPreference.clearLoginInfo(this@MainActivity)
+                                val intent = Intent(this@MainActivity, MainActivity::class.java)
+                                this@MainActivity?.finish()
+                                startActivity(intent)
+                            }
+                        }
+                    }
+                }
+
+                override fun onFailure(call: Call<ResponseToken>, t: Throwable) {
+                    Toast.makeText(this@MainActivity, t.localizedMessage, Toast.LENGTH_SHORT).show()
+                }
+            })
+
+            handler?.postDelayed(this, 5 * 60 * 1000)
+        }
+    }
+
+    private fun startChecking() {
+        if (handler == null) {
+            handler = Handler()
+            handler?.post(checkToken)
+        }
+    }
+
+    private fun stopChecking() {
+        handler?.removeCallbacks(checkToken)
+        handler = null
+    }
 
     private fun replaceFragment(fragmentToShow: Fragment) {
         val fragments = supportFragmentManager.fragments
diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/api/ApiService.kt b/app/src/main/java/com/example/if3210_2024_android_aab/api/ApiService.kt
index fb030616d6f5e1753d35e3a90d8ed838ce6e5f0f..ad1e177dffe681a2483cde219ba7528bc71a24d8 100644
--- a/app/src/main/java/com/example/if3210_2024_android_aab/api/ApiService.kt
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/api/ApiService.kt
@@ -2,6 +2,7 @@ package com.example.if3210_2024_android_aab.api
 
 import com.example.if3210_2024_android_aab.model.DataModal
 import com.example.if3210_2024_android_aab.model.ResponseItem
+import com.example.if3210_2024_android_aab.model.ResponseToken
 import com.example.if3210_2024_android_aab.model.ResponseUser
 import okhttp3.MultipartBody
 import retrofit2.Call
@@ -23,4 +24,9 @@ interface ApiService {
         @Header("Authorization") authToken: String,
         @Part file: MultipartBody.Part
     ) : Call<ResponseItem>
+
+    @POST("api/auth/token/")
+    fun token (
+        @Header("Authorization") authToken: String,
+    ) : Call<ResponseToken>
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/model/ResponseToken.kt b/app/src/main/java/com/example/if3210_2024_android_aab/model/ResponseToken.kt
new file mode 100644
index 0000000000000000000000000000000000000000..cbcf4b4017beaf3f99d13ea626d5dfea038e3178
--- /dev/null
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/model/ResponseToken.kt
@@ -0,0 +1,7 @@
+package com.example.if3210_2024_android_aab.model
+
+data class ResponseToken (
+    val nim : String,
+    val iat : Long,
+    val exp : Long,
+)