diff --git a/README.md b/README.md index 37b772c6..e850208c 100755 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ ConstructorIo.getSearchResults(query, selectedFacets?.map { it.key to it.value } .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe { it.onValue { - it.searchData?.let { + it.response?.let { view.renderData(it) } } @@ -76,7 +76,7 @@ ConstructorIo.getBrowseResults(filterName, filterValue, selectedFacets?.map { it .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe { it.onValue { - it.browseData?.let { + it.response?.let { view.renderData(it) } } diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index 952c7c5a..100d8d88 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -6,8 +6,9 @@ import io.constructor.data.ConstructorData import io.constructor.data.DataManager import io.constructor.data.local.PreferencesHelper import io.constructor.data.memory.ConfigMemoryHolder -import io.constructor.data.model.Group -import io.constructor.data.model.Suggestion +import io.constructor.data.model.autocomplete.AutocompleteResponse +import io.constructor.data.model.common.Result +import io.constructor.data.model.common.ResultGroup import io.constructor.data.model.search.SearchResponse import io.constructor.data.model.browse.BrowseResponse import io.constructor.injection.component.AppComponent @@ -96,7 +97,7 @@ object ConstructorIo { /** * Returns a list of autocomplete suggestions */ - fun getAutocompleteResults(query: String): Observable?>> { + fun getAutocompleteResults(query: String): Observable> { val params = mutableListOf>() configMemoryHolder.autocompleteResultCount?.entries?.forEach { params.add(Pair(Constants.QueryConstants.NUM_RESULTS+it.key, it.value.toString())) @@ -156,19 +157,19 @@ object ConstructorIo { /** * Tracks autocomplete select events */ - fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null) { - var completable = trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, group, resultID); + fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, resultGroup: ResultGroup? = null, resultID: String? = null) { + var completable = trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, resultGroup, resultID); disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({ context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm) }, { t -> e("Autocomplete Select error: ${t.message}") })) } - internal fun trackAutocompleteSelectInternal(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null): Completable { + internal fun trackAutocompleteSelectInternal(searchTerm: String, originalQuery: String, sectionName: String, resultGroup: ResultGroup? = null, resultID: String? = null): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val encodedParams: ArrayList> = arrayListOf() - group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } - group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) } + resultGroup?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } + resultGroup?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) } resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) } return dataManager.trackAutocompleteSelect(searchTerm, arrayOf( Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionName, @@ -180,19 +181,19 @@ object ConstructorIo { /** * Tracks search submit events */ - fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?) { - var completable = trackSearchSubmitInternal(searchTerm, originalQuery, group) + fun trackSearchSubmit(searchTerm: String, originalQuery: String, resultGroup: ResultGroup?) { + var completable = trackSearchSubmitInternal(searchTerm, originalQuery, resultGroup) disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({ context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm) }, { t -> e("Search Submit error: ${t.message}") })) } - internal fun trackSearchSubmitInternal(searchTerm: String, originalQuery: String, group: Group?): Completable { + internal fun trackSearchSubmitInternal(searchTerm: String, originalQuery: String, resultGroup: ResultGroup?): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val encodedParams: ArrayList> = arrayListOf() - group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } - group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) } + resultGroup?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } + resultGroup?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) } return dataManager.trackSearchSubmit(searchTerm, arrayOf( Constants.QueryConstants.ORIGINAL_QUERY to originalQuery, Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_SEARCH diff --git a/library/src/main/java/io/constructor/core/ConstructorListener.kt b/library/src/main/java/io/constructor/core/ConstructorListener.kt index fe8976e9..1898d22f 100755 --- a/library/src/main/java/io/constructor/core/ConstructorListener.kt +++ b/library/src/main/java/io/constructor/core/ConstructorListener.kt @@ -1,12 +1,11 @@ package io.constructor.core -import io.constructor.data.model.Group -import io.constructor.data.model.Suggestion - +import io.constructor.data.model.common.ResultGroup +import io.constructor.data.model.common.Result interface ConstructorListener { - fun onSuggestionSelected(term: String, group: Group?, autocompleteSection: String?) + fun onSuggestionSelected(term: String, resultGroup: ResultGroup?, autocompleteSection: String?) fun onQuerySentToServer(query: String) - fun onSuggestionsRetrieved(suggestions: List) + fun onSuggestionsRetrieved(suggestions: List) fun onErrorGettingSuggestions(error: Throwable) } \ No newline at end of file diff --git a/library/src/main/java/io/constructor/core/SuggestionListener.kt b/library/src/main/java/io/constructor/core/SuggestionListener.kt index aa976b46..27814f1b 100755 --- a/library/src/main/java/io/constructor/core/SuggestionListener.kt +++ b/library/src/main/java/io/constructor/core/SuggestionListener.kt @@ -1,14 +1,13 @@ package io.constructor.core -import io.constructor.data.model.Suggestion - +import io.constructor.data.model.common.Result interface SuggestionListener { /** * triggered after getting suggestions * @param suggestions list of suggestions */ - fun onSuggestionsResult(suggestions: List) + fun onSuggestionsResult(suggestions: List) /** * triggered on error diff --git a/library/src/main/java/io/constructor/data/DataManager.kt b/library/src/main/java/io/constructor/data/DataManager.kt index 25a4d79f..1c3c2672 100755 --- a/library/src/main/java/io/constructor/data/DataManager.kt +++ b/library/src/main/java/io/constructor/data/DataManager.kt @@ -1,7 +1,7 @@ package io.constructor.data import com.squareup.moshi.Moshi -import io.constructor.data.model.Suggestion +import io.constructor.data.model.autocomplete.AutocompleteResponse import io.constructor.data.model.search.SearchResponse import io.constructor.data.model.browse.BrowseResponse import io.constructor.data.remote.ApiPaths @@ -15,19 +15,25 @@ import javax.inject.Singleton class DataManager @Inject constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi) { - fun getAutocompleteResults(text: String, params: Array> = arrayOf()): Observable?>> = constructorApi.getAutocompleteResults(text, params.toMap()).map { - if (!it.isError) { - it.response()?.let { - if (it.isSuccessful) { - ConstructorData.of(it.body()?.sections?.suggestions) - } else { - ConstructorData.networkError(it.errorBody()?.string()) - } - } ?: ConstructorData.error(it.error()) - } else { - ConstructorData.error(it.error()) - } - }.toObservable() + fun getAutocompleteResults(text: String, params: Array> = arrayOf()): Observable> { + return constructorApi.getAutocompleteResults(text, params.toMap()).map { + if (!it.isError) { + it.response()?.let { + if (it.isSuccessful) { + val adapter = moshi.adapter(AutocompleteResponse::class.java) + val response = it.body()?.string() + val result = response?.let { adapter.fromJson(it) } + result?.rawData = response + ConstructorData.of(result!!) + } else { + ConstructorData.networkError(it.errorBody()?.string()) + } + } ?: ConstructorData.error(it.error()) + } else { + ConstructorData.error(it.error()) + } + }.toObservable() + } fun getSearchResults(text: String, encodedParams: Array> = arrayOf()): Observable> { var dynamicUrl = "/${ApiPaths.URL_SEARCH.format(text)}" @@ -40,9 +46,9 @@ constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi if (it.isSuccessful){ val adapter = moshi.adapter(SearchResponse::class.java) val response = it.body()?.string() - val result = response?.let { adapter.fromJson(it) } - result?.rawData = response - ConstructorData.of(result!!) + val res = response?.let { adapter.fromJson(it) } + res?.rawData = response + ConstructorData.of(res!!) } else { ConstructorData.networkError(it.errorBody()?.string()) } @@ -96,9 +102,9 @@ constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi if (it.isSuccessful){ val adapter = moshi.adapter(BrowseResponse::class.java) val response = it.body()?.string() - val result = response?.let { adapter.fromJson(it) } - result?.rawData = response - ConstructorData.of(result!!) + val res = response?.let { adapter.fromJson(it) } + res?.rawData = response + ConstructorData.of(res!!) } else { ConstructorData.networkError(it.errorBody()?.string()) } diff --git a/library/src/main/java/io/constructor/data/model/AutocompleteResult.kt b/library/src/main/java/io/constructor/data/model/AutocompleteResult.kt deleted file mode 100755 index 469397c2..00000000 --- a/library/src/main/java/io/constructor/data/model/AutocompleteResult.kt +++ /dev/null @@ -1,4 +0,0 @@ -package io.constructor.data.model - - -data class AutocompleteResult(val sections: Sections) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/Group.kt b/library/src/main/java/io/constructor/data/model/Group.kt deleted file mode 100755 index 5b28d54b..00000000 --- a/library/src/main/java/io/constructor/data/model/Group.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.constructor.data.model - -import com.squareup.moshi.Json -import java.io.Serializable - - -data class Group(@Json(name="display_name") var displayName: String?, @Json(name="group_id") var groupId: String, @Json(name="path") var path: String? = null) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/Product.kt b/library/src/main/java/io/constructor/data/model/Product.kt deleted file mode 100755 index f223e4e1..00000000 --- a/library/src/main/java/io/constructor/data/model/Product.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.constructor.data.model - -import com.squareup.moshi.Json - -data class Product(val value: String, val data: ProductData, @Json(name = "matched_terms") val matchedTerms: List?) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/ProductData.kt b/library/src/main/java/io/constructor/data/model/ProductData.kt deleted file mode 100755 index 7da7d3ac..00000000 --- a/library/src/main/java/io/constructor/data/model/ProductData.kt +++ /dev/null @@ -1,4 +0,0 @@ -package io.constructor.data.model - - -data class ProductData(val groups: List?, val keywords: List?, val url: String?) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/Sections.kt b/library/src/main/java/io/constructor/data/model/Sections.kt deleted file mode 100755 index 580f819e..00000000 --- a/library/src/main/java/io/constructor/data/model/Sections.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.constructor.data.model - -import com.squareup.moshi.Json - - -class Sections { - @Json(name="Search Suggestions") - lateinit var suggestions: List - - @Json(name="Products") - lateinit var products: List -} \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/Suggestion.kt b/library/src/main/java/io/constructor/data/model/Suggestion.kt deleted file mode 100755 index 8c5011da..00000000 --- a/library/src/main/java/io/constructor/data/model/Suggestion.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.constructor.data.model - -import com.squareup.moshi.Json -import io.constructor.core.Constants - -data class Suggestion(val value: String, val data: SuggestionData, @Json(name = "matched_terms") val matchedTerms: List?, val sectionName: String = Constants.QueryValues.SEARCH_SUGGESTIONS) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/SuggestionData.kt b/library/src/main/java/io/constructor/data/model/SuggestionData.kt deleted file mode 100755 index 718eea07..00000000 --- a/library/src/main/java/io/constructor/data/model/SuggestionData.kt +++ /dev/null @@ -1,4 +0,0 @@ -package io.constructor.data.model - - -data class SuggestionData(val groups: List) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/SuggestionViewModel.kt b/library/src/main/java/io/constructor/data/model/SuggestionViewModel.kt deleted file mode 100755 index d1c28567..00000000 --- a/library/src/main/java/io/constructor/data/model/SuggestionViewModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.constructor.data.model - -import java.io.Serializable - -data class SuggestionViewModel(val term: String, val group: Group?, val section: String?, val matchedTerms: List?) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/autocomplete/AutocompleteResponse.kt b/library/src/main/java/io/constructor/data/model/autocomplete/AutocompleteResponse.kt new file mode 100755 index 00000000..7a017af9 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/autocomplete/AutocompleteResponse.kt @@ -0,0 +1,11 @@ +package io.constructor.data.model.autocomplete + +import com.squareup.moshi.Json +import io.constructor.data.model.common.*; +import java.io.Serializable + +data class AutocompleteResponse ( + @Json(name = "sections") val sections: Map>?, + @Json(name = "result_id") val resultId: String?, + var rawData: String? +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/browse/BrowseData.kt b/library/src/main/java/io/constructor/data/model/browse/BrowseData.kt deleted file mode 100644 index 2bb1f7ee..00000000 --- a/library/src/main/java/io/constructor/data/model/browse/BrowseData.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.constructor.data.model.browse - -import com.squareup.moshi.Json -import io.constructor.data.model.search.SortOption - -data class BrowseData(val facets: List?, val groups: List?, @Json(name = "results") val browseResults: List?, @Json(name = "sort_options") val sortOptions: List? = null, @Json(name = "total_num_results") val resultCount: Int) diff --git a/library/src/main/java/io/constructor/data/model/browse/BrowseFacet.kt b/library/src/main/java/io/constructor/data/model/browse/BrowseFacet.kt deleted file mode 100644 index 5189929d..00000000 --- a/library/src/main/java/io/constructor/data/model/browse/BrowseFacet.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.constructor.data.model.browse - -import com.squareup.moshi.Json -import java.io.Serializable -import io.constructor.data.model.search.FacetOption - - -data class BrowseFacet(val name: String, - @Json(name = "display_name") val displayName: String?, - val status: Map?, - val type: String?, - val min: Double?, - val max: Double?, - val options: List?) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/browse/BrowseGroup.kt b/library/src/main/java/io/constructor/data/model/browse/BrowseGroup.kt deleted file mode 100644 index e276cea4..00000000 --- a/library/src/main/java/io/constructor/data/model/browse/BrowseGroup.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.constructor.data.model.browse - -import com.squareup.moshi.Json - -data class BrowseGroup(@Json(name = "children") val children: List?, - @Json(name = "parents") val parents: List?, - val count: Int?, - @Json(name = "display_name") val displayName: String, - @Json(name = "group_id") val groupId: String) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/browse/BrowseResponse.kt b/library/src/main/java/io/constructor/data/model/browse/BrowseResponse.kt index a2455b53..fbe9683a 100644 --- a/library/src/main/java/io/constructor/data/model/browse/BrowseResponse.kt +++ b/library/src/main/java/io/constructor/data/model/browse/BrowseResponse.kt @@ -1,5 +1,10 @@ package io.constructor.data.model.browse import com.squareup.moshi.Json +import java.io.Serializable -data class BrowseResponse(@Json(name = "response") val browseData: BrowseData, @Json(name = "result_id") val resultId: String, var rawData: String?) \ No newline at end of file +data class BrowseResponse( + @Json(name = "response") val response: BrowseResponseInner?, + @Json(name = "result_id") val resultId: String?, + var rawData: String? +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/browse/BrowseResponseInner.kt b/library/src/main/java/io/constructor/data/model/browse/BrowseResponseInner.kt new file mode 100644 index 00000000..92676ee8 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/browse/BrowseResponseInner.kt @@ -0,0 +1,13 @@ +package io.constructor.data.model.browse + +import com.squareup.moshi.Json +import io.constructor.data.model.common.*; +import java.io.Serializable + +data class BrowseResponseInner( + @Json(name = "facets") val facets: List?, + @Json(name = "groups") val groups: List?, + @Json(name = "results") val results: List?, + @Json(name = "sort_options") val filterSortOptions: List? = null, + @Json(name = "total_num_results") val resultCount: Int +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/browse/BrowseResult.kt b/library/src/main/java/io/constructor/data/model/browse/BrowseResult.kt deleted file mode 100644 index f16028e4..00000000 --- a/library/src/main/java/io/constructor/data/model/browse/BrowseResult.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.constructor.data.model.browse - -import com.squareup.moshi.Json -import io.constructor.data.model.search.ResultData -import java.io.Serializable - -data class BrowseResult(@Json(name = "data") val result: ResultData, @Json(name = "matched_terms") val matchedTerms: List?, val value: String) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/common/FilterFacet.kt b/library/src/main/java/io/constructor/data/model/common/FilterFacet.kt new file mode 100644 index 00000000..5293b75b --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/FilterFacet.kt @@ -0,0 +1,14 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class FilterFacet( + @Json(name = "display_name") val displayName: String?, + @Json(name = "name") val name: String, + @Json(name = "status") val status: Map?, + @Json(name = "min") val min: Double?, + @Json(name = "max") val max: Double?, + @Json(name = "options") val options: List?, + @Json(name = "type") val type: String? +) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/common/FilterFacetOption.kt b/library/src/main/java/io/constructor/data/model/common/FilterFacetOption.kt new file mode 100644 index 00000000..dd41dab7 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/FilterFacetOption.kt @@ -0,0 +1,11 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class FilterFacetOption( + @Json(name = "count") val count: Int, + @Json(name = "display_name") val displayName: String?, + @Json(name = "status") val status: String?, + @Json(name = "value") val value: String? +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/common/FilterGroup.kt b/library/src/main/java/io/constructor/data/model/common/FilterGroup.kt new file mode 100644 index 00000000..38384be4 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/FilterGroup.kt @@ -0,0 +1,12 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class FilterGroup( + @Json(name = "children") val children: List?, + @Json(name = "parents") val parents: List?, + @Json(name = "count") val count: Int?, + @Json(name = "display_name") val displayName: String, + @Json(name = "group_id") val groupId: String +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/common/FilterSortOption.kt b/library/src/main/java/io/constructor/data/model/common/FilterSortOption.kt new file mode 100644 index 00000000..2a56f3c8 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/FilterSortOption.kt @@ -0,0 +1,11 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class FilterSortOption( + @Json(name = "display_name") val displayName: String, + @Json(name = "sort_by") val sortBy: String, + @Json(name = "sort_order") val sortOrder: String, + @Json(name = "status") val status: String +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/common/Result.kt b/library/src/main/java/io/constructor/data/model/common/Result.kt new file mode 100644 index 00000000..636c633f --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/Result.kt @@ -0,0 +1,11 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class Result( + @Json(name = "data") val data: ResultData, + @Json(name = "matched_terms") val matchedTerms: List?, + @Json(name = "variations") val variations: List?, + @Json(name = "value") val value: String +) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/common/ResultData.kt b/library/src/main/java/io/constructor/data/model/common/ResultData.kt new file mode 100644 index 00000000..1bf51fef --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/ResultData.kt @@ -0,0 +1,14 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class ResultData( + @Json(name = "description") val description: String?, + @Json(name = "id") val id: String?, + @Json(name = "url") val url: String?, + @Json(name = "image_url") val imageUrl: String?, + @Json(name = "groups") val groups: List?, + @Json(name = "facets") val facets: List?, + @Json(name = "metadata") var metadata: Map? +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/common/ResultFacet.kt b/library/src/main/java/io/constructor/data/model/common/ResultFacet.kt new file mode 100644 index 00000000..06d71f31 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/ResultFacet.kt @@ -0,0 +1,9 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class ResultFacet( + @Json(name = "name") val name: String, + @Json(name = "values") val values: List? +) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/common/ResultGroup.kt b/library/src/main/java/io/constructor/data/model/common/ResultGroup.kt new file mode 100755 index 00000000..32d92945 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/common/ResultGroup.kt @@ -0,0 +1,10 @@ +package io.constructor.data.model.common + +import com.squareup.moshi.Json +import java.io.Serializable + +data class ResultGroup( + @Json(name="display_name") var displayName: String?, + @Json(name="group_id") var groupId: String, + @Json(name="path") var path: String? = null +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/dataadapter/ResultDataAdapter.kt b/library/src/main/java/io/constructor/data/model/dataadapter/ResultDataAdapter.kt index 3a40fefe..1e17232f 100644 --- a/library/src/main/java/io/constructor/data/model/dataadapter/ResultDataAdapter.kt +++ b/library/src/main/java/io/constructor/data/model/dataadapter/ResultDataAdapter.kt @@ -3,9 +3,9 @@ package io.constructor.data.model.dataadapter import com.squareup.moshi.FromJson import com.squareup.moshi.JsonAdapter import com.squareup.moshi.JsonReader -import io.constructor.data.model.Group -import io.constructor.data.model.search.ResultData -import io.constructor.data.model.search.ResultFacet +import io.constructor.data.model.common.ResultGroup +import io.constructor.data.model.common.ResultData +import io.constructor.data.model.common.ResultFacet class ResultDataAdapter { @@ -13,7 +13,7 @@ class ResultDataAdapter { val NAMES = JsonReader.Options.of("id", "description", "image_url", "url", "facets", "groups") } - @FromJson fun fromJson(jsonReader: JsonReader, facetDelegate: JsonAdapter>, groupDelegate: JsonAdapter>): ResultData { + @FromJson fun fromJson(jsonReader: JsonReader, facetDelegate: JsonAdapter>, resultGroupDelegate: JsonAdapter>): ResultData { jsonReader.beginObject() var metadata: HashMap = hashMapOf() var id = "" @@ -21,7 +21,7 @@ class ResultDataAdapter { var imageUrl: String? = null var url: String? = null var facets: List? = null - var groups: List? = null + var groups: List? = null while (jsonReader.hasNext()) { when (jsonReader.selectName(NAMES)) { 0 -> { @@ -41,7 +41,7 @@ class ResultDataAdapter { facets = facetDelegate.fromJsonValue(jsonReader.readJsonValue()) } 5 -> { - groups = groupDelegate.fromJsonValue(jsonReader.readJsonValue()) + groups = resultGroupDelegate.fromJsonValue(jsonReader.readJsonValue()) } else -> { metadata[jsonReader.nextName()] = jsonReader.readJsonValue() @@ -49,7 +49,7 @@ class ResultDataAdapter { } } jsonReader.endObject() - return ResultData(description, id, imageUrl, url, facets, groups, metadata) + return ResultData(description, id, imageUrl, url, groups, facets, metadata) } diff --git a/library/src/main/java/io/constructor/data/model/search/FacetOption.kt b/library/src/main/java/io/constructor/data/model/search/FacetOption.kt deleted file mode 100644 index 756ed5c8..00000000 --- a/library/src/main/java/io/constructor/data/model/search/FacetOption.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.constructor.data.model.search - -import java.io.Serializable - -data class FacetOption(val count: Int, val value: String?) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/search/Result.kt b/library/src/main/java/io/constructor/data/model/search/Result.kt deleted file mode 100644 index 364f7f26..00000000 --- a/library/src/main/java/io/constructor/data/model/search/Result.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json - -data class Result(@Json(name = "data") val result: ResultData, @Json(name = "matched_terms") val matchedTerms: List?, val value: String) diff --git a/library/src/main/java/io/constructor/data/model/search/ResultData.kt b/library/src/main/java/io/constructor/data/model/search/ResultData.kt deleted file mode 100644 index f486478e..00000000 --- a/library/src/main/java/io/constructor/data/model/search/ResultData.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json -import io.constructor.data.model.Group -import java.io.Serializable - -data class ResultData(val description: String?, - val id: String, - @Json(name = "image_url") val imageUrl: String?, - val url: String?, - val facets: List?, - val groups: List?, - var metadata: Map) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/search/ResultFacet.kt b/library/src/main/java/io/constructor/data/model/search/ResultFacet.kt deleted file mode 100644 index c917049a..00000000 --- a/library/src/main/java/io/constructor/data/model/search/ResultFacet.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.constructor.data.model.search - -import java.io.Serializable - -data class ResultFacet(val name: String, val values: List?) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/search/SearchData.kt b/library/src/main/java/io/constructor/data/model/search/SearchData.kt deleted file mode 100644 index c7755287..00000000 --- a/library/src/main/java/io/constructor/data/model/search/SearchData.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json - - -data class SearchData(val facets: List?, val groups: List?, @Json(name = "results") val searchResults: List?, @Json(name = "sort_options") val sortOptions: List? = null, @Json(name = "total_num_results") val resultCount: Int) diff --git a/library/src/main/java/io/constructor/data/model/search/SearchFacet.kt b/library/src/main/java/io/constructor/data/model/search/SearchFacet.kt deleted file mode 100644 index f934dba8..00000000 --- a/library/src/main/java/io/constructor/data/model/search/SearchFacet.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json -import java.io.Serializable - -data class SearchFacet(val name: String, - @Json(name = "display_name") val displayName: String?, - val status: Map?, - val type: String?, - val min: Double?, - val max: Double?, - val options: List?) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/search/SearchGroup.kt b/library/src/main/java/io/constructor/data/model/search/SearchGroup.kt deleted file mode 100644 index a580ef70..00000000 --- a/library/src/main/java/io/constructor/data/model/search/SearchGroup.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json - -data class SearchGroup(@Json(name = "children") val children: List?, - @Json(name = "parents") val parents: List?, - val count: Int?, - @Json(name = "display_name") val displayName: String, - @Json(name = "group_id") val groupId: String) \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/search/SearchResponse.kt b/library/src/main/java/io/constructor/data/model/search/SearchResponse.kt index 96d4ae86..32d076d4 100644 --- a/library/src/main/java/io/constructor/data/model/search/SearchResponse.kt +++ b/library/src/main/java/io/constructor/data/model/search/SearchResponse.kt @@ -1,5 +1,10 @@ package io.constructor.data.model.search import com.squareup.moshi.Json +import java.io.Serializable -data class SearchResponse(@Json(name = "response") val searchData: SearchData, @Json(name = "result_id") val resultId: String, var rawData: String?) \ No newline at end of file +data class SearchResponse( + @Json(name = "response") val response: SearchResponseInner?, + @Json(name = "result_id") val resultId: String?, + var rawData: String? +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/search/SearchResponseInner.kt b/library/src/main/java/io/constructor/data/model/search/SearchResponseInner.kt new file mode 100644 index 00000000..fb07c760 --- /dev/null +++ b/library/src/main/java/io/constructor/data/model/search/SearchResponseInner.kt @@ -0,0 +1,13 @@ +package io.constructor.data.model.search; + +import com.squareup.moshi.Json +import io.constructor.data.model.common.*; +import java.io.Serializable + +data class SearchResponseInner( + @Json(name = "facets") val facets: List?, + @Json(name = "groups") val groups: List?, + @Json(name = "results") val results: List?, + @Json(name = "sort_options") val filterSortOptions: List? = null, + @Json(name = "total_num_results") val resultCount: Int +) : Serializable \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/model/search/SearchResult.kt b/library/src/main/java/io/constructor/data/model/search/SearchResult.kt deleted file mode 100644 index 8652b381..00000000 --- a/library/src/main/java/io/constructor/data/model/search/SearchResult.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json -import java.io.Serializable - -data class SearchResult(@Json(name = "data") val result: ResultData, @Json(name = "matched_terms") val matchedTerms: List?, val value: String) : Serializable diff --git a/library/src/main/java/io/constructor/data/model/search/SortOption.kt b/library/src/main/java/io/constructor/data/model/search/SortOption.kt deleted file mode 100644 index 1a674ada..00000000 --- a/library/src/main/java/io/constructor/data/model/search/SortOption.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.constructor.data.model.search - -import com.squareup.moshi.Json -import java.io.Serializable - - -data class SortOption(@Json(name = "display_name") val displayName: String, - @Json(name = "sort_by") val sortBy: String, - @Json(name = "sort_order") val sortOrder: String, - val status: String) : Serializable diff --git a/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt b/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt index 79ab699a..ba8b2e1a 100755 --- a/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt +++ b/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt @@ -1,7 +1,7 @@ package io.constructor.data.remote import io.constructor.core.Constants -import io.constructor.data.model.AutocompleteResult +import io.constructor.data.model.autocomplete.AutocompleteResponse import io.reactivex.Completable import io.reactivex.Single import okhttp3.ResponseBody @@ -12,7 +12,7 @@ interface ConstructorApi { @GET(ApiPaths.URL_AUTOCOMPLETE) fun getAutocompleteResults(@Path("value") value: String, - @QueryMap data: Map): Single> + @QueryMap data: Map): Single> @GET(ApiPaths.URL_AUTOCOMPLETE_SELECT_EVENT) fun trackAutocompleteSelect(@Path("term") term: String, diff --git a/library/src/main/java/io/constructor/injection/module/NetworkModule.kt b/library/src/main/java/io/constructor/injection/module/NetworkModule.kt index 1889b78d..af32ed99 100755 --- a/library/src/main/java/io/constructor/injection/module/NetworkModule.kt +++ b/library/src/main/java/io/constructor/injection/module/NetworkModule.kt @@ -1,7 +1,7 @@ package io.constructor.injection.module import android.content.Context -import com.squareup.moshi.KotlinJsonAdapterFactory +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import com.squareup.moshi.Moshi import dagger.Module import dagger.Provides diff --git a/library/src/main/java/io/constructor/mapper/Mapper.kt b/library/src/main/java/io/constructor/mapper/Mapper.kt index 91d5afb4..71b7ea28 100755 --- a/library/src/main/java/io/constructor/mapper/Mapper.kt +++ b/library/src/main/java/io/constructor/mapper/Mapper.kt @@ -1,23 +1,19 @@ package io.constructor.mapper import io.constructor.core.Constants -import io.constructor.data.model.Suggestion -import io.constructor.data.model.SuggestionViewModel -import java.util.* +import io.constructor.data.model.autocomplete.AutocompleteResponse +import io.constructor.data.model.common.Result +import java.util.* object Mapper { - fun toSuggestionsViewModel(suggestions: List, groupsShownForFirstTerm : Int = Int.MAX_VALUE): List { - val data = ArrayList() - suggestions.mapIndexed { index, suggestion -> - if (index == 0) { - suggestion.data.groups.take(groupsShownForFirstTerm).mapTo(data) { SuggestionViewModel(suggestion.value, it, Constants.QueryValues.SEARCH_SUGGESTIONS, suggestion.matchedTerms) } - } else { - data.add(SuggestionViewModel(suggestion.value, null, Constants.QueryValues.SEARCH_SUGGESTIONS, suggestion.matchedTerms)) - } + fun toSuggestionsViewModel(response: AutocompleteResponse, groupsShownForFirstTerm : Int = Int.MAX_VALUE): List { + val data = ArrayList() + response.sections?.get("Search Suggestions")?.mapIndexed { _, suggestion -> + data.add(suggestion); } - return data + return data; } } \ No newline at end of file diff --git a/library/src/main/java/io/constructor/service/OnSearchService.kt b/library/src/main/java/io/constructor/service/OnSearchService.kt index 23d6613e..01f9b574 100755 --- a/library/src/main/java/io/constructor/service/OnSearchService.kt +++ b/library/src/main/java/io/constructor/service/OnSearchService.kt @@ -5,12 +5,12 @@ import android.content.Context import android.content.Intent import io.constructor.core.Constants import io.constructor.core.ConstructorIo -import io.constructor.data.model.SuggestionViewModel +import io.constructor.data.model.common.Result; class OnSearchService : IntentService("OnSearchService") { companion object { - fun startService(context: Context, query: String, suggestion: SuggestionViewModel) { + fun startService(context: Context, query: String, suggestion: Result) { val intent = Intent(context, OnSearchService::class.java) intent.putExtra(Constants.EXTRA_QUERY, query) intent.putExtra(Constants.EXTRA_SUGGESTION, suggestion) @@ -20,9 +20,9 @@ class OnSearchService : IntentService("OnSearchService") { override fun onHandleIntent(intent: Intent) { val query: String = intent.getStringExtra(Constants.EXTRA_QUERY) - val suggestion: SuggestionViewModel = intent.getSerializableExtra(Constants.EXTRA_SUGGESTION) as SuggestionViewModel - if (!suggestion.term.isBlank()) { - ConstructorIo.trackSearchSubmit(suggestion.term, query, suggestion.group) + val suggestion: Result = intent.getSerializableExtra(Constants.EXTRA_SUGGESTION) as Result + if (!suggestion.value.isBlank()) { + ConstructorIo.trackSearchSubmit(suggestion.value, query, suggestion.data.groups?.get(0)) } } } \ No newline at end of file diff --git a/library/src/main/java/io/constructor/service/OnSelectService.kt b/library/src/main/java/io/constructor/service/OnSelectService.kt index ab97e34e..c1818869 100755 --- a/library/src/main/java/io/constructor/service/OnSelectService.kt +++ b/library/src/main/java/io/constructor/service/OnSelectService.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import io.constructor.core.Constants import io.constructor.core.ConstructorIo -import io.constructor.data.model.SuggestionViewModel +import io.constructor.data.model.common.Result; /** * Service which triggers each time user select suggestion @@ -13,7 +13,7 @@ import io.constructor.data.model.SuggestionViewModel class OnSelectService : IntentService("OnSelectService") { companion object { - fun startService(context: Context, query: String, suggestion: SuggestionViewModel) { + fun startService(context: Context, query: String, suggestion: Result) { val intent = Intent(context, OnSelectService::class.java) intent.putExtra(Constants.EXTRA_QUERY, query) intent.putExtra(Constants.EXTRA_SUGGESTION, suggestion) @@ -24,9 +24,9 @@ class OnSelectService : IntentService("OnSelectService") { override fun onHandleIntent(intent: Intent) { val query: String = intent.getStringExtra(Constants.EXTRA_QUERY) - val suggestion: SuggestionViewModel = intent.getSerializableExtra(Constants.EXTRA_SUGGESTION) as SuggestionViewModel - if (!suggestion.term.isBlank()) { - ConstructorIo.trackAutocompleteSelect(suggestion.term, query, suggestion.section!!, suggestion.group) + val suggestion: Result = intent.getSerializableExtra(Constants.EXTRA_SUGGESTION) as Result + if (!suggestion.value.isBlank()) { + ConstructorIo.trackAutocompleteSelect(suggestion.value, query, "Search Suggestions", suggestion.data.groups?.get(0)) } } } \ No newline at end of file diff --git a/library/src/main/java/io/constructor/ui/base/BaseSuggestionFragment.kt b/library/src/main/java/io/constructor/ui/base/BaseSuggestionFragment.kt index 6e91d17c..eeb91018 100755 --- a/library/src/main/java/io/constructor/ui/base/BaseSuggestionFragment.kt +++ b/library/src/main/java/io/constructor/ui/base/BaseSuggestionFragment.kt @@ -18,8 +18,8 @@ import android.widget.ProgressBar import android.widget.TextView import io.constructor.core.Constants import io.constructor.core.ConstructorListener -import io.constructor.data.model.Suggestion -import io.constructor.data.model.SuggestionViewModel +import io.constructor.data.model.autocomplete.AutocompleteResponse +import io.constructor.data.model.common.Result import io.constructor.features.base.BaseFragment import io.constructor.mapper.Mapper import io.constructor.service.OnSearchService @@ -52,7 +52,7 @@ abstract class BaseSuggestionFragment : BaseFragment(), SuggestionsView { p1?.let { when (it.action) { Constants.EVENT_QUERY_SENT -> listener?.onQuerySentToServer(it.getStringExtra(Constants.EXTRA_TERM)) - Constants.EVENT_SUGGESTIONS_RETRIEVED -> listener?.onSuggestionsRetrieved(it.getSerializableExtra(Constants.EXTRA_SUGGESTIONS) as List) + Constants.EVENT_SUGGESTIONS_RETRIEVED -> listener?.onSuggestionsRetrieved(it.getSerializableExtra(Constants.EXTRA_SUGGESTIONS) as List) else -> { } } @@ -141,17 +141,17 @@ abstract class BaseSuggestionFragment : BaseFragment(), SuggestionsView { abstract fun getProgressId(): Int - override fun showSuggestions(suggestionsResult: List, groupsShownForFirstTerm: Int) { + override fun showSuggestions(response: AutocompleteResponse, groupsShownForFirstTerm: Int) { progressIndicator?.visibility = View.GONE activity?.let { - it.broadcastIntent(Constants.EVENT_SUGGESTIONS_RETRIEVED, Constants.EXTRA_SUGGESTIONS to suggestionsResult) + it.broadcastIntent(Constants.EVENT_SUGGESTIONS_RETRIEVED, Constants.EXTRA_SUGGESTIONS to response) } - val suggestionViews = Mapper.toSuggestionsViewModel(suggestionsResult, groupsShownForFirstTerm) + val suggestionViews = Mapper.toSuggestionsViewModel(response, groupsShownForFirstTerm) val adapter = getSuggestionAdapter() adapter.setData(suggestionViews) adapter.setListener(object : BaseSuggestionsAdapter.ClickListener { - override fun onSuggestionClick(suggestion: SuggestionViewModel) { - listener?.onSuggestionSelected(suggestion.term, suggestion.group, suggestion.section) + override fun onSuggestionClick(suggestion: Result) { + listener?.onSuggestionSelected(suggestion.value, null, null) val query = suggestionBox?.text.toString() OnSelectService.startService(context!!, query, suggestion) OnSearchService.startService(context!!, query, suggestion) diff --git a/library/src/main/java/io/constructor/ui/base/BaseSuggestionsAdapter.kt b/library/src/main/java/io/constructor/ui/base/BaseSuggestionsAdapter.kt index 248542f8..847ca17d 100755 --- a/library/src/main/java/io/constructor/ui/base/BaseSuggestionsAdapter.kt +++ b/library/src/main/java/io/constructor/ui/base/BaseSuggestionsAdapter.kt @@ -12,14 +12,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import io.constructor.data.model.SuggestionViewModel import io.constructor.util.ViewUtil -import java.util.* +import io.constructor.data.model.common.Result +import java.util.* abstract class BaseSuggestionsAdapter : RecyclerView.Adapter() { - private var suggestions: List = ArrayList() + private var suggestions: List = ArrayList() private var listener: BaseSuggestionsAdapter.ClickListener? = null @get:LayoutRes @@ -34,10 +34,10 @@ abstract class BaseSuggestionsAdapter : RecyclerView.Adapter Unit)? interface ClickListener { - fun onSuggestionClick(suggestion: SuggestionViewModel) + fun onSuggestionClick(suggestion: Result) } - fun setData(suggestions: List) { + fun setData(suggestions: List) { this.suggestions = suggestions } @@ -57,11 +57,11 @@ abstract class BaseSuggestionsAdapter : RecyclerView.Adapter styleHighlightedSpans?.invoke(spannable, start, end) ?: styleSpans(spannable, start, end) - }, suggestionViewModel.group?.displayName) + }, suggestionViewModel.data.groups?.get(0)?.displayName) holder.itemView.setOnClickListener { listener!!.onSuggestionClick(suggestionViewModel) } } diff --git a/library/src/main/java/io/constructor/ui/suggestion/SuggestionsPresenter.kt b/library/src/main/java/io/constructor/ui/suggestion/SuggestionsPresenter.kt index f7239057..c34d9511 100755 --- a/library/src/main/java/io/constructor/ui/suggestion/SuggestionsPresenter.kt +++ b/library/src/main/java/io/constructor/ui/suggestion/SuggestionsPresenter.kt @@ -46,7 +46,7 @@ constructor(private val preferencesHelper: PreferencesHelper) : BasePresenter data.onValue { - it?.let { + it.let { mvpView.showSuggestions(it, preferencesHelper.groupsShownForFirstTerm) } } diff --git a/library/src/main/java/io/constructor/ui/suggestion/SuggestionsView.kt b/library/src/main/java/io/constructor/ui/suggestion/SuggestionsView.kt index 08bd1393..7866e758 100755 --- a/library/src/main/java/io/constructor/ui/suggestion/SuggestionsView.kt +++ b/library/src/main/java/io/constructor/ui/suggestion/SuggestionsView.kt @@ -1,13 +1,13 @@ package io.constructor.ui.suggestion -import io.constructor.data.model.Suggestion +import io.constructor.data.model.autocomplete.AutocompleteResponse import io.constructor.features.base.MvpView import io.reactivex.Observable interface SuggestionsView : MvpView { - fun showSuggestions(suggestionsResult: List, groupsShownForFirstTerm: Int = Int.MAX_VALUE) + fun showSuggestions(response: AutocompleteResponse, groupsShownForFirstTerm: Int = Int.MAX_VALUE) fun queryChanged() : Observable fun inputFocusChanged() : Observable> fun loading() diff --git a/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt index f8e0882c..e9591306 100644 --- a/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt @@ -58,7 +58,8 @@ class ConstructorIoAutocompleteTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { - it.get()!!.isNotEmpty() && it.get()!!.size == 5 + var suggestions = it.get()!!.sections?.get("Search Suggestions"); + suggestions?.isNotEmpty()!! && suggestions.size == 5 } val request = mockServer.takeRequest() val path = "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.1.1&_dt=" @@ -98,7 +99,8 @@ class ConstructorIoAutocompleteTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { - it.isEmpty + var suggestions = it.get()!!.sections?.get("Search Suggestions"); + suggestions?.isEmpty()!! } val request = mockServer.takeRequest() val path = "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.1.1&_dt=" diff --git a/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt index 4eaf61e4..4fc026f5 100755 --- a/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt @@ -3,7 +3,7 @@ package io.constructor.core import android.content.Context import io.constructor.data.local.PreferencesHelper import io.constructor.data.memory.ConfigMemoryHolder -import io.constructor.data.model.Group +import io.constructor.data.model.common.ResultGroup import io.constructor.test.createTestDataManager import io.constructor.util.RxSchedulersOverrideRule import io.mockk.every @@ -135,7 +135,7 @@ class ConstructorIoTest { fun trackAutocompleteSelectWithSectionAndResultID() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions", Group("recommended", "123123"), "2346784").test() + val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions", ResultGroup("recommended", "123123"), "2346784").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/select?autocomplete_section=Search%20Suggestions&original_query=tit&tr=click&group%5Bgroup_id%5D=123123&group%5Bdisplay_name%5D=recommended&result_id=2346784&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.1&_dt=" diff --git a/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt b/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt index 03318ce4..78feb653 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt @@ -58,16 +58,16 @@ class ConstructorIoBrowseTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getBrowseResults("group_id", "Beverages").test() observer.assertComplete().assertValue { - it.get()!!.browseData.browseResults!!.size == 24 - it.get()!!.browseData.browseResults!![0].value == "Crystal Geyser Natural Alpine Spring Water - 1 Gallon" - it.get()!!.browseData.browseResults!![0].result.id == "108200440" - it.get()!!.browseData.browseResults!![0].result.imageUrl == "https://d17bbgoo3npfov.cloudfront.net/images/farmstand-108200440.png" - it.get()!!.browseData.browseResults!![0].result.metadata["price"] == 1.25 - it.get()!!.browseData.facets!!.size == 3 - it.get()!!.browseData.facets!![0].displayName == "Brand" - it.get()!!.browseData.facets!![0].type == "multiple" - it.get()!!.browseData.groups!!.size == 1 - it.get()!!.browseData.resultCount == 367 + it.get()!!.response?.results!!.size == 24 + it.get()!!.response?.results!![0].value == "Crystal Geyser Natural Alpine Spring Water - 1 Gallon" + it.get()!!.response?.results!![0].data.id == "108200440" + it.get()!!.response?.results!![0].data.imageUrl == "https://d17bbgoo3npfov.cloudfront.net/images/farmstand-108200440.png" + it.get()!!.response?.results!![0].data.metadata?.get("price") == 1.25 + it.get()!!.response?.facets!!.size == 3 + it.get()!!.response?.facets!![0].displayName == "Brand" + it.get()!!.response?.facets!![0].type == "multiple" + it.get()!!.response?.groups!!.size == 1 + it.get()!!.response?.resultCount == 367 } val request = mockServer.takeRequest() val path = "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.1.1&_dt" @@ -107,10 +107,10 @@ class ConstructorIoBrowseTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getBrowseResults("group_id", "Beverages").test() observer.assertComplete().assertValue { - it.get()!!.browseData.browseResults!!.isEmpty() - it.get()!!.browseData.facets!!.isEmpty() - it.get()!!.browseData.groups!!.isEmpty() - it.get()!!.browseData.resultCount == 0 + it.get()!!.response?.results!!.isEmpty() + it.get()!!.response?.facets!!.isEmpty() + it.get()!!.response?.groups!!.isEmpty() + it.get()!!.response?.resultCount == 0 } val request = mockServer.takeRequest() val path = "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.1.1&_dt" diff --git a/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt b/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt index 37d6fadd..04f4c8c3 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt @@ -58,17 +58,17 @@ class ConstructorIoSearchTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getSearchResults("corn").test() observer.assertComplete().assertValue { - it.get()!!.searchData.searchResults!!.size == 24 - it.get()!!.searchData.searchResults!![0].value == "Del Monte Fresh Cut Corn Whole Kernel Golden Sweet with Natural Sea Salt - 15.25 Oz" - it.get()!!.searchData.searchResults!![0].result.id == "121150086" - it.get()!!.searchData.searchResults!![0].result.imageUrl == "https://d17bbgoo3npfov.cloudfront.net/images/farmstand-121150086.png" - it.get()!!.searchData.searchResults!![0].result.metadata["price"] == 2.29 - it.get()!!.searchData.searchResults!![0].matchedTerms!![0] == "corn" - it.get()!!.searchData.facets!!.size == 3 - it.get()!!.searchData.facets!![0].displayName == "Brand" - it.get()!!.searchData.facets!![0].type == "multiple" - it.get()!!.searchData.groups!!.size == 1 - it.get()!!.searchData.resultCount == 225 + it.get()!!.response?.results!!.size == 24 + it.get()!!.response?.results!![0].value == "Del Monte Fresh Cut Corn Whole Kernel Golden Sweet with Natural Sea Salt - 15.25 Oz" + it.get()!!.response?.results!![0].data.id == "121150086" + it.get()!!.response?.results!![0].data.imageUrl == "https://d17bbgoo3npfov.cloudfront.net/images/farmstand-121150086.png" + it.get()!!.response?.results!![0].data.metadata?.get("price") == 2.29 + it.get()!!.response?.results!![0].matchedTerms!![0] == "corn" + it.get()!!.response?.facets!!.size == 3 + it.get()!!.response?.facets!![0].displayName == "Brand" + it.get()!!.response?.facets!![0].type == "multiple" + it.get()!!.response?.groups!!.size == 1 + it.get()!!.response?.resultCount == 225 } val request = mockServer.takeRequest() val path = "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.1.1&_dt=" @@ -108,10 +108,10 @@ class ConstructorIoSearchTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getSearchResults("corn").test() observer.assertComplete().assertValue { - it.get()!!.searchData.searchResults!!.isEmpty() - it.get()!!.searchData.facets!!.isEmpty() - it.get()!!.searchData.groups!!.isEmpty() - it.get()!!.searchData.resultCount == 0 + it.get()!!.response?.results!!.isEmpty() + it.get()!!.response?.facets!!.isEmpty() + it.get()!!.response?.groups!!.isEmpty() + it.get()!!.response?.resultCount == 0 } val request = mockServer.takeRequest() val path = "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.1.1&_dt=" diff --git a/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt b/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt index d69bc149..31672bec 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt @@ -57,7 +57,8 @@ class ConstructorioTestCellTest { mockServer.enqueue(mockResponse) val observer = constructorIo.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { - it.get()!!.isNotEmpty() && it.get()!!.size == 5 + var suggestions = it.get()!!.sections?.get("Search Suggestions"); + suggestions?.isNotEmpty()!! && suggestions.size == 5 } val request = mockServer.takeRequest() val path = "/autocomplete/titanic?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.1.1&_dt=" diff --git a/library/src/test/java/io/constructor/mapper/MapperTest.kt b/library/src/test/java/io/constructor/mapper/MapperTest.kt index 1156f38a..ae84b5d1 100755 --- a/library/src/test/java/io/constructor/mapper/MapperTest.kt +++ b/library/src/test/java/io/constructor/mapper/MapperTest.kt @@ -8,8 +8,10 @@ class MapperTest { @Test fun mapDataToViewModel() { - val suggestions = TestDataLoader.loadResponse()!!.sections.suggestions - val viewModels = Mapper.toSuggestionsViewModel(suggestions) - assertEquals(10, viewModels.size) + val response = TestDataLoader.loadResponse() + val viewModels = response?.let { Mapper.toSuggestionsViewModel(it) } + if (viewModels != null) { + assertEquals(5, viewModels.size) + } } } \ No newline at end of file diff --git a/library/src/test/java/io/constructor/util/TestDataLoader.kt b/library/src/test/java/io/constructor/util/TestDataLoader.kt index 58a6f1ac..b92378e7 100755 --- a/library/src/test/java/io/constructor/util/TestDataLoader.kt +++ b/library/src/test/java/io/constructor/util/TestDataLoader.kt @@ -1,8 +1,8 @@ package io.constructor.util -import com.squareup.moshi.KotlinJsonAdapterFactory +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import com.squareup.moshi.Moshi -import io.constructor.data.model.AutocompleteResult +import io.constructor.data.model.autocomplete.AutocompleteResponse import io.constructor.data.model.search.SearchResponse import okio.Buffer import java.io.File @@ -13,21 +13,21 @@ import java.nio.charset.Charset object TestDataLoader { - fun loadResponse() : AutocompleteResult? = loadResult("autocomplete_response.json") + fun loadResponse() : AutocompleteResponse? = loadResult("autocomplete_response.json") - fun loadEmptyResponse() : AutocompleteResult? = loadResult("autocomplete_response_empty.json") + fun loadEmptyResponse() : AutocompleteResponse? = loadResult("autocomplete_response_empty.json") - private fun loadResult(fileName: String): AutocompleteResult? { + private fun loadResult(fileName: String): AutocompleteResponse? { val file = File(TestDataLoader::class.java.classLoader.getResource(fileName).path) val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build() - val jsonAdapter = moshi.adapter(AutocompleteResult::class.java) - var result: AutocompleteResult? = null + val jsonAdapter = moshi.adapter(AutocompleteResponse::class.java) + var response: AutocompleteResponse? = null try { - result = jsonAdapter.fromJson(Buffer().readFrom(FileInputStream(file))) + response = jsonAdapter.fromJson(Buffer().readFrom(FileInputStream(file))) } catch (e: IOException) { e.printStackTrace() } - return result + return response } private fun convertToSearchResult(stringResponse: String): SearchResponse? { diff --git a/sample/src/main/java/io/constructor/sample/data/CartDataStorage.kt b/sample/src/main/java/io/constructor/sample/data/CartDataStorage.kt index bfb6c5c9..8e80b106 100644 --- a/sample/src/main/java/io/constructor/sample/data/CartDataStorage.kt +++ b/sample/src/main/java/io/constructor/sample/data/CartDataStorage.kt @@ -1,7 +1,7 @@ package io.constructor.sample.data import android.content.Context -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import java.io.* class CartDataStorage(private val context: Context) { @@ -14,23 +14,25 @@ class CartDataStorage(private val context: Context) { } } - fun addToCart(item: SearchResult, quantity: Int = 1) { + fun addToCart(item: Result, quantity: Int = 1) { readAndWrite { - if (it.containsKey(item.result.id)) { - it[item.result.id] = it[item.result.id]!!.first to (it[item.result.id]!!.second + quantity) + val key = item.data.id!!; + if (it.containsKey(key)) { + it[key] = it[key]!!.first to (it[key]!!.second + quantity) } else { - it[item.result.id] = item to quantity + it[key] = item to quantity } } } - fun removeFromCart(item: SearchResult) { + fun removeFromCart(item: Result) { readAndWrite { - if (it.containsKey(item.result.id)) { - if (it.get(item.result.id)!!.second == 1) { - it.remove(item.result.id) + val key = item.data.id!!; + if (it.containsKey(key)) { + if (it.get(key)!!.second == 1) { + it.remove(key) } else { - it[item.result.id] = it[item.result.id]!!.first to (it[item.result.id]!!.second - 1) + it[key] = it[key]!!.first to (it[key]!!.second - 1) } } } @@ -42,19 +44,19 @@ class CartDataStorage(private val context: Context) { } } - fun getCartContent(): LinkedHashMap> { - var searchResult: LinkedHashMap> = linkedMapOf() + fun getCartContent(): LinkedHashMap> { + var searchResult: LinkedHashMap> = linkedMapOf() readAndWrite { searchResult = it } return searchResult } - fun readAndWrite(action: (LinkedHashMap>) -> Unit) { - var cartItems: LinkedHashMap> = linkedMapOf() + fun readAndWrite(action: (LinkedHashMap>) -> Unit) { + var cartItems: LinkedHashMap> = linkedMapOf() try { val input = ObjectInputStream(FileInputStream(cartFile)) - cartItems = input.readObject() as LinkedHashMap> + cartItems = input.readObject() as LinkedHashMap> input.close() } catch (e: Exception) { e.printStackTrace() diff --git a/sample/src/main/java/io/constructor/sample/extensions/ResultDataExt.kt b/sample/src/main/java/io/constructor/sample/extensions/ResultDataExt.kt index d215d25d..9484a518 100644 --- a/sample/src/main/java/io/constructor/sample/extensions/ResultDataExt.kt +++ b/sample/src/main/java/io/constructor/sample/extensions/ResultDataExt.kt @@ -1,23 +1,23 @@ package io.constructor.sample.extensions -import io.constructor.data.model.search.ResultData +import io.constructor.data.model.common.ResultData -fun ResultData.price(): Double? { - val price = metadata["price"] +fun ResultData.price(): Double { + val price = metadata?.get("price") if (price is String) { - return (metadata["price"] as String).trim('$').toDouble() + return price.trim('$').toDouble() } else if (price is Double) { return price } - return null + return 0.00 } -fun ResultData.priceFormatted(): String? { - val price = metadata["price"] +fun ResultData.priceFormatted(): String { + val price = metadata?.get("price") if (price is String) { return price } else if (price is Double) { return price.toString() } - return null + return "0.00" } \ No newline at end of file diff --git a/sample/src/main/java/io/constructor/sample/feature/cart/CartActivity.kt b/sample/src/main/java/io/constructor/sample/feature/cart/CartActivity.kt index f57f144e..7c2c2b28 100755 --- a/sample/src/main/java/io/constructor/sample/feature/cart/CartActivity.kt +++ b/sample/src/main/java/io/constructor/sample/feature/cart/CartActivity.kt @@ -3,7 +3,7 @@ package io.constructor.sample.feature.cart import android.content.Intent import android.os.Bundle import android.support.v7.widget.LinearLayoutManager -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.R import io.constructor.sample.common.BaseActivity import io.constructor.sample.di.DependencyProvider @@ -44,7 +44,7 @@ class CartActivity : BaseActivity(), CheckoutView { } } - override fun renderContent(content: LinkedHashMap>) { + override fun renderContent(content: LinkedHashMap>) { cartContent.layoutManager = LinearLayoutManager(this) adapter = CartContentAdapter({ ProductDetailActivity.start(this, it.first) diff --git a/sample/src/main/java/io/constructor/sample/feature/cart/CartContentAdapter.kt b/sample/src/main/java/io/constructor/sample/feature/cart/CartContentAdapter.kt index 7b21bd1a..514c9be0 100644 --- a/sample/src/main/java/io/constructor/sample/feature/cart/CartContentAdapter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/cart/CartContentAdapter.kt @@ -6,16 +6,16 @@ import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.R import io.constructor.sample.extensions.price import kotlinx.android.synthetic.main.item_cart_content.view.* -class CartContentAdapter(var clickListener: (Pair) -> Unit, val decrementAction: (SearchResult) -> Unit, val incrementAction: (SearchResult) -> Unit) : RecyclerView.Adapter() { +class CartContentAdapter(var clickListener: (Pair) -> Unit, val decrementAction: (Result) -> Unit, val incrementAction: (Result) -> Unit) : RecyclerView.Adapter() { - private val data = mutableListOf>() + private val data = mutableListOf>() - fun setData(data: LinkedHashMap>) { + fun setData(data: LinkedHashMap>) { this.data.clear() this.data.addAll(data.map { it.value }) notifyDataSetChanged() @@ -32,9 +32,9 @@ class CartContentAdapter(var clickListener: (Pair) -> Unit, v override fun onBindViewHolder(p0: RecyclerView.ViewHolder, p1: Int) { val item = data[p1] with(p0 as CartContentViewHolder) { - Glide.with(image).load(item.first.result.imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(image) + Glide.with(image).load(item.first.data.imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(image) title.text = item.first.value - price.text = price.context.getString(R.string.price, (item.first.result.price() ?: 0.0) * item.second) + price.text = price.context.getString(R.string.price, (item.first.data.price()) * item.second) increment.setOnClickListener { incrementAction.invoke(item.first) } diff --git a/sample/src/main/java/io/constructor/sample/feature/cart/CartPresenter.kt b/sample/src/main/java/io/constructor/sample/feature/cart/CartPresenter.kt index e01b7e1c..e80cd97a 100644 --- a/sample/src/main/java/io/constructor/sample/feature/cart/CartPresenter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/cart/CartPresenter.kt @@ -1,6 +1,6 @@ package io.constructor.sample.feature.cart -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.common.BasePresenter import io.constructor.sample.data.CartDataStorage import io.constructor.sample.feature.checkout.CheckoutView @@ -12,12 +12,12 @@ class CartPresenter(view: CheckoutView, private val cartStorage: CartDataStorage view.renderContent(content) } - fun removeFromCart(item: SearchResult) { + fun removeFromCart(item: Result) { cartStorage.removeFromCart(item) loadCartContents() } - fun addToCart(it: SearchResult) { + fun addToCart(it: Result) { cartStorage.addToCart(it) loadCartContents() } diff --git a/sample/src/main/java/io/constructor/sample/feature/cart/CartView.kt b/sample/src/main/java/io/constructor/sample/feature/cart/CartView.kt index b7c5b8d1..8f532f9a 100644 --- a/sample/src/main/java/io/constructor/sample/feature/cart/CartView.kt +++ b/sample/src/main/java/io/constructor/sample/feature/cart/CartView.kt @@ -1,8 +1,8 @@ package io.constructor.sample.feature.cart -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.search.SearchResponseInner import io.constructor.sample.common.BaseView interface CartView : BaseView { - fun renderContent(content: LinkedHashMap>) + fun renderContent(content: LinkedHashMap>) } \ No newline at end of file diff --git a/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutActivity.kt b/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutActivity.kt index 06a4aa36..82a8f9bf 100755 --- a/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutActivity.kt +++ b/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutActivity.kt @@ -1,7 +1,7 @@ package io.constructor.sample.feature.checkout import android.os.Bundle -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.R import io.constructor.sample.common.BaseActivity import io.constructor.sample.di.DependencyProvider @@ -22,7 +22,7 @@ class CheckoutActivity : BaseActivity(), CheckoutView { presenter.checkout() } - override fun renderContent(content: LinkedHashMap>) { + override fun renderContent(content: LinkedHashMap>) { } } diff --git a/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutPresenter.kt b/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutPresenter.kt index f84628f6..613ef912 100644 --- a/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutPresenter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutPresenter.kt @@ -10,7 +10,7 @@ class CheckoutPresenter(view: CheckoutView, private val cartStorage: CartDataSto fun checkout() { val total = cartStorage.getCartContent().map { it.value }.sumByDouble { - ((it.first.result.price() ?: 0.0) * it.second) + (it.first.data.price() * it.second) } ConstructorIo.trackPurchase(arrayOf("item-001", "item-002", "item-003"), total, "ORD" + Random.nextInt(0, 10000)) } diff --git a/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutView.kt b/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutView.kt index aa619e66..f072e528 100644 --- a/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutView.kt +++ b/sample/src/main/java/io/constructor/sample/feature/checkout/CheckoutView.kt @@ -1,8 +1,8 @@ package io.constructor.sample.feature.checkout -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.common.BaseView interface CheckoutView : BaseView { - fun renderContent(content: LinkedHashMap>) + fun renderContent(content: LinkedHashMap>) } \ No newline at end of file diff --git a/sample/src/main/java/io/constructor/sample/feature/home/AutoSuggestAdapter.kt b/sample/src/main/java/io/constructor/sample/feature/home/AutoSuggestAdapter.kt index 27d2f94f..f7fe3efd 100644 --- a/sample/src/main/java/io/constructor/sample/feature/home/AutoSuggestAdapter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/home/AutoSuggestAdapter.kt @@ -2,15 +2,16 @@ package io.constructor.sample.feature.home import android.content.Context import android.widget.ArrayAdapter -import io.constructor.data.model.Suggestion +import io.constructor.data.model.autocomplete.AutocompleteResponse +import io.constructor.data.model.common.Result class AutoSuggestAdapter(context: Context, resource: Int) : ArrayAdapter(context, resource) { - private val data = mutableListOf() + private val data = mutableListOf() - fun setData(suggestions: List) { + fun setData(suggestions: AutocompleteResponse) { data.clear() - data.addAll(suggestions) + suggestions.sections?.get("Search Suggestions")?.let { data.addAll(it) } notifyDataSetChanged() } @@ -18,7 +19,7 @@ class AutoSuggestAdapter(context: Context, resource: Int) : ArrayAdapter return data[position].value } - fun getSuggestion(position: Int): Suggestion { + fun getSuggestion(position: Int): Result { return data[position] } diff --git a/sample/src/main/java/io/constructor/sample/feature/home/HomeActivity.kt b/sample/src/main/java/io/constructor/sample/feature/home/HomeActivity.kt index 1c555b9a..3125fe6c 100755 --- a/sample/src/main/java/io/constructor/sample/feature/home/HomeActivity.kt +++ b/sample/src/main/java/io/constructor/sample/feature/home/HomeActivity.kt @@ -5,7 +5,7 @@ import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.View -import io.constructor.data.model.Suggestion +import io.constructor.data.model.autocomplete.AutocompleteResponse import io.constructor.sample.R import io.constructor.sample.common.BaseActivity import io.constructor.sample.feature.cart.CartActivity @@ -14,7 +14,7 @@ import kotlinx.android.synthetic.main.activity_home.* class HomeActivity : BaseActivity(), HomeView { - override fun renderAutcompleteData(it: List) { + override fun renderAutocompleteData(it: AutocompleteResponse) { autocompleteAdapter.setData(it) autocompleteAdapter.notifyDataSetChanged() } @@ -65,7 +65,7 @@ class HomeActivity : BaseActivity(), HomeView { private fun setupSearch() { autocompleteAdapter = AutoSuggestAdapter(this, android.R.layout.simple_dropdown_item_1line) searchInput.setAdapter(autocompleteAdapter) - searchInput.setOnItemClickListener { parent, view, position, id -> + searchInput.setOnItemClickListener { _, _, position, _ -> val item = autocompleteAdapter.getSuggestion(position) SearchResultActivity.start(this, item.value) } diff --git a/sample/src/main/java/io/constructor/sample/feature/home/HomePresenter.kt b/sample/src/main/java/io/constructor/sample/feature/home/HomePresenter.kt index 5bb366de..126a7f92 100644 --- a/sample/src/main/java/io/constructor/sample/feature/home/HomePresenter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/home/HomePresenter.kt @@ -16,8 +16,8 @@ class HomePresenter(view: HomeView) : BasePresenter(view) { ConstructorIo.getAutocompleteResults(it) }.io2ui().subscribe { it.onValue { - it?.let { - view.renderAutcompleteData(it) + it.let { + view.renderAutocompleteData(it) } } } diff --git a/sample/src/main/java/io/constructor/sample/feature/home/HomeView.kt b/sample/src/main/java/io/constructor/sample/feature/home/HomeView.kt index 119d8e61..89317e27 100644 --- a/sample/src/main/java/io/constructor/sample/feature/home/HomeView.kt +++ b/sample/src/main/java/io/constructor/sample/feature/home/HomeView.kt @@ -1,8 +1,8 @@ package io.constructor.sample.feature.home -import io.constructor.data.model.Suggestion +import io.constructor.data.model.autocomplete.AutocompleteResponse import io.constructor.sample.common.BaseView interface HomeView : BaseView { - fun renderAutcompleteData(it: List) + fun renderAutocompleteData(it: AutocompleteResponse) } \ No newline at end of file diff --git a/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailActivity.kt b/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailActivity.kt index 82848fe7..26320820 100755 --- a/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailActivity.kt +++ b/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailActivity.kt @@ -5,7 +5,7 @@ import android.content.Intent import android.os.Bundle import android.support.design.widget.Snackbar import com.bumptech.glide.Glide -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.R import io.constructor.sample.common.BaseActivity import io.constructor.sample.di.DependencyProvider @@ -15,7 +15,7 @@ import kotlinx.android.synthetic.main.activity_product_detail.* class ProductDetailActivity : BaseActivity(), ProductDetailView { private val item by lazy { - intent.getSerializableExtra(EXTRA_ITEM) as SearchResult + intent.getSerializableExtra(EXTRA_ITEM) as Result } override fun initPresenter(): ProductDetailPresenter { @@ -41,16 +41,16 @@ class ProductDetailActivity : BaseActivity(), ProductDet } } } - Glide.with(image).load(item.result.imageUrl).into(image) - price.text = item.result.priceFormatted() - descriptionTV.text = item.result.description + Glide.with(image).load(item.data.imageUrl).into(image) + price.text = item.data.priceFormatted() + descriptionTV.text = item.data.description } companion object { const val EXTRA_ITEM = "item" - fun start(context: Context, item: SearchResult) { + fun start(context: Context, item: Result) { context.startActivity(Intent(context, ProductDetailActivity::class.java).apply { putExtra(EXTRA_ITEM, item) }) diff --git a/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailPresenter.kt b/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailPresenter.kt index 898cb154..a1bc04a2 100644 --- a/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailPresenter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/productdetail/ProductDetailPresenter.kt @@ -1,15 +1,15 @@ package io.constructor.sample.feature.productdetail import io.constructor.core.ConstructorIo -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result import io.constructor.sample.common.BasePresenter import io.constructor.sample.data.CartDataStorage import io.constructor.sample.extensions.price class ProductDetailPresenter(view: ProductDetailView, private val cartDataStorage: CartDataStorage) : BasePresenter(view) { - fun addToCart(item: SearchResult) { - ConstructorIo.trackConversion(item.value, item.result.id, item.result.price()) + fun addToCart(item: Result) { + ConstructorIo.trackConversion(item.value, item.data.id!!, item.data.price()) cartDataStorage.addToCart(item) } diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultActivity.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultActivity.kt index b6d64aa5..a5a76dbf 100755 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultActivity.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultActivity.kt @@ -5,8 +5,8 @@ import android.content.Intent import android.os.Bundle import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.RecyclerView -import io.constructor.data.model.search.SearchResult -import io.constructor.data.model.search.SearchData +import io.constructor.data.model.common.Result +import io.constructor.data.model.search.SearchResponseInner import io.constructor.sample.R import io.constructor.sample.common.BaseActivity import io.constructor.sample.feature.productdetail.ProductDetailActivity @@ -22,7 +22,7 @@ class SearchResultActivity : BaseActivity(), SearchView { intent.getStringExtra(EXTRA_SEARCH_QUERY) } - override fun renderData(it: SearchData, totalCount: Int) { + override fun renderData(it: SearchResponseInner, totalCount: Int) { adapter.setData(it) toolbar.title = "$query, found: $totalCount" } @@ -65,8 +65,8 @@ class SearchResultActivity : BaseActivity(), SearchView { true } R.id.filter -> { - presenter.availableSortOptions?.let { - val dialog = SortDialog.newInstance(ArrayList(it), presenter.selectedSortOption) + presenter.availableFilterSortOptions?.let { + val dialog = SortDialog.newInstance(ArrayList(it), presenter.selectedFilterSortOption) dialog.dismissListener = { presenter.sortOptionSelected(it) } @@ -94,7 +94,7 @@ class SearchResultActivity : BaseActivity(), SearchView { }) } - override fun navigateToDetails(it: SearchResult) { + override fun navigateToDetails(it: Result) { ProductDetailActivity.start(this, it) } diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultAdapter.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultAdapter.kt index 743ba244..06bf5e2f 100644 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultAdapter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultAdapter.kt @@ -5,18 +5,18 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide -import io.constructor.data.model.search.SearchData -import io.constructor.data.model.search.SearchResult +import io.constructor.data.model.common.Result +import io.constructor.data.model.search.SearchResponseInner import io.constructor.sample.R import io.constructor.sample.extensions.priceFormatted import kotlinx.android.synthetic.main.item_search_result.view.* -class SearchResultAdapter(var clickListener: (SearchResult) -> Unit) : RecyclerView.Adapter() { +class SearchResultAdapter(var clickListener: (Result) -> Unit) : RecyclerView.Adapter() { - private val data = mutableListOf() + private val data = mutableListOf() - fun setData(it: SearchData) { - it.searchResults?.let { + fun setData(it: SearchResponseInner) { + it.results?.let { data.addAll(it) notifyDataSetChanged() } @@ -33,10 +33,10 @@ class SearchResultAdapter(var clickListener: (SearchResult) -> Unit) : RecyclerV override fun onBindViewHolder(p0: RecyclerView.ViewHolder, p1: Int) { val item = data[p1] with(p0 as SearchItemViewHolder) { - Glide.with(image).load(item.result.imageUrl).into(image) + Glide.with(image).load(item.data.imageUrl).into(image) title.text = item.value - description.text = item.result.description - val priceFormatted = item.result.priceFormatted() + description.text = item.data.description + val priceFormatted = item.data.priceFormatted() price.text = priceFormatted rootView.setOnClickListener { clickListener.invoke(item) diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultPresenter.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultPresenter.kt index e33df084..a6ffabac 100644 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultPresenter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchResultPresenter.kt @@ -1,22 +1,22 @@ package io.constructor.sample.feature.searchresult import io.constructor.core.ConstructorIo -import io.constructor.data.model.search.SearchResult -import io.constructor.data.model.search.SearchFacet -import io.constructor.data.model.search.SortOption +import io.constructor.data.model.common.Result +import io.constructor.data.model.common.FilterFacet +import io.constructor.data.model.common.FilterSortOption import io.constructor.sample.common.BasePresenter import io.constructor.sample.extensions.io2ui import io.constructor.sample.extensions.plusAssign class SearchResultPresenter(view: SearchView) : BasePresenter(view) { - var availableFacets: List? = null - var availableSortOptions: List? = null + var availableFacets: List? = null + var availableFilterSortOptions: List? = null private var page = 1 private val limit = 10 private lateinit var query: String var selectedFacets: HashMap>? = null - var selectedSortOption: SortOption? = null + var selectedFilterSortOption: FilterSortOption? = null private var totalCount: Int? = null @@ -38,14 +38,14 @@ class SearchResultPresenter(view: SearchView) : BasePresenter(view) } private fun loadInternal(firstRun: Boolean) { - compositeDisposable += ConstructorIo.getSearchResults(query, selectedFacets?.map { it.key to it.value }, page = page, perPage = limit, sortBy = selectedSortOption?.sortBy, sortOrder = selectedSortOption?.sortOrder).io2ui().subscribe { + compositeDisposable += ConstructorIo.getSearchResults(query, selectedFacets?.map { it.key to it.value }, page = page, perPage = limit, sortBy = selectedFilterSortOption?.sortBy, sortOrder = selectedFilterSortOption?.sortOrder).io2ui().subscribe { it.onValue { if (firstRun) { - availableFacets = it.searchData.facets - availableSortOptions = it.searchData.sortOptions - ConstructorIo.trackSearchResultsLoaded(query, it.searchData.resultCount) + availableFacets = it.response?.facets + availableFilterSortOptions = it.response?.filterSortOptions + it.response?.resultCount?.let { it1 -> ConstructorIo.trackSearchResultsLoaded(query, it1) } } - it.searchData?.let { + it.response?.let { page += 1 totalCount = it.resultCount view.renderData(it, totalCount!!) @@ -54,8 +54,8 @@ class SearchResultPresenter(view: SearchView) : BasePresenter(view) } } - fun handleClick(it: SearchResult, query: String) { - ConstructorIo.trackSearchResultClick(it.value, it.result.id, query) + fun handleClick(it: Result, query: String) { + it.data.id?.let { it1 -> ConstructorIo.trackSearchResultClick(it.value, it1, query) } view.navigateToDetails(it) } @@ -66,9 +66,9 @@ class SearchResultPresenter(view: SearchView) : BasePresenter(view) loadNextDataBatch() } - fun sortOptionSelected(option: SortOption?) { + fun sortOptionSelected(optionFilter: FilterSortOption?) { page = 1 - selectedSortOption = option + selectedFilterSortOption = optionFilter view.clearData() loadNextDataBatch() } diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchView.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchView.kt index a8c06c61..a9a0ca87 100644 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchView.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/SearchView.kt @@ -1,11 +1,11 @@ package io.constructor.sample.feature.searchresult -import io.constructor.data.model.search.SearchResult -import io.constructor.data.model.search.SearchData +import io.constructor.data.model.common.Result +import io.constructor.data.model.search.SearchResponseInner import io.constructor.sample.common.BaseView interface SearchView : BaseView { - fun renderData(it: SearchData, totalCount: Int) - fun navigateToDetails(it: SearchResult) + fun renderData(it: SearchResponseInner, totalCount: Int) + fun navigateToDetails(it: Result) fun clearData() } \ No newline at end of file diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterDialog.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterDialog.kt index 0e50e64d..364fccf1 100644 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterDialog.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterDialog.kt @@ -7,7 +7,7 @@ import android.support.v7.app.AlertDialog import android.support.v7.widget.LinearLayoutManager import android.view.LayoutInflater import android.view.View -import io.constructor.data.model.search.SearchFacet +import io.constructor.data.model.common.FilterFacet import io.constructor.sample.R import kotlinx.android.synthetic.main.dialog_filter.view.* @@ -28,13 +28,11 @@ class FilterDialog : DialogFragment() { private fun setDialogInteractions(view: View) { - val list = arguments?.getSerializable(EXTRA_FACETS) as ArrayList + val list = arguments?.getSerializable(EXTRA_FACETS) as ArrayList val selectedFacets = arguments?.getSerializable(EXTRA_SELECTED_FACETS) as? HashMap> view.filterList.layoutManager = LinearLayoutManager(view.context) adapter = FilterListAdapter().apply { - list?.let { - setData(it, selectedFacets) - } + setData(list, selectedFacets) } view.title.text = "Filters" view.cancel.setOnClickListener { @@ -52,7 +50,7 @@ class FilterDialog : DialogFragment() { const val EXTRA_FACETS = "facets" const val EXTRA_SELECTED_FACETS = "selected-facets" - fun newInstance(facets: ArrayList, selectedFacets: HashMap>? = null): FilterDialog { + fun newInstance(facets: ArrayList, selectedFacets: HashMap>? = null): FilterDialog { return FilterDialog().apply { arguments = Bundle().apply { putSerializable(EXTRA_FACETS, facets) diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterListAdapter.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterListAdapter.kt index 41d29f0a..59621176 100644 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterListAdapter.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/filterdialog/FilterListAdapter.kt @@ -4,8 +4,8 @@ import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import io.constructor.data.model.search.FacetOption -import io.constructor.data.model.search.SearchFacet +import io.constructor.data.model.common.FilterFacetOption +import io.constructor.data.model.common.FilterFacet import io.constructor.sample.R import kotlinx.android.synthetic.main.item_facet.view.* import kotlinx.android.synthetic.main.item_header.view.* @@ -17,7 +17,7 @@ class FilterListAdapter : RecyclerView.Adapter() { private val data = mutableListOf>() - fun setData(facets: ArrayList, selected: HashMap>? = null) { + fun setData(facets: ArrayList, selected: HashMap>? = null) { facets.forEach { facet -> val selectedFacets = selected?.get(facet.displayName!!) data.add(HeaderWrapper(facet)) @@ -78,7 +78,7 @@ class FilterListAdapter : RecyclerView.Adapter() { is ItemViewHolder -> { item as ItemWrapper p0.checkbox.text = item.data.second.value - p0.checkbox.setOnCheckedChangeListener { buttonView, isChecked -> + p0.checkbox.setOnCheckedChangeListener { _, isChecked -> item.checked = isChecked } p0.checkbox.isChecked = item.checked @@ -86,9 +86,9 @@ class FilterListAdapter : RecyclerView.Adapter() { } } - internal class HeaderWrapper(data: SearchFacet) : DataWrapper(data) + internal class HeaderWrapper(data: FilterFacet) : DataWrapper(data) - internal class ItemWrapper(data: Pair) : DataWrapper>(data) + internal class ItemWrapper(data: Pair) : DataWrapper>(data) internal abstract class DataWrapper(var data: T) { var checked = false diff --git a/sample/src/main/java/io/constructor/sample/feature/searchresult/sortdialog/SortDialog.kt b/sample/src/main/java/io/constructor/sample/feature/searchresult/sortdialog/SortDialog.kt index e0ecde68..feb18c57 100644 --- a/sample/src/main/java/io/constructor/sample/feature/searchresult/sortdialog/SortDialog.kt +++ b/sample/src/main/java/io/constructor/sample/feature/searchresult/sortdialog/SortDialog.kt @@ -7,13 +7,13 @@ import android.support.v7.app.AlertDialog import android.view.LayoutInflater import android.view.View import android.widget.RadioButton -import io.constructor.data.model.search.SortOption +import io.constructor.data.model.common.FilterSortOption import io.constructor.sample.R import kotlinx.android.synthetic.main.dialog_sort.view.* class SortDialog : DialogFragment() { - var dismissListener: ((SortOption?) -> Unit)? = null + var dismissListener: ((FilterSortOption?) -> Unit)? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val view = LayoutInflater.from(activity).inflate(R.layout.dialog_sort, null) @@ -26,8 +26,8 @@ class SortDialog : DialogFragment() { private fun setDialogInteractions(view: View) { - val list = arguments?.getSerializable(EXTRA_OPTIONS) as ArrayList - val selectedSortOption = arguments?.getSerializable(EXTRA_SELECTED_OPTION) as? SortOption + val list = arguments?.getSerializable(EXTRA_OPTIONS) as ArrayList + val selectedSortOption = arguments?.getSerializable(EXTRA_SELECTED_OPTION) as? FilterSortOption list.forEachIndexed { index, sortOption -> val radioButton = LayoutInflater.from(view.context).inflate(R.layout.item_sort_option, view.filterRadioGroup, false) as RadioButton radioButton.id = index + 1 @@ -59,12 +59,12 @@ class SortDialog : DialogFragment() { const val EXTRA_OPTIONS = "options" const val EXTRA_SELECTED_OPTION = "selected-option" - fun newInstance(sortOptions: ArrayList, selectedSortOption: SortOption? = null): SortDialog { + fun newInstance(filterSortOptions: ArrayList, selectedFilterSortOption: FilterSortOption? = null): SortDialog { return SortDialog().apply { arguments = Bundle().apply { - putSerializable(EXTRA_OPTIONS, sortOptions) - selectedSortOption?.let { - putSerializable(EXTRA_SELECTED_OPTION, selectedSortOption) + putSerializable(EXTRA_OPTIONS, filterSortOptions) + selectedFilterSortOption?.let { + putSerializable(EXTRA_SELECTED_OPTION, selectedFilterSortOption) } } }