diff --git a/Sources/dafl_project_flutter/android/app/src/main/AndroidManifest.xml b/Sources/dafl_project_flutter/android/app/src/main/AndroidManifest.xml index 9b5ec5f..b3767c7 100644 --- a/Sources/dafl_project_flutter/android/app/src/main/AndroidManifest.xml +++ b/Sources/dafl_project_flutter/android/app/src/main/AndroidManifest.xml @@ -32,5 +32,8 @@ - + + + + diff --git a/Sources/dafl_project_flutter/lib/api/api.dart b/Sources/dafl_project_flutter/lib/api/api.dart index da39adf..5e2ced2 100644 --- a/Sources/dafl_project_flutter/lib/api/api.dart +++ b/Sources/dafl_project_flutter/lib/api/api.dart @@ -1,17 +1,25 @@ +import 'dart:convert'; import 'dart:math'; +import 'package:http/http.dart' as http; class Api { var clientId = '7ceb49d874b9404492246027e4d68cf8'; + var clientSecret = '98f9cb960bf54ebbb9ad306e7ff919cb'; var redirectUri = 'https://daflmusic.000webhostapp.com/callback/'; var state; - var scopes = 'user-read-private'; - var url; - + String scopes = 'user-read-playback-state user-read-currently-playing'; var code; + var urlAuthorize; + String? access_token; + String token_type = 'Bearer '; + int? expires_in; + String? refresh_token; + + var client = http.Client(); Api() { state = generateRandomString(); - url = Uri.https('accounts.spotify.com', 'authorize', { + urlAuthorize = Uri.https('accounts.spotify.com', 'authorize', { 'client_id': clientId, 'response_type': 'code', 'redirect_uri': redirectUri, @@ -21,13 +29,42 @@ class Api { }); } - verifyLogIn(Uri url) { - if (verifyState(url.queryParameters['state'])) { + requestUserAuthorization(Uri url) { + if (url.queryParameters['state'] == state.toString()) { code = url.queryParameters['code']; + requestAccessToken(); } + // TODO : implement the else } - bool verifyState(String? newState) => state == newState; + requestAccessToken() async { + var urlToken = Uri.https('accounts.spotify.com', 'api/token', { + 'code': code, + 'redirect_uri': redirectUri, + 'grant_type': 'authorization_code' + }); + String credentials = "$clientId:$clientSecret"; + String encodedLogs = base64.encode(utf8.encode(credentials)); + var response = await client.post(urlToken, headers: { + 'Authorization': 'Basic $encodedLogs', + 'Content-Type': 'application/x-www-form-urlencoded' + }); + var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map; + access_token = decodedResponse['access_token']; + expires_in = decodedResponse['expires_in']; + refresh_token = decodedResponse['refresh_token']; + getCurrentlyPlayingTrack(); + } + + getCurrentlyPlayingTrack() async { + var url = + Uri.https('api.spotify.com', 'v1/me/player/currently-playing', {}); + var response = await client.post(url, headers: { + 'Authorization': '$token_type $access_token', + 'Content-Type': 'application/json' + }); + // Problem while trying to get body + } // for state value String generateRandomString() { diff --git a/Sources/dafl_project_flutter/lib/api/w_in_app_browser.dart b/Sources/dafl_project_flutter/lib/api/in_app_browser.dart similarity index 53% rename from Sources/dafl_project_flutter/lib/api/w_in_app_browser.dart rename to Sources/dafl_project_flutter/lib/api/in_app_browser.dart index 9a76215..0a84200 100644 --- a/Sources/dafl_project_flutter/lib/api/w_in_app_browser.dart +++ b/Sources/dafl_project_flutter/lib/api/in_app_browser.dart @@ -1,7 +1,6 @@ -import 'dart:convert'; import 'dart:io'; +import 'package:dafl_project_flutter/main.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; -import './api.dart'; class MyInAppBrowser extends InAppBrowser { var options = InAppBrowserClassOptions( @@ -10,11 +9,10 @@ class MyInAppBrowser extends InAppBrowser { inAppWebViewGroupOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions(javaScriptEnabled: true))); - Api api; - - MyInAppBrowser(this.api) { + MyInAppBrowser() { _debugBrowser(); - launchBrowser(); + openUrlRequest( + urlRequest: URLRequest(url: MyApp.api.urlAuthorize), options: options); } _debugBrowser() async { @@ -23,30 +21,11 @@ class MyInAppBrowser extends InAppBrowser { } } - launchBrowser() { - openUrlRequest(urlRequest: URLRequest(url: api.url), options: options); - } - - @override - Future onBrowserCreated() async {} - @override Future onLoadStart(url) async { - if (url!.origin + url!.path == api.redirectUri) { - api.verifyLogIn(url); + if (url!.origin + url.path == MyApp.api.redirectUri) { + MyApp.api.requestUserAuthorization(url); + close(); } - close(); } - - @override - Future onLoadStop(url) async {} - - @override - void onLoadError(url, code, message) {} - - @override - void onProgressChanged(progress) {} - - @override - void onExit() {} } diff --git a/Sources/dafl_project_flutter/lib/main.dart b/Sources/dafl_project_flutter/lib/main.dart index f88c899..3232726 100644 --- a/Sources/dafl_project_flutter/lib/main.dart +++ b/Sources/dafl_project_flutter/lib/main.dart @@ -8,12 +8,14 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:rive/rive.dart'; +import 'api/api.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { + static Api api = Api(); // This widget is the root of your application. @override Widget build(BuildContext context) { diff --git a/Sources/dafl_project_flutter/lib/views/pages/sign_up/p_sign_up.dart b/Sources/dafl_project_flutter/lib/views/pages/sign_up/p_sign_up.dart index 5cf07cb..22afa07 100644 --- a/Sources/dafl_project_flutter/lib/views/pages/sign_up/p_sign_up.dart +++ b/Sources/dafl_project_flutter/lib/views/pages/sign_up/p_sign_up.dart @@ -1,13 +1,12 @@ import 'package:dafl_project_flutter/api/api.dart'; +import 'package:dafl_project_flutter/main.dart'; import 'package:flutter/material.dart'; import 'package:page_transition/page_transition.dart'; -import '../../../api/w_in_app_browser.dart'; +import '../../../api/in_app_browser.dart'; import '../home/p_home.dart'; import '../sign_in/p_sign_in.dart'; class SignUpPage extends StatefulWidget { - static Api api = Api(); - const SignUpPage({Key? key}) : super(key: key); @override @@ -223,7 +222,7 @@ class _SignUpPageState extends State { ), // background// foreground ), onPressed: () { - MyInAppBrowser(SignUpPage.api); + MyInAppBrowser(); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/Sources/dafl_project_flutter/pubspec.lock b/Sources/dafl_project_flutter/pubspec.lock index 2c97b71..a4b2a00 100644 --- a/Sources/dafl_project_flutter/pubspec.lock +++ b/Sources/dafl_project_flutter/pubspec.lock @@ -171,7 +171,7 @@ packages: source: hosted version: "0.15.1" http: - dependency: transitive + dependency: "direct main" description: name: http url: "https://pub.dartlang.org" diff --git a/Sources/dafl_project_flutter/pubspec.yaml b/Sources/dafl_project_flutter/pubspec.yaml index 8298131..cd4b6a5 100644 --- a/Sources/dafl_project_flutter/pubspec.yaml +++ b/Sources/dafl_project_flutter/pubspec.yaml @@ -21,6 +21,7 @@ dependencies: fluttertoast: ^8.1.1 vibration: ^1.7.6 flutter_inappwebview: ^5.7.1 + http: ^0.13.5 dev_dependencies: flutter_test: