From d22a440a44455df6f9d0a993be5c1a2d7daddddc Mon Sep 17 00:00:00 2001
From: goodgirlwannabe <13521006@mahasiswa.itb.ac.id>
Date: Mon, 18 Mar 2024 19:41:11 +0700
Subject: [PATCH] feat: background service

---
 bondoman/app/src/main/AndroidManifest.xml     |  2 +
 .../bondoman/retrofit/data/DataExpiry.kt      |  9 +++
 .../retrofit/endpoint/EndpointCheckExpiry.kt  | 13 ++++
 .../retrofit/request/CheckExpiryRequest.kt    |  5 ++
 .../bondoman/utils/BackgroundService.kt       | 72 +++++++++++++++++++
 5 files changed, 101 insertions(+)
 create mode 100644 bondoman/app/src/main/java/com/example/bondoman/retrofit/data/DataExpiry.kt
 create mode 100644 bondoman/app/src/main/java/com/example/bondoman/retrofit/endpoint/EndpointCheckExpiry.kt
 create mode 100644 bondoman/app/src/main/java/com/example/bondoman/retrofit/request/CheckExpiryRequest.kt
 create mode 100644 bondoman/app/src/main/java/com/example/bondoman/utils/BackgroundService.kt

diff --git a/bondoman/app/src/main/AndroidManifest.xml b/bondoman/app/src/main/AndroidManifest.xml
index bd630f2..c433079 100644
--- a/bondoman/app/src/main/AndroidManifest.xml
+++ b/bondoman/app/src/main/AndroidManifest.xml
@@ -32,6 +32,8 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <service android:name=".utils.BackgroundService" />
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/bondoman/app/src/main/java/com/example/bondoman/retrofit/data/DataExpiry.kt b/bondoman/app/src/main/java/com/example/bondoman/retrofit/data/DataExpiry.kt
new file mode 100644
index 0000000..b1fb409
--- /dev/null
+++ b/bondoman/app/src/main/java/com/example/bondoman/retrofit/data/DataExpiry.kt
@@ -0,0 +1,9 @@
+package com.example.bondoman.retrofit.data
+
+import com.google.gson.annotations.SerializedName
+
+data class DataExpiry(
+    @SerializedName("nim") val nim: String,
+    @SerializedName("iat") val iat: Long,
+    @SerializedName("exp") val exp:Long
+)
diff --git a/bondoman/app/src/main/java/com/example/bondoman/retrofit/endpoint/EndpointCheckExpiry.kt b/bondoman/app/src/main/java/com/example/bondoman/retrofit/endpoint/EndpointCheckExpiry.kt
new file mode 100644
index 0000000..9fbd76d
--- /dev/null
+++ b/bondoman/app/src/main/java/com/example/bondoman/retrofit/endpoint/EndpointCheckExpiry.kt
@@ -0,0 +1,13 @@
+package com.example.bondoman.retrofit.endpoint
+
+
+import com.example.bondoman.retrofit.data.DataExpiry
+import com.example.bondoman.retrofit.request.CheckExpiryRequest
+import retrofit2.Response
+import retrofit2.http.Header
+import retrofit2.http.POST
+
+interface EndpointCheckExpiry {
+    @POST("api/auth/token")
+    suspend fun getExpiry(@Header("Authorization") token: CheckExpiryRequest): Response<DataExpiry>
+}
\ No newline at end of file
diff --git a/bondoman/app/src/main/java/com/example/bondoman/retrofit/request/CheckExpiryRequest.kt b/bondoman/app/src/main/java/com/example/bondoman/retrofit/request/CheckExpiryRequest.kt
new file mode 100644
index 0000000..52c00ea
--- /dev/null
+++ b/bondoman/app/src/main/java/com/example/bondoman/retrofit/request/CheckExpiryRequest.kt
@@ -0,0 +1,5 @@
+package com.example.bondoman.retrofit.request
+
+data class CheckExpiryRequest(
+    val token : String
+)
diff --git a/bondoman/app/src/main/java/com/example/bondoman/utils/BackgroundService.kt b/bondoman/app/src/main/java/com/example/bondoman/utils/BackgroundService.kt
new file mode 100644
index 0000000..c47b9a2
--- /dev/null
+++ b/bondoman/app/src/main/java/com/example/bondoman/utils/BackgroundService.kt
@@ -0,0 +1,72 @@
+package com.example.bondoman.utils
+
+import android.app.Service
+import android.content.Intent
+import android.os.Handler
+import android.os.IBinder
+import android.widget.Toast
+import com.example.bondoman.LoginPage
+import com.example.bondoman.retrofit.Retrofit
+import com.example.bondoman.retrofit.endpoint.EndpointCheckExpiry
+import com.example.bondoman.retrofit.request.CheckExpiryRequest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import java.time.Instant
+
+class BackgroundService : Service() {
+    private val handler = Handler()
+    private val delayMillis = 30000L
+    private val currentTime = Instant.now().epochSecond
+
+    private val runnable: Runnable = object : Runnable {
+        override fun run() {
+            // Check token expiry logic using Retrofit
+            GlobalScope.launch(Dispatchers.IO) {
+                val token = AuthManager.getToken(this@BackgroundService)
+                val prefixedToken = "Bearer $token"
+                val request = CheckExpiryRequest(prefixedToken)
+                val retro = Retrofit.getInstance().create(EndpointCheckExpiry::class.java)
+                val response = retro.getExpiry(request)
+                if (response.isSuccessful) {
+                    val dataExpiry = response.body()
+                    if (dataExpiry != null) {
+                        // Handle token expiry logic here
+                        val exp = dataExpiry.exp
+                        if (currentTime > exp) {
+                            AuthManager.deleteToken(this@BackgroundService)
+                            val intent = Intent(this@BackgroundService, LoginPage::class.java)
+                            intent.flags =
+                                Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+                            startActivity(intent)
+                            showToast("Token has expired")
+                        }
+                    }
+                } else {
+                    // Handle unsuccessful response (e.g., token expired)
+                    // For demonstration, we'll just show a toast
+                    showToast("Token is expired")
+                }
+            }
+        }
+    }
+
+    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+        // Start the runnable when the service starts
+        handler.post(runnable)
+        return START_STICKY
+    }
+
+    override fun onBind(intent: Intent?): IBinder? {
+        return null
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        // Remove any pending callbacks to prevent memory leaks
+        handler.removeCallbacks(runnable)
+    }
+    private fun showToast(message: String){
+        Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
+    }
+}
\ No newline at end of file
-- 
GitLab