From 8417e9daeecbdb3847de401b0fcc6304d246a787 Mon Sep 17 00:00:00 2001 From: Malik Talha Date: Mon, 23 Oct 2023 02:00:01 +0500 Subject: Add flutter voice assistant app A flutter based gRPC client Voice Assistant made specifically to communicate with the Voice Agent service. SPEC-4906 Signed-off-by: Malik Talha Change-Id: Ic4a382c1cdb78f1a79f985e3d37ce2fb06c53203 --- lib/main.dart | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 lib/main.dart (limited to 'lib/main.dart') diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..bc5b84b --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'models/app_state.dart'; +import 'screens/home_screen.dart'; +import 'screens/error_screen.dart'; +import 'providers/service_status.dart'; +import 'grpc/generated/voice_agent.pbgrpc.dart'; +import 'grpc/voice_agent_client.dart'; +import 'utils/app_config.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + final serviceStatusProvider = ServiceStatusProvider(); + + // get config variables + final config = await AppConfig.loadFromAsset(); + + // Check the service status initially + final initialServiceStatus = await checkServiceStatus(config); + serviceStatusProvider.setServiceStatus(initialServiceStatus.status); + + runApp( + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => AppState()), + ChangeNotifierProvider.value(value: serviceStatusProvider), + ], + child: App( + config: config, + onRetry: () async { + final serviceStatus = await checkServiceStatus( + config); // Retry connecting to the server + + if (serviceStatus.status) { + serviceStatusProvider + .setServiceStatus(true); // Update the service status + } + }, + ), + ), + ); +} + +Future checkServiceStatus(AppConfig config) async { + final client = VoiceAgentClient(config.grpcHost, config.grpcPort); + final serviceStatus = await client.checkServiceStatus(); + client.shutdown(); + return serviceStatus; +} + +class App extends StatelessWidget { + final AppConfig config; + final VoidCallback onRetry; + + const App({Key? key, required this.config, required this.onRetry}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'AGL Voice Assistant', + theme: ThemeData( + useMaterial3: true, + colorScheme: ColorScheme.fromSeed(seedColor: Colors.green), + ), + home: Consumer( + builder: (context, provider, child) { + return provider.isServiceOnline + ? HomePage(config: config) + : ErrorScreen( + onRetry: onRetry, // Pass the callback to the ErrorScreen + ); // Conditionally render HomePage or ErrorScreen + }, + ), + ); + } +} -- cgit