package id.pribadi.qrisnotifier import android.app.Activity import android.content.Intent import android.os.Bundle import android.provider.Settings import android.text.InputType import android.widget.Button import android.widget.EditText import android.widget.LinearLayout import android.widget.ScrollView import android.widget.TextView import android.widget.Toast class MainActivity : Activity() { private lateinit var server: EditText private lateinit var key: EditText private lateinit var packages: EditText private lateinit var status: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val p = Sender.prefs(this) val pad = (16 * resources.displayMetrics.density).toInt() val root = LinearLayout(this).apply { orientation = LinearLayout.VERTICAL setPadding(pad, pad, pad, pad) } fun label(t: String) = TextView(this).apply { text = t; setPadding(0, pad / 2, 0, 0) } fun field(value: String, hint: String) = EditText(this).apply { setText(value); this.hint = hint inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS } fun button(t: String, action: () -> Unit) = Button(this).apply { text = t; setOnClickListener { action() } } root.addView(TextView(this).apply { text = "Qris Notifier"; textSize = 22f }) status = TextView(this).apply { setPadding(0, pad / 2, 0, pad / 2) } root.addView(status) root.addView(label("URL server (https, tanpa /api/notify.php)")) server = field(p.getString("server", "").orEmpty(), "https://bayar.domainmu.com") root.addView(server) root.addView(label("Device Key (dari dashboard → Pengaturan)")) key = field(p.getString("device_key", "").orEmpty(), "device key") root.addView(key) root.addView(label("Paket aplikasi yang dipantau (pisahkan koma)")) packages = field(p.getString("packages", Sender.DEFAULT_PACKAGES).orEmpty(), "id.dana,com.gojek.gopaymerchant") root.addView(packages) root.addView(button("Simpan") { p.edit() .putString("server", server.text.toString().trim()) .putString("device_key", key.text.toString().trim()) .putString("packages", packages.text.toString().trim()) .apply() Toast.makeText(this, "Tersimpan", Toast.LENGTH_SHORT).show() Sender.flush(this) refresh() }) root.addView(button("1. Beri akses notifikasi") { startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)) }) root.addView(button("2. Matikan hemat baterai untuk aplikasi ini") { startActivity(Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)) }) root.addView(button("Kirim tes ke server") { Sender.enqueue(this, "test", "Tes koneksi", "Tes dari aplikasi Qris Notifier", System.currentTimeMillis()) Sender.flush(this) Toast.makeText(this, "Tes dikirim, lihat dashboard", Toast.LENGTH_SHORT).show() status.postDelayed({ refresh() }, 2000) }) root.addView(label("Diagnosa: dipakai untuk melihat notifikasi apa saja yang dikirim aplikasi pembayaran")) root.addView(button("Mode diagnosa 10 menit (kirim SEMUA notifikasi)") { Sender.startDiagnostic(this, 10) Toast.makeText(this, "Aktif 10 menit. Lakukan tes bayar, lalu lihat dashboard.", Toast.LENGTH_LONG).show() refresh() }) root.addView(button("Matikan mode diagnosa") { Sender.stopDiagnostic(this) refresh() }) setContentView(ScrollView(this).apply { addView(root) }) } override fun onResume() { super.onResume() Sender.flush(this) refresh() } private fun refresh() { val enabled = Settings.Secure.getString(contentResolver, "enabled_notification_listeners") ?.contains(packageName) == true val p = Sender.prefs(this) status.text = "Akses notifikasi: " + (if (enabled) "AKTIF āœ“" else "BELUM aktif āœ—") + "\nAntrean belum terkirim: ${Sender.queueSize(this)}" + "\nPengiriman terakhir: ${p.getString("last", "-")}" + Sender.diagnosticLeftMs(this).let { ms -> if (ms > 0) "\n⚠ MODE DIAGNOSA AKTIF, sisa ${ms / 60_000 + 1} menit (semua notifikasi dikirim ke servermu)" else "" } } }