@@ -17,12 +17,9 @@ class WallpaperModel extends SafeChangeNotifier {
1717 static const _primaryColorKey = 'primary-color' ;
1818 static const _secondaryColorKey = 'secondary-color' ;
1919
20- //TODO: Sync the locale of the image with the device's locale
21- static const String _bingImageAddress =
22- 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US' ;
23- static const String _bingAddress = 'http://www.bing.com' ;
24-
2520 WallpaperMode wallpaperMode = WallpaperMode .custom;
21+ ImageOfTheDayProvider imageOfTheDayProvider = ImageOfTheDayProvider .bing;
22+
2623
2724 final String ? _userWallpapersDir =
2825 Platform .environment['HOME' ]! + '/.local/share/backgrounds/' ;
@@ -132,7 +129,7 @@ class WallpaperModel extends SafeChangeNotifier {
132129 }
133130 break ;
134131 case WallpaperMode .imageOfTheDay:
135- refreshBingWallpaper ( );
132+ setUrlWallpaperProvider (imageOfTheDayProvider );
136133 break ;
137134 }
138135
@@ -144,31 +141,63 @@ class WallpaperModel extends SafeChangeNotifier {
144141 pictureUri = list.first;
145142 }
146143
147- static Future <String > getBingImageUrl () async {
148- http.Response imageMetadataResponse =
149- await http.get (Uri .parse (_bingImageAddress));
150- return _bingAddress +
151- json.decode (imageMetadataResponse.body)['images' ][0 ]['url' ];
152- }
144+ void refreshUrlWallpaper (){
145+ setUrlWallpaperProvider (imageOfTheDayProvider);
146+ }
147+
148+ Future <void > setUrlWallpaperProvider (
149+ ImageOfTheDayProvider newImageOfTheDayProvider) async {
150+ //Set the new provider
151+ imageOfTheDayProvider = newImageOfTheDayProvider;
153152
154- Future < void > refreshBingWallpaper () async {
153+ //Load the user's Documents Directory to store the downloaded wallpapers
155154 final Directory directory = await getApplicationDocumentsDirectory ();
155+ final file = File ('${directory .path }/${imageOfTheDayProvider .name }.jpeg' );
156+
157+ final Map providers = {
158+ 'bing' : {
159+ 'apiUrl' :
160+ 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US' ,
161+ 'getImageUrl' : (jsonData) {
162+ return 'http://www.bing.com' +
163+ json.decode (jsonData.body)['images' ][0 ]['url' ];
164+ }
165+ },
166+ 'nasa' : {
167+ 'apiUrl' :
168+ 'https://api.nasa.gov/planetary/apod?api_key=PdQXYMNV2kT9atjMjNI9gbzLqe7qF6TcEHXhexXg' , //The api uses my own api_key
169+ 'getImageUrl' : (jsonData) {
170+ return json.decode (jsonData.body)['url' ];
171+ }
172+ },
173+ };
174+
175+ //Get the url of the day using the apiUrl in the providers Map
176+ Future <String > getImageUrl () async {
177+ Map currentProvider = providers[imageOfTheDayProvider.name];
178+ http.Response imageMetadataResponse =
179+ await http.get (Uri .parse (currentProvider['apiUrl' ]));
180+ return currentProvider['getImageUrl' ](imageMetadataResponse);
181+ }
156182
157- final file = File ( '${ directory . path }/bing.jpeg' );
183+ String imageUrl = await getImageUrl ( );
158184
159185 // Refetch if the image doesn't exist or the current image is older than a day
160186 bool shouldRefetch =
161187 ! file.existsSync () || file.lastModifiedSync ().day != DateTime .now ().day;
162188
163189 if (shouldRefetch) {
164- var imageResponse = await http.get (Uri .parse (await getBingImageUrl () ));
190+ var imageResponse = await http.get (Uri .parse (imageUrl ));
165191 await file.writeAsBytes (imageResponse.bodyBytes);
166192 }
167193
168- pictureUri = '${directory .path }/bing.jpeg' ;
194+ //Set the wallpaper to the downloaded image path
195+ pictureUri = file.path;
169196 }
170197}
171198
172199enum ColorShadingType { solid, vertical, horizontal }
173200
174201enum WallpaperMode { solid, custom, imageOfTheDay }
202+
203+ enum ImageOfTheDayProvider { bing, nasa,}
0 commit comments