diff --git a/example/viam_example_app/ios/Podfile b/example/viam_example_app/ios/Podfile index bcf86086c7c..79d16c83ed2 100644 --- a/example/viam_example_app/ios/Podfile +++ b/example/viam_example_app/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '12.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/viam_robot_example_app/ios/Podfile b/example/viam_robot_example_app/ios/Podfile index 0b62d79ed44..10f3c9b470e 100644 --- a/example/viam_robot_example_app/ios/Podfile +++ b/example/viam_robot_example_app/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '14.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/viam_robot_example_app/ios/Runner.xcodeproj/project.pbxproj b/example/viam_robot_example_app/ios/Runner.xcodeproj/project.pbxproj index 9716806e17d..547ead5497e 100644 --- a/example/viam_robot_example_app/ios/Runner.xcodeproj/project.pbxproj +++ b/example/viam_robot_example_app/ios/Runner.xcodeproj/project.pbxproj @@ -155,7 +155,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { diff --git a/example/viam_robot_example_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/viam_robot_example_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a3352..a6b826db27d 100644 --- a/example/viam_robot_example_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/viam_robot_example_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + NSLocalNetworkUsageDescription + Viam requires access to your devices local network to connect to your devices. + NSBonjourServices + + _rpc._tcp + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/example/viam_robot_example_app/lib/main.dart b/example/viam_robot_example_app/lib/main.dart index b495abe8ab1..33dc24f8e62 100644 --- a/example/viam_robot_example_app/lib/main.dart +++ b/example/viam_robot_example_app/lib/main.dart @@ -1,7 +1,5 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -10,6 +8,7 @@ import 'screens/screens.dart'; void main() async { // Load the `.env` file await dotenv.load(); + runApp(const MyApp()); } @@ -18,46 +17,10 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - final materialTheme = ThemeData( - cupertinoOverrideTheme: const CupertinoThemeData( - primaryColor: Color(0xff127EFB), - ), - primarySwatch: Colors.green, - outlinedButtonTheme: OutlinedButtonThemeData( - style: ButtonStyle( - padding: MaterialStateProperty.all(const EdgeInsets.all(16.0)), - foregroundColor: MaterialStateProperty.all(const Color(0xFF3DDC84)), - ), - ), - ); - - return Theme( - data: materialTheme, - child: PlatformProvider( - settings: PlatformSettingsData( - iosUsesMaterialWidgets: true, - iosUseZeroPaddingForAppbarPlatformIcon: true, - ), - builder: (context) => PlatformApp( - localizationsDelegates: const >[ - DefaultMaterialLocalizations.delegate, - DefaultWidgetsLocalizations.delegate, - DefaultCupertinoLocalizations.delegate, - ], - title: 'Viam Example', - home: const MyHomePage( - title: 'Viam Example', - ), - material: (_, __) => MaterialAppData( - theme: materialTheme, - ), - cupertino: (_, __) => CupertinoAppData( - theme: const CupertinoThemeData( - brightness: Brightness.light, - primaryColor: Color(0xff127EFB), - ), - ), - ), + return const MaterialApp( + title: 'Viam Example', + home: MyHomePage( + title: 'Viam Example', ), ); } @@ -79,7 +42,7 @@ class _MyHomePageState extends State { final List _resourceNames = []; late RobotClient _robot; - void _login() { + Future _login() async { if (_loading) { return; } @@ -91,42 +54,29 @@ class _MyHomePageState extends State { _loading = true; }); - Future robotFut; - - if (dotenv.env['ROBOT_LOCATION'] != null && dotenv.env['LOCATION_SECRET'] != null) { - robotFut = RobotClient.atAddress( - dotenv.env['ROBOT_LOCATION'] ?? '', - RobotClientOptions.withLocationSecret(dotenv.env['LOCATION_SECRET'] ?? ''), - ); - } else if (dotenv.env['API_KEY_ID'] != null && dotenv.env['API_KEY'] != null) { - robotFut = RobotClient.atAddress( - dotenv.env['ROBOT_LOCATION'] ?? '', // or whatever default value you want - RobotClientOptions.withApiKey( - dotenv.env['API_KEY_ID'] ?? '', - dotenv.env['API_KEY'] ?? '', - ), - ); - } else { - throw Exception('None of the required variables are defined in .env. Please see README.md for more information.'); - } + // Be sure to create a .env file with these fields + _robot = await RobotClient.atAddress( + dotenv.env['ROBOT_LOCATION']!, + RobotClientOptions.withApiKey( + dotenv.env['API_KEY_ID']!, + dotenv.env['API_KEY']!, + ), + ); - robotFut.then((value) { - _robot = value; - final services = _robot.resourceNames.where((element) => element.type == resourceTypeService); - final components = _robot.resourceNames.where((element) => element.type == resourceTypeComponent); + final services = _robot.resourceNames.where((element) => element.type == resourceTypeService); + final components = _robot.resourceNames.where((element) => element.type == resourceTypeComponent); - for (ResourceName component in components) { - if (component.subtype == Camera.subtype.resourceSubtype) { - _cameraName = component; - } + for (ResourceName component in components) { + if (component.subtype == Camera.subtype.resourceSubtype) { + _cameraName = component; } + } - setState(() { - _loggedIn = true; - _loading = false; - _resourceNames.addAll(services); - _resourceNames.addAll(components); - }); + setState(() { + _loggedIn = true; + _loading = false; + _resourceNames.addAll(services); + _resourceNames.addAll(components); }); } @@ -189,23 +139,22 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(widget.title), ), - iosContentPadding: true, body: _loggedIn ? ListView.builder( itemCount: _resourceNames.length, itemBuilder: (context, index) { final resourceName = _resourceNames[index]; return Column(children: [ - PlatformListTile( + ListTile( title: Text(resourceName.name), subtitle: Text('${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}/${resourceName.name}'), - trailing: _isNavigable(resourceName) ? Icon(context.platformIcons.rightChevron) : null, + trailing: _isNavigable(resourceName) ? const Icon(Icons.chevron_right) : null, onTap: () => _isNavigable(resourceName) - ? Navigator.push(context, platformPageRoute(context: context, builder: (context) => _getScreen(resourceName)!)) + ? Navigator.push(context, MaterialPageRoute(builder: (context) => _getScreen(resourceName)!)) : null, ), const Divider(height: 0, indent: 0, endIndent: 0) @@ -223,7 +172,7 @@ class _MyHomePageState extends State { Text(_robot.resourceNames.where((element) => element.type == resourceTypeComponent).join('\n')), ]) : _loading - ? PlatformCircularProgressIndicator() + ? const CircularProgressIndicator.adaptive() : Column(children: [ ViamButton( onPressed: _login, diff --git a/example/viam_robot_example_app/lib/screens/base.dart b/example/viam_robot_example_app/lib/screens/base.dart index de1efb12ea4..c15d57039b8 100644 --- a/example/viam_robot_example_app/lib/screens/base.dart +++ b/example/viam_robot_example_app/lib/screens/base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -12,11 +11,10 @@ class BaseScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: const Text('Remote Control'), ), - iosContentPadding: true, body: Center( child: ViamBaseWidget( base: base, diff --git a/example/viam_robot_example_app/lib/screens/board.dart b/example/viam_robot_example_app/lib/screens/board.dart index 2162512451e..ac58f0991c3 100644 --- a/example/viam_robot_example_app/lib/screens/board.dart +++ b/example/viam_robot_example_app/lib/screens/board.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets/resources/board.dart'; @@ -11,16 +10,15 @@ class BoardScreen extends StatelessWidget { @override Widget build(Object context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Column( children: [ const SizedBox(height: 16), - PlatformText( + Text( '${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}/${resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), diff --git a/example/viam_robot_example_app/lib/screens/gripper.dart b/example/viam_robot_example_app/lib/screens/gripper.dart index 7c859bf3781..a9257ddd269 100644 --- a/example/viam_robot_example_app/lib/screens/gripper.dart +++ b/example/viam_robot_example_app/lib/screens/gripper.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -12,11 +11,10 @@ class GripperScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text('Gripper ${gripper.name} Control'), ), - iosContentPadding: true, body: Center( child: ViamGripperWidget( gripper: gripper, diff --git a/example/viam_robot_example_app/lib/screens/motor.dart b/example/viam_robot_example_app/lib/screens/motor.dart index 5a23f7adddd..88df8bcb85d 100644 --- a/example/viam_robot_example_app/lib/screens/motor.dart +++ b/example/viam_robot_example_app/lib/screens/motor.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -11,16 +10,15 @@ class MotorScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Column( children: [ const SizedBox(height: 16), - PlatformText( + Text( '${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}/${resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), diff --git a/example/viam_robot_example_app/lib/screens/movement_sensor.dart b/example/viam_robot_example_app/lib/screens/movement_sensor.dart index 6932cc3c2b8..bbc728a4a8e 100644 --- a/example/viam_robot_example_app/lib/screens/movement_sensor.dart +++ b/example/viam_robot_example_app/lib/screens/movement_sensor.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; + import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -59,16 +59,15 @@ class MovementSensorScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Column( children: [ const Padding(padding: EdgeInsets.symmetric(vertical: 8, horizontal: 0)), - PlatformText( + Text( '${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}/${resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), diff --git a/example/viam_robot_example_app/lib/screens/power_sensor.dart b/example/viam_robot_example_app/lib/screens/power_sensor.dart index 3b8f5c3325e..cfa665b0190 100644 --- a/example/viam_robot_example_app/lib/screens/power_sensor.dart +++ b/example/viam_robot_example_app/lib/screens/power_sensor.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; + import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -37,16 +37,15 @@ class PowerSensorScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Column( children: [ const Padding(padding: EdgeInsets.symmetric(vertical: 8, horizontal: 0)), - PlatformText( + Text( '${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}/${resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), diff --git a/example/viam_robot_example_app/lib/screens/sensor.dart b/example/viam_robot_example_app/lib/screens/sensor.dart index 3d651db963c..ee1889c757d 100644 --- a/example/viam_robot_example_app/lib/screens/sensor.dart +++ b/example/viam_robot_example_app/lib/screens/sensor.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -11,16 +10,15 @@ class SensorScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Column( children: [ const Padding(padding: EdgeInsets.symmetric(vertical: 8, horizontal: 0)), - PlatformText( + Text( '${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}/${resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), diff --git a/example/viam_robot_example_app/lib/screens/servo.dart b/example/viam_robot_example_app/lib/screens/servo.dart index 480c7f96dec..3a9217e77b1 100644 --- a/example/viam_robot_example_app/lib/screens/servo.dart +++ b/example/viam_robot_example_app/lib/screens/servo.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; + import 'package:viam_sdk/viam_sdk.dart'; class ServoScreen extends StatefulWidget { @@ -46,18 +46,17 @@ class _ServoScreenState extends State { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(widget.resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ const Padding(padding: EdgeInsets.symmetric(vertical: 8, horizontal: 0)), - PlatformText( + Text( '${widget.resourceName.namespace}:${widget.resourceName.type}:${widget.resourceName.subtype}/${widget.resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), diff --git a/example/viam_robot_example_app/lib/screens/stream.dart b/example/viam_robot_example_app/lib/screens/stream.dart index 55053c5bef1..2bf317e64eb 100644 --- a/example/viam_robot_example_app/lib/screens/stream.dart +++ b/example/viam_robot_example_app/lib/screens/stream.dart @@ -2,7 +2,6 @@ import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:image/image.dart' as img; import 'package:viam_sdk/viam_sdk.dart'; import 'package:viam_sdk/widgets.dart'; @@ -68,16 +67,15 @@ class _StreamScreenState extends State { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: PlatformAppBar( + return Scaffold( + appBar: AppBar( title: Text(widget.resourceName.name.toUpperCase()), ), - iosContentPadding: true, body: Center( child: Column( children: [ const SizedBox(height: 16), - PlatformText( + Text( '${widget.resourceName.namespace}:${widget.resourceName.type}:${widget.resourceName.subtype}/${widget.resourceName.name}', style: const TextStyle(fontWeight: FontWeight.w300), ), @@ -86,7 +84,7 @@ class _StreamScreenState extends State { const SizedBox(height: 16), if (_imgLoaded) Image.memory(Uint8List.view(imageBytes!.buffer), scale: 3), const SizedBox(height: 16), - PlatformElevatedButton( + ElevatedButton( child: const Text('Get image'), onPressed: () => _getImage(), ) diff --git a/example/viam_robot_example_app/pubspec.yaml b/example/viam_robot_example_app/pubspec.yaml index 947aca17321..e7ceff821f5 100644 --- a/example/viam_robot_example_app/pubspec.yaml +++ b/example/viam_robot_example_app/pubspec.yaml @@ -12,14 +12,10 @@ dependencies: sdk: flutter viam_sdk: path: ../../ - cupertino_icons: ^1.0.2 - flutter_platform_widgets: ^3.2.1 - flutter_webrtc: ^0.9.35 image: ^4.0.17 flutter_dotenv: ^5.1.0 dev_dependencies: - flutter_launcher_icons: ^0.13.1 flutter_test: sdk: flutter flutter_lints: ^3.0.0 diff --git a/example/viam_robot_example_app/windows/flutter/generated_plugin_registrant.cc b/example/viam_robot_example_app/windows/flutter/generated_plugin_registrant.cc index e8559e4a05f..2ac20fe2dae 100644 --- a/example/viam_robot_example_app/windows/flutter/generated_plugin_registrant.cc +++ b/example/viam_robot_example_app/windows/flutter/generated_plugin_registrant.cc @@ -6,9 +6,12 @@ #include "generated_plugin_registrant.h" +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + BonsoirWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("BonsoirWindowsPluginCApi")); FlutterWebRTCPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); } diff --git a/example/viam_robot_example_app/windows/flutter/generated_plugins.cmake b/example/viam_robot_example_app/windows/flutter/generated_plugins.cmake index 3024cacc530..4c56f020bf0 100644 --- a/example/viam_robot_example_app/windows/flutter/generated_plugins.cmake +++ b/example/viam_robot_example_app/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + bonsoir_windows flutter_webrtc ) diff --git a/lib/src/rpc/dial.dart b/lib/src/rpc/dial.dart index 32b2afbb189..c587145e08e 100644 --- a/lib/src/rpc/dial.dart +++ b/lib/src/rpc/dial.dart @@ -115,7 +115,7 @@ Future dial(String address, DialOptions? options, String Func if (opts.attemptMdns) { try { - final mdnsUri = await searchMdns(address); + final mdnsUri = await _searchMdns(address); // Let downstream calls know when mdns was used. This is helpful to inform // when determining if we want to use the external auth credentials for the signaling // in cases where the external signaling is the same as the external auth. For mdns @@ -123,7 +123,7 @@ Future dial(String address, DialOptions? options, String Func final dialOptsCopy = opts .._usingMdns = true ..authEntity = address; - return _dialWebRtc(mdnsUri, dialOptsCopy, sessionCallback); + return await _dialWebRtc(mdnsUri, dialOptsCopy, sessionCallback); } on NotLocalAddressException catch (e) { _logger.d(e.toString()); } catch (e) { @@ -141,7 +141,7 @@ Future dial(String address, DialOptions? options, String Func return _dialWebRtc(address, opts, sessionCallback); } -Future searchMdns(String address) async { +Future _searchMdns(String address) async { // We need to replace all periods with dashes, because this is how viam instances are broadcast locally. final targetName = address.replaceAll(RegExp(r'\.'), '-');