Procházet zdrojové kódy

Added function for returning Flickr recent photos

Ana Sekuloski před 3 roky
rodič
revize
41f0096252

+ 4 - 0
app/src/main/java/com/livelike/livelikeandroidchallenge/FlickrServiceViewModel.kt

@@ -17,4 +17,8 @@ class FlickrServiceViewModel : ViewModel() {
         _photos.postValue(Flickr.search(searchQuery))
     }
 
+    fun getRecentPhotos() = viewModelScope.launch {
+        _photos.postValue(Flickr.getRecentPhotos())
+    }
+
 }

+ 1 - 1
app/src/main/java/com/livelike/livelikeandroidchallenge/MainActivity.kt

@@ -19,7 +19,7 @@ class MainActivity : AppCompatActivity() {
         }
 
         lifecycleScope.launchWhenCreated {
-            viewModel.searchFlickrPhotos(null)
+            viewModel.getRecentPhotos()
         }
     }
 }

+ 8 - 0
flickersearchlibrary/src/main/java/com/livelike/flickersearchlibrary/Flickr.kt

@@ -1,5 +1,6 @@
 package com.livelike.flickersearchlibrary
 
+import com.livelike.flickersearchlibrary.api.model.Photo
 import com.livelike.flickersearchlibrary.di.Dependencies
 import com.livelike.flickersearchlibrary.service.FlickrService
 import org.koin.java.KoinJavaComponent.inject
@@ -24,4 +25,11 @@ object Flickr {
      */
     suspend fun search(searchQuery: String?) = flickrService.search(searchQuery)
 
+    /**
+     * Retrieves recently published photos on Flickr.
+     *
+     * @return [List] of recently published photos on Flickr.
+     */
+    suspend fun getRecentPhotos() = flickrService.getRecentPhotos()
+
 }

+ 8 - 0
flickersearchlibrary/src/main/java/com/livelike/flickersearchlibrary/api/FlickrApi.kt

@@ -19,4 +19,12 @@ internal interface FlickrApi {
         @Query(QUERY_FORMAT) format: String = JSON_FORMAT,
         @Query(QUERY_NO_JSON_CALLBACK) noJsonCallback: Boolean = NO_JSON_CALLBACK,
     ): Response<SearchResponse>
+
+    @GET(".")
+    suspend fun getRecent(
+        @Query(QUERY_METHOD) method: String = RECENT_IMAGES_METHOD,
+        @Query(QUERY_API_KEY) apiKey: String = DEFAULT_API_KEY,
+        @Query(QUERY_FORMAT) format: String = JSON_FORMAT,
+        @Query(QUERY_NO_JSON_CALLBACK) noJsonCallback: Boolean = NO_JSON_CALLBACK,
+    ): Response<SearchResponse>
 }

+ 1 - 0
flickersearchlibrary/src/main/java/com/livelike/flickersearchlibrary/api/utils/Constants.kt

@@ -16,6 +16,7 @@ internal const val QUERY_METHOD = "method"
 
 // Constant values for methods supported in the library
 internal const val SEARCH_METHOD = "flickr.photos.search"
+internal const val RECENT_IMAGES_METHOD = "flickr.photos.getRecent"
 
 // Constant Query keys for methods supported in the library
 internal const val QUERY_TEXT = "text"

+ 7 - 0
flickersearchlibrary/src/main/java/com/livelike/flickersearchlibrary/service/FlickrService.kt

@@ -15,4 +15,11 @@ interface FlickrService {
      * @return [List] of [Photo]s matching given [searchQuery] or empty list if no query is provided.
      */
     suspend fun search(searchQuery: String?): List<Photo>
+
+    /**
+     * Retrieves recently published photos on Flickr.
+     *
+     * @return [List] of recently published photos on Flickr.
+     */
+    suspend fun getRecentPhotos(): List<Photo>
 }

+ 24 - 3
flickersearchlibrary/src/main/java/com/livelike/flickersearchlibrary/service/logic/FlickrServiceLogic.kt

@@ -20,6 +20,26 @@ internal class FlickrServiceLogic(private val api: FlickrApi) : FlickrService {
             cachedPhotos
         } ?: emptyList()
 
+    override suspend fun getRecentPhotos(): List<Photo> {
+        return runCatching {
+            val response = api.getRecent()
+            if (response.isSuccessful) {
+                response.body()?.photosPage?.photos ?: emptyList()
+            } else {
+                throw Exception(
+                    "Flickr API responded with error: ${
+                        response.errorBody().toString()
+                    }"
+                )
+            }
+        }.onFailure { exception: Throwable ->
+            Log.d(
+                LOG_TAG,
+                "Exception occurred when executing API call: ${exception.message}"
+            )
+        }.getOrDefault(emptyList())
+    }
+
     private suspend fun updateCachedPhotos(searchQuery: String) =
         runCatching {
             val response = api.search(searchQuery)
@@ -29,9 +49,10 @@ internal class FlickrServiceLogic(private val api: FlickrApi) : FlickrService {
                     cachedPhotos.addAll(it.photosPage.photos)
                 }
             } else {
-                Log.d(
-                    LOG_TAG,
-                    "Flickr API responded with error: ${response.errorBody().toString()}"
+                throw Exception(
+                    "Flickr API responded with error: ${
+                        response.errorBody().toString()
+                    }"
                 )
             }
         }.onFailure { exception: Throwable ->