package com.parentalmonitor.child.ui.paircode import android.content.Intent import android.os.Build import android.os.Bundle import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.parentalmonitor.child.BuildConfig import com.parentalmonitor.child.ParentalMonitorApp import com.parentalmonitor.child.R import com.parentalmonitor.child.ui.permissions.PermissionsSetupActivity import kotlinx.coroutines.delay import kotlinx.coroutines.launch class PairCodeActivity : AppCompatActivity() { private val apiClient by lazy { (application as ParentalMonitorApp).apiClient } private var isPolling = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (apiClient.isDeviceLinked) { startActivity(Intent(this, PermissionsSetupActivity::class.java)) finish() return } setContentView(R.layout.activity_pair_code) val etPairCode = findViewById(R.id.etPairCode) val btnVerify = findViewById(R.id.btnVerify) val progressBar = findViewById(R.id.progressBar) val tvError = findViewById(R.id.tvError) val tvStatus = findViewById(R.id.tvStatus) btnVerify.setOnClickListener { val code = etPairCode.text.toString().trim() if (code.length != 6 || !code.all { it.isDigit() }) { tvError.text = "Please enter a valid 6-digit pair code." tvError.visibility = View.VISIBLE return@setOnClickListener } tvError.visibility = View.GONE btnVerify.isEnabled = false progressBar.visibility = View.VISIBLE val deviceName = "${Build.MANUFACTURER} ${Build.MODEL}" val deviceModel = Build.MODEL val androidVersion = Build.VERSION.RELEASE val appVersion = BuildConfig.VERSION_NAME lifecycleScope.launch { val result = apiClient.verifyPairCode( code, deviceName, deviceModel, androidVersion, appVersion ) if (result.success && result.data != null) { apiClient.deviceId = result.data.deviceId tvStatus.text = "Waiting for admin approval..." tvStatus.visibility = View.VISIBLE progressBar.visibility = View.VISIBLE // Start polling for approval startApprovalPolling(result.data.deviceId) } else { tvError.text = result.message tvError.visibility = View.VISIBLE btnVerify.isEnabled = true progressBar.visibility = View.GONE } } } } private fun startApprovalPolling(deviceId: Int) { isPolling = true lifecycleScope.launch { while (isPolling) { delay(3000) // Poll every 3 seconds val result = apiClient.checkApproval(deviceId) if (result.success && result.data != null) { when { result.data.isApproved -> { isPolling = false Toast.makeText( this@PairCodeActivity, "Device approved! Setting up permissions...", Toast.LENGTH_LONG ).show() // Go to permissions setup startActivity(Intent(this@PairCodeActivity, PermissionsSetupActivity::class.java)) finish() } result.data.approvalStatus == "denied" -> { isPolling = false apiClient.deviceId = -1 val tvError = findViewById(R.id.tvError) tvError.text = "Device was denied by admin. Please try again." tvError.visibility = View.VISIBLE findViewById(R.id.progressBar).visibility = View.GONE findViewById(R.id.btnVerify).isEnabled = true findViewById(R.id.tvStatus).visibility = View.GONE } } } } } } override fun onDestroy() { super.onDestroy() isPolling = false } }