package com.vanta.smsgateway import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.widget.* import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private lateinit var etUrl: EditText private lateinit var etKey: EditText private lateinit var btnStart: Button private lateinit var tvStatus: TextView private lateinit var tvSim: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) etUrl = findViewById(R.id.et_url) etKey = findViewById(R.id.et_key) btnStart = findViewById(R.id.btn_start) tvStatus = findViewById(R.id.tv_status) tvSim = findViewById(R.id.tv_sim) val prefs = getSharedPreferences(SmsService.PREF_NAME, Context.MODE_PRIVATE) etUrl.setText(prefs.getString(SmsService.PREF_URL, "")) etKey.setText(prefs.getString(SmsService.PREF_KEY, "")) updateUI() btnStart.setOnClickListener { if (SmsService.isRunning) stopGateway() else requestAndStart() } } override fun onResume() { super.onResume() updateUI() if (hasPhonePerm()) tvSim.text = SubscriptionHelper.describe(this) } private fun updateUI() { if (SmsService.isRunning) { btnStart.text = "Stop Gateway" tvStatus.text = "● Running" tvStatus.setTextColor(getColor(android.R.color.holo_green_light)) } else { btnStart.text = "Start Gateway" tvStatus.text = "● Stopped" tvStatus.setTextColor(getColor(android.R.color.darker_gray)) } } private fun requestAndStart() { val perms = mutableListOf(Manifest.permission.SEND_SMS, Manifest.permission.READ_PHONE_STATE) if (Build.VERSION.SDK_INT >= 33) perms += Manifest.permission.POST_NOTIFICATIONS val denied = perms.filter { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED } if (denied.isEmpty()) startGateway() else ActivityCompat.requestPermissions(this, denied.toTypedArray(), 100) } override fun onRequestPermissionsResult(code: Int, perms: Array, results: IntArray) { super.onRequestPermissionsResult(code, perms, results) if (code == 100) { if (results.any { it != PackageManager.PERMISSION_GRANTED }) Toast.makeText(this, "SMS and Phone permissions required", Toast.LENGTH_LONG).show() else startGateway() } } private fun startGateway() { val url = etUrl.text.toString().trim() val key = etKey.text.toString().trim() if (url.isEmpty() || key.isEmpty()) { Toast.makeText(this, "Enter server URL and API key", Toast.LENGTH_SHORT).show() return } getSharedPreferences(SmsService.PREF_NAME, Context.MODE_PRIVATE).edit() .putString(SmsService.PREF_URL, url) .putString(SmsService.PREF_KEY, key) .apply() val svc = Intent(this, SmsService::class.java) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) startForegroundService(svc) else startService(svc) updateUI() tvSim.text = SubscriptionHelper.describe(this) } private fun stopGateway() { startService(Intent(this, SmsService::class.java).apply { action = SmsService.ACTION_STOP }) updateUI() } private fun hasPhonePerm() = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED }