diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2ce3da4174de80c0101b9ae48be40897b3bc5ec..2eaceb217f42cac04434af2142acecb0a216ed35 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,6 +30,7 @@ <activity android:name=".MainActivity" android:exported="false"/> + <service android:name=".services.BackgroundService"/> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/LoginActivity.kt b/app/src/main/java/com/pbd/psi/LoginActivity.kt index 9f764f094c78850de0d5de0a4003e729ded950ef..8a7ec1064702320f1b1fdd80ecf59ef77e4c2808 100644 --- a/app/src/main/java/com/pbd/psi/LoginActivity.kt +++ b/app/src/main/java/com/pbd/psi/LoginActivity.kt @@ -1,8 +1,11 @@ package com.pbd.psi +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.SharedPreferences +import android.net.ConnectivityManager +import android.net.NetworkCapabilities import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log @@ -32,12 +35,40 @@ class LoginActivity : AppCompatActivity() { setContentView(binding.root) sharedpreferences = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE) + + if(!isOnline(this)){ + Toast.makeText(this, "No internet connection", Toast.LENGTH_SHORT).show() + return + } + isLogin() binding.btnLogin.setOnClickListener { login() } } + + private fun isOnline(context: Context): Boolean { + val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if (connectivityManager != null) { + val capabilities = + connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR") + return true + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI") + return true + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { + Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET") + return true + } + } + } + return false + } private fun isLogin(){ val token = sharedpreferences.getString(TOKEN, "") if (token != null) { @@ -59,13 +90,13 @@ class LoginActivity : AppCompatActivity() { Toast.makeText(this, "Email and password cannot be empty", Toast.LENGTH_SHORT).show() return } - val loginReq = LoginReq(email, password) + val loginReq = LoginReq("13521099@std.stei.itb.ac.id", "password_13521099") ApiConfig.api.login(loginReq).enqueue(object : Callback<LoginRes> { override fun onResponse(call: Call<LoginRes>, response: Response<LoginRes>) { if (response.isSuccessful) { Toast.makeText(this@LoginActivity, "Login success", Toast.LENGTH_SHORT).show() val token = response.body()?.token - editor.putString("TOKEN", token) + editor.putString(TOKEN, token) editor.apply() val intentRecycle = Intent(this@LoginActivity, MainActivity::class.java) startActivity(intentRecycle) diff --git a/app/src/main/java/com/pbd/psi/MainActivity.kt b/app/src/main/java/com/pbd/psi/MainActivity.kt index 3a0e38021c31c3e07943e0f52aac6d766b07aa81..0b2c63c604b2e7d996bfdbde741a8c8fd1f3346a 100644 --- a/app/src/main/java/com/pbd/psi/MainActivity.kt +++ b/app/src/main/java/com/pbd/psi/MainActivity.kt @@ -3,9 +3,10 @@ package com.pbd.psi import android.content.Context import android.content.Intent import android.content.SharedPreferences -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import com.pbd.psi.databinding.ActivityMainBinding +import com.pbd.psi.services.BackgroundService class MainActivity : AppCompatActivity() { companion object { @@ -16,22 +17,28 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var sharedpreferences: SharedPreferences + override fun onCreate(savedInstanceState: Bundle?) { - sharedpreferences = getSharedPreferences(LoginActivity.SHARED_PREFS, Context.MODE_PRIVATE) super.onCreate(savedInstanceState) - binding= ActivityMainBinding.inflate(layoutInflater) - binding.textEmail.text=sharedpreferences.getString(TOKEN, "default") - binding.textToken.text=sharedpreferences.getString(EMAIL, "default") + binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - binding.btnLogout.setOnClickListener{ - val editor = sharedpreferences.edit() - editor.clear() - editor.apply() + sharedpreferences = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE) + binding.textEmail.text = sharedpreferences.getString(TOKEN, "default") + binding.textToken.text = sharedpreferences.getString(EMAIL, "default") + + val serviceIntent = Intent(this, BackgroundService::class.java) + startService(serviceIntent) + + binding.btnLogout.setOnClickListener { + with(sharedpreferences.edit()) { + clear() + apply() + } val intentLogin = Intent(this@MainActivity, LoginActivity::class.java) startActivity(intentLogin) + stopService(serviceIntent) finish() - } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/pbd/psi/services/BackgroundService.kt b/app/src/main/java/com/pbd/psi/services/BackgroundService.kt new file mode 100644 index 0000000000000000000000000000000000000000..99c9e5a96aa5e019d4288a6665d4b123307e0f87 --- /dev/null +++ b/app/src/main/java/com/pbd/psi/services/BackgroundService.kt @@ -0,0 +1,83 @@ +package com.pbd.psi.services + +import android.app.Service +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import android.os.IBinder +import android.util.Log +import com.pbd.psi.LoginActivity +import com.pbd.psi.MainActivity +import com.pbd.psi.api.ApiConfig +import com.pbd.psi.models.AuthRes +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class BackgroundService : Service() { + + companion object { + const val SHARED_PREFS = "shared_prefs" + const val EMAIL = "email" + const val TOKEN = "token" + } + + private lateinit var sharedpreferences: SharedPreferences + private var isServiceRunning = false + + override fun onBind(intent: Intent?): IBinder? { + Log.d("BackgroundService", "onBind") + return null + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (!isServiceRunning) { + isServiceRunning = true + sharedpreferences = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE) + val token = sharedpreferences.getString(TOKEN, "default").toString() + Log.d("BackgroundService", token) + startBackgroundTask(token) + } + return START_STICKY + } + + private fun startBackgroundTask(token: String) { + Thread { + while (isServiceRunning) { + try { + Thread.sleep(10000) + Log.d("BackgroundService", "Running") + ApiConfig.api.auth("Bearer $token").enqueue(object : Callback<AuthRes> { + override fun onResponse(call: Call<AuthRes>, response: Response<AuthRes>) { + if (response.isSuccessful){ + Log.d("BackgroundService", "onResponse: ${response.body()}") + } else { + val editor = sharedpreferences.edit() + editor.clear() + editor.apply() + val loginIntent = Intent(this@BackgroundService, LoginActivity::class.java) + loginIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(loginIntent) + stopSelf() + } + } + + override fun onFailure(call: Call<AuthRes>, t: Throwable) { + Log.e("BackgroundService", "onFailure: ${t.message}") + } + + }) + Log.d("BackgroundService", "Service running") + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + }.start() + } + + override fun onDestroy() { + super.onDestroy() + isServiceRunning = false + Log.d("BackgroundService", "Service stopped") + } +}