From bd36eb556ebf7328527fb1f3954343e94cb1869f Mon Sep 17 00:00:00 2001 From: Chris Albert <christiangultom5@gmail.com> Date: Fri, 5 Apr 2024 16:50:14 +0700 Subject: [PATCH] feat: check token expired --- .../if3210_2024_android_aab/GraphFragment.kt | 16 +++--- .../if3210_2024_android_aab/MainActivity.kt | 55 +++++++++++++++++++ .../if3210_2024_android_aab/api/ApiService.kt | 6 ++ .../model/ResponseToken.kt | 7 +++ 4 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/example/if3210_2024_android_aab/model/ResponseToken.kt 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 76b6f0e..4ee8e06 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 1192c8d..d8b80ab 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 fb03061..ad1e177 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 0000000..cbcf4b4 --- /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, +) -- GitLab