package mx.trackermap.TrackerMap.android.session import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceManager import com.zhuinden.liveevent.observe import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.UserInformationActivityBinding import mx.trackermap.TrackerMap.controllers.SessionController import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.time.ExperimentalTime @DelicateCoroutinesApi @ExperimentalTime class UserInformationActivity : AppCompatActivity() { private var _binding: UserInformationActivityBinding? = null private val binding get() = _binding!! private val userInformationViewModel: UserInformationViewModel by viewModel() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = UserInformationActivityBinding.inflate(layoutInflater) setContentView(binding.root) initialize() } private fun initialize() { setupObservers() setupEvents() userInformationViewModel.fetchUserInfo() // Show version number val pm = applicationContext.packageManager val pkgName = applicationContext.packageName try { val pkgInfo = pm.getPackageInfo(pkgName, 0) binding.appVersion.text = pkgInfo.versionName } catch (e: PackageManager.NameNotFoundException) { e.printStackTrace() } } private fun setupObservers() { userInformationViewModel.loginState.observe(this) { userInformation -> when (userInformation) { SessionController.LoginState.Loading -> setLoading(true) SessionController.LoginState.Failure -> failure() SessionController.LoginState.SignOut -> signOut() else -> {} } } userInformationViewModel.user.observe(this) { user -> setLoading(false) binding.apply { usernameInfo.text = user.name ?: "" emailInfo.text = user.email ?: "" idInfo.text = "${user.id ?: "--"}" adminInfo.text = "${user.administrator}" user.deviceLimit?.let { deviceLimitInfo.text = "${user.deviceLimit ?: "--"}" if (it > 0) { deviceLimitInfo.visibility = View.VISIBLE deviceLimitInfo.visibility = View.VISIBLE } } } } } private fun setupEvents() { binding.closeButton.setOnClickListener { onBackPressed() } binding.signoutButton.setOnClickListener { userInformationViewModel.signOut(PreferenceManager .getDefaultSharedPreferences(this) .getString(LoginFragment.PREFERENCE_TOKEN, null)) } binding.sourceCodeButton.setOnClickListener { openURL(getString(R.string.app_source_code_url)) } binding.websiteButton.setOnClickListener { openURL(getString(R.string.app_website_url)) } } private fun setLoading(isLoading: Boolean) { binding.infoLoading.root.visibility = if (isLoading) View.VISIBLE else View.GONE binding.userInfoCard.visibility = if (isLoading) View.GONE else View.VISIBLE } private fun failure() { setLoading(false) Toast.makeText(this, "Something went wrong...", Toast.LENGTH_LONG).show() } private fun openURL(url: String) { val uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, uri) startActivity(intent) } private fun signOut() { val intent = Intent(applicationContext, LoginActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) finish() } }