package com.plugin.bluclas import android.Manifest import android.app.Activity import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothManager import android.bluetooth.BluetoothSocket import app.tauri.annotation.Command import app.tauri.annotation.InvokeArg import app.tauri.annotation.Permission import app.tauri.annotation.TauriPlugin import app.tauri.plugin.Invoke import app.tauri.plugin.JSArray import app.tauri.plugin.JSObject import app.tauri.plugin.Plugin import java.io.OutputStream import java.util.* @InvokeArg class KirimArgs { var alamat: String? = null var data: ByteArray? = null } @TauriPlugin( permissions = [ Permission( strings = [ Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_ADVERTISE ], alias = "bluetooth" ) ] ) class BluclasPlugin(private val activity: Activity) : Plugin(activity) { private val uuidSpp: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") private val adapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter() private var soket: BluetoothSocket? = null private var keluaran: OutputStream? = null @Command override fun checkPermissions(invoke: Invoke) { super.checkPermissions(invoke) } @Command override fun requestPermissions(invoke: Invoke) { super.requestPermissions(invoke) } @Command fun daftarPerangkat(invoke: Invoke) { if (adapter == null) { invoke.reject("Bluetooth tidak didukung") return } val daftarRes = JSArray() adapter.bondedDevices.map { i -> val res = JSObject() res.put("nama", i.name ?: "Unknown") res.put("alamat", i.address) daftarRes.put(res) } val objekDaftarRes = JSObject() objekDaftarRes.put("data", daftarRes) invoke.resolve(objekDaftarRes) } fun menghubungkanKoneksi(alamat: String) { val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat) soket = perangkat.createInsecureRfcommSocketToServiceRecord(uuidSpp) soket!!.connect() keluaran = soket!!.outputStream } fun memutusKoneksi() { keluaran?.close() keluaran = null soket?.close() soket = null } @Command fun kirim(invoke: Invoke) { val args = invoke.parseArgs(KirimArgs::class.java) try { menghubungkanKoneksi(args.alamat ?: "") if (keluaran == null) { throw Exception("Tidak ada perangkat yang terhubung") } keluaran!!.write(args.data) keluaran!!.flush() } catch (e: Exception) { memutusKoneksi() invoke.reject("Mengirim data ke perangkat gagal: ${e.message}") return } memutusKoneksi() invoke.resolve() } }