Commit 24090d57 authored by Nicolas Richard Walter Boeckh's avatar Nicolas Richard Walter Boeckh 💬

Advancing to connect

parent e2c96e2b
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_blue","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\flutter_blue-0.6.3+1\\\\","dependencies":[]},{"name":"geolocator","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\geolocator-5.2.1\\\\","dependencies":["google_api_availability","location_permissions"]},{"name":"google_api_availability","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\google_api_availability-2.0.2\\\\","dependencies":[]},{"name":"location_permissions","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\location_permissions-2.0.4+1\\\\","dependencies":[]},{"name":"path_provider","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.0\\\\","dependencies":[]},{"name":"permission_handler","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler-4.2.0+hotfix.3\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.4.3\\\\","dependencies":[]},{"name":"sqflite","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-1.2.0\\\\","dependencies":[]}],"android":[{"name":"flutter_blue","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\flutter_blue-0.6.3+1\\\\","dependencies":[]},{"name":"geolocator","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\geolocator-5.2.1\\\\","dependencies":["google_api_availability","location_permissions"]},{"name":"google_api_availability","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\google_api_availability-2.0.2\\\\","dependencies":[]},{"name":"location_permissions","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\location_permissions-2.0.4+1\\\\","dependencies":[]},{"name":"path_provider","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.0\\\\","dependencies":[]},{"name":"permission_handler","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler-4.2.0+hotfix.3\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.4.3\\\\","dependencies":[]},{"name":"sqflite","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-1.2.0\\\\","dependencies":[]}],"macos":[{"name":"sqflite","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-1.2.0\\\\","dependencies":[]}],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"flutter_blue","dependencies":[]},{"name":"geolocator","dependencies":["google_api_availability","location_permissions"]},{"name":"google_api_availability","dependencies":[]},{"name":"location_permissions","dependencies":[]},{"name":"path_provider","dependencies":[]},{"name":"permission_handler","dependencies":[]},{"name":"shared_preferences","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2020-02-20 08:02:35.622880","version":"1.14.6"}
\ No newline at end of file
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_blue","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\flutter_blue-0.6.3+1\\\\","dependencies":[]},{"name":"geolocator","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\geolocator-5.2.1\\\\","dependencies":["google_api_availability","location_permissions"]},{"name":"google_api_availability","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\google_api_availability-2.0.2\\\\","dependencies":[]},{"name":"location_permissions","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\location_permissions-2.0.4+1\\\\","dependencies":[]},{"name":"path_provider","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.0\\\\","dependencies":[]},{"name":"permission_handler","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler-4.2.0+hotfix.3\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.4.3\\\\","dependencies":[]},{"name":"sqflite","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-1.2.0\\\\","dependencies":[]}],"android":[{"name":"flutter_blue","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\flutter_blue-0.6.3+1\\\\","dependencies":[]},{"name":"geolocator","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\geolocator-5.2.1\\\\","dependencies":["google_api_availability","location_permissions"]},{"name":"google_api_availability","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\google_api_availability-2.0.2\\\\","dependencies":[]},{"name":"location_permissions","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\location_permissions-2.0.4+1\\\\","dependencies":[]},{"name":"path_provider","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.0\\\\","dependencies":[]},{"name":"permission_handler","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler-4.2.0+hotfix.3\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.4.3\\\\","dependencies":[]},{"name":"sqflite","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-1.2.0\\\\","dependencies":[]}],"macos":[{"name":"sqflite","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\sqflite-1.2.0\\\\","dependencies":[]}],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"flutter_blue","dependencies":[]},{"name":"geolocator","dependencies":["google_api_availability","location_permissions"]},{"name":"google_api_availability","dependencies":[]},{"name":"location_permissions","dependencies":[]},{"name":"path_provider","dependencies":[]},{"name":"permission_handler","dependencies":[]},{"name":"shared_preferences","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2020-02-20 17:12:51.524675","version":"1.14.6"}
\ No newline at end of file
......@@ -5,5 +5,6 @@ object Channels {
@JvmStatic val BATTERY_CHARGE: String = "logair.application/battery_charge_status";
@JvmStatic val WAKE: String = "logair.application/wake";
@JvmStatic val WAKE_NOTIFICATION: String = "logair.application/wake_notification";
@JvmStatic val BLUETOOTH_ADAPTER: String = "logair.application/bluetooth_adapter";
}
package com.logair.logair_application
import android.bluetooth.BluetoothAdapter
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
......@@ -16,14 +17,15 @@ import android.os.Build.VERSION_CODES
import io.flutter.plugin.common.MethodChannel
import android.os.Handler;
import android.util.Log
import android.widget.Toast
import java.util.Timer;
import java.util.TimerTask;
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Channels.BATTERY).setMethodCallHandler {
call, result ->
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Channels.BATTERY).setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
......@@ -35,14 +37,26 @@ class MainActivity: FlutterActivity() {
result.notImplemented()
};
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Channels.WAKE).setMethodCallHandler {
call, result ->
if (call.method == "startWakeService") {
modifyWakeService(Actions.START);
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Channels.WAKE).setMethodCallHandler { call, result ->
when (call.method) {
"startWakeService" -> {
modifyWakeService(Actions.START);
result.success(true);
}
"endWakeService" -> {
modifyWakeService(Actions.STOP);
result.success(false);
}
else -> result.notImplemented()
};
}
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Channels.BLUETOOTH_ADAPTER).setMethodCallHandler { call, result ->
var btAdapter: BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (!btAdapter.isEnabled && call.method == "turnBluetoothOn") {
startActivityForResult(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
result.success(true);
} else if (call.method == "endWakeService") {
modifyWakeService(Actions.STOP);
result.success(false);
} else
result.notImplemented();
}
......
import 'package:flutter/material.dart';
// TODO Change to something that pops forward
class PopForwardRoute extends PageRouteBuilder {
final Widget page;
PopForwardRoute({this.page}) : super(
pageBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) => page,
transitionsBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) => SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, -1),
end: Offset.zero,
).animate(animation),
child: child,
),
);
}
\ No newline at end of file
import 'package:flutter/material.dart';
class SlideUpRoute extends PageRouteBuilder {
final Widget page;
SlideUpRoute({this.page}) : super(
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, ) =>
page,
transitionsBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) =>
SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, -1),
end: Offset.zero,
).animate(animation),
child: child,
),
);
import 'package:flutter/material.dart';
class SlideUpRoute extends PageRouteBuilder {
final Widget page;
SlideUpRoute({this.page}) : super(
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, ) =>
page,
transitionsBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) =>
SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, -1),
end: Offset.zero,
).animate(animation),
child: child,
),
);
}
\ No newline at end of file
/// Constants enum defining the names of the platform channels used to communicate with platform specific code.
class Channels {
static const String BATTERY = 'logair.application/battery';
static const String BATTERY_CHARGE = 'logair.application/bsattery_charge_status';
static const String BATTERY_CHARGE = 'logair.application/battery_charge_status';
static const String WAKE = "logair.application/wake";
static const String BLUETOOTH_ADAPTER = 'logair.application/bluetooth_adapter';
}
\ No newline at end of file
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_blue/flutter_blue.dart';
import 'package:kotlin_flavor/scope_functions.dart';
import 'package:logair_application/platform/wake_service.dart';
import 'package:logair_application/enums/platform_channels.dart';
import 'package:logair_application/services/wake_service.dart';
/// Serves as a wrapper class around [FlutterBlue], and helps integrate it into the application with extensions
class BTLEHandler {
......@@ -13,6 +16,8 @@ class BTLEHandler {
FlutterBlue _flutterBlueInstance = FlutterBlue.instance;
static const MethodChannel _btAdapterChannel = const MethodChannel(Channels.BLUETOOTH_ADAPTER);
factory BTLEHandler() => _singleton;
BTLEHandler._internal() {
......@@ -40,8 +45,18 @@ class BTLEHandler {
return it.disconnect();
});
// TODO turn BTLE on method
turnBTLEOn() {}
// TODO turn BTLE on method (platform side)
Future<bool> turnBTLEOn() async {
bool _status;
try {
_status = await _btAdapterChannel.invokeMethod('turnBluetoothOn');
} on PlatformException catch (e) {
print('BLUETOOTH_ON : $e');
}
return _status;
}
String get address => this._device?.let((it) => it.id.toString());
......@@ -72,4 +87,8 @@ class BTLEHandler {
WakeService().modifyWakeService(false).then((value) => print('Device will stay awake $value'));
t.cancel();
}
Stream<BluetoothState> get state => _flutterBlueInstance.state;
}
\ No newline at end of file
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:logair_application/animation/custom_slide_animation.dart';
import 'package:logair_application/animation/slide_animation.dart';
import 'package:logair_application/routes/stats.dart';
import 'package:logair_application/ui/base_widget.dart';
......@@ -15,7 +15,7 @@ class HomeView extends StatefulWidget {
_HomeViewState createState() => _HomeViewState();
}
class _HomeViewState extends State<HomeView> { // TODO Remove statefulness here.s
class _HomeViewState extends State<HomeView> { // TODO Remove statefulness here.
bool shouldChange = false;
bool canChange = false;
double deltaSum = 0.0;
......
import 'package:flutter/services.dart';
import 'package:logair_application/enums/platform_channels.dart';
class BatteryService {
static const MethodChannel methodChannel = const MethodChannel(Channels.BATTERY);
Future<int> get batteryLevel async {
int batteryLevel;
try {
batteryLevel = await methodChannel.invokeMethod('getBatteryLevel');
} on PlatformException catch (e) {
print('BATTERY_SERVICE : $e');
}
return batteryLevel;
}
}
import 'package:flutter/services.dart';
import 'package:logair_application/enums/platform_channels.dart';
class BatteryService {
static const MethodChannel methodChannel = const MethodChannel(Channels.BATTERY);
Future<int> get batteryLevel async {
int batteryLevel;
try {
batteryLevel = await methodChannel.invokeMethod('getBatteryLevel');
} on PlatformException catch (e) {
print('BATTERY_SERVICE : $e');
}
return batteryLevel;
}
}
import 'package:flutter/services.dart';
import 'package:logair_application/enums/platform_channels.dart';
class WakeService {
static const MethodChannel methodChannel = const MethodChannel(Channels.WAKE);
static final WakeService _singleton = new WakeService._internal();
factory WakeService() => _singleton;
WakeService._internal();
Future<bool> modifyWakeService(bool start) async {
bool wakeServiceStatus;
try {
wakeServiceStatus = await methodChannel.invokeMethod(start ? 'startWakeService' : 'endWakeService');
} on PlatformException catch (e) {
print('WAKE_SERVICE : $e');
}
return wakeServiceStatus;
}
import 'package:flutter/services.dart';
import 'package:logair_application/enums/platform_channels.dart';
class WakeService {
static const MethodChannel methodChannel = const MethodChannel(Channels.WAKE);
static final WakeService _singleton = new WakeService._internal();
factory WakeService() => _singleton;
WakeService._internal();
Future<bool> modifyWakeService(bool start) async {
bool wakeServiceStatus;
try {
wakeServiceStatus = await methodChannel.invokeMethod(start ? 'startWakeService' : 'endWakeService');
} on PlatformException catch (e) {
print('WAKE_SERVICE : $e');
}
return wakeServiceStatus;
}
}
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
class BluetoothOffScreen extends StatelessWidget {
const BluetoothOffScreen({Key key, this.state}) : super(key: key);
final BluetoothState state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.lightBlue,
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
Icons.bluetooth_disabled,
size: 200.0,
color: Colors.white54,
),
Text(
'Bluetooth Adapter is ${state.toString().substring(15)}.', // TODO internationalize
style: Theme.of(context)
.primaryTextTheme
.subtitle1
.copyWith(color: Colors.white),
),
],
),
),
);
}
}
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logair_application/localization/localization.dart';
class BluetoothUnavailableScreen extends StatelessWidget {
const BluetoothUnavailableScreen({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.lightBlue,
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
Icons.bluetooth_disabled,
size: 200.0,
color: Colors.red[300],
),
Text(
AppLocalization.of(context).bluetoothUnsupported,
style: Theme.of(context)
.primaryTextTheme
.subtitle1
.copyWith(color: Colors.white),
),
],
),
),
);
}
}
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:async';
class BluetoothButton extends StatefulWidget {
final Function onTapOn;
final Function onTapOff;
......
......@@ -4,11 +4,10 @@ import 'package:flutter/widgets.dart';
import 'package:logair_application/handlers/bluetooth_le_handler.dart';
import 'package:logair_application/ui/carousel_card.dart';
import 'package:logair_application/platform/battery_service.dart';
import 'package:logair_application/services/battery_service.dart';
import 'package:logair_application/ui/components/bluetooth_button.dart';
import 'package:logair_application/ui/dialog/bluetooth_inactive_dialog.dart';
import 'package:logair_application/ui/dialog/bluetooth_selection_dialog.dart';
import 'package:logair_application/ui/dialog/bluetooth_unavailable_dialog.dart';
import 'package:logair_application/animation/forward_animation.dart';
import 'package:logair_application/ui/dialog/bluetooth_dialog.dart';
class DataWidget extends StatelessWidget {
DataWidget();
......@@ -35,13 +34,6 @@ class DataWidget extends StatelessWidget {
},
child: Text('Toggle BTLE Service'),
),
RaisedButton(
onPressed: () => {
//showBTElements
showBluetoothSelectionDialog(context)
},
child: Text("BTLE popup")
),
BluetoothButton(
onTapOn: () => _onTapOn(context),
onTapOff: () => _onTapOff(context),
......@@ -54,40 +46,12 @@ class DataWidget extends StatelessWidget {
}
_onTapOn(BuildContext context) async {
print('Check BTAvail');
bool _returnValue = await BTLEHandler().isBluetoothAvailable().then(
(bluetoothAvailable) async {
if (!bluetoothAvailable) {
showBluetoothUnavailableDialog(context);
print('BTLE availability check failed');
return false;
}
print('Check BTOn');
bool _returnValue = await BTLEHandler().isBluetoothActive().then((bluetoothOn) async {
bool _userConfirmed = false;
bool _returnValue = false;
if (!bluetoothOn) {
print('BTLE activity check failed');
_userConfirmed = await showBluetoothInactiveDialog(context).then((userConfirmed) async {
return userConfirmed;
});
} else
_userConfirmed = true;
// TODO Turn on BT or ask turn on BT. Method Channel ?
if (_userConfirmed) {
bool _returnValue = await showBluetoothSelectionDialog(context).then((value) => value);
return _returnValue;
} else
return false;
});
return _returnValue;
});
return _returnValue;
Navigator.push(
context,
PopForwardRoute(
page: BluetoothDialog(),
),
);
}
_onTapOff(BuildContext context) async {
......
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_blue/flutter_blue.dart';
import 'package:logair_application/handlers/bluetooth_le_handler.dart';
import 'package:logair_application/ui/components/bluetooth_adapter_off.dart';
import 'package:logair_application/ui/components/bluetooth_adapter_unavailable.dart';
import 'package:logair_application/ui/dialog/bluetooth_selection_dialog.dart';
class BluetoothDialog extends StatefulWidget {
BluetoothDialog({Key key}) : super(key: key);
@override
_BluetoothDialogState createState() => _BluetoothDialogState();
}
class _BluetoothDialogState extends State<BluetoothDialog> {
_BluetoothDialogState({Key key});
bool bluetoothAvailable = false;
@override
Widget build(BuildContext context) {
BTLEHandler().isBluetoothAvailable().then((value) => setState(() {
bluetoothAvailable = true;
}));
return SafeArea(
child: Scaffold(
body: Center(
child: Column(
children: <Widget>[
// Carousel
Expanded(
flex: 9,
child: _bluetoothPane(bluetoothAvailable)
),
Expanded(
flex: 1,
child: RaisedButton(
onPressed: () => Navigator.of(context).pop(),
child: Text("Back"),
)
),
],
),
),
),
);
}
}
Widget _bluetoothPane(bluetoothAvailable) =>
(!bluetoothAvailable) ?
StreamBuilder<BluetoothState>(
stream: BTLEHandler().state,
builder: (context, snapshot) {
final state = snapshot.data;
if (state == BluetoothState.on) {
return BluetoothSelectionDialog();
} else {
return BluetoothOffScreen(state: state);
}
},
) :
BluetoothUnavailableScreen();
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logair_application/localization/localization.dart';
Future<bool> showBluetoothInactiveDialog(BuildContext context) async {
bool _returnValue = await showDialog(
context: context,
barrierDismissible: false,
builder: (context) => SimpleDialog(
children: <Widget>[
Container(
child: Column(
children: <Widget>[
Text(
AppLocalization.of(context).bluetoothInactive
),
SimpleDialogOption(
child: Text(
AppLocalization.of(context).cancel
),
onPressed: () => Navigator.of(context).pop(false),
),
SimpleDialogOption(
child: Text(
AppLocalization.of(context).ok
),
onPressed: () => Navigator.of(context).pop(true),
)
],
),
),
],
),
);
return _returnValue;
}
\ No newline at end of file
......@@ -603,7 +603,7 @@ packages:
source: hosted
version: "1.1.6"
uuid:
dependency: transitive
dependency: "direct main"
description:
name: uuid
url: "https://pub.dartlang.org"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment