diff --git a/packages/ada_chat_flutter/CHANGELOG.md b/packages/ada_chat_flutter/CHANGELOG.md index 83b1aa0d..6443e67e 100644 --- a/packages/ada_chat_flutter/CHANGELOG.md +++ b/packages/ada_chat_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.4 + +- Add host and isHttp fields to the browser controller. + ## 0.0.3 - Add browserSettings with webview page builder. diff --git a/packages/ada_chat_flutter/example/lib/main.dart b/packages/ada_chat_flutter/example/lib/main.dart index 8e7da4e7..35c63144 100644 --- a/packages/ada_chat_flutter/example/lib/main.dart +++ b/packages/ada_chat_flutter/example/lib/main.dart @@ -13,6 +13,18 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) => MaterialApp( + theme: ThemeData.from( + colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.orange), + useMaterial3: false, + ), + darkTheme: ThemeData.from( + colorScheme: ColorScheme.fromSwatch( + primarySwatch: Colors.orange, + brightness: Brightness.dark, + ), + useMaterial3: false, + ), + themeMode: ThemeMode.system, onGenerateRoute: (route) { switch (route.name) { case '/ada': diff --git a/packages/ada_chat_flutter/example/lib/screens/ada_chat_screen.dart b/packages/ada_chat_flutter/example/lib/screens/ada_chat_screen.dart index 3a57c408..f3e15daa 100644 --- a/packages/ada_chat_flutter/example/lib/screens/ada_chat_screen.dart +++ b/packages/ada_chat_flutter/example/lib/screens/ada_chat_screen.dart @@ -62,10 +62,13 @@ class _AdaChatScreenState extends State { setState(() => _progress = 0); }, browserSettings: BrowserSettings( - pageBuilder: (context, browser, controller) => - PageWithControls( - controller: controller, - child: browser, + pageBuilder: (context, browser, controller) => Scaffold( + body: SafeArea( + child: PageWithControls( + controller: controller, + child: browser, + ), + ), ), ), onLoaded: (data) => diff --git a/packages/ada_chat_flutter/example/lib/webview_controls/page_controls.dart b/packages/ada_chat_flutter/example/lib/webview_controls/page_controls.dart index c90df505..5021db68 100644 --- a/packages/ada_chat_flutter/example/lib/webview_controls/page_controls.dart +++ b/packages/ada_chat_flutter/example/lib/webview_controls/page_controls.dart @@ -56,10 +56,30 @@ class _PageControlsState extends State { onPressed: widget.controller.reload, ), Expanded( - child: Text( - widget.controller.title, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.bodySmall, + child: Column( + children: [ + Text( + widget.controller.title, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodySmall, + ), + Row( + children: [ + Icon( + widget.controller.isHttps + ? Icons.lock + : Icons.lock_open, + size: 10, + ), + const SizedBox(width: 8), + Text( + widget.controller.host, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + ], ), ), IconButton( diff --git a/packages/ada_chat_flutter/lib/src/ada_web_view.dart b/packages/ada_chat_flutter/lib/src/ada_web_view.dart index 5d90d3cb..f2f2a35a 100644 --- a/packages/ada_chat_flutter/lib/src/ada_web_view.dart +++ b/packages/ada_chat_flutter/lib/src/ada_web_view.dart @@ -308,8 +308,9 @@ console.log("adaSettings: " + JSON.stringify(window.adaSettings)); } unawaited( - showDialog( + showAdaptiveDialog( context: context, + barrierColor: Colors.transparent, builder: (context) => CustomizedWebView( url: url, browserSettings: widget.browserSettings, diff --git a/packages/ada_chat_flutter/lib/src/browser_controller.dart b/packages/ada_chat_flutter/lib/src/browser_controller.dart index 5443a942..f5f49485 100644 --- a/packages/ada_chat_flutter/lib/src/browser_controller.dart +++ b/packages/ada_chat_flutter/lib/src/browser_controller.dart @@ -4,6 +4,8 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class BrowserController extends ChangeNotifier { InAppWebViewController? _controller; String _title = ''; + String _host = ''; + bool _isHttps = true; bool _backIsAvailable = false; bool _forwardIsAvailable = false; @@ -22,6 +24,20 @@ class BrowserController extends ChangeNotifier { notifyListeners(); } + String get host => _host; + + void setHost(String host) { + _host = host; + notifyListeners(); + } + + bool get isHttps => _isHttps; + + void setIsHttps(bool isHttps) { + _isHttps = isHttps; + notifyListeners(); + } + bool get backIsAvailable => _backIsAvailable; void setBackIsAvailable(bool isAvailable) { diff --git a/packages/ada_chat_flutter/lib/src/customized_web_view.dart b/packages/ada_chat_flutter/lib/src/customized_web_view.dart index 75f8bf74..d1fffc3f 100644 --- a/packages/ada_chat_flutter/lib/src/customized_web_view.dart +++ b/packages/ada_chat_flutter/lib/src/customized_web_view.dart @@ -51,6 +51,11 @@ class _CustomizedWebViewState extends State { final title = await webViewController.getTitle(); widget.browserSettings?.control?.setTitle(title ?? ''); + final webUri = await webViewController.getUrl(); + widget.browserSettings?.control?.setHost(webUri?.host ?? ''); + widget.browserSettings?.control + ?.setIsHttps(webUri?.isScheme('https') ?? false); + final canGoBack = await webViewController.canGoBack(); widget.browserSettings?.control?.setBackIsAvailable(canGoBack); diff --git a/packages/ada_chat_flutter/pubspec.yaml b/packages/ada_chat_flutter/pubspec.yaml index cca7ab93..1ceed81a 100644 --- a/packages/ada_chat_flutter/pubspec.yaml +++ b/packages/ada_chat_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: ada_chat_flutter description: Flutter implementation of Ada chat -version: 0.0.3 +version: 0.0.4 environment: sdk: '>=3.0.0 <4.0.0' diff --git a/packages/ada_chat_flutter/test/src/browser_controller_test.dart b/packages/ada_chat_flutter/test/src/browser_controller_test.dart index 2b4e5173..19f63034 100644 --- a/packages/ada_chat_flutter/test/src/browser_controller_test.dart +++ b/packages/ada_chat_flutter/test/src/browser_controller_test.dart @@ -42,6 +42,19 @@ void main() { expect(browserController.title, newTitle); }); + test('host getter returns correct value', () { + const newHost = 'New Host'; + browserController.setHost(newHost); + expect(browserController.host, newHost); + }); + + test('isHttps getter returns correct value', () { + browserController.setIsHttps(false); + expect(browserController.isHttps, false); + browserController.setIsHttps(true); + expect(browserController.isHttps, true); + }); + test('backIsAvailable getter returns correct value', () { browserController.setBackIsAvailable(true); expect(browserController.backIsAvailable, true); @@ -57,10 +70,12 @@ void main() { browserController.addListener(() => listenerCallCount++); browserController.setTitle('New Title'); + browserController.setHost('New Host'); + browserController.setIsHttps(false); browserController.setBackIsAvailable(true); browserController.setForwardIsAvailable(false); - expect(listenerCallCount, 3); + expect(listenerCallCount, 5); }); }); }