diff --git a/lib/common.dart b/lib/common.dart index a6db4bec0..ae2694cd6 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -9,6 +9,7 @@ var isIOS = false; var isWeb = false; var isDesktop = false; var version = ""; +int androidVersion = 0; typedef F = String Function(String); typedef FMethod = String Function(String, dynamic); diff --git a/lib/main.dart b/lib/main.dart index 969e051a6..32b8cdf8a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,20 +18,26 @@ Future main() async { } class App extends StatelessWidget { - @override Widget build(BuildContext context) { final analytics = FirebaseAnalytics(); - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: FFI.ffiModel), - ChangeNotifierProvider.value(value: FFI.imageModel), - ChangeNotifierProvider.value(value: FFI.cursorModel), - ChangeNotifierProvider.value(value: FFI.canvasModel), - ChangeNotifierProvider.value(value: FFI.serverModel), + final providers = [ + ChangeNotifierProvider.value(value: FFI.ffiModel), + ChangeNotifierProvider.value(value: FFI.imageModel), + ChangeNotifierProvider.value(value: FFI.cursorModel), + ChangeNotifierProvider.value(value: FFI.canvasModel), + ]; + if (!isWeb) { + providers.addAll([ ChangeNotifierProvider.value(value: FFI.chatModel), ChangeNotifierProvider.value(value: FFI.fileModel), - ], + ]); + if (isAndroid) { + providers.add(ChangeNotifierProvider.value(value: FFI.serverModel)); + } + } + return MultiProvider( + providers: providers, child: MaterialApp( navigatorKey: globalKey, debugShowCheckedModeBanner: false, @@ -40,7 +46,7 @@ class App extends StatelessWidget { primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), - home: HomePage(), + home: isWeb ? WebHomePage() : HomePage(), navigatorObservers: [ FirebaseAnalyticsObserver(analytics: analytics), ], diff --git a/lib/models/chat_model.dart b/lib/models/chat_model.dart index 854507114..1b8be60f1 100644 --- a/lib/models/chat_model.dart +++ b/lib/models/chat_model.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hbb/pages/chat_page.dart'; import 'model.dart'; -import 'native_model.dart'; class ChatModel with ChangeNotifier { // -1作为客户端模式的id,客户端模式下此id唯一 @@ -51,12 +50,12 @@ class ChatModel with ChangeNotifier { if (message.text != null && message.text!.isNotEmpty) { _messages[_currentID]?.add(message); if (_currentID == clientModeID) { - PlatformFFI.setByName("chat_client_mode", message.text!); + FFI.setByName("chat_client_mode", message.text!); } else { final msg = Map() ..["id"] = _currentID ..["text"] = message.text!; - PlatformFFI.setByName("chat_server_mode", jsonEncode(msg)); + FFI.setByName("chat_server_mode", jsonEncode(msg)); } } notifyListeners(); diff --git a/lib/models/native_model.dart b/lib/models/native_model.dart index 342c99df5..781a5cabe 100644 --- a/lib/models/native_model.dart +++ b/lib/models/native_model.dart @@ -24,7 +24,6 @@ class PlatformFFI { static Pointer? _lastRgbaFrame; static String _dir = ''; static String _homeDir = ''; - static int? _androidVersion; static F2? _getByName; static F3? _setByName; static F4? _freeRgba; @@ -49,8 +48,6 @@ class PlatformFFI { return packageInfo.version; } - static int? get androidVersion => _androidVersion; - static String getByName(String name, [String arg = '']) { if (_getByName == null) return ''; var a = name.toNativeUtf8(); @@ -97,7 +94,7 @@ class PlatformFFI { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; name = '${androidInfo.brand}-${androidInfo.model}'; id = androidInfo.id.hashCode.toString(); - _androidVersion = androidInfo.version.sdkInt; + androidVersion = androidInfo.version.sdkInt; } else { IosDeviceInfo iosInfo = await deviceInfo.iosInfo; name = iosInfo.utsname.machine; diff --git a/lib/models/server_model.dart b/lib/models/server_model.dart index b9e5f07d7..b7abb291d 100644 --- a/lib/models/server_model.dart +++ b/lib/models/server_model.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:flutter_hbb/models/native_model.dart'; import '../common.dart'; import '../pages/server_page.dart'; import 'model.dart'; @@ -71,7 +70,7 @@ class ServerModel with ChangeNotifier { toggleInput(){ if(_inputOk){ - PlatformFFI.invokeMethod("stop_input"); + FFI.invokeMethod("stop_input"); }else{ showInputWarnAlert(); } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index ec2d5c27c..f84f0775e 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -20,12 +20,20 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { var _selectedIndex = 0; - final List _pages = [ - ConnectionPage(), - chatPage, - ServerPage(), - SettingsPage() - ]; + final List _pages = []; + + @override + void initState() { + super.initState(); + _pages.addAll([ + ConnectionPage(), + chatPage, + ]); + if(isAndroid){ + _pages.add(ServerPage()); + } + _pages.add(SettingsPage()); + } @override Widget build(BuildContext context) { @@ -58,7 +66,7 @@ class _HomePageState extends State { unselectedItemColor: MyTheme.darkGray, onTap: (index) => setState(() { // close chat overlay when go chat page - if(index == 1 && _selectedIndex!=index){ + if (index == 1 && _selectedIndex != index) { hideChatIconOverlay(); hideChatWindowOverlay(); } @@ -69,3 +77,20 @@ class _HomePageState extends State { )); } } + +class WebHomePage extends StatelessWidget { + final connectionPage = ConnectionPage(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyTheme.grayBg, + appBar: AppBar( + centerTitle: true, + title: Text("RustDesk"), + actions: connectionPage.appBarActions, + ), + body: connectionPage, + ); + } +} diff --git a/lib/pages/server_page.dart b/lib/pages/server_page.dart index 3acc2951c..1e98e2db6 100644 --- a/lib/pages/server_page.dart +++ b/lib/pages/server_page.dart @@ -3,7 +3,6 @@ import 'package:flutter_hbb/models/model.dart'; import 'package:provider/provider.dart'; import '../common.dart'; -import '../models/native_model.dart'; import '../models/server_model.dart'; import 'home_page.dart'; import '../models/model.dart'; @@ -156,7 +155,6 @@ class _PermissionCheckerState extends State { @override Widget build(BuildContext context) { final serverModel = Provider.of(context); - final androidVersion = PlatformFFI.androidVersion ?? 0; final hasAudioPermission = androidVersion>=30; return PaddingCard( title: translate("Configuration Permissions"),