This commit is contained in:
Guillaume David 2024-06-11 23:11:43 +02:00
parent 7388f2b4bb
commit e7331e7d93
7 changed files with 178 additions and 25 deletions

View File

@ -1,4 +1,22 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permissions Internet et réseau -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Permissions Bluetooth -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- Permissions de localisation -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Fonctionnalités Bluetooth Low Energy -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
<application <application
android:label="gps_map_flowpoint" android:label="gps_map_flowpoint"
android:name="${applicationName}" android:name="${applicationName}"
@ -30,4 +48,5 @@
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
</application> </application>
</manifest> </manifest>

View File

@ -1,5 +1,5 @@
buildscript { buildscript {
ext.kotlin_version = '1.7.10' ext.kotlin_version = '2.0.0'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()

View File

@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_osm_plugin/flutter_osm_plugin.dart';
class DeviceAdvertizinScan extends StatefulWidget {
const DeviceAdvertizinScan(
{super.key,
required this.title,
required this.deviceName,
required this.deviceAddress,
required this.remoteId});
final String title;
final String deviceName;
final String deviceAddress;
final String remoteId;
@override
State<DeviceAdvertizinScan> createState() => _DeviceAdvertizinScanState();
}
class _DeviceAdvertizinScanState extends State<DeviceAdvertizinScan> {
List<ScanResult> scanResults = [];
TextEditingController tecTakingPoint = TextEditingController();
MapController mapController = MapController(
initPosition: GeoPoint(latitude: 47.4358055, longitude: 8.4737324),
);
@override
void initState() {
tecTakingPoint.text = '5';
FlutterBluePlus.startScan();
}
@override
void dispose() {
FlutterBluePlus.stopScan();
print('Page disposed');
super.dispose();
}
String value = 'Aucune valeur trouvée';
@override
Widget build(BuildContext context) {
FlutterBluePlus.onScanResults.listen((results) {
setState(() {
if (results.length > 0) value = results[0].toString();
});
});
return Scaffold(
appBar: AppBar(
title: Text(widget.title, style: const TextStyle(color: Colors.white)),
backgroundColor: Colors.blue,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.white),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'(debug) Vous devez redémarrer l application et réaliser un nouveau scan pour voir les nouvelles valeurs (FlutterBluePlus.startScan())'),
),
);
return;
},
),
),
body: Column(
children: [
Container(
alignment: Alignment.topCenter,
child: Text('Advertizin data value for ${widget.deviceName}' +
' with remoteId ${widget.remoteId}')),
Container(
alignment: Alignment.center,
child: Text(value,
style: const TextStyle(
color: Colors.black,
fontSize: 20,
fontWeight: FontWeight.bold))),
Container(child: CircularProgressIndicator()),
Spacer(),
Container(
child: Text(
'La trame publicitaire est en cours de réception et actualisée en temps réel.')),
],
),
);
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:gps_map_flowpoint/deviceAdvertizinScan.dart';
import 'package:gps_map_flowpoint/deviceFlowMap.dart'; import 'package:gps_map_flowpoint/deviceFlowMap.dart';
class DeviceSelection extends StatefulWidget { class DeviceSelection extends StatefulWidget {
@ -58,7 +59,7 @@ class _DeviceSelectionState extends State<DeviceSelection> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
// Filtered list of devices // Filtered list of devices
List<ScanResult> filteredDevices = scanResults List<ScanResult> filteredDevices = scanResults
.where((result) => result.device.name .where((result) => result.device.platformName
.toLowerCase() .toLowerCase()
.contains(tecSearch.text.toLowerCase())) .contains(tecSearch.text.toLowerCase()))
.toList(); .toList();
@ -76,7 +77,7 @@ class _DeviceSelectionState extends State<DeviceSelection> {
child: TextFormField( child: TextFormField(
controller: tecSearch, controller: tecSearch,
decoration: InputDecoration( decoration: InputDecoration(
hintText: 'Rechercher un appareil', hintText: 'Rechercher un appareil par nom',
prefixIcon: Icon(Icons.search), prefixIcon: Icon(Icons.search),
), ),
onChanged: (value) { onChanged: (value) {
@ -91,8 +92,31 @@ class _DeviceSelectionState extends State<DeviceSelection> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
ScanResult result = filteredDevices[index]; ScanResult result = filteredDevices[index];
return ListTile( return ListTile(
title: Text(result.device.name), trailing: Row(
subtitle: Text(result.device.id.id), mainAxisSize: MainAxisSize.min,
children: [
GestureDetector(
onTap: () {
//Stop scanning when a device is selected
FlutterBluePlus.stopScan();
setState(() {
isScanning = false;
});
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DeviceAdvertizinScan(
title: 'Advertising Frame View',
deviceName: result.device.platformName,
deviceAddress: result.device.remoteId.str,
remoteId: result.device.remoteId.str,
),
),
);
},
child: Icon(Icons.info_outline),
),
GestureDetector(
onTap: () { onTap: () {
//Stop scanning when a device is selected //Stop scanning when a device is selected
FlutterBluePlus.stopScan(); FlutterBluePlus.stopScan();
@ -105,12 +129,18 @@ class _DeviceSelectionState extends State<DeviceSelection> {
MaterialPageRoute( MaterialPageRoute(
builder: (context) => DeviceFlowMap( builder: (context) => DeviceFlowMap(
title: 'GPS Map Flowpoint', title: 'GPS Map Flowpoint',
deviceName: result.device.name, deviceName: result.device.platformName,
deviceAddress: result.device.id.id, deviceAddress: result.device.remoteId.str,
), ),
), ),
); );
}, },
child: Icon(Icons.map_outlined),
),
],
),
title: Text(result.device.platformName),
subtitle: Text(result.device.remoteId.str),
); );
}, },
), ),
@ -121,6 +151,7 @@ class _DeviceSelectionState extends State<DeviceSelection> {
backgroundColor: Colors.blue, backgroundColor: Colors.blue,
onPressed: () { onPressed: () {
print('Scanning'); print('Scanning');
setState(() { setState(() {
isScanning = !isScanning; isScanning = !isScanning;
if (isScanning) { if (isScanning) {

View File

@ -2,21 +2,33 @@ PODS:
- flutter_blue_plus (0.0.1): - flutter_blue_plus (0.0.1):
- FlutterMacOS - FlutterMacOS
- FlutterMacOS (1.0.0) - FlutterMacOS (1.0.0)
- geolocator_apple (1.2.0):
- FlutterMacOS
- url_launcher_macos (0.0.1):
- FlutterMacOS
DEPENDENCIES: DEPENDENCIES:
- flutter_blue_plus (from `Flutter/ephemeral/.symlinks/plugins/flutter_blue_plus/macos`) - flutter_blue_plus (from `Flutter/ephemeral/.symlinks/plugins/flutter_blue_plus/macos`)
- FlutterMacOS (from `Flutter/ephemeral`) - FlutterMacOS (from `Flutter/ephemeral`)
- geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
EXTERNAL SOURCES: EXTERNAL SOURCES:
flutter_blue_plus: flutter_blue_plus:
:path: Flutter/ephemeral/.symlinks/plugins/flutter_blue_plus/macos :path: Flutter/ephemeral/.symlinks/plugins/flutter_blue_plus/macos
FlutterMacOS: FlutterMacOS:
:path: Flutter/ephemeral :path: Flutter/ephemeral
geolocator_apple:
:path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos
url_launcher_macos:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
SPEC CHECKSUMS: SPEC CHECKSUMS:
flutter_blue_plus: e2868679021f19d12a8c0c58a33f1df66ec7fa6a flutter_blue_plus: e2868679021f19d12a8c0c58a33f1df66ec7fa6a
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
geolocator_apple: 72a78ae3f3e4ec0db62117bd93e34523f5011d58
url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399
PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
COCOAPODS: 1.14.2 COCOAPODS: 1.15.2

View File

@ -259,7 +259,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0920; LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 1430; LastUpgradeCheck = 1510;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
331C80D4294CF70F00263BE5 = { 331C80D4294CF70F00263BE5 = {

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1430" LastUpgradeVersion = "1510"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"