Skip to content

Commit

Permalink
Refactor robot example (#162)
Browse files Browse the repository at this point in the history
* make podfile ios version consistent with minimum outlined in sdk readme

* add mDNS entitlements to example info.plist

* make mdns function private, await mdns dialWebRtc call

the missing await here was causing an exception to get propogated when it should've been caught and handled

* reduce dependencies in example

* remove location secret

* Update main.dart
  • Loading branch information
clintpurser authored Jan 3, 2024

Verified

This commit was signed with the committer’s verified signature.
estherk15 Esther Kim
1 parent 616be99 commit 14af995
Showing 19 changed files with 77 additions and 137 deletions.
2 changes: 1 addition & 1 deletion example/viam_example_app/ios/Podfile
Original file line number Diff line number Diff line change
@@ -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'
2 changes: 1 addition & 1 deletion example/viam_robot_example_app/ios/Podfile
Original file line number Diff line number Diff line change
@@ -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'
Original file line number Diff line number Diff line change
@@ -155,7 +155,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
6 changes: 6 additions & 0 deletions example/viam_robot_example_app/ios/Runner/Info.plist
Original file line number Diff line number Diff line change
@@ -2,6 +2,12 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSLocalNetworkUsageDescription</key>
<string>Viam requires access to your devices local network to connect to your devices.</string>
<key>NSBonjourServices</key>
<array>
<string>_rpc._tcp</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
113 changes: 31 additions & 82 deletions example/viam_robot_example_app/lib/main.dart
Original file line number Diff line number Diff line change
@@ -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 <LocalizationsDelegate<dynamic>>[
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<MyHomePage> {
final List<ResourceName> _resourceNames = [];
late RobotClient _robot;

void _login() {
Future<void> _login() async {
if (_loading) {
return;
}
@@ -91,42 +54,29 @@ class _MyHomePageState extends State<MyHomePage> {
_loading = true;
});

Future<RobotClient> 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<MyHomePage> {

@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<MyHomePage> {
Text(_robot.resourceNames.where((element) => element.type == resourceTypeComponent).join('\n')),
])
: _loading
? PlatformCircularProgressIndicator()
? const CircularProgressIndicator.adaptive()
: Column(children: [
ViamButton(
onPressed: _login,
6 changes: 2 additions & 4 deletions example/viam_robot_example_app/lib/screens/base.dart
Original file line number Diff line number Diff line change
@@ -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,
8 changes: 3 additions & 5 deletions example/viam_robot_example_app/lib/screens/board.dart
Original file line number Diff line number Diff line change
@@ -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),
),
6 changes: 2 additions & 4 deletions example/viam_robot_example_app/lib/screens/gripper.dart
Original file line number Diff line number Diff line change
@@ -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,
8 changes: 3 additions & 5 deletions example/viam_robot_example_app/lib/screens/motor.dart
Original file line number Diff line number Diff line change
@@ -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),
),
Original file line number Diff line number Diff line change
@@ -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),
),
9 changes: 4 additions & 5 deletions example/viam_robot_example_app/lib/screens/power_sensor.dart
Original file line number Diff line number Diff line change
@@ -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),
),
8 changes: 3 additions & 5 deletions example/viam_robot_example_app/lib/screens/sensor.dart
Original file line number Diff line number Diff line change
@@ -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),
),
Loading

0 comments on commit 14af995

Please sign in to comment.