Compare commits

..

2 commits

Author SHA1 Message Date
76b4e4d8d8 update 2024-05-18 16:17:57 +02:00
6ca0e3d569 enable intent 2024-05-18 13:51:20 +02:00
5 changed files with 97 additions and 48 deletions

View file

@ -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>

View file

@ -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) {
Toast.makeText(
applicationContext,
if (granted) "yes!!!!!!!!" else "no :(",
Toast.LENGTH_SHORT
).show()
if (!granted) {
Toast.makeText(
applicationContext,
"you must grant bluetooth permission",
Toast.LENGTH_SHORT
).show()
finishAffinity()
} else {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
btEnableActivityResult.launch(enableBtIntent)
}
}
}

View file

@ -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>?) {

View file

@ -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"

View file

@ -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