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 defab80..5ef1e66 100644 --- a/Sources/dafl_project_flutter/android/app/src/main/AndroidManifest.xml +++ b/Sources/dafl_project_flutter/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,10 @@ + - @@ -19,12 +21,11 @@ while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" /> - - + + @@ -35,6 +36,7 @@ android:name="flutterEmbedding" android:value="2" /> - - + + + diff --git a/Sources/dafl_project_flutter/assets/images/playlist_icon.jpg b/Sources/dafl_project_flutter/assets/images/playlist_icon.jpg new file mode 100644 index 0000000..69b1b39 Binary files /dev/null and b/Sources/dafl_project_flutter/assets/images/playlist_icon.jpg differ diff --git a/Sources/dafl_project_flutter/lib/api/api.dart b/Sources/dafl_project_flutter/lib/api/api.dart index bd35eee..fd9dabe 100644 --- a/Sources/dafl_project_flutter/lib/api/api.dart +++ b/Sources/dafl_project_flutter/lib/api/api.dart @@ -3,8 +3,10 @@ import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; import 'package:dafl_project_flutter/main.dart'; +import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; import 'package:crypto/crypto.dart'; +import 'package:path_provider/path_provider.dart'; import 'dart:developer' as dev; import '../exceptions/api_exception.dart'; @@ -16,7 +18,7 @@ class Api { //for web api get redirectUri => 'https://daflmusic.000webhostapp.com/callback/'; final _scopes = - 'user-read-playback-state user-read-currently-playing user-read-recently-played playlist-modify-public'; + 'user-read-playback-state user-read-currently-playing user-read-recently-played playlist-modify-public ugc-image-upload'; late String _state; dynamic _codeVerifier; dynamic _codeChallenge; @@ -114,6 +116,7 @@ class Api { _setResponse(value) { int sc = value.statusCode; if (sc >= 300) { + dev.log(value.body.toString()); throw ApiException(sc); } _response = value; @@ -201,7 +204,9 @@ class Api { if (idPlaylist == null) { idPlaylist = await _createPlaylist(); } else { - if (await _isInPlaylist(idTrack, idPlaylist)) return; + if (await _isInPlaylist(idTrack, idPlaylist)) { + return; + } } var token = await _getAccessToken(); var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks', @@ -231,6 +236,7 @@ class Api { } _createPlaylist() async { + //create playlist var idUser = await MyApp.controller.currentUser.getIdSpotify(); var token = await _getAccessToken(); var url = Uri.https('api.spotify.com', 'v1/users/$idUser/playlists'); @@ -248,19 +254,28 @@ class Api { }))); var decodedResponse = jsonDecode(utf8.decode(_response.bodyBytes)) as Map; var idPlaylist = decodedResponse['id']; - url = Uri.https('api.spotify.com', 'v1/playlists/playlist_id/images'); - String imagePath = 'assets/images/icon_App.png'; - File imagefile = File(imagePath); - Uint8List imagebytes = await imagefile.readAsBytes(); - String base64string = base64.encode(imagebytes); + + //add image : problem in request, API doc does not explain how to give the image + /*var byteData = await rootBundle.load('assets/images/playlist_icon.jpg'); + var buffer = byteData.buffer.asUint8List(); + String base64Encode = base64 + .encode(buffer) + .replaceAll('+', '-') + .replaceAll('/', '_') + .replaceAll('=', ''); + dev.log(jsonEncode(base64Encode).toString()); + //dev.log(base64Encode); + //the request should contain a Base64 encoded JPEG image data, maximum payload size is 256 KB + url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/images'); _setResponse(await _client.put(url, headers: { 'Accept': 'application/json', 'Authorization': '$_tokenType $token', 'Content-Type': 'application/json' }, - body: base64string)); + body: jsonEncode(base64Encode))); decodedResponse = jsonDecode(utf8.decode(_response.bodyBytes)) as Map; + dev.log(decodedResponse.toString());*/ return idPlaylist; } diff --git a/Sources/dafl_project_flutter/lib/api/in_app_browser.dart b/Sources/dafl_project_flutter/lib/api/in_app_browser.dart index f7cccc5..c682e60 100644 --- a/Sources/dafl_project_flutter/lib/api/in_app_browser.dart +++ b/Sources/dafl_project_flutter/lib/api/in_app_browser.dart @@ -6,7 +6,7 @@ import '../main.dart'; class MyInAppBrowser extends InAppBrowser { var options = InAppBrowserClassOptions( crossPlatform: - InAppBrowserOptions(hideUrlBar: true, hideToolbarTop: true), + InAppBrowserOptions(hideUrlBar: true, hideToolbarTop: true), inAppWebViewGroupOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions(javaScriptEnabled: true))); @@ -27,8 +27,10 @@ class MyInAppBrowser extends InAppBrowser { if (url!.origin + url.path == MyApp.api.redirectUri) { try { await MyApp.api.requestUserAuthorization(url); - /*var id = await MyApp.api.getCurrentlyPlayingTrack(); - await MyApp.api.addToPLaylist(id);*/ //TODO : end the adding of playlist image + var id = await MyApp.api.getCurrentlyPlayingTrack(); + await MyApp.api + .addToPLaylist(id); + //TODO : end the adding of playlist image } on ApiException { // TODO : add notification to show that an error occured } finally { diff --git a/Sources/dafl_project_flutter/lib/main.dart b/Sources/dafl_project_flutter/lib/main.dart index 9184150..a8ee8cb 100644 --- a/Sources/dafl_project_flutter/lib/main.dart +++ b/Sources/dafl_project_flutter/lib/main.dart @@ -215,20 +215,18 @@ class CardProvider extends ChangeNotifier { decoration: BoxDecoration( boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.4), - offset: const Offset( - 0, - 0, - ), - blurRadius: 10.0, - spreadRadius: 2.0, - ), + color: Colors.black.withOpacity(0.4), + offset: const Offset( + 0, + 0, + ), + blurRadius: 10.0, + spreadRadius: 2.0), BoxShadow( - color: Colors.white.withOpacity(0.3), - offset: const Offset(0.0, 0.0), - blurRadius: 0.0, - spreadRadius: 0.0, - ), //BoxShadow//BoxShadow + color: Colors.white.withOpacity(0.3), + offset: const Offset(0.0, 0.0), + blurRadius: 0.0, + spreadRadius: 0.0) ], color: const Color(0xFF232123), borderRadius: const BorderRadius.only( diff --git a/Sources/dafl_project_flutter/pubspec.yaml b/Sources/dafl_project_flutter/pubspec.yaml index b309a65..7f9ec74 100644 --- a/Sources/dafl_project_flutter/pubspec.yaml +++ b/Sources/dafl_project_flutter/pubspec.yaml @@ -55,6 +55,7 @@ flutter: uses-material-design: true assets: - assets/images/ + - assets/images/playlist_icon.jpg - assets/fonts/ - assets/