diff --git a/bondoman/app/src/main/AndroidManifest.xml b/bondoman/app/src/main/AndroidManifest.xml index bd630f2d77d072060ffc45011983c39b3ed81326..c433079e8c33e070cdaf0b6ff2ba95420006b277 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 0000000000000000000000000000000000000000..b1fb409bf8c384469f15982bebef49ddabec4bf8 --- /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 0000000000000000000000000000000000000000..9fbd76db1ca306f74c003442d14dc0776170786d --- /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 0000000000000000000000000000000000000000..52c00ea51f21dd39aa13a0523391390b53c33076 --- /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 0000000000000000000000000000000000000000..c47b9a2cb9cdedafd57291c1ecb1a6e8ccd86a1c --- /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