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