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, +)