Compare commits
2 commits
fe08d434a0
...
76b4e4d8d8
Author | SHA1 | Date | |
---|---|---|---|
76b4e4d8d8 | |||
6ca0e3d569 |
5 changed files with 97 additions and 48 deletions
|
@ -3,20 +3,7 @@
|
|||
<component name="deploymentTargetDropDown">
|
||||
<value>
|
||||
<entry key="app">
|
||||
<State>
|
||||
<runningDeviceTargetSelectedWithDropDown>
|
||||
<Target>
|
||||
<type value="RUNNING_DEVICE_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="SERIAL_NUMBER" />
|
||||
<value value="adb-6lib7t69autkdauc-vxlVsT._adb-tls-connect._tcp" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</runningDeviceTargetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2024-05-17T14:54:32.741207568Z" />
|
||||
</State>
|
||||
<State />
|
||||
</entry>
|
||||
</value>
|
||||
</component>
|
||||
|
|
|
@ -1,18 +1,33 @@
|
|||
package eu.m724.bt
|
||||
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.le.BluetoothLeScanner
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.widget.Toast
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.result.ActivityResult
|
||||
import androidx.activity.result.ActivityResultCallback
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material3.ListItem
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.core.app.ActivityCompat
|
||||
|
@ -22,25 +37,48 @@ import eu.m724.bt.ui.theme.PicoBtAndroidTheme
|
|||
class MainActivity : ComponentActivity() {
|
||||
private val requestPermission =
|
||||
registerForActivityResult(
|
||||
ActivityResultContracts.RequestPermission()
|
||||
ActivityResultContracts.RequestMultiplePermissions()
|
||||
) { granted ->
|
||||
onPermissionGranted(granted)
|
||||
val all = granted.values.all { all -> all }
|
||||
onPermissionGranted(all)
|
||||
}
|
||||
|
||||
private val btEnableActivityResult =
|
||||
registerForActivityResult(
|
||||
ActivityResultContracts.StartActivityForResult(),
|
||||
ActivityResultCallback<ActivityResult> { result ->
|
||||
if (result.resultCode != Activity.RESULT_OK) {
|
||||
Toast.makeText(
|
||||
applicationContext,
|
||||
"you must enable bluetooth",
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
finishAffinity()
|
||||
}
|
||||
bluetoothHelper.start()
|
||||
}
|
||||
)
|
||||
|
||||
private val deviceList = mutableStateListOf("a", "b", "c")
|
||||
|
||||
private fun bluetoothPermission() {
|
||||
if (checkSelfPermission(
|
||||
requestPermission.launch(
|
||||
arrayOf(
|
||||
Manifest.permission.BLUETOOTH_CONNECT,
|
||||
Manifest.permission.BLUETOOTH_SCAN
|
||||
) != PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
requestPermission.launch(Manifest.permission.BLUETOOTH_SCAN)
|
||||
} else onPermissionGranted(true)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private lateinit var bluetoothHelper: BluetoothHelper
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
bluetoothHelper = BluetoothHelper(applicationContext)
|
||||
bluetoothHelper = BluetoothHelper(applicationContext, deviceList)
|
||||
Handler().postDelayed({
|
||||
System.out.println("aded")
|
||||
deviceList.add("f")
|
||||
}, 1000)
|
||||
setContent {
|
||||
PicoBtAndroidTheme {
|
||||
// A surface container using the 'background' color from the theme
|
||||
|
@ -49,6 +87,13 @@ class MainActivity : ComponentActivity() {
|
|||
color = MaterialTheme.colorScheme.background
|
||||
) {
|
||||
Greeting("Android")
|
||||
LazyColumn (
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
items(deviceList) { item ->
|
||||
Text(text = item)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,11 +106,17 @@ class MainActivity : ComponentActivity() {
|
|||
}
|
||||
|
||||
private fun onPermissionGranted(granted: Boolean) {
|
||||
if (!granted) {
|
||||
Toast.makeText(
|
||||
applicationContext,
|
||||
if (granted) "yes!!!!!!!!" else "no :(",
|
||||
"you must grant bluetooth permission",
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
finishAffinity()
|
||||
} else {
|
||||
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
|
||||
btEnableActivityResult.launch(enableBtIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package eu.m724.bt.code
|
||||
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.bluetooth.le.BluetoothLeScanner
|
||||
|
@ -8,54 +9,64 @@ import android.bluetooth.le.ScanCallback
|
|||
import android.bluetooth.le.ScanResult
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||
import androidx.core.app.ActivityCompat
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.logging.Handler
|
||||
|
||||
class BluetoothHelper(
|
||||
val context: Context
|
||||
val context: Context,
|
||||
val deviceList: SnapshotStateList<String>
|
||||
) {
|
||||
private var started: Boolean = false
|
||||
private val bluetoothManager: BluetoothManager =
|
||||
context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
|
||||
private val bluetoothAdapter: BluetoothAdapter =
|
||||
bluetoothManager.adapter
|
||||
private val bluetoothLeScanner: BluetoothLeScanner =
|
||||
bluetoothAdapter.bluetoothLeScanner
|
||||
private lateinit var bluetoothLeScanner: BluetoothLeScanner
|
||||
|
||||
@Throws(SecurityException::class)
|
||||
private fun init() {
|
||||
@SuppressLint("MissingPermission")
|
||||
fun start(): Int {
|
||||
if (started) return 0
|
||||
started = true
|
||||
|
||||
bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner
|
||||
|
||||
if (!bluetoothAdapter.isEnabled)
|
||||
return 2
|
||||
|
||||
bluetoothLeScanner.startScan(scanCallback)
|
||||
System.out.println("scanning now")
|
||||
android.os.Handler().postDelayed(Runnable {
|
||||
bluetoothLeScanner.stopScan(scanCallback)
|
||||
}, 10000)
|
||||
return 0
|
||||
}
|
||||
|
||||
private fun onFailed(errorCode: Int) {
|
||||
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
private fun addDevice(result: ScanResult) {
|
||||
if (ActivityCompat.checkSelfPermission(
|
||||
context,
|
||||
Manifest.permission.BLUETOOTH_CONNECT
|
||||
) != PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
// TODO: Consider calling
|
||||
// ActivityCompat#requestPermissions
|
||||
// here to request the missing permissions, and then overriding
|
||||
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
|
||||
// int[] grantResults)
|
||||
// to handle the case where the user grants the permission. See the documentation
|
||||
// for ActivityCompat#requestPermissions for more details.
|
||||
return
|
||||
println("Found: ${result.device.name} (${result.device.address})")
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
deviceList.add(result.device.name)
|
||||
}
|
||||
println(result.device.name)
|
||||
}
|
||||
|
||||
private val scanCallback: ScanCallback =
|
||||
object : ScanCallback() {
|
||||
override fun onScanResult(callbackType: Int, result: ScanResult) {
|
||||
super.onScanResult(callbackType, result)
|
||||
addDevice(result)
|
||||
}
|
||||
|
||||
override fun onScanFailed(errorCode: Int) {
|
||||
super.onScanFailed(errorCode)
|
||||
println("scam failed :((( $errorCode")
|
||||
}
|
||||
|
||||
override fun onBatchScanResults(results: MutableList<ScanResult>?) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[versions]
|
||||
agp = "8.3.1"
|
||||
agp = "8.4.0"
|
||||
kotlin = "1.9.0"
|
||||
coreKtx = "1.12.0"
|
||||
junit = "4.13.2"
|
||||
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
#Thu May 16 18:07:40 CEST 2024
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
Loading…
Reference in a new issue