From 5609190f7239b2a8820521faf83c4ddcf0df0213 Mon Sep 17 00:00:00 2001 From: Nikonell Date: Sat, 24 Jun 2023 17:34:18 +0700 Subject: [PATCH] List devices --- .idea/codeStyles/Project.xml | 123 ++++++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + app/src/main/AndroidManifest.xml | 13 ++ .../main/java/com/listerk/helible/AppState.kt | 5 + .../java/com/listerk/helible/BleDevice.kt | 3 + .../com/listerk/helible/BleDeviceAdapter.kt | 39 ++++++ .../com/listerk/helible/ControlActivity.kt | 67 ++++++++++ .../java/com/listerk/helible/MainActivity.kt | 113 ++++++++-------- app/src/main/res/layout/activity_control.xml | 73 +++++++++++ app/src/main/res/layout/activity_main.xml | 85 ++++-------- app/src/main/res/layout/item_ble_device.xml | 38 ++++++ 11 files changed, 452 insertions(+), 112 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 app/src/main/java/com/listerk/helible/AppState.kt create mode 100644 app/src/main/java/com/listerk/helible/BleDevice.kt create mode 100644 app/src/main/java/com/listerk/helible/BleDeviceAdapter.kt create mode 100644 app/src/main/java/com/listerk/helible/ControlActivity.kt create mode 100644 app/src/main/res/layout/activity_control.xml create mode 100644 app/src/main/res/layout/item_ble_device.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..7643783 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 292aabd..ff66778 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,16 @@ + + + + + + + + + diff --git a/app/src/main/java/com/listerk/helible/AppState.kt b/app/src/main/java/com/listerk/helible/AppState.kt new file mode 100644 index 0000000..02014fe --- /dev/null +++ b/app/src/main/java/com/listerk/helible/AppState.kt @@ -0,0 +1,5 @@ +package com.listerk.helible + +object AppState { + lateinit var bleDevice: BleDevice; +} \ No newline at end of file diff --git a/app/src/main/java/com/listerk/helible/BleDevice.kt b/app/src/main/java/com/listerk/helible/BleDevice.kt new file mode 100644 index 0000000..9183560 --- /dev/null +++ b/app/src/main/java/com/listerk/helible/BleDevice.kt @@ -0,0 +1,3 @@ +package com.listerk.helible + +data class BleDevice(val name: String, val address: String, val rssi: Int) diff --git a/app/src/main/java/com/listerk/helible/BleDeviceAdapter.kt b/app/src/main/java/com/listerk/helible/BleDeviceAdapter.kt new file mode 100644 index 0000000..716f87a --- /dev/null +++ b/app/src/main/java/com/listerk/helible/BleDeviceAdapter.kt @@ -0,0 +1,39 @@ +package com.listerk.helible + +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView + +class BleDeviceAdapter(private val devices: List, private val gotoControlBtn: Button) : + RecyclerView.Adapter() { + private lateinit var itemView: View + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BleDeviceViewHolder { + itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_ble_device, parent, false) + return BleDeviceViewHolder(itemView) + } + + override fun getItemCount(): Int = devices.size + + override fun onBindViewHolder(holder: BleDeviceViewHolder, position: Int) { + holder.nameView.text = devices[position].name + holder.addressView.text = devices[position].address + holder.rssiView.text = devices[position].rssi.toString() + holder.cardView.setOnClickListener { + AppState.bleDevice = devices[position] + gotoControlBtn.isEnabled = true + } + } + + class BleDeviceViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + val cardView = itemView.rootView + val nameView = itemView.findViewById(R.id.deviceName) + val addressView = itemView.findViewById(R.id.deviceAddress) + val rssiView = itemView.findViewById(R.id.deviceRssi) + } +} diff --git a/app/src/main/java/com/listerk/helible/ControlActivity.kt b/app/src/main/java/com/listerk/helible/ControlActivity.kt new file mode 100644 index 0000000..ca3ca75 --- /dev/null +++ b/app/src/main/java/com/listerk/helible/ControlActivity.kt @@ -0,0 +1,67 @@ +package com.listerk.helible + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.widget.SeekBar +import android.widget.TextView + +class ControlActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_control) + + var sliderR1Value = 0 + var sliderR2Value = 0 + var sliderR3Value = 0 + + val sliderR1ValueText = findViewById(R.id.sliderR1Value) + val sliderR2ValueText = findViewById(R.id.sliderR2Value) + val sliderR3ValueText = findViewById(R.id.sliderR3Value) + + val sliderR1 = findViewById(R.id.sliderR1) + val sliderR2 = findViewById(R.id.sliderR2) + val sliderR3 = findViewById(R.id.sliderR3) + + sliderR1.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + sliderR1Value = progress + val val_text = getString(R.string.r_slider_text, 1, progress) + sliderR1ValueText.text = val_text + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + + } + }) + + sliderR2.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + sliderR2Value = progress + val val_text = getString(R.string.r_slider_text, 2, progress) + sliderR2ValueText.text = val_text + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + + } + }) + + sliderR3.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + sliderR3Value = progress + val val_text = getString(R.string.r_slider_text, 3, progress) + sliderR3ValueText.text = val_text + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/listerk/helible/MainActivity.kt b/app/src/main/java/com/listerk/helible/MainActivity.kt index 80942f3..f0cbe50 100644 --- a/app/src/main/java/com/listerk/helible/MainActivity.kt +++ b/app/src/main/java/com/listerk/helible/MainActivity.kt @@ -1,67 +1,74 @@ package com.listerk.helible +import android.Manifest +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothManager +import android.bluetooth.le.BluetoothLeScanner +import android.bluetooth.le.ScanCallback +import android.bluetooth.le.ScanResult +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.widget.SeekBar -import android.widget.TextView +import android.os.Handler +import android.util.Log +import android.widget.Button +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { + private val bluetoothAdapter: BluetoothAdapter by lazy { + val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager + bluetoothManager.adapter + } + private val bleScanner: BluetoothLeScanner by lazy { + bluetoothAdapter.bluetoothLeScanner + } + + private val foundDevices = mutableListOf() + + private val leScanCallback: ScanCallback = object : ScanCallback() { + override fun onScanResult(callbackType: Int, result: ScanResult) { + super.onScanResult(callbackType, result) + val bleDevicesView = findViewById(R.id.bleDevicesView) + if (result.device.name.isNullOrBlank()) { + return + } + val deviceExists = foundDevices.any { it.address == result.device.address } + if (!deviceExists) { + foundDevices.add(BleDevice(result.device.name, result.device.address, result.rssi)) + bleDevicesView.adapter?.notifyItemChanged(foundDevices.size - 1) + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - var sliderR1Value = 0 - var sliderR2Value = 0 - var sliderR3Value = 0 + val gotoControlButton = findViewById