diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d045dd5..2285b36 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -48,20 +48,6 @@ - - - - - - - - - - - - LogViewPage(title: "Log"), "/whats-new": (context) => WhatsNewPage(), - "/test": (_) => new WebviewScaffold( - url: "https://www.google.com", + "/auth": (context) => new WebviewScaffold( + url: "${ConnectionManager().oauthUrl}", appBar: new AppBar( - title: new Text("Widget webview"), + leading: IconButton( + icon: Icon(Icons.help), + onPressed: () => Launcher.launchURLInCustomTab(context: context, url: "http://ha-client.homemade.systems/docs#authentication") + ), + title: new Text("Login with HA"), + actions: [ + FlatButton( + child: Text("Manual", style: TextStyle(color: Colors.white)), + onPressed: () { + eventBus.fire(ShowPageEvent(path: "/connection-settings", goBackFirst: true)); + }, + ) + ], ), ) }, diff --git a/lib/managers/auth_manager.class.dart b/lib/managers/auth_manager.class.dart index f8ab80a..6069fb7 100644 --- a/lib/managers/auth_manager.class.dart +++ b/lib/managers/auth_manager.class.dart @@ -9,46 +9,37 @@ class AuthManager { } AuthManager._internal(); - StreamSubscription deepLinksSubscription; Future start({String oauthUrl}) { Completer completer = Completer(); - deepLinksSubscription?.cancel(); - deepLinksSubscription = getUriLinksStream().listen((Uri uri) { - Logger.d("[LINKED AUTH] We got something private"); - _getTempToken(oauthUrl, uri.queryParameters["code"]) - .then((tempToken) => completer.complete(tempToken)) - .catchError((_){ - completer.completeError(HAError("Auth error")); - }); - }, onError: (err) { - Logger.e("[LINKED AUTH] Error handling linked auth: $e"); - completer.completeError(HAError("Auth error")); - }); - Logger.d("Launching OAuth"); - eventBus.fire(StartAuthEvent(oauthUrl, true)); - return completer.future; - } - - Future _getTempToken(String oauthUrl,String authCode) { - Completer completer = Completer(); - ConnectionManager().sendHTTPPost( - endPoint: "/auth/token", - contentType: "application/x-www-form-urlencoded", - includeAuthHeader: false, - data: "grant_type=authorization_code&code=$authCode&client_id=${Uri.encodeComponent('http://ha-client.homemade.systems')}" + final flutterWebviewPlugin = new FlutterWebviewPlugin(); + flutterWebviewPlugin.onUrlChanged.listen((String url) { + if (url.startsWith("http://ha-client.homemade.systems/service/auth_callback.html")) { + Logger.d("url=$url"); + String authCode = url.split("=")[1]; + Logger.d("authCode=$authCode"); + Logger.d("We have auth code. Getting temporary access token..."); + ConnectionManager().sendHTTPPost( + endPoint: "/auth/token", + contentType: "application/x-www-form-urlencoded", + includeAuthHeader: false, + data: "grant_type=authorization_code&code=$authCode&client_id=${Uri.encodeComponent('http://ha-client.homemade.systems')}" ).then((response) { Logger.d("Got temp token"); String tempToken = json.decode(response)['access_token']; + Logger.d("Closing webview..."); eventBus.fire(StartAuthEvent(oauthUrl, false)); completer.complete(tempToken); }).catchError((e) { - //flutterWebviewPlugin.close(); Logger.e("Error getting temp token: ${e.toString()}"); eventBus.fire(StartAuthEvent(oauthUrl, false)); completer.completeError(HAError("Error getting temp token")); - }); + }).whenComplete(() => flutterWebviewPlugin.close()); + } + }); + Logger.d("Launching OAuth"); + eventBus.fire(StartAuthEvent(oauthUrl, true)); return completer.future; - } + } } \ No newline at end of file diff --git a/lib/managers/connection_manager.class.dart b/lib/managers/connection_manager.class.dart index 912b5f6..a78738b 100644 --- a/lib/managers/connection_manager.class.dart +++ b/lib/managers/connection_manager.class.dart @@ -61,7 +61,7 @@ class ConnectionManager { oauthUrl = "$httpWebHost/auth/authorize?client_id=${Uri.encodeComponent( 'http://ha-client.homemade.systems')}&redirect_uri=${Uri .encodeComponent( - 'haclient://auth')}"; + 'http://ha-client.homemade.systems/service/auth_callback.html')}"; settingsLoaded = true; } catch (e) { completer.completeError(HAError("Error reading login details", actions: [HAErrorAction.tryAgain(type: HAErrorActionType.FULL_RELOAD), HAErrorAction.loginAgain()])); diff --git a/lib/pages/main.page.dart b/lib/pages/main.page.dart index 3159b2c..61901a4 100644 --- a/lib/pages/main.page.dart +++ b/lib/pages/main.page.dart @@ -239,6 +239,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker _showOAuth(); } else { _preventAppRefresh = false; + Navigator.of(context).pop(); } }); } @@ -252,9 +253,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker void _showOAuth() { _preventAppRefresh = true; - Launcher.launchURLInCustomTab( - url: ConnectionManager().oauthUrl - ); + Navigator.of(context).pushNamed("/auth", arguments: {"url": ConnectionManager().oauthUrl}); } _setErrorState(HAError e) { @@ -436,20 +435,6 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker }, ), Divider(), - new ListTile( - leading: Icon(Icons.build), - title: Text("TEST"), - onTap: () { - Navigator.of(context).pop(); - final flutterWebviewPlugin = new FlutterWebviewPlugin(); - flutterWebviewPlugin.onUrlChanged.listen((String url) { - Logger.d("[Webview] URL Changed: $url"); - }); - Logger.d("[Webview] Listener attached"); - Navigator.of(context).pushNamed("/test"); - }, - ), - Divider(), new ListTile( leading: Icon(Icons.help), title: Text("Help"), diff --git a/pubspec.yaml b/pubspec.yaml index 0163755..4347ec7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,6 @@ dependencies: flutter_custom_tabs: ^0.6.0 flutter_webview_plugin: ^0.3.10+1 firebase_messaging: ^5.1.6 - uni_links: ^0.2.0 flutter_secure_storage: ^3.3.1+1 device_info: ^0.4.0+3 flutter_local_notifications: ^0.8.4