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/