diff --git a/lib/main.dart b/lib/main.dart index 5d6deb9..bfb6b1d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,7 +16,8 @@ import 'package:http/http.dart' as http; import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_custom_tabs/flutter_custom_tabs.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:hive/hive.dart'; +import 'package:hive_flutter/hive_flutter.dart'; import 'package:device_info/device_info.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; import 'plugins/dynamic_multi_column_layout.dart'; @@ -184,7 +185,8 @@ void main() async { }; WidgetsFlutterBinding.ensureInitialized(); - AppSettings().loadAppTheme(); + await AppSettings().loadAppTheme(); + await Hive.initFlutter(); runZoned(() { runApp(new HAClientApp( diff --git a/lib/managers/app_settings.dart b/lib/managers/app_settings.dart index 3b7d030..41cb0f7 100644 --- a/lib/managers/app_settings.dart +++ b/lib/managers/app_settings.dart @@ -2,6 +2,10 @@ part of '../main.dart'; class AppSettings { + static const DEFAULT_HIVE_BOX = 'defaultSettingsBox'; + + static const AUTH_TOKEN_KEY = 'llt'; + static final AppSettings _instance = AppSettings._internal(); factory AppSettings() { @@ -37,6 +41,7 @@ class AppSettings { Future load(bool full) async { if (full) { + await Hive.openBox(DEFAULT_HIVE_BOX); Logger.d('Loading settings...'); SharedPreferences prefs = await SharedPreferences.getInstance(); _domain = prefs.getString('hassio-domain'); @@ -52,18 +57,11 @@ class AppSettings { locationUpdateInterval = Duration(minutes: prefs.getInt("location-interval") ?? defaultLocationUpdateIntervalMinutes); locationTrackingEnabled = prefs.getBool("location-enabled") ?? false; - Logger.d('Done. $_domain:$_port'); - try { - final storage = new FlutterSecureStorage(); - longLivedToken = await storage.read(key: "hacl_llt"); - Logger.d("Long-lived token read successful"); - oauthUrl = "$httpWebHost/auth/authorize?client_id=${Uri.encodeComponent( - 'https://ha-client.app')}&redirect_uri=${Uri - .encodeComponent( - 'https://ha-client.app/service/auth_callback.html')}"; - } catch (e, stacktrace) { - Logger.e("Error reading secure storage: $e", stacktrace: stacktrace); - } + longLivedToken = Hive.box(DEFAULT_HIVE_BOX).get(AUTH_TOKEN_KEY); + oauthUrl = "$httpWebHost/auth/authorize?client_id=${Uri.encodeComponent( + 'https://ha-client.app')}&redirect_uri=${Uri + .encodeComponent( + 'https://ha-client.app/service/auth_callback.html')}"; } } @@ -103,25 +101,13 @@ class AppSettings { Future clearTokens() async { longLivedToken = null; tempToken = null; - try { - final storage = new FlutterSecureStorage(); - await storage.delete(key: "hacl_llt"); - } catch(e, stacktrace) { - Logger.e("Error clearing tokens: $e", stacktrace: stacktrace); - } + Hive.box(DEFAULT_HIVE_BOX).delete(AUTH_TOKEN_KEY); } Future saveLongLivedToken(token) async { longLivedToken = token; tempToken = null; - try { - final storage = new FlutterSecureStorage(); - await storage.write(key: "hacl_llt", value: "$longLivedToken"); - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setBool("oauth-used", true); - } catch(e, stacktrace) { - Logger.e("Error saving long-lived token: $e", stacktrace: stacktrace); - } + Hive.box(DEFAULT_HIVE_BOX).put(AUTH_TOKEN_KEY, longLivedToken); } bool isNotConfigured() { diff --git a/lib/pages/main/main.page.dart b/lib/pages/main/main.page.dart index 1498615..a3a6b83 100644 --- a/lib/pages/main/main.page.dart +++ b/lib/pages/main/main.page.dart @@ -654,6 +654,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker @override void dispose() { WidgetsBinding.instance.removeObserver(this); + Hive.close(); //final flutterWebviewPlugin = new FlutterWebviewPlugin(); //flutterWebviewPlugin.dispose(); _viewsTabController?.dispose(); diff --git a/lib/popups.dart b/lib/popups.dart index f367225..ce397b5 100644 --- a/lib/popups.dart +++ b/lib/popups.dart @@ -73,11 +73,9 @@ class TokenLoginPopup extends Popup { padding: EdgeInsets.all(20), child: TextFormField( onSaved: (newValue) { - final storage = new FlutterSecureStorage(); - storage.write(key: "hacl_llt", value: newValue.trim()).then((_) { - Navigator.of(context).pop(); - eventBus.fire(SettingsChangedEvent(true)); - }); + Hive.box(AppSettings.DEFAULT_HIVE_BOX).put(AppSettings.AUTH_TOKEN_KEY, newValue.trim()); + Navigator.of(context).pop(); + eventBus.fire(SettingsChangedEvent(true)); }, decoration: InputDecoration( hintText: 'Please enter long-lived token', diff --git a/pubspec.yaml b/pubspec.yaml index 9f37468..8640f96 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,8 @@ dependencies: flutter_custom_tabs: ^0.6.0 flutter_webview_plugin: ^0.3.10+1 webview_flutter: ^0.3.19+7 - flutter_secure_storage: ^3.3.3 + hive: ^1.4.1+1 + hive_flutter: ^0.3.0+2 device_info: ^0.4.1+4 geolocator: ^5.3.1 workmanager: ^0.2.2