From 672c2b66c0dd953d6adc3ddff769a3afaabea2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Tue, 13 Jun 2017 16:13:17 +0200 Subject: [PATCH 01/18] get detailed places request added to StSDK, PlacesDetailedRepsonse removed - only PlacesResponse --- .../travel/sdkdemo/list/PlacesListActivity.kt | 74 +++++++++---------- .../main/java/com/sygic/travel/sdk/StSDK.kt | 26 ++++++- .../PlacesDetailedResponse.kt | 21 ------ .../api/responseWrappers/PlacesResponse.kt | 4 +- .../travel/sdk/contentProvider/api/StApi.kt | 6 +- .../sygic/travel/sdk/model/place/Detail.kt | 21 +++++- 6 files changed, 84 insertions(+), 68 deletions(-) delete mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesDetailedResponse.kt diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt index 1aa9cfce..3d68a6eb 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt @@ -72,14 +72,13 @@ class PlacesListActivity : AppCompatActivity() { } // On a place click listener. Opens it's detail. - private val onPlaceClick: PlacesAdapter.ViewHolder.PlaceClick - get() = object : PlacesAdapter.ViewHolder.PlaceClick { - override fun onPlaceClick(position: Int) { - val placeDetailIntent = Intent(this@PlacesListActivity, PlaceDetailActivity::class.java) - placeDetailIntent.putExtra(ID, places!![position].id) - startActivity(placeDetailIntent) - } + private val onPlaceClick = object: PlacesAdapter.ViewHolder.PlaceClick { + override fun onPlaceClick(position: Int) { + val placeDetailIntent = Intent(this@PlacesListActivity, PlaceDetailActivity::class.java) + placeDetailIntent.putExtra(ID, places!![position].id) + startActivity(placeDetailIntent) } + } // Use the SDK to load places private fun loadPlaces() { @@ -98,47 +97,42 @@ class PlacesListActivity : AppCompatActivity() { } // On a category click listener. - private // Set activity's title - // Reload places - val onCategoriesClick: CategoriesAdapter.ViewHolder.CategoryClick - get() = object : CategoriesAdapter.ViewHolder.CategoryClick { - override fun onCategoryClick(categoryKey: String, categoryName: String) { - if (selectedCateoriesKeys.contains(categoryKey)) { - categoriesDialog!!.dismiss() - return - } - if (categoryKey == "all") { - selectedCateoriesKeys.clear() - title = getString(R.string.title_activity_list) - } else { - selectedCateoriesKeys.add(categoryKey) - title = String.format(titlePattern!!, categoryName) - } - loadPlaces() + private val onCategoriesClick = object: CategoriesAdapter.ViewHolder.CategoryClick { + override fun onCategoryClick(categoryKey: String, categoryName: String) { + if (selectedCateoriesKeys.contains(categoryKey)) { categoriesDialog!!.dismiss() + return + } + if (categoryKey == "all") { + selectedCateoriesKeys.clear() + title = getString(R.string.title_activity_list) // Set activity's title + } else { + selectedCateoriesKeys.add(categoryKey) + title = String.format(titlePattern!!, categoryName) // Set activity's title } + loadPlaces() // Reload places + categoriesDialog!!.dismiss() } + } - private // Places are sorted by rating, best rated places are at the top of the list - val placesCallback: Callback<List<Place>?> - get() = object : Callback<List<Place>?>() { - override fun onSuccess(data: List<Place>?) { - // Places are sorted by rating, best rated places are at the top of the list - Collections.sort(data) { p1, p2 -> - if (p1.rating == p2.rating) { - 0 - } else { - if (p1.rating > p2.rating) -1 else 1 - } + private val placesCallback = object: Callback<List<Place>?>() { + override fun onSuccess(data: List<Place>?) { + // Places are sorted by rating, best rated places are at the top of the list + Collections.sort(data) { p1, p2 -> + if (p1.rating == p2.rating) { + 0 + } else { + if (p1.rating > p2.rating) -1 else 1 } - renderPlacesList(data!!) } + renderPlacesList(data!!) + } - override fun onFailure(t: Throwable) { - Toast.makeText(this@PlacesListActivity, t.message, Toast.LENGTH_LONG).show() - t.printStackTrace() - } + override fun onFailure(t: Throwable) { + Toast.makeText(this@PlacesListActivity, t.message, Toast.LENGTH_LONG).show() + t.printStackTrace() } + } companion object { private val TAG = PlacesListActivity::class.java.simpleName diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index 0c15bab3..3b7574a6 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -70,7 +70,7 @@ class StSDK internal constructor() { * Creates and sends a request to get place with detailed information. * @param id Unique id of a place - detailed information about this place will be requested. * * - * @param back Callback. Either [Callback.onSuccess] with places is called, or + * @param back Callback. Either [Callback.onSuccess] with place is called, or * * [Callback.onFailure] in case of an error is called. */ fun getPlaceDetailed(id: String, back: Callback<Place?>) { @@ -88,6 +88,30 @@ class StSDK internal constructor() { disposable = preparedObservable.subscribeWith(StObserver(callback, false)) } + /** + * + * Creates and sends a request to get places with detailed information. + * @param ids Ids of places - detailed information about these places will be requested. + * * + * @param back Callback. Either [Callback.onSuccess] with places is called, or + * * [Callback.onFailure] in case of an error is called. + */ + fun getPlacesDetailed(ids: List<String>, back: Callback<List<Place>?>) { + val queryIds = ids.joinToString(Query.Operator.OR.operator) + val unpreparedObservable = getStApi().getPlacesDetailed(queryIds) + val preparedObservable = getPreparedObservable(unpreparedObservable) + val callback = object : Callback<PlacesResponse>() { + override fun onSuccess(data: PlacesResponse) { + back.onSuccess(data.getPlaces()) + } + + override fun onFailure(t: Throwable) { + back.onFailure(t) + } + } + subscription = preparedObservable.subscribe(StObserver(callback, false)) + } + /** * * Creates and sends a request to get the place's media. diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesDetailedResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesDetailedResponse.kt deleted file mode 100644 index 74133d01..00000000 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesDetailedResponse.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.sygic.travel.sdk.api.responseWrappers - -import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.model.place.Place - -/** - * Response containing a list of detailed places data. Suitable for showing details in a pager or - * synchronization. - */ -class PlacesDetailedResponse : StResponse() { - private var data: Data? = null - - fun getPlaces(): List<Place>? { - return data?.places - } - - inner class Data { - @SerializedName("places") - var places: List<Place>? = null - } -} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt index bf34c289..1987d349 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt @@ -4,8 +4,8 @@ import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.model.place.Place /** - * Response that contains a list of basic places data (without detailed data). Suitable for showing - * places in a list or spread on a map. + * Response that contains a list of places data. Suitable for showing places in a list or + * spread on a map. */ class PlacesResponse : StResponse() { private var data: Data? = null diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt b/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt index 55494048..969d7be0 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt @@ -36,10 +36,10 @@ interface StApi { @Path("id") id: String ): Observable<Result<PlaceDetailedResponse>> - @GET("places/{ids}") + @GET("places") fun getPlacesDetailed( - @Path(encoded = true, value = "ids") ids: String - ): Observable<Result<PlacesDetailedResponse>> + @Query(encoded = true, value = "ids") ids: String + ): Observable<Result<PlacesResponse>> @GET("places/{id}/media") fun getPlaceMedia( diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt index dda9ef61..65c3f1ff 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt @@ -1,21 +1,40 @@ package com.sygic.travel.sdk.model.place +import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.model.media.MainMedia /** * Place detailed information. */ class Detail { - + @SerializedName("tags") var tags: List<Tag>? = null + + @SerializedName("description") var description: Description? = null + + @SerializedName("address") var address: String? = null + + @SerializedName("admission") var admission: String? = null + + @SerializedName("duration") var duration: Int = 0 + + @SerializedName("email") var email: String? = null + + @SerializedName("opening_hours") var openingHours: String? = null + + @SerializedName("phone") var phone: String? = null + + @SerializedName("main_media") var mainMedia: MainMedia? = null + + @SerializedName("references") var references: List<Reference>? = null } From 95dc8d4fb50e30ffc02f31cfc4fac056da432ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Wed, 14 Jun 2017 11:31:54 +0200 Subject: [PATCH 02/18] SDK: internal model classes added --- .../sygic/travel/sdk/api/model/geo/Bounds.kt | 20 +++++ .../travel/sdk/api/model/geo/Location.kt | 16 ++++ .../travel/sdk/api/model/media/Attribution.kt | 31 +++++++ .../travel/sdk/api/model/media/MainMedia.kt | 18 ++++ .../travel/sdk/api/model/media/Medium.kt | 51 +++++++++++ .../travel/sdk/api/model/media/Original.kt | 19 +++++ .../travel/sdk/api/model/media/Source.kt | 19 +++++ .../sygic/travel/sdk/api/model/media/Usage.kt | 22 +++++ .../travel/sdk/api/model/place/Description.kt | 22 +++++ .../travel/sdk/api/model/place/PlaceDetail.kt | 84 +++++++++++++++++++ .../sygic/travel/sdk/api/model/place/Price.kt | 13 +++ .../travel/sdk/api/model/place/Reference.kt | 40 +++++++++ .../sygic/travel/sdk/api/model/place/Tag.kt | 12 +++ 13 files changed, 367 insertions(+) create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt new file mode 100644 index 00000000..fac2c4d9 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt @@ -0,0 +1,20 @@ +package com.sygic.travel.sdk.api.model.geo + +import com.google.gson.annotations.SerializedName + +/** + * Geographical bounds - south, west, north, east. + */ +internal class Bounds { + @SerializedName("north") + var north: Float = 0.toFloat() + + @SerializedName("east") + var east: Float = 0.toFloat() + + @SerializedName("south") + var south: Float = 0.toFloat() + + @SerializedName("west") + var west: Float = 0.toFloat() +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt new file mode 100644 index 00000000..7ba72339 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt @@ -0,0 +1,16 @@ +package com.sygic.travel.sdk.api.model.geo + +import com.google.gson.annotations.SerializedName + +/** + * Geographic location - latitude, longitude. + */ +internal class Location { + + @SerializedName("lat") + var lat: Float = 0.toFloat() + + @SerializedName("lng") + var lng: Float = 0.toFloat() + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt new file mode 100644 index 00000000..2d1402ed --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt @@ -0,0 +1,31 @@ +package com.sygic.travel.sdk.api.model.media + +import com.google.gson.annotations.SerializedName + +/** + * Attribution of a medium, contains information about author, license and title. + */ +internal class Attribution { + + @SerializedName("author") + var author: String? = null + + @SerializedName("author_url") + var authorUrl: String? = null + + @SerializedName("license") + var license: String? = null + + @SerializedName("license_url") + var licenseUrl: String? = null + + @SerializedName("other") + var other: String? = null + + @SerializedName("title") + var title: String? = null + + @SerializedName("title_url") + var titleUrl: String? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt new file mode 100644 index 00000000..4c7580d8 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt @@ -0,0 +1,18 @@ +package com.sygic.travel.sdk.api.model.media + +import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.media.Medium +import com.sygic.travel.sdk.model.media.Usage + +/** + * Place main media. + */ +internal class MainMedia { + + @SerializedName("usage") + val usage: Usage? = null + + @SerializedName("media") + val media: List<Medium>? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt new file mode 100644 index 00000000..1e7b7cab --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt @@ -0,0 +1,51 @@ +package com.sygic.travel.sdk.api.model.media + +import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.geo.Location +import com.sygic.travel.sdk.model.media.Attribution +import com.sygic.travel.sdk.model.media.Original +import com.sygic.travel.sdk.model.media.Source + +/** + * Place medium. + */ + +internal class Medium { + + @SerializedName("id") + var id: String? = null + + @SerializedName("type") + var type: String? = null + + @SerializedName("url_template") + var urlTemplate: String? = null + + @SerializedName("url") + var url: String? = null + + @SerializedName("original") + var original: Original? = null + + @SerializedName("suitability") + var suitability: List<String>? = null + + @SerializedName("created_at") + var createdAt: String? = null + + @SerializedName("source") + var source: Source? = null + + @SerializedName("created_by") + var createdBy: String? = null + + @SerializedName("quadkey") + var quadkey: String? = null + + @SerializedName("attribution") + var attribution: Attribution? = null + + @SerializedName("location") + var location: Location? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt new file mode 100644 index 00000000..9f03462f --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt @@ -0,0 +1,19 @@ +package com.sygic.travel.sdk.api.model.media + +import com.google.gson.annotations.SerializedName + +/** + * Medium's original parameters. + */ +internal class Original { + + @SerializedName("size") + var size: Int = 0 + + @SerializedName("width") + var width: Int = 0 + + @SerializedName("height") + var height: Int = 0 + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt new file mode 100644 index 00000000..95b33281 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt @@ -0,0 +1,19 @@ +package com.sygic.travel.sdk.api.model.media + +import com.google.gson.annotations.SerializedName + +/** + * Medium's source. + */ +internal class Source { + + @SerializedName("name") + var name: String? = null + + @SerializedName("external_id") + var externalId: String? = null + + @SerializedName("provider") + var provider: String? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt new file mode 100644 index 00000000..bc8872cf --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt @@ -0,0 +1,22 @@ +package com.sygic.travel.sdk.api.model.media + +import com.google.gson.annotations.SerializedName + +/** + * Medium's suitable usages. + */ +internal class Usage { + + @SerializedName("square") + val square: String? = null + + @SerializedName("landscape") + val landscape: String? = null + + @SerializedName("portrait") + val portrait: String? = null + + @SerializedName("video_preview") + val videoPreview: String? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt new file mode 100644 index 00000000..ecdf1224 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt @@ -0,0 +1,22 @@ +package com.sygic.travel.sdk.api.model.place + +import com.google.gson.annotations.SerializedName + +/** + * Place description data. + */ +internal class Description { + + @SerializedName("text") + var text: String? = null + + @SerializedName("provider") + var provider: String? = null + + @SerializedName("translation_provider") + var translationProvider: String? = null + + @SerializedName("url") + var url: String? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt new file mode 100644 index 00000000..80b15eb1 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt @@ -0,0 +1,84 @@ +package com.sygic.travel.sdk.api.model.place + +import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.geo.Bounds +import com.sygic.travel.sdk.api.model.geo.Location +import com.sygic.travel.sdk.api.model.media.MainMedia + +internal class PlaceDetail { + // PLACE + + @SerializedName("id") + var id: String? = null + + @SerializedName("level") + var level: String? = null + + @SerializedName("categories") + var categories: List<String>? = null + + @SerializedName("rating") + var rating: Float = 0.toFloat() + + @SerializedName("quadkey") + var quadkey: String? = null + + @SerializedName("location") + var location: Location? = null + + @SerializedName("bounding_box") + var bounds: Bounds? = null + + @SerializedName("name") + var name: String? = null + + @SerializedName("name_suffix") + var nameSuffix: String? = null + + @SerializedName("perex") + var perex: String? = null + + @SerializedName("url") + var url: String? = null + + @SerializedName("thumbnail_url") + var thumbnailUrl: String? = null + + @SerializedName("marker") + var marker: String? = null + + @SerializedName("parent_ids") + var parentIds: List<String>? = null + + // DETAIL + + @SerializedName("tags") + var tags: List<Tag>? = null + + @SerializedName("description") + var description: Description? = null + + @SerializedName("address") + var address: String? = null + + @SerializedName("admission") + var admission: String? = null + + @SerializedName("duration") + var duration: Int = 0 + + @SerializedName("email") + var email: String? = null + + @SerializedName("opening_hours") + var openingHours: String? = null + + @SerializedName("phone") + var phone: String? = null + + @SerializedName("main_media") + var mainMedia: MainMedia? = null + + @SerializedName("references") + var references: List<Reference>? = null +} \ No newline at end of file diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt new file mode 100644 index 00000000..9ee6f62c --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt @@ -0,0 +1,13 @@ +package com.sygic.travel.sdk.api.model.place + +import com.google.gson.annotations.SerializedName + +internal class Price { + + @SerializedName("value") + var value: Float = 0.toFloat() + + @SerializedName("savings") + var savings: Float = 0.toFloat() + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt new file mode 100644 index 00000000..33a23a16 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt @@ -0,0 +1,40 @@ +package com.sygic.travel.sdk.api.model.place + +import com.google.gson.annotations.SerializedName + +/** + * Link (Wiki, web site, etc.) related to a specific place. + */ +internal class Reference { + + @SerializedName("id") + var id: Int = 0 + + @SerializedName("title") + var title: String? = null + + @SerializedName("type") + var type: String? = null + + @SerializedName("language_id") + var languageId: String? = null + + @SerializedName("url") + var url: String? = null + + @SerializedName("supplier") + var supplier: String? = null + + @SerializedName("priority") + var priority: Int = 0 + + @SerializedName("currency") + var currency: String? = null + + @SerializedName("price") + var price: Float = 0.toFloat() + + @SerializedName("flags") + var flags: List<String>? = null + +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt new file mode 100644 index 00000000..ca53b43f --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt @@ -0,0 +1,12 @@ +package com.sygic.travel.sdk.api.model.place + +import com.google.gson.annotations.SerializedName + +internal class Tag { + + @SerializedName("key") + var key: String? = null + + @SerializedName("name") + var name: String? = null +} From 12c41bb51996784c1405448f17d3384d7695615e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Wed, 14 Jun 2017 11:47:04 +0200 Subject: [PATCH 03/18] SDK: all API classes moved to package api --- .../sdkdemo/detail/PlaceDetailActivity.kt | 2 +- .../travel/sdkdemo/gallery/GalleryActivity.kt | 2 +- .../travel/sdkdemo/list/PlacesListActivity.kt | 2 +- .../sygic/travel/sdkdemo/map/MapsActivity.kt | 2 +- .../travel/sdkdemo/search/SearchActivity.kt | 2 +- .../travel/sdkdemo/tours/ToursActivity.kt | 2 +- .../main/java/com/sygic/travel/sdk/StSDK.kt | 12 +++--- .../sdk/{contentProvider => }/api/Callback.kt | 2 +- .../sdk/{contentProvider => }/api/StApi.kt | 9 ++-- .../api/StApiConstants.kt | 2 +- .../api/StApiGenerator.kt | 11 ++--- .../{contentProvider => }/api/StObserver.kt | 4 +- .../travel/sdk/api/SupportedLanguages.kt | 42 +++++++++++++++++++ .../api/interceptors/HeadersInterceptor.kt | 19 ++++----- .../api/interceptors/LocaleInterceptor.kt | 17 ++++---- .../contentProvider/api/SupportedLanguages.kt | 42 ------------------- 16 files changed, 85 insertions(+), 87 deletions(-) rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/Callback.kt (69%) rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/StApi.kt (86%) rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/StApiConstants.kt (89%) rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/StApiGenerator.kt (86%) rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/StObserver.kt (97%) create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/interceptors/HeadersInterceptor.kt (63%) rename sdk/src/main/java/com/sygic/travel/sdk/{contentProvider => }/api/interceptors/LocaleInterceptor.kt (63%) delete mode 100644 sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/SupportedLanguages.kt diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt index 91506297..556f8755 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt @@ -12,7 +12,7 @@ import android.widget.Toast import com.google.android.flexbox.FlexboxLayout import com.squareup.picasso.Picasso import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.contentProvider.api.Callback +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.place.Reference import com.sygic.travel.sdk.model.place.Tag diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/gallery/GalleryActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/gallery/GalleryActivity.kt index 7b6ec381..b5a4e6f6 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/gallery/GalleryActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/gallery/GalleryActivity.kt @@ -8,7 +8,7 @@ import android.support.v7.widget.RecyclerView import android.util.Log import android.widget.ImageView import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.contentProvider.api.Callback +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.model.media.Medium import com.sygic.travel.sdkdemo.R import com.sygic.travel.sdkdemo.utils.Utils diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt index 3d68a6eb..dba17db2 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt @@ -10,7 +10,7 @@ import android.view.Menu import android.view.MenuItem import android.widget.Toast import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.contentProvider.api.Callback +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.query.PlacesQuery import com.sygic.travel.sdkdemo.R diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/map/MapsActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/map/MapsActivity.kt index 5336e949..ac1b7ec1 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/map/MapsActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/map/MapsActivity.kt @@ -13,7 +13,7 @@ import com.google.android.gms.maps.OnMapReadyCallback import com.google.android.gms.maps.SupportMapFragment import com.google.android.gms.maps.model.* import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.contentProvider.api.Callback +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.geo.quadkey.QuadkeysGenerator import com.sygic.travel.sdk.geo.spread.CanvasSize import com.sygic.travel.sdk.geo.spread.SpreadResult diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/search/SearchActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/search/SearchActivity.kt index bde134fc..718f2ebe 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/search/SearchActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/search/SearchActivity.kt @@ -15,7 +15,7 @@ import android.widget.EditText import android.widget.TextView import android.widget.Toast import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.contentProvider.api.Callback +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.query.PlacesQuery import com.sygic.travel.sdkdemo.R diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt index de570782..11c578f1 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt @@ -8,7 +8,7 @@ import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.widget.Toast import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.contentProvider.api.Callback +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.model.place.Tour import com.sygic.travel.sdk.model.query.ToursQuery import com.sygic.travel.sdkdemo.R diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index 3b7574a6..327bbd45 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -8,10 +8,10 @@ import com.sygic.travel.sdk.api.responseWrappers.MediaResponse import com.sygic.travel.sdk.api.responseWrappers.PlaceDetailedResponse import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse import com.sygic.travel.sdk.api.responseWrappers.TourResponse -import com.sygic.travel.sdk.contentProvider.api.Callback -import com.sygic.travel.sdk.contentProvider.api.StApi -import com.sygic.travel.sdk.contentProvider.api.StApiGenerator -import com.sygic.travel.sdk.contentProvider.api.StObserver +import com.sygic.travel.sdk.api.Callback +import com.sygic.travel.sdk.api.StApi +import com.sygic.travel.sdk.api.StApiGenerator +import com.sygic.travel.sdk.api.StObserver import com.sygic.travel.sdk.model.media.Medium import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.place.Tour @@ -97,7 +97,7 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlacesDetailed(ids: List<String>, back: Callback<List<Place>?>) { - val queryIds = ids.joinToString(Query.Operator.OR.operator) + val queryIds = ids.joinToString(PlacesQuery.Operator.OR.operator) val unpreparedObservable = getStApi().getPlacesDetailed(queryIds) val preparedObservable = getPreparedObservable(unpreparedObservable) val callback = object : Callback<PlacesResponse>() { @@ -109,7 +109,7 @@ class StSDK internal constructor() { back.onFailure(t) } } - subscription = preparedObservable.subscribe(StObserver(callback, false)) + disposable = preparedObservable.subscribeWith(StObserver(callback, false)) } /** diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/Callback.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/Callback.kt similarity index 69% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/Callback.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/Callback.kt index 5c4290d8..2c53d405 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/Callback.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/Callback.kt @@ -1,4 +1,4 @@ -package com.sygic.travel.sdk.contentProvider.api +package com.sygic.travel.sdk.api abstract class Callback<in T> { abstract fun onSuccess(data: T) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt similarity index 86% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt index 969d7be0..acb4a37d 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApi.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt @@ -1,11 +1,14 @@ -package com.sygic.travel.sdk.contentProvider.api +package com.sygic.travel.sdk.api -import com.sygic.travel.sdk.api.responseWrappers.* +import com.sygic.travel.sdk.api.responseWrappers.MediaResponse +import com.sygic.travel.sdk.api.responseWrappers.PlaceDetailedResponse +import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse +import com.sygic.travel.sdk.api.responseWrappers.TourResponse +import io.reactivex.Observable import retrofit2.adapter.rxjava2.Result import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Query -import io.reactivex.Observable /** * diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiConstants.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt similarity index 89% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiConstants.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt index 23b34841..05c6d0d8 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiConstants.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt @@ -1,4 +1,4 @@ -package com.sygic.travel.sdk.contentProvider.api +package com.sygic.travel.sdk.api object StApiConstants { diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiGenerator.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt similarity index 86% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiGenerator.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt index d4a5ee6c..816dbb72 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiGenerator.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt @@ -1,11 +1,12 @@ -package com.sygic.travel.sdk.contentProvider.api +package com.sygic.travel.sdk.api import com.google.gson.FieldNamingPolicy import com.google.gson.GsonBuilder -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.API_BASE_URL -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.VERSION_AND_LOCALE -import com.sygic.travel.sdk.contentProvider.api.interceptors.HeadersInterceptor -import com.sygic.travel.sdk.contentProvider.api.interceptors.LocaleInterceptor +import com.sygic.travel.sdk.api.StApiConstants.API_BASE_URL +import com.sygic.travel.sdk.api.StApiConstants.VERSION_AND_LOCALE +import com.sygic.travel.sdk.api.interceptors.HeadersInterceptor +import com.sygic.travel.sdk.api.interceptors.LocaleInterceptor +import com.sygic.travel.sdk.api.StApi import okhttp3.Cache import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StObserver.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StObserver.kt similarity index 97% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StObserver.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/StObserver.kt index b3293dba..558cf1bc 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StObserver.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StObserver.kt @@ -1,4 +1,4 @@ -package com.sygic.travel.sdk.contentProvider.api +package com.sygic.travel.sdk.api import com.sygic.travel.sdk.api.responseWrappers.StResponse import com.sygic.travel.sdk.api.responseWrappers.StResponse.Companion.STATUS_OK @@ -12,7 +12,7 @@ import java.util.* * Observer which subscribes to receive a response from API. * @param <RT> Response type - must be one of the response classes extending [StResponse]. </RT> */ -class StObserver<RT : StResponse> +internal class StObserver<RT : StResponse> /** * @param userCallback Callback, whose methods are called, when the response is processed. * * diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt new file mode 100644 index 00000000..19b49008 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt @@ -0,0 +1,42 @@ +package com.sygic.travel.sdk.api + +import java.util.* + +/** + * + * Determines the appropriate locale. + */ +object SupportedLanguages { + private val supportedLanguages: MutableList<String> + var EN = "en" + + /** + * @return Device's current locale, if it is supported. Returns English locale otherwise. + */ + val actualLocale: String + get() { + val locale = java.util.Locale.getDefault().language + if (com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.contains(locale)) { + return locale + } else { + return com.sygic.travel.sdk.api.SupportedLanguages.EN + } + } + + init { + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages = java.util.ArrayList<String>() + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("fr") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("de") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("es") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("nl") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("pt") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("it") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("ru") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("cs") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("sk") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("zh") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("ko") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("pl") + com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("tr") + } +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/interceptors/HeadersInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt similarity index 63% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/interceptors/HeadersInterceptor.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt index 799529c2..f7da806b 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/interceptors/HeadersInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt @@ -1,18 +1,15 @@ -package com.sygic.travel.sdk.contentProvider.api.interceptors +package com.sygic.travel.sdk.api.interceptors -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.H_NAME_API_KEY -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.H_NAME_CONTENT_TYPE -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.H_NAME_USER_AGENT -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.H_VALUE_CONTENT_TYPE -import okhttp3.Interceptor -import okhttp3.Response -import java.io.IOException +import com.sygic.travel.sdk.api.StApiConstants.H_NAME_API_KEY +import com.sygic.travel.sdk.api.StApiConstants.H_NAME_CONTENT_TYPE +import com.sygic.travel.sdk.api.StApiConstants.H_NAME_USER_AGENT +import com.sygic.travel.sdk.api.StApiConstants.H_VALUE_CONTENT_TYPE /** * * Implements [okhttp3.Interceptor], adds headers to a requests. */ -class HeadersInterceptor : Interceptor { +class HeadersInterceptor : okhttp3.Interceptor { private var apiKey: String? = null private var userAgent: String? = null @@ -38,8 +35,8 @@ class HeadersInterceptor : Interceptor { * * Modifies the original request by adding an **API key**. */ - @Throws(IOException::class) - override fun intercept(chain: Interceptor.Chain): Response { + @Throws(java.io.IOException::class) + override fun intercept(chain: okhttp3.Interceptor.Chain): okhttp3.Response { val original = chain.request() val request = original.newBuilder() .addHeader(H_NAME_CONTENT_TYPE, H_VALUE_CONTENT_TYPE) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/interceptors/LocaleInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt similarity index 63% rename from sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/interceptors/LocaleInterceptor.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt index 568084aa..c14d6fda 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/interceptors/LocaleInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt @@ -1,17 +1,14 @@ -package com.sygic.travel.sdk.contentProvider.api.interceptors +package com.sygic.travel.sdk.api.interceptors -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.API_VERSION -import com.sygic.travel.sdk.contentProvider.api.StApiConstants.VERSION_AND_LOCALE -import com.sygic.travel.sdk.contentProvider.api.SupportedLanguages -import okhttp3.Interceptor -import okhttp3.Response -import java.io.IOException +import com.sygic.travel.sdk.api.StApiConstants.API_VERSION +import com.sygic.travel.sdk.api.StApiConstants.VERSION_AND_LOCALE +import com.sygic.travel.sdk.api.SupportedLanguages /** * * Implements [okhttp3.Interceptor], adds API version and locale code. */ -class LocaleInterceptor : Interceptor { +class LocaleInterceptor : okhttp3.Interceptor { /** * * Device's current locale code @@ -34,8 +31,8 @@ class LocaleInterceptor : Interceptor { * * Modifies the original request by adding an **API version** and a **locale code**. */ - @Throws(IOException::class) - override fun intercept(chain: Interceptor.Chain): Response { + @Throws(java.io.IOException::class) + override fun intercept(chain: okhttp3.Interceptor.Chain): okhttp3.Response { val original = chain.request() var url = original.url().toString() diff --git a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/SupportedLanguages.kt b/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/SupportedLanguages.kt deleted file mode 100644 index 9769dc73..00000000 --- a/sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/SupportedLanguages.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.sygic.travel.sdk.contentProvider.api - -import java.util.* - -/** - * - * Determines the appropriate locale. - */ -object SupportedLanguages { - private val supportedLanguages: MutableList<String> - var EN = "en" - - /** - * @return Device's current locale, if it is supported. Returns English locale otherwise. - */ - val actualLocale: String - get() { - val locale = Locale.getDefault().language - if (supportedLanguages.contains(locale)) { - return locale - } else { - return EN - } - } - - init { - supportedLanguages = ArrayList<String>() - supportedLanguages.add("fr") - supportedLanguages.add("de") - supportedLanguages.add("es") - supportedLanguages.add("nl") - supportedLanguages.add("pt") - supportedLanguages.add("it") - supportedLanguages.add("ru") - supportedLanguages.add("cs") - supportedLanguages.add("sk") - supportedLanguages.add("zh") - supportedLanguages.add("ko") - supportedLanguages.add("pl") - supportedLanguages.add("tr") - } -} From d23eceaace4e0ab803c7f958effc9ac72240bbde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Muri=C2=B4n?= <michal.murin@sygictravel.com> Date: Wed, 14 Jun 2017 16:28:12 +0200 Subject: [PATCH 04/18] SDK: convert method added to every api model class - converts to user model class, response wrappers always convert their data before returning it --- .circleci/config.yml | 2 +- .../main/res/layout/activity_place_detail.xml | 10 ++-- .../java/com/sygic/travel/sdk/api/StApi.kt | 2 +- .../sygic/travel/sdk/api/StApiConstants.kt | 2 +- .../sygic/travel/sdk/api/StApiGenerator.kt | 2 +- .../travel/sdk/api/SupportedLanguages.kt | 37 +++++++------- .../api/interceptors/HeadersInterceptor.kt | 2 +- .../sdk/api/interceptors/LocaleInterceptor.kt | 2 +- .../sygic/travel/sdk/api/model/geo/Bounds.kt | 12 +++++ .../travel/sdk/api/model/geo/Location.kt | 10 ++++ .../travel/sdk/api/model/media/Attribution.kt | 15 ++++++ .../travel/sdk/api/model/media/MainMedia.kt | 16 +++++- .../travel/sdk/api/model/media/Medium.kt | 24 +++++++-- .../travel/sdk/api/model/media/Original.kt | 11 ++++ .../travel/sdk/api/model/media/Source.kt | 11 ++++ .../sygic/travel/sdk/api/model/media/Usage.kt | 11 ++++ .../travel/sdk/api/model/place/Description.kt | 12 +++++ .../travel/sdk/api/model/place/PlaceDetail.kt | 51 +++++++++++++++++++ .../sygic/travel/sdk/api/model/place/Price.kt | 9 ++++ .../travel/sdk/api/model/place/Reference.kt | 18 +++++++ .../sygic/travel/sdk/api/model/place/Tag.kt | 10 ++++ .../sdk/api/responseWrappers/MediaResponse.kt | 15 ++++-- .../responseWrappers/PlaceDetailedResponse.kt | 40 ++------------- .../api/responseWrappers/PlacesResponse.kt | 14 +++-- .../sdk/api/responseWrappers/StResponse.kt | 2 +- .../sygic/travel/sdk/model/media/MainMedia.kt | 4 +- .../sygic/travel/sdk/model/media/Medium.kt | 1 - .../com/sygic/travel/sdk/model/media/Usage.kt | 8 +-- .../sygic/travel/sdk/model/place/Detail.kt | 1 + .../travel/sdk/model/place/PlaceDetail.kt | 38 -------------- 30 files changed, 268 insertions(+), 124 deletions(-) delete mode 100644 sdk/src/main/java/com/sygic/travel/sdk/model/place/PlaceDetail.kt diff --git a/.circleci/config.yml b/.circleci/config.yml index 12583d56..a8015cda 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,7 +26,7 @@ jobs: sed -i 's/\(.\)bintray\-api\-key\(.\)/\1'"$ANDROID_SDK_BINTRAY_API_KEY"'\2/g' sdk/build.gradle echo "Disable OkHttp Logging" - sed -i 's/HttpLoggingInterceptor\.Level\.BODY/HttpLoggingInterceptor\.Level\.NONE/g' sdk/src/main/java/com/sygic/travel/sdk/contentProvider/api/StApiGenerator.kt + sed -i 's/HttpLoggingInterceptor\.Level\.BODY/HttpLoggingInterceptor\.Level\.NONE/g' sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt - run: name: Clean command: | diff --git a/app/src/main/res/layout/activity_place_detail.xml b/app/src/main/res/layout/activity_place_detail.xml index d9932840..60f7ee53 100644 --- a/app/src/main/res/layout/activity_place_detail.xml +++ b/app/src/main/res/layout/activity_place_detail.xml @@ -117,10 +117,12 @@ android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_marginStart="16dp" + android:layout_marginTop="16dp" android:orientation="vertical" - app:layout_constraintBottom_toBottomOf="@+id/ll_description" - app:layout_constraintLeft_toRightOf="@+id/ll_description" - app:layout_constraintRight_toRightOf="parent"> + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/ll_description"> <TextView android:layout_width="wrap_content" @@ -149,7 +151,7 @@ app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toBottomOf="@+id/ll_description"> + app:layout_constraintTop_toBottomOf="@+id/ll_rating"> <TextView android:layout_width="wrap_content" diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt index acb4a37d..f231a14b 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApi.kt @@ -15,7 +15,7 @@ import retrofit2.http.Query * Contains available API requests. * @see [API Documentation](http://docs.sygictravelapi.com/0.2) */ -interface StApi { +internal interface StApi { /*-----------------------------------------------------------------------------*/ /* GET */ diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt index 05c6d0d8..d7705ea3 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiConstants.kt @@ -1,6 +1,6 @@ package com.sygic.travel.sdk.api -object StApiConstants { +internal object StApiConstants { // HEADERS val H_NAME_API_KEY = "x-api-key" diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt index 816dbb72..ed964a72 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt @@ -21,7 +21,7 @@ import java.util.concurrent.TimeUnit * Generates an implementation of an API interface, which has to follow the Retrofit patterns. * @see StApi */ -object StApiGenerator { +internal object StApiGenerator { var headersInterceptor = HeadersInterceptor() var localeInterceptor = LocaleInterceptor() diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt index 19b49008..65dcb7c6 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt @@ -1,12 +1,9 @@ package com.sygic.travel.sdk.api -import java.util.* - /** - * * Determines the appropriate locale. */ -object SupportedLanguages { +internal object SupportedLanguages { private val supportedLanguages: MutableList<String> var EN = "en" @@ -16,27 +13,27 @@ object SupportedLanguages { val actualLocale: String get() { val locale = java.util.Locale.getDefault().language - if (com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.contains(locale)) { + if (supportedLanguages.contains(locale)) { return locale } else { - return com.sygic.travel.sdk.api.SupportedLanguages.EN + return SupportedLanguages.EN } } init { - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages = java.util.ArrayList<String>() - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("fr") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("de") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("es") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("nl") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("pt") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("it") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("ru") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("cs") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("sk") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("zh") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("ko") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("pl") - com.sygic.travel.sdk.api.SupportedLanguages.supportedLanguages.add("tr") + supportedLanguages = java.util.ArrayList<String>() + supportedLanguages.add("fr") + supportedLanguages.add("de") + supportedLanguages.add("es") + supportedLanguages.add("nl") + supportedLanguages.add("pt") + supportedLanguages.add("it") + supportedLanguages.add("ru") + supportedLanguages.add("cs") + supportedLanguages.add("sk") + supportedLanguages.add("zh") + supportedLanguages.add("ko") + supportedLanguages.add("pl") + supportedLanguages.add("tr") } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt index f7da806b..f9b57e6e 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt @@ -9,7 +9,7 @@ import com.sygic.travel.sdk.api.StApiConstants.H_VALUE_CONTENT_TYPE * * Implements [okhttp3.Interceptor], adds headers to a requests. */ -class HeadersInterceptor : okhttp3.Interceptor { +internal class HeadersInterceptor : okhttp3.Interceptor { private var apiKey: String? = null private var userAgent: String? = null diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt index c14d6fda..29181ed8 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt @@ -8,7 +8,7 @@ import com.sygic.travel.sdk.api.SupportedLanguages * * Implements [okhttp3.Interceptor], adds API version and locale code. */ -class LocaleInterceptor : okhttp3.Interceptor { +internal class LocaleInterceptor : okhttp3.Interceptor { /** * * Device's current locale code diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt index fac2c4d9..216a2660 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.geo import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.geo.Bounds /** * Geographical bounds - south, west, north, east. @@ -17,4 +18,15 @@ internal class Bounds { @SerializedName("west") var west: Float = 0.toFloat() + + fun convert(): Bounds { + val bounds = Bounds() + + bounds.north = north + bounds.east = east + bounds.south = south + bounds.west = west + + return bounds + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt index 7ba72339..48ac4557 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.geo import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.geo.Location /** * Geographic location - latitude, longitude. @@ -13,4 +14,13 @@ internal class Location { @SerializedName("lng") var lng: Float = 0.toFloat() + fun convert(): Location { + val location = Location() + + location.lat = lat + location.lng = lng + + return location + } + } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt index 2d1402ed..aae06e3e 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.media.Attribution /** * Attribution of a medium, contains information about author, license and title. @@ -27,5 +28,19 @@ internal class Attribution { @SerializedName("title_url") var titleUrl: String? = null + + fun convert(): Attribution { + val attribution = Attribution() + + attribution.author = author + attribution.authorUrl = authorUrl + attribution.license = license + attribution.licenseUrl = licenseUrl + attribution.other = other + attribution.title = title + attribution.titleUrl = titleUrl + + return Attribution() + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt index 4c7580d8..0e37505c 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt @@ -1,8 +1,7 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.model.media.Medium -import com.sygic.travel.sdk.model.media.Usage +import com.sygic.travel.sdk.model.media.MainMedia /** * Place main media. @@ -15,4 +14,17 @@ internal class MainMedia { @SerializedName("media") val media: List<Medium>? = null + fun convert(): MainMedia { + val mainMedia = MainMedia() + + val convertedMedia: MutableList<com.sygic.travel.sdk.model.media.Medium> = mutableListOf() + media?.mapTo(convertedMedia) { + it.convert() + } + + mainMedia.usage = usage?.convert() + mainMedia.media = convertedMedia + + return mainMedia + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt index 1e7b7cab..39048cdc 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt @@ -1,10 +1,8 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.model.geo.Location -import com.sygic.travel.sdk.model.media.Attribution -import com.sygic.travel.sdk.model.media.Original -import com.sygic.travel.sdk.model.media.Source +import com.sygic.travel.sdk.api.model.geo.Location +import com.sygic.travel.sdk.model.media.Medium /** * Place medium. @@ -48,4 +46,22 @@ internal class Medium { @SerializedName("location") var location: Location? = null + fun convert(): Medium { + val medium = Medium() + + medium.id = id + medium.type = type + medium.urlTemplate = urlTemplate + medium.url = url + medium.original = original?.convert() + medium.suitability = suitability + medium.createdAt = createdAt + medium.source = source?.convert() + medium.createdBy = createdBy + medium.quadkey = quadkey + medium.attribution = attribution?.convert() + medium.location = location?.convert() + + return medium + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt index 9f03462f..fc609433 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.media.Original /** * Medium's original parameters. @@ -16,4 +17,14 @@ internal class Original { @SerializedName("height") var height: Int = 0 + fun convert(): Original { + val original = Original() + + original.size = size + original.width = width + original.height = height + + return original + } + } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt index 95b33281..3d558461 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.media.Source /** * Medium's source. @@ -16,4 +17,14 @@ internal class Source { @SerializedName("provider") var provider: String? = null + fun convert(): Source { + val source = Source() + + source.name = name + source.externalId = externalId + source.provider = provider + + return source + } + } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt index bc8872cf..d5a1d234 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.media.Usage /** * Medium's suitable usages. @@ -19,4 +20,14 @@ internal class Usage { @SerializedName("video_preview") val videoPreview: String? = null + fun convert(): Usage { + val usage = Usage() + + usage.square = square + usage.landscape = landscape + usage.portrait = portrait + usage.videoPreview = videoPreview + + return usage + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt index ecdf1224..5e65d271 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.place.Description /** * Place description data. @@ -19,4 +20,15 @@ internal class Description { @SerializedName("url") var url: String? = null + fun convert(): Description { + val description = Description() + + description.text = text + description.provider = provider + description.translationProvider = translationProvider + description.url = url + + return description + } + } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt index 80b15eb1..73d00c67 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt @@ -4,6 +4,8 @@ import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.api.model.geo.Bounds import com.sygic.travel.sdk.api.model.geo.Location import com.sygic.travel.sdk.api.model.media.MainMedia +import com.sygic.travel.sdk.model.place.Detail +import com.sygic.travel.sdk.model.place.Place internal class PlaceDetail { // PLACE @@ -81,4 +83,53 @@ internal class PlaceDetail { @SerializedName("references") var references: List<Reference>? = null + + fun convert(): Place{ + val place = Place() + + place.id = id + place.level = level + place.categories = categories + place.rating = rating + place.quadkey = quadkey + place.location= location?.convert() + place.bounds = bounds?.convert() + place.name = name + place.nameSuffix = nameSuffix + place.perex = perex + place.url = url + place.thumbnailUrl = thumbnailUrl + place.marker = marker + place.parentIds = parentIds + place.detail = convertDetail() + + return place + } + + fun convertDetail(): Detail { + val detail = Detail() + + val convertedTags: MutableList<com.sygic.travel.sdk.model.place.Tag> = mutableListOf() + tags?.mapTo(convertedTags) { + it.convert() + } + + val convertedReferences: MutableList<com.sygic.travel.sdk.model.place.Reference> = mutableListOf() + references?.mapTo(convertedReferences){ + it.convert() + } + + detail.tags = convertedTags + detail.description = description?.convert() + detail.address = address + detail.admission = admission + detail.duration = duration + detail.email = email + detail.openingHours = openingHours + detail.phone = phone + detail.mainMedia = mainMedia?.convert() + detail.references = convertedReferences + + return detail + } } \ No newline at end of file diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt index 9ee6f62c..22414b10 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.place.Price internal class Price { @@ -10,4 +11,12 @@ internal class Price { @SerializedName("savings") var savings: Float = 0.toFloat() + fun convert(): Price { + val price = Price() + + price.value = value + price.savings = savings + + return price + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt index 33a23a16..51f60193 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.place.Reference /** * Link (Wiki, web site, etc.) related to a specific place. @@ -37,4 +38,21 @@ internal class Reference { @SerializedName("flags") var flags: List<String>? = null + fun convert(): Reference { + val reference = Reference() + + reference.id = id + reference.title = title + reference.type = type + reference.languageId = languageId + reference.url = url + reference.supplier = supplier + reference.priority = priority + reference.currency = currency + reference.price = price + reference.flags = flags + + return reference + } + } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt index ca53b43f..f07c69b1 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.model.place.Tag internal class Tag { @@ -9,4 +10,13 @@ internal class Tag { @SerializedName("name") var name: String? = null + + fun convert(): Tag { + val tag = Tag() + + tag.key = key + tag.name = name + + return tag + } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt index 628644f1..51af9bef 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt @@ -1,16 +1,23 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.model.media.Medium +import com.sygic.travel.sdk.api.model.media.Medium /** * Response containing a list of place media. Suitable for a gallery. */ -class MediaResponse : StResponse() { +internal class MediaResponse : StResponse() { private var data: Data? = null - fun getMedia(): List<Medium>? { - return data?.media + fun getMedia(): List<com.sygic.travel.sdk.model.media.Medium>? { + val media = data?.media + val convertedMedia: MutableList<com.sygic.travel.sdk.model.media.Medium> = mutableListOf() + + media?.mapTo(convertedMedia) { + it.convert() + } + + return convertedMedia } inner class Data { diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt index c8791bec..d3317f9d 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt @@ -1,49 +1,19 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.model.place.Detail -import com.sygic.travel.sdk.model.place.Place -import com.sygic.travel.sdk.model.place.PlaceDetail +import com.sygic.travel.sdk.api.model.place.PlaceDetail +import com.sygic.travel.sdk.model.place.* /** * Response containing one detailed place data. Suitable for showing a place detail. */ -class PlaceDetailedResponse : StResponse() { +internal class PlaceDetailedResponse : StResponse() { private val data: Data? = null fun getPlace(): Place? { - val detail = Detail() - val place = Place() + val placeDetail = data?.place + val place = placeDetail?.convert() - val dataPlace = data?.place - dataPlace?.let { - detail.tags = dataPlace.tags - detail.description = dataPlace.description - detail.address = dataPlace.address - detail.admission = dataPlace.admission - detail.duration = dataPlace.duration - detail.email = dataPlace.email - detail.openingHours = dataPlace.openingHours - detail.phone = dataPlace.phone - detail.mainMedia = dataPlace.mainMedia - detail.references = dataPlace.references - - place.id = dataPlace.id - place.level = dataPlace.level - place.categories = dataPlace.categories - place.rating = dataPlace.rating - place.quadkey = dataPlace.quadkey - place.location = dataPlace.location - place.bounds = dataPlace.bounds - place.name = dataPlace.name - place.nameSuffix = dataPlace.nameSuffix - place.perex = dataPlace.perex - place.url = dataPlace.url - place.thumbnailUrl = dataPlace.thumbnailUrl - place.marker = dataPlace.marker - place.parentIds = dataPlace.parentIds - place.detail = detail - } return place } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt index 1987d349..86fba530 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt @@ -1,21 +1,29 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.place.PlaceDetail import com.sygic.travel.sdk.model.place.Place /** * Response that contains a list of places data. Suitable for showing places in a list or * spread on a map. */ -class PlacesResponse : StResponse() { +internal class PlacesResponse : StResponse() { private var data: Data? = null fun getPlaces(): List<Place>? { - return data?.places + val places = data?.places + val convertedPlaces: MutableList<Place> = mutableListOf() + + places?.mapTo(convertedPlaces) { + it.convert() + } + + return convertedPlaces } inner class Data { @SerializedName("places") - var places: List<Place>? = null + var places: List<PlaceDetail>? = null } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/StResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/StResponse.kt index 70e73f62..5f12281a 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/StResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/StResponse.kt @@ -6,7 +6,7 @@ import com.google.gson.annotations.SerializedName * Base of an API response. It's extended by specific respond classes containing the specific data. * It's abstract, because of the abstract [.getData] method. */ -abstract class StResponse { +internal abstract class StResponse { @SerializedName("status_code") val statusCode: Int = 0 diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt index edc27e53..58154709 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt @@ -8,9 +8,9 @@ import com.google.gson.annotations.SerializedName class MainMedia { @SerializedName("usage") - val usage: Usage? = null + var usage: Usage? = null @SerializedName("media") - val media: List<Medium>? = null + var media: List<Medium>? = null } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt index 5e7c9ee1..9778249a 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt @@ -4,7 +4,6 @@ import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.model.geo.Location /** - * * Place medium. */ diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt index b566a90c..fe36cc47 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt @@ -8,15 +8,15 @@ import com.google.gson.annotations.SerializedName class Usage { @SerializedName("square") - val square: String? = null + var square: String? = null @SerializedName("landscape") - val landscape: String? = null + var landscape: String? = null @SerializedName("portrait") - val portrait: String? = null + var portrait: String? = null @SerializedName("video_preview") - val videoPreview: String? = null + var videoPreview: String? = null } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt index 65c3f1ff..623c64d3 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt @@ -7,6 +7,7 @@ import com.sygic.travel.sdk.model.media.MainMedia * Place detailed information. */ class Detail { + @SerializedName("tags") var tags: List<Tag>? = null diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/PlaceDetail.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/PlaceDetail.kt deleted file mode 100644 index e3b3d2bb..00000000 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/PlaceDetail.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.sygic.travel.sdk.model.place - -import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.model.media.MainMedia - -class PlaceDetail : Place() { - - @SerializedName("tags") - var tags: List<Tag>? = null - - @SerializedName("description") - var description: Description? = null - - @SerializedName("address") - var address: String? = null - - @SerializedName("admission") - var admission: String? = null - - @SerializedName("duration") - var duration: Int = 0 - - @SerializedName("email") - var email: String? = null - - @SerializedName("opening_hours") - var openingHours: String? = null - - @SerializedName("phone") - var phone: String? = null - - @SerializedName("main_media") - var mainMedia: MainMedia? = null - - @SerializedName("references") - var references: List<Reference>? = null - -} From 62ea40afa540e54f3a054db6d0ef0dc851c5becf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Thu, 15 Jun 2017 09:22:54 +0200 Subject: [PATCH 05/18] SDK: imports instead of full package paths --- .../com/sygic/travel/sdk/api/StApiGenerator.kt | 1 - .../sygic/travel/sdk/api/SupportedLanguages.kt | 8 +++++--- .../sdk/api/interceptors/HeadersInterceptor.kt | 15 ++++++++------- .../sdk/api/interceptors/LocaleInterceptor.kt | 14 +++++++------- .../sdk/api/responseWrappers/TourResponse.kt | 2 +- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt index ed964a72..34ac8a2f 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/StApiGenerator.kt @@ -6,7 +6,6 @@ import com.sygic.travel.sdk.api.StApiConstants.API_BASE_URL import com.sygic.travel.sdk.api.StApiConstants.VERSION_AND_LOCALE import com.sygic.travel.sdk.api.interceptors.HeadersInterceptor import com.sygic.travel.sdk.api.interceptors.LocaleInterceptor -import com.sygic.travel.sdk.api.StApi import okhttp3.Cache import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt index 65dcb7c6..baf6c432 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt @@ -1,5 +1,7 @@ package com.sygic.travel.sdk.api +import java.util.* + /** * Determines the appropriate locale. */ @@ -12,16 +14,16 @@ internal object SupportedLanguages { */ val actualLocale: String get() { - val locale = java.util.Locale.getDefault().language + val locale = Locale.getDefault().language if (supportedLanguages.contains(locale)) { return locale } else { - return SupportedLanguages.EN + return EN } } init { - supportedLanguages = java.util.ArrayList<String>() + supportedLanguages = ArrayList<String>() supportedLanguages.add("fr") supportedLanguages.add("de") supportedLanguages.add("es") diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt index f9b57e6e..41b6c553 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt @@ -1,20 +1,23 @@ package com.sygic.travel.sdk.api.interceptors +import okhttp3.Interceptor +import okhttp3.Interceptor.Chain +import okhttp3.Response +import java.io.IOException + import com.sygic.travel.sdk.api.StApiConstants.H_NAME_API_KEY import com.sygic.travel.sdk.api.StApiConstants.H_NAME_CONTENT_TYPE import com.sygic.travel.sdk.api.StApiConstants.H_NAME_USER_AGENT import com.sygic.travel.sdk.api.StApiConstants.H_VALUE_CONTENT_TYPE /** - * * Implements [okhttp3.Interceptor], adds headers to a requests. */ -internal class HeadersInterceptor : okhttp3.Interceptor { +internal class HeadersInterceptor : Interceptor { private var apiKey: String? = null private var userAgent: String? = null /** - * * Sets API key * @param apiKey API key to be sent as a header in every request. */ @@ -23,7 +26,6 @@ internal class HeadersInterceptor : okhttp3.Interceptor { } /** - * * Sets UserAgent * @param userAgent UserAgent to by sent as a header in every request. */ @@ -32,11 +34,10 @@ internal class HeadersInterceptor : okhttp3.Interceptor { } /** - * * Modifies the original request by adding an **API key**. */ - @Throws(java.io.IOException::class) - override fun intercept(chain: okhttp3.Interceptor.Chain): okhttp3.Response { + @Throws(IOException::class) + override fun intercept(chain: Chain): Response { val original = chain.request() val request = original.newBuilder() .addHeader(H_NAME_CONTENT_TYPE, H_VALUE_CONTENT_TYPE) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt index 29181ed8..c4c19fdd 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/LocaleInterceptor.kt @@ -3,14 +3,16 @@ package com.sygic.travel.sdk.api.interceptors import com.sygic.travel.sdk.api.StApiConstants.API_VERSION import com.sygic.travel.sdk.api.StApiConstants.VERSION_AND_LOCALE import com.sygic.travel.sdk.api.SupportedLanguages +import okhttp3.Interceptor +import okhttp3.Interceptor.Chain +import okhttp3.Response +import java.io.IOException /** - * * Implements [okhttp3.Interceptor], adds API version and locale code. */ -internal class LocaleInterceptor : okhttp3.Interceptor { +internal class LocaleInterceptor : Interceptor { /** - * * Device's current locale code */ private var locale: String? = null @@ -20,7 +22,6 @@ internal class LocaleInterceptor : okhttp3.Interceptor { } /** - * * Updates [LocaleInterceptor.locale] to device's current locale code */ fun updateLocale() { @@ -28,11 +29,10 @@ internal class LocaleInterceptor : okhttp3.Interceptor { } /** - * * Modifies the original request by adding an **API version** and a **locale code**. */ - @Throws(java.io.IOException::class) - override fun intercept(chain: okhttp3.Interceptor.Chain): okhttp3.Response { + @Throws(IOException::class) + override fun intercept(chain: Chain): Response { val original = chain.request() var url = original.url().toString() diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt index c5cf93d6..e3e729e4 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt @@ -6,7 +6,7 @@ import com.sygic.travel.sdk.model.place.Tour /** * Response that contains a list of Tour classes. */ -class TourResponse : StResponse() { +internal class TourResponse : StResponse() { private var data: Data? = null fun getTours(): List<Tour>? = data?.tours From ecebda765be00d23cbe6a317682de18fa609c995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Wed, 14 Jun 2017 11:47:04 +0200 Subject: [PATCH 06/18] SDK: all API classes moved to package api --- .../main/java/com/sygic/travel/sdk/StSDK.kt | 2 + .../travel/sdk/api/SupportedLanguages.kt | 65 ++++++++++--------- .../api/interceptors/HeadersInterceptor.kt | 10 +-- 3 files changed, 41 insertions(+), 36 deletions(-) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index 327bbd45..7dfeaf83 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -14,6 +14,7 @@ import com.sygic.travel.sdk.api.StApiGenerator import com.sygic.travel.sdk.api.StObserver import com.sygic.travel.sdk.model.media.Medium import com.sygic.travel.sdk.model.place.Place + import com.sygic.travel.sdk.model.place.Tour import com.sygic.travel.sdk.model.query.PlacesQuery import com.sygic.travel.sdk.model.query.ToursQuery @@ -22,6 +23,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposables import io.reactivex.schedulers.Schedulers + import java.io.File /** diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt index baf6c432..8f43559a 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt @@ -3,39 +3,40 @@ package com.sygic.travel.sdk.api import java.util.* /** + * * Determines the appropriate locale. */ -internal object SupportedLanguages { - private val supportedLanguages: MutableList<String> - var EN = "en" +object SupportedLanguages { + private val supportedLanguages: MutableList<String> + var EN = "en" - /** - * @return Device's current locale, if it is supported. Returns English locale otherwise. - */ - val actualLocale: String - get() { - val locale = Locale.getDefault().language - if (supportedLanguages.contains(locale)) { - return locale - } else { - return EN - } - } + /** + * @return Device's current locale, if it is supported. Returns English locale otherwise. + */ + val actualLocale: String + get() { + val locale = Locale.getDefault().language + if (supportedLanguages.contains(locale)) { + return locale + } else { + return EN + } + } - init { - supportedLanguages = ArrayList<String>() - supportedLanguages.add("fr") - supportedLanguages.add("de") - supportedLanguages.add("es") - supportedLanguages.add("nl") - supportedLanguages.add("pt") - supportedLanguages.add("it") - supportedLanguages.add("ru") - supportedLanguages.add("cs") - supportedLanguages.add("sk") - supportedLanguages.add("zh") - supportedLanguages.add("ko") - supportedLanguages.add("pl") - supportedLanguages.add("tr") - } -} + init { + supportedLanguages = ArrayList<String>() + supportedLanguages.add("fr") + supportedLanguages.add("de") + supportedLanguages.add("es") + supportedLanguages.add("nl") + supportedLanguages.add("pt") + supportedLanguages.add("it") + supportedLanguages.add("ru") + supportedLanguages.add("cs") + supportedLanguages.add("sk") + supportedLanguages.add("zh") + supportedLanguages.add("ko") + supportedLanguages.add("pl") + supportedLanguages.add("tr") + } +} \ No newline at end of file diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt index 41b6c553..773820cd 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/interceptors/HeadersInterceptor.kt @@ -1,14 +1,16 @@ package com.sygic.travel.sdk.api.interceptors +import com.sygic.travel.sdk.api.StApiConstants.H_NAME_API_KEY +import com.sygic.travel.sdk.api.StApiConstants.H_NAME_CONTENT_TYPE +import com.sygic.travel.sdk.api.StApiConstants.H_NAME_USER_AGENT +import com.sygic.travel.sdk.api.StApiConstants.H_VALUE_CONTENT_TYPE + import okhttp3.Interceptor import okhttp3.Interceptor.Chain import okhttp3.Response import java.io.IOException -import com.sygic.travel.sdk.api.StApiConstants.H_NAME_API_KEY -import com.sygic.travel.sdk.api.StApiConstants.H_NAME_CONTENT_TYPE -import com.sygic.travel.sdk.api.StApiConstants.H_NAME_USER_AGENT -import com.sygic.travel.sdk.api.StApiConstants.H_VALUE_CONTENT_TYPE + /** * Implements [okhttp3.Interceptor], adds headers to a requests. From 8973cdc640d56dc2012f032da73257239bbb90d4 Mon Sep 17 00:00:00 2001 From: Michal Holecy <michal.holecy@sygictravel.com> Date: Mon, 19 Jun 2017 11:19:30 +0200 Subject: [PATCH 07/18] SDK: all api model classes prefixed by Api and implement new ApiModel interface with convert method --- .../travel/sdkdemo/list/PlacesListActivity.kt | 2 +- .../main/java/com/sygic/travel/sdk/StSDK.kt | 2 - .../travel/sdk/api/SupportedLanguages.kt | 65 +++++++++---------- .../sdk/api/model/converter/ApiModel.kt | 5 ++ .../api/model/geo/{Bounds.kt => ApiBounds.kt} | 6 +- .../model/geo/{Location.kt => ApiLocation.kt} | 5 +- .../{Attribution.kt => ApiAttribution.kt} | 8 +-- .../media/{MainMedia.kt => ApiMainMedia.kt} | 9 +-- .../model/media/{Medium.kt => ApiMedium.kt} | 15 +++-- .../media/{Original.kt => ApiOriginal.kt} | 5 +- .../model/media/{Source.kt => ApiSource.kt} | 5 +- .../api/model/media/{Usage.kt => ApiUsage.kt} | 5 +- .../{Description.kt => ApiDescription.kt} | 5 +- .../{PlaceDetail.kt => ApiPlaceDetail.kt} | 20 +++--- .../api/model/place/{Price.kt => ApiPrice.kt} | 5 +- .../place/{Reference.kt => ApiReference.kt} | 5 +- .../sdk/api/model/place/{Tag.kt => ApiTag.kt} | 5 +- .../sdk/api/responseWrappers/MediaResponse.kt | 4 +- .../responseWrappers/PlaceDetailedResponse.kt | 6 +- .../api/responseWrappers/PlacesResponse.kt | 6 +- 20 files changed, 101 insertions(+), 87 deletions(-) create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/converter/ApiModel.kt rename sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/{Bounds.kt => ApiBounds.kt} (81%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/{Location.kt => ApiLocation.kt} (75%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/media/{Attribution.kt => ApiAttribution.kt} (87%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/media/{MainMedia.kt => ApiMainMedia.kt} (72%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/media/{Medium.kt => ApiMedium.kt} (79%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/media/{Original.kt => ApiOriginal.kt} (77%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/media/{Source.kt => ApiSource.kt} (79%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/media/{Usage.kt => ApiUsage.kt} (82%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/place/{Description.kt => ApiDescription.kt} (81%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/place/{PlaceDetail.kt => ApiPlaceDetail.kt} (86%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/place/{Price.kt => ApiPrice.kt} (74%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/place/{Reference.kt => ApiReference.kt} (89%) rename sdk/src/main/java/com/sygic/travel/sdk/api/model/place/{Tag.kt => ApiTag.kt} (73%) diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt index dba17db2..4d220ec0 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt @@ -75,7 +75,7 @@ class PlacesListActivity : AppCompatActivity() { private val onPlaceClick = object: PlacesAdapter.ViewHolder.PlaceClick { override fun onPlaceClick(position: Int) { val placeDetailIntent = Intent(this@PlacesListActivity, PlaceDetailActivity::class.java) - placeDetailIntent.putExtra(ID, places!![position].id) + placeDetailIntent.putExtra(ID, places?.get(position)?.id) startActivity(placeDetailIntent) } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index 7dfeaf83..327bbd45 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -14,7 +14,6 @@ import com.sygic.travel.sdk.api.StApiGenerator import com.sygic.travel.sdk.api.StObserver import com.sygic.travel.sdk.model.media.Medium import com.sygic.travel.sdk.model.place.Place - import com.sygic.travel.sdk.model.place.Tour import com.sygic.travel.sdk.model.query.PlacesQuery import com.sygic.travel.sdk.model.query.ToursQuery @@ -23,7 +22,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposables import io.reactivex.schedulers.Schedulers - import java.io.File /** diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt index 8f43559a..baf6c432 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/SupportedLanguages.kt @@ -3,40 +3,39 @@ package com.sygic.travel.sdk.api import java.util.* /** - * * Determines the appropriate locale. */ -object SupportedLanguages { - private val supportedLanguages: MutableList<String> - var EN = "en" +internal object SupportedLanguages { + private val supportedLanguages: MutableList<String> + var EN = "en" - /** - * @return Device's current locale, if it is supported. Returns English locale otherwise. - */ - val actualLocale: String - get() { - val locale = Locale.getDefault().language - if (supportedLanguages.contains(locale)) { - return locale - } else { - return EN - } - } + /** + * @return Device's current locale, if it is supported. Returns English locale otherwise. + */ + val actualLocale: String + get() { + val locale = Locale.getDefault().language + if (supportedLanguages.contains(locale)) { + return locale + } else { + return EN + } + } - init { - supportedLanguages = ArrayList<String>() - supportedLanguages.add("fr") - supportedLanguages.add("de") - supportedLanguages.add("es") - supportedLanguages.add("nl") - supportedLanguages.add("pt") - supportedLanguages.add("it") - supportedLanguages.add("ru") - supportedLanguages.add("cs") - supportedLanguages.add("sk") - supportedLanguages.add("zh") - supportedLanguages.add("ko") - supportedLanguages.add("pl") - supportedLanguages.add("tr") - } -} \ No newline at end of file + init { + supportedLanguages = ArrayList<String>() + supportedLanguages.add("fr") + supportedLanguages.add("de") + supportedLanguages.add("es") + supportedLanguages.add("nl") + supportedLanguages.add("pt") + supportedLanguages.add("it") + supportedLanguages.add("ru") + supportedLanguages.add("cs") + supportedLanguages.add("sk") + supportedLanguages.add("zh") + supportedLanguages.add("ko") + supportedLanguages.add("pl") + supportedLanguages.add("tr") + } +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/converter/ApiModel.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/converter/ApiModel.kt new file mode 100644 index 00000000..49f56745 --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/converter/ApiModel.kt @@ -0,0 +1,5 @@ +package com.sygic.travel.sdk.api.model.converter + +internal interface ApiModel<out R> { + fun convert(): R +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/ApiBounds.kt similarity index 81% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/ApiBounds.kt index 216a2660..8270daf1 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Bounds.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/ApiBounds.kt @@ -1,12 +1,14 @@ package com.sygic.travel.sdk.api.model.geo import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.geo.Bounds /** * Geographical bounds - south, west, north, east. */ -internal class Bounds { +internal class ApiBounds : ApiModel<Bounds> { + @SerializedName("north") var north: Float = 0.toFloat() @@ -19,7 +21,7 @@ internal class Bounds { @SerializedName("west") var west: Float = 0.toFloat() - fun convert(): Bounds { + override fun convert(): Bounds { val bounds = Bounds() bounds.north = north diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/ApiLocation.kt similarity index 75% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/ApiLocation.kt index 48ac4557..9ed1059a 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/Location.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/geo/ApiLocation.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.geo import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.geo.Location /** * Geographic location - latitude, longitude. */ -internal class Location { +internal class ApiLocation : ApiModel<Location> { @SerializedName("lat") var lat: Float = 0.toFloat() @@ -14,7 +15,7 @@ internal class Location { @SerializedName("lng") var lng: Float = 0.toFloat() - fun convert(): Location { + override fun convert(): Location { val location = Location() location.lat = lat diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt similarity index 87% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt index aae06e3e..94d087a5 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Attribution.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.media.Attribution /** * Attribution of a medium, contains information about author, license and title. */ -internal class Attribution { +internal class ApiAttribution : ApiModel<Attribution> { @SerializedName("author") var author: String? = null @@ -28,8 +29,8 @@ internal class Attribution { @SerializedName("title_url") var titleUrl: String? = null - - fun convert(): Attribution { + + override fun convert(): Attribution { val attribution = Attribution() attribution.author = author @@ -42,5 +43,4 @@ internal class Attribution { return Attribution() } - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt similarity index 72% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt index 0e37505c..b4df4f34 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/MainMedia.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt @@ -1,20 +1,21 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.media.MainMedia /** * Place main media. */ -internal class MainMedia { +internal class ApiMainMedia : ApiModel<MainMedia> { @SerializedName("usage") - val usage: Usage? = null + val usage: ApiUsage? = null @SerializedName("media") - val media: List<Medium>? = null + val media: List<ApiMedium>? = null - fun convert(): MainMedia { + override fun convert(): MainMedia { val mainMedia = MainMedia() val convertedMedia: MutableList<com.sygic.travel.sdk.model.media.Medium> = mutableListOf() diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMedium.kt similarity index 79% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMedium.kt index 39048cdc..4ff69332 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Medium.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMedium.kt @@ -1,14 +1,15 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.api.model.geo.Location +import com.sygic.travel.sdk.api.model.converter.ApiModel +import com.sygic.travel.sdk.api.model.geo.ApiLocation import com.sygic.travel.sdk.model.media.Medium /** * Place medium. */ -internal class Medium { +internal class ApiMedium : ApiModel<Medium> { @SerializedName("id") var id: String? = null @@ -23,7 +24,7 @@ internal class Medium { var url: String? = null @SerializedName("original") - var original: Original? = null + var original: ApiOriginal? = null @SerializedName("suitability") var suitability: List<String>? = null @@ -32,7 +33,7 @@ internal class Medium { var createdAt: String? = null @SerializedName("source") - var source: Source? = null + var source: ApiSource? = null @SerializedName("created_by") var createdBy: String? = null @@ -41,12 +42,12 @@ internal class Medium { var quadkey: String? = null @SerializedName("attribution") - var attribution: Attribution? = null + var attribution: ApiAttribution? = null @SerializedName("location") - var location: Location? = null + var location: ApiLocation? = null - fun convert(): Medium { + override fun convert(): Medium { val medium = Medium() medium.id = id diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiOriginal.kt similarity index 77% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiOriginal.kt index fc609433..5307cf52 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Original.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiOriginal.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.media.Original /** * Medium's original parameters. */ -internal class Original { +internal class ApiOriginal : ApiModel<Original> { @SerializedName("size") var size: Int = 0 @@ -17,7 +18,7 @@ internal class Original { @SerializedName("height") var height: Int = 0 - fun convert(): Original { + override fun convert(): Original { val original = Original() original.size = size diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiSource.kt similarity index 79% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiSource.kt index 3d558461..a195a974 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Source.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiSource.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.media.Source /** * Medium's source. */ -internal class Source { +internal class ApiSource : ApiModel<Source> { @SerializedName("name") var name: String? = null @@ -17,7 +18,7 @@ internal class Source { @SerializedName("provider") var provider: String? = null - fun convert(): Source { + override fun convert(): Source { val source = Source() source.name = name diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiUsage.kt similarity index 82% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiUsage.kt index d5a1d234..ba3ad8e5 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/Usage.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiUsage.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.media.Usage /** * Medium's suitable usages. */ -internal class Usage { +internal class ApiUsage : ApiModel<Usage> { @SerializedName("square") val square: String? = null @@ -20,7 +21,7 @@ internal class Usage { @SerializedName("video_preview") val videoPreview: String? = null - fun convert(): Usage { + override fun convert(): Usage { val usage = Usage() usage.square = square diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiDescription.kt similarity index 81% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiDescription.kt index 5e65d271..809781ce 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Description.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiDescription.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.place.Description /** * Place description data. */ -internal class Description { +internal class ApiDescription : ApiModel<Description> { @SerializedName("text") var text: String? = null @@ -20,7 +21,7 @@ internal class Description { @SerializedName("url") var url: String? = null - fun convert(): Description { + override fun convert(): Description { val description = Description() description.text = text diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt similarity index 86% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt index 73d00c67..fd651cd0 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/PlaceDetail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt @@ -1,13 +1,13 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.api.model.geo.Bounds -import com.sygic.travel.sdk.api.model.geo.Location -import com.sygic.travel.sdk.api.model.media.MainMedia +import com.sygic.travel.sdk.api.model.geo.ApiBounds +import com.sygic.travel.sdk.api.model.geo.ApiLocation +import com.sygic.travel.sdk.api.model.media.ApiMainMedia import com.sygic.travel.sdk.model.place.Detail import com.sygic.travel.sdk.model.place.Place -internal class PlaceDetail { +internal class ApiPlaceDetail { // PLACE @SerializedName("id") @@ -26,10 +26,10 @@ internal class PlaceDetail { var quadkey: String? = null @SerializedName("location") - var location: Location? = null + var location: ApiLocation? = null @SerializedName("bounding_box") - var bounds: Bounds? = null + var bounds: ApiBounds? = null @SerializedName("name") var name: String? = null @@ -55,10 +55,10 @@ internal class PlaceDetail { // DETAIL @SerializedName("tags") - var tags: List<Tag>? = null + var tags: List<ApiTag>? = null @SerializedName("description") - var description: Description? = null + var description: ApiDescription? = null @SerializedName("address") var address: String? = null @@ -79,10 +79,10 @@ internal class PlaceDetail { var phone: String? = null @SerializedName("main_media") - var mainMedia: MainMedia? = null + var mainMedia: ApiMainMedia? = null @SerializedName("references") - var references: List<Reference>? = null + var references: List<ApiReference>? = null fun convert(): Place{ val place = Place() diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPrice.kt similarity index 74% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPrice.kt index 22414b10..8fa2611a 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Price.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPrice.kt @@ -1,9 +1,10 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.place.Price -internal class Price { +internal class ApiPrice : ApiModel<Price> { @SerializedName("value") var value: Float = 0.toFloat() @@ -11,7 +12,7 @@ internal class Price { @SerializedName("savings") var savings: Float = 0.toFloat() - fun convert(): Price { + override fun convert(): Price { val price = Price() price.value = value diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiReference.kt similarity index 89% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiReference.kt index 51f60193..6ceccc11 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Reference.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiReference.kt @@ -1,12 +1,13 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.place.Reference /** * Link (Wiki, web site, etc.) related to a specific place. */ -internal class Reference { +internal class ApiReference : ApiModel<Reference> { @SerializedName("id") var id: Int = 0 @@ -38,7 +39,7 @@ internal class Reference { @SerializedName("flags") var flags: List<String>? = null - fun convert(): Reference { + override fun convert(): Reference { val reference = Reference() reference.id = id diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTag.kt similarity index 73% rename from sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt rename to sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTag.kt index f07c69b1..b4c571b8 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/Tag.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTag.kt @@ -1,9 +1,10 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.place.Tag -internal class Tag { +internal class ApiTag : ApiModel<Tag> { @SerializedName("key") var key: String? = null @@ -11,7 +12,7 @@ internal class Tag { @SerializedName("name") var name: String? = null - fun convert(): Tag { + override fun convert(): Tag { val tag = Tag() tag.key = key diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt index 51af9bef..a4681a5b 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt @@ -1,7 +1,7 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.api.model.media.Medium +import com.sygic.travel.sdk.api.model.media.ApiMedium /** * Response containing a list of place media. Suitable for a gallery. @@ -22,6 +22,6 @@ internal class MediaResponse : StResponse() { inner class Data { @SerializedName("media") - var media: List<Medium>? = null + var media: List<ApiMedium>? = null } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt index d3317f9d..2f1fb8b3 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlaceDetailedResponse.kt @@ -1,7 +1,7 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.api.model.place.PlaceDetail +import com.sygic.travel.sdk.api.model.place.ApiPlaceDetail import com.sygic.travel.sdk.model.place.* /** @@ -11,7 +11,7 @@ internal class PlaceDetailedResponse : StResponse() { private val data: Data? = null fun getPlace(): Place? { - val placeDetail = data?.place + val placeDetail = data?.apiPlace val place = placeDetail?.convert() return place @@ -19,6 +19,6 @@ internal class PlaceDetailedResponse : StResponse() { inner class Data { @SerializedName("place") - var place: PlaceDetail? = null + var apiPlace: ApiPlaceDetail? = null } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt index 86fba530..b9093d41 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/PlacesResponse.kt @@ -1,7 +1,7 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName -import com.sygic.travel.sdk.api.model.place.PlaceDetail +import com.sygic.travel.sdk.api.model.place.ApiPlaceDetail import com.sygic.travel.sdk.model.place.Place /** @@ -12,7 +12,7 @@ internal class PlacesResponse : StResponse() { private var data: Data? = null fun getPlaces(): List<Place>? { - val places = data?.places + val places = data?.apiPlaces val convertedPlaces: MutableList<Place> = mutableListOf() places?.mapTo(convertedPlaces) { @@ -24,6 +24,6 @@ internal class PlacesResponse : StResponse() { inner class Data { @SerializedName("places") - var places: List<PlaceDetail>? = null + var apiPlaces: List<ApiPlaceDetail>? = null } } From df4816325e0b4cd335143ac14c81a56b5b6be862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Mon, 19 Jun 2017 13:17:06 +0200 Subject: [PATCH 08/18] SDK: ApiAttribution's convert return the initialized attribution, full package paths removed --- .../sygic/travel/sdk/api/model/media/ApiAttribution.kt | 2 +- .../sygic/travel/sdk/api/model/media/ApiMainMedia.kt | 3 ++- .../sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt | 10 ++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt index 94d087a5..0e687836 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiAttribution.kt @@ -41,6 +41,6 @@ internal class ApiAttribution : ApiModel<Attribution> { attribution.title = title attribution.titleUrl = titleUrl - return Attribution() + return attribution } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt index b4df4f34..2bd0fb77 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/media/ApiMainMedia.kt @@ -3,6 +3,7 @@ package com.sygic.travel.sdk.api.model.media import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.model.media.MainMedia +import com.sygic.travel.sdk.model.media.Medium /** * Place main media. @@ -18,7 +19,7 @@ internal class ApiMainMedia : ApiModel<MainMedia> { override fun convert(): MainMedia { val mainMedia = MainMedia() - val convertedMedia: MutableList<com.sygic.travel.sdk.model.media.Medium> = mutableListOf() + val convertedMedia: MutableList<Medium> = mutableListOf() media?.mapTo(convertedMedia) { it.convert() } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt index fd651cd0..f9bedb13 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt @@ -6,6 +6,8 @@ import com.sygic.travel.sdk.api.model.geo.ApiLocation import com.sygic.travel.sdk.api.model.media.ApiMainMedia import com.sygic.travel.sdk.model.place.Detail import com.sygic.travel.sdk.model.place.Place +import com.sygic.travel.sdk.model.place.Reference +import com.sygic.travel.sdk.model.place.Tag internal class ApiPlaceDetail { // PLACE @@ -106,16 +108,16 @@ internal class ApiPlaceDetail { return place } - fun convertDetail(): Detail { + private fun convertDetail(): Detail { val detail = Detail() - val convertedTags: MutableList<com.sygic.travel.sdk.model.place.Tag> = mutableListOf() + val convertedTags: MutableList<Tag> = mutableListOf() tags?.mapTo(convertedTags) { it.convert() } - val convertedReferences: MutableList<com.sygic.travel.sdk.model.place.Reference> = mutableListOf() - references?.mapTo(convertedReferences){ + val convertedReferences: MutableList<Reference> = mutableListOf() + references?.mapTo(convertedReferences) { it.convert() } From 411ad3bb7d2cd7b755e33e21646847786f6c2f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Mon, 19 Jun 2017 14:04:16 +0200 Subject: [PATCH 09/18] SDK: all redundant @SerializedName annotations removed from all public models --- .../com/sygic/travel/sdk/model/geo/Bounds.kt | 11 ------- .../sygic/travel/sdk/model/geo/Location.kt | 7 ----- .../travel/sdk/model/media/Attribution.kt | 17 ----------- .../sygic/travel/sdk/model/media/MainMedia.kt | 7 ----- .../sygic/travel/sdk/model/media/Medium.kt | 26 ----------------- .../sygic/travel/sdk/model/media/Original.kt | 9 ------ .../sygic/travel/sdk/model/media/Source.kt | 9 ------ .../com/sygic/travel/sdk/model/media/Usage.kt | 10 ------- .../travel/sdk/model/place/Description.kt | 12 -------- .../sygic/travel/sdk/model/place/Detail.kt | 22 -------------- .../com/sygic/travel/sdk/model/place/Place.kt | 29 ------------------- .../com/sygic/travel/sdk/model/place/Price.kt | 7 ----- .../sygic/travel/sdk/model/place/Reference.kt | 23 --------------- .../com/sygic/travel/sdk/model/place/Tag.kt | 7 ----- .../com/sygic/travel/sdk/model/place/Tour.kt | 24 --------------- .../travel/sdk/model/query/PlacesQuery.kt | 2 +- 16 files changed, 1 insertion(+), 221 deletions(-) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Bounds.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Bounds.kt index 208db370..a8a265ca 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Bounds.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Bounds.kt @@ -1,23 +1,12 @@ package com.sygic.travel.sdk.model.geo -import com.google.gson.annotations.SerializedName - /** - * * Geographical bounds - south, west, north, east. */ class Bounds { - - @SerializedName("north") var north: Float = 0.toFloat() - - @SerializedName("east") var east: Float = 0.toFloat() - - @SerializedName("south") var south: Float = 0.toFloat() - - @SerializedName("west") var west: Float = 0.toFloat() fun toQueryString(): String { diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Location.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Location.kt index 9a693e7e..9507aff7 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Location.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/geo/Location.kt @@ -1,16 +1,9 @@ package com.sygic.travel.sdk.model.geo -import com.google.gson.annotations.SerializedName - /** * Geographic location - latitude, longitude. */ class Location { - - @SerializedName("lat") var lat: Float = 0.toFloat() - - @SerializedName("lng") var lng: Float = 0.toFloat() - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Attribution.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Attribution.kt index eff60979..df50692f 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Attribution.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Attribution.kt @@ -1,31 +1,14 @@ package com.sygic.travel.sdk.model.media -import com.google.gson.annotations.SerializedName - /** * Attribution of a medium, contains information about author, license and title. */ class Attribution { - - @SerializedName("author") var author: String? = null - - @SerializedName("author_url") var authorUrl: String? = null - - @SerializedName("license") var license: String? = null - - @SerializedName("license_url") var licenseUrl: String? = null - - @SerializedName("other") var other: String? = null - - @SerializedName("title") var title: String? = null - - @SerializedName("title_url") var titleUrl: String? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt index 58154709..eba9b29c 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/MainMedia.kt @@ -1,16 +1,9 @@ package com.sygic.travel.sdk.model.media -import com.google.gson.annotations.SerializedName - /** * Place main media. */ class MainMedia { - - @SerializedName("usage") var usage: Usage? = null - - @SerializedName("media") var media: List<Medium>? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt index 9778249a..818966ae 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Medium.kt @@ -1,6 +1,5 @@ package com.sygic.travel.sdk.model.media -import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.model.geo.Location /** @@ -8,41 +7,16 @@ import com.sygic.travel.sdk.model.geo.Location */ class Medium { - - @SerializedName("id") var id: String? = null - - @SerializedName("type") var type: String? = null - - @SerializedName("url_template") var urlTemplate: String? = null - - @SerializedName("url") var url: String? = null - - @SerializedName("original") var original: Original? = null - - @SerializedName("suitability") var suitability: List<String>? = null - - @SerializedName("created_at") var createdAt: String? = null - - @SerializedName("source") var source: Source? = null - - @SerializedName("created_by") var createdBy: String? = null - - @SerializedName("quadkey") var quadkey: String? = null - - @SerializedName("attribution") var attribution: Attribution? = null - - @SerializedName("location") var location: Location? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Original.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Original.kt index 73a805c7..82801aae 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Original.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Original.kt @@ -1,19 +1,10 @@ package com.sygic.travel.sdk.model.media -import com.google.gson.annotations.SerializedName - /** * Medium's original parameters. */ class Original { - - @SerializedName("size") var size: Int = 0 - - @SerializedName("width") var width: Int = 0 - - @SerializedName("height") var height: Int = 0 - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Source.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Source.kt index a5f9cb66..2b1a68ef 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Source.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Source.kt @@ -1,19 +1,10 @@ package com.sygic.travel.sdk.model.media -import com.google.gson.annotations.SerializedName - /** * Medium's source. */ class Source { - - @SerializedName("name") var name: String? = null - - @SerializedName("external_id") var externalId: String? = null - - @SerializedName("provider") var provider: String? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt index fe36cc47..0f7070af 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/media/Usage.kt @@ -1,22 +1,12 @@ package com.sygic.travel.sdk.model.media -import com.google.gson.annotations.SerializedName - /** * Medium's suitable usages. */ class Usage { - - @SerializedName("square") var square: String? = null - - @SerializedName("landscape") var landscape: String? = null - - @SerializedName("portrait") var portrait: String? = null - - @SerializedName("video_preview") var videoPreview: String? = null } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Description.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Description.kt index efe6871d..66f77e6b 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Description.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Description.kt @@ -1,23 +1,11 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName - /** - * * Place description data. */ class Description { - - @SerializedName("text") var text: String? = null - - @SerializedName("provider") var provider: String? = null - - @SerializedName("translation_provider") var translationProvider: String? = null - - @SerializedName("url") var url: String? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt index 623c64d3..c67930aa 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Detail.kt @@ -1,41 +1,19 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.model.media.MainMedia /** * Place detailed information. */ class Detail { - - @SerializedName("tags") var tags: List<Tag>? = null - - @SerializedName("description") var description: Description? = null - - @SerializedName("address") var address: String? = null - - @SerializedName("admission") var admission: String? = null - - @SerializedName("duration") var duration: Int = 0 - - @SerializedName("email") var email: String? = null - - @SerializedName("opening_hours") var openingHours: String? = null - - @SerializedName("phone") var phone: String? = null - - @SerializedName("main_media") var mainMedia: MainMedia? = null - - @SerializedName("references") var references: List<Reference>? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt index c0cee10c..9c4011b2 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt @@ -1,51 +1,22 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.model.geo.Bounds import com.sygic.travel.sdk.model.geo.Location open class Place { - - @SerializedName("id") var id: String? = null - - @SerializedName("level") var level: String? = null - - @SerializedName("categories") var categories: List<String>? = null - - @SerializedName("rating") var rating: Float = 0.toFloat() - - @SerializedName("quadkey") var quadkey: String? = null - - @SerializedName("location") var location: Location? = null - - @SerializedName("bounding_box") var bounds: Bounds? = null - - @SerializedName("name") var name: String? = null - - @SerializedName("name_suffix") var nameSuffix: String? = null - - @SerializedName("perex") var perex: String? = null - - @SerializedName("url") var url: String? = null - - @SerializedName("thumbnail_url") var thumbnailUrl: String? = null - - @SerializedName("marker") var marker: String? = null - - @SerializedName("parent_ids") var parentIds: List<String>? = null var detail: Detail? = null diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Price.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Price.kt index 74ccd8a6..4bbe53dc 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Price.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Price.kt @@ -1,13 +1,6 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName - class Price { - - @SerializedName("value") var value: Float = 0.toFloat() - - @SerializedName("savings") var savings: Float = 0.toFloat() - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Reference.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Reference.kt index 6921365a..f3f8f708 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Reference.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Reference.kt @@ -1,40 +1,17 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName - /** * Link (Wiki, web site, etc.) related to a specific place. */ class Reference { - - @SerializedName("id") var id: Int = 0 - - @SerializedName("title") var title: String? = null - - @SerializedName("type") var type: String? = null - - @SerializedName("language_id") var languageId: String? = null - - @SerializedName("url") var url: String? = null - - @SerializedName("supplier") var supplier: String? = null - - @SerializedName("priority") var priority: Int = 0 - - @SerializedName("currency") var currency: String? = null - - @SerializedName("price") var price: Float = 0.toFloat() - - @SerializedName("flags") var flags: List<String>? = null - } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tag.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tag.kt index 8bbf0a28..238d26cc 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tag.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tag.kt @@ -1,16 +1,9 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName - class Tag { - - @SerializedName("key") var key: String? = null - - @SerializedName("name") var name: String? = null - override fun equals(other: Any?): Boolean { if (other != null && other is Tag) { return key == other.key diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt index 80b3875d..cfdcb1a2 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt @@ -1,41 +1,17 @@ package com.sygic.travel.sdk.model.place -import com.google.gson.annotations.SerializedName - /** * Model class for Tour. */ class Tour { - @SerializedName("id") var id: String? = null - - @SerializedName("supplier") - var supplier: String? = null - - @SerializedName("title") var title: String? = null - - @SerializedName("perex") var perex: String? = null - - @SerializedName("url") var url: String? = null - - @SerializedName("rating") var rating: Float? = null - - @SerializedName("review_count") var reviewCount: Int? = null - - @SerializedName("photo_url") var photoUrl: String? = null - - @SerializedName("price") var price: Float? = null - - @SerializedName("original_price") var originalPrice: Float? = null - - @SerializedName("duration") var duration: String? = null } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/query/PlacesQuery.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/query/PlacesQuery.kt index c02f3fa5..6749f698 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/query/PlacesQuery.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/query/PlacesQuery.kt @@ -27,7 +27,7 @@ class PlacesQuery { /** * Enumaration of possible logical operators. */ - enum class Operator private constructor(operator: String) { + enum class Operator constructor(operator: String) { AND(","), OR("%7C"); From 060ce59f73fba27d6250f1388790459c5029a6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Fri, 23 Jun 2017 14:32:58 +0200 Subject: [PATCH 10/18] SDK: apply new tours endpoint changes --- sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt index cfdcb1a2..5f006e7a 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Tour.kt @@ -5,6 +5,7 @@ package com.sygic.travel.sdk.model.place */ class Tour { var id: String? = null + var supplier: String? = null var title: String? = null var perex: String? = null var url: String? = null From 039ee9c2aa9075e91b0f37d416916ebf32abcd3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Thu, 22 Jun 2017 16:55:07 +0200 Subject: [PATCH 11/18] Favorites: Room library for working with SQLite db, database with Favorites table created --- build.gradle | 1 + sdk/build.gradle | 8 +++++ .../main/java/com/sygic/travel/sdk/StSDK.kt | 20 ++++++++--- .../sdk/api/model/place/ApiPlaceDetail.kt | 5 +-- .../travel/sdk/api/model/place/ApiTour.kt | 36 +++++++++++++++++++ .../sdk/api/responseWrappers/MediaResponse.kt | 9 ++--- .../sdk/api/responseWrappers/TourResponse.kt | 16 +++++++-- .../com/sygic/travel/sdk/db/Converters.kt | 15 ++++++++ .../main/java/com/sygic/travel/sdk/db/StDb.kt | 16 +++++++++ .../sygic/travel/sdk/db/dao/FavoriteDao.kt | 18 ++++++++++ .../sygic/travel/sdk/model/place/Favorite.kt | 10 ++++++ .../com/sygic/travel/sdk/model/place/Place.kt | 3 +- 12 files changed, 141 insertions(+), 16 deletions(-) create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTour.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/db/Converters.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/db/StDb.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/model/place/Favorite.kt diff --git a/build.gradle b/build.gradle index 15829e79..431476de 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ buildscript { ext.kotlin_version = '1.1.3-2' ext.dokka_version = '0.9.14' + ext.room_version = '1.0.0-alpha3' repositories { jcenter() diff --git a/sdk/build.gradle b/sdk/build.gradle index 43ca0fe8..0a574035 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' ext { stRepo = 'maven' @@ -51,6 +52,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + // http request, api calls compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' @@ -61,6 +64,11 @@ dependencies { compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.1' + // room persistance + compile "android.arch.persistence.room:runtime:$room_version" + kapt "android.arch.persistence.room:compiler:$room_version" + testCompile "android.arch.persistence.room:testing:$room_version" + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index 327bbd45..e2c0be04 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -1,17 +1,19 @@ package com.sygic.travel.sdk +import android.arch.persistence.room.Room import android.content.Context import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.os.Build -import com.sygic.travel.sdk.api.responseWrappers.MediaResponse -import com.sygic.travel.sdk.api.responseWrappers.PlaceDetailedResponse -import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse -import com.sygic.travel.sdk.api.responseWrappers.TourResponse import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.api.StApi import com.sygic.travel.sdk.api.StApiGenerator import com.sygic.travel.sdk.api.StObserver +import com.sygic.travel.sdk.api.responseWrappers.MediaResponse +import com.sygic.travel.sdk.api.responseWrappers.PlaceDetailedResponse +import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse +import com.sygic.travel.sdk.api.responseWrappers.TourResponse +import com.sygic.travel.sdk.db.StDb import com.sygic.travel.sdk.model.media.Medium import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.place.Tour @@ -220,9 +222,10 @@ class StSDK internal constructor() { companion object { private val ST_SDK_NAME_AND_VERSION = "sygic-travel-sdk-android/sdk-version" private val ANDROID_VERSION = "Android/" + Build.VERSION.RELEASE + private val DATABASE_NAME = "st-sdk-db" private var _instance: StSDK? = null - + internal var stDb: StDb? = null fun getInstance(): StSDK { if (_instance == null) { @@ -241,6 +244,13 @@ class StSDK internal constructor() { fun initialize(xApiKey: String, context: Context) { StApiGenerator.headersInterceptor.setApiKey(xApiKey) StApiGenerator.headersInterceptor.setUserAgent(createUserAgent(context)) + + stDb = Room.databaseBuilder( + context, + StDb::class.java, + DATABASE_NAME + ).build() + getInstance().setCacheDir(context.cacheDir) } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt index f9bedb13..4299bbbf 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiPlaceDetail.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.model.place import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.converter.ApiModel import com.sygic.travel.sdk.api.model.geo.ApiBounds import com.sygic.travel.sdk.api.model.geo.ApiLocation import com.sygic.travel.sdk.api.model.media.ApiMainMedia @@ -9,7 +10,7 @@ import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.place.Reference import com.sygic.travel.sdk.model.place.Tag -internal class ApiPlaceDetail { +internal class ApiPlaceDetail : ApiModel<Place> { // PLACE @SerializedName("id") @@ -86,7 +87,7 @@ internal class ApiPlaceDetail { @SerializedName("references") var references: List<ApiReference>? = null - fun convert(): Place{ + override fun convert(): Place{ val place = Place() place.id = id diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTour.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTour.kt new file mode 100644 index 00000000..821c6fdc --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/model/place/ApiTour.kt @@ -0,0 +1,36 @@ +package com.sygic.travel.sdk.api.model.place + +import com.sygic.travel.sdk.api.model.converter.ApiModel +import com.sygic.travel.sdk.model.place.Tour + +internal class ApiTour: ApiModel<Tour> { + var id: String? = null + var supplier: String? = null + var title: String? = null + var perex: String? = null + var url: String? = null + var rating: Float? = null + var reviewCount: Int? = null + var photoUrl: String? = null + var price: Float? = null + var originalPrice: Float? = null + var duration: String? = null + + override fun convert(): Tour { + val tour = Tour() + + tour.id = id + tour.supplier = supplier + tour.title = title + tour.perex = perex + tour.url = url + tour.rating = rating + tour.reviewCount = reviewCount + tour.photoUrl = photoUrl + tour.price = price + tour.originalPrice = originalPrice + tour.duration = duration + + return tour + } +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt index a4681a5b..dec8a5d7 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/MediaResponse.kt @@ -2,6 +2,7 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName import com.sygic.travel.sdk.api.model.media.ApiMedium +import com.sygic.travel.sdk.model.media.Medium /** * Response containing a list of place media. Suitable for a gallery. @@ -9,9 +10,9 @@ import com.sygic.travel.sdk.api.model.media.ApiMedium internal class MediaResponse : StResponse() { private var data: Data? = null - fun getMedia(): List<com.sygic.travel.sdk.model.media.Medium>? { - val media = data?.media - val convertedMedia: MutableList<com.sygic.travel.sdk.model.media.Medium> = mutableListOf() + fun getMedia(): List<Medium>? { + val media = data?.apiMedia + val convertedMedia: MutableList<Medium> = mutableListOf() media?.mapTo(convertedMedia) { it.convert() @@ -22,6 +23,6 @@ internal class MediaResponse : StResponse() { inner class Data { @SerializedName("media") - var media: List<ApiMedium>? = null + var apiMedia: List<ApiMedium>? = null } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt index e3e729e4..847bec76 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/api/responseWrappers/TourResponse.kt @@ -1,6 +1,7 @@ package com.sygic.travel.sdk.api.responseWrappers import com.google.gson.annotations.SerializedName +import com.sygic.travel.sdk.api.model.place.ApiTour import com.sygic.travel.sdk.model.place.Tour /** @@ -9,10 +10,19 @@ import com.sygic.travel.sdk.model.place.Tour internal class TourResponse : StResponse() { private var data: Data? = null - fun getTours(): List<Tour>? = data?.tours + fun getTours(): List<Tour>? { + val apiTours = data?.apiTours + val convertedTours: MutableList<Tour> = mutableListOf() + + apiTours?.mapTo(convertedTours) { + it.convert() + } + + return convertedTours + } inner class Data { @SerializedName("tours") - var tours: List<Tour>? = null + var apiTours: List<ApiTour>? = null } -} \ No newline at end of file +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/db/Converters.kt b/sdk/src/main/java/com/sygic/travel/sdk/db/Converters.kt new file mode 100644 index 00000000..16de305e --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/db/Converters.kt @@ -0,0 +1,15 @@ +package com.sygic.travel.sdk.db + +import android.arch.persistence.room.TypeConverter + +class Converters { + @TypeConverter + fun stringToList(value: String): List<String> { + return value.split((",").toRegex(), 0) + } + + @TypeConverter + fun listToString(values: List<String>): String { + return values.joinToString(",") + } +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/db/StDb.kt b/sdk/src/main/java/com/sygic/travel/sdk/db/StDb.kt new file mode 100644 index 00000000..b0e8483e --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/db/StDb.kt @@ -0,0 +1,16 @@ +package com.sygic.travel.sdk.db + +import android.arch.persistence.room.Database +import android.arch.persistence.room.RoomDatabase +import android.arch.persistence.room.TypeConverters +import com.sygic.travel.sdk.db.dao.FavoriteDao +import com.sygic.travel.sdk.model.place.Favorite + +@Database( + entities = arrayOf(Favorite::class), + version = 1 +) +@TypeConverters(Converters::class) +internal abstract class StDb : RoomDatabase() { + abstract fun favoriteDao(): FavoriteDao +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt b/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt new file mode 100644 index 00000000..ec9d839b --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt @@ -0,0 +1,18 @@ +package com.sygic.travel.sdk.db.dao + +import android.arch.persistence.room.Dao +import android.arch.persistence.room.Insert +import android.arch.persistence.room.OnConflictStrategy +import android.arch.persistence.room.Query +import com.sygic.travel.sdk.model.place.Favorite +@Dao +interface FavoriteDao { + @Query("SELECT * FROM favorite") + fun getAll(): List<Favorite> + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(vararg placeId: Favorite) + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(placeId: List<Favorite>) +} diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Favorite.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Favorite.kt new file mode 100644 index 00000000..a078f3bd --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Favorite.kt @@ -0,0 +1,10 @@ +package com.sygic.travel.sdk.model.place + +import android.arch.persistence.room.Entity +import android.arch.persistence.room.PrimaryKey + +@Entity(tableName = "favorite") +class Favorite( + @PrimaryKey + var id: String? = null +) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt index 9c4011b2..b2b7cc8e 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/model/place/Place.kt @@ -3,7 +3,7 @@ package com.sygic.travel.sdk.model.place import com.sygic.travel.sdk.model.geo.Bounds import com.sygic.travel.sdk.model.geo.Location -open class Place { +class Place { var id: String? = null var level: String? = null var categories: List<String>? = null @@ -18,7 +18,6 @@ open class Place { var thumbnailUrl: String? = null var marker: String? = null var parentIds: List<String>? = null - var detail: Detail? = null fun hasLocation(): Boolean { From 504bfa70e9f1b2f6a6a30d72d4c031cc2ddf8afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Fri, 30 Jun 2017 10:25:08 +0200 Subject: [PATCH 12/18] Favorites: DataProvider added - StSDK calls it's methods to work with data --- .../main/java/com/sygic/travel/sdk/StSDK.kt | 243 ++++++------------ .../sygic/travel/sdk/provider/DataProvider.kt | 174 +++++++++++++ 2 files changed, 259 insertions(+), 158 deletions(-) create mode 100644 sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index e2c0be04..94e57a7f 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -8,26 +8,18 @@ import android.os.Build import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdk.api.StApi import com.sygic.travel.sdk.api.StApiGenerator -import com.sygic.travel.sdk.api.StObserver -import com.sygic.travel.sdk.api.responseWrappers.MediaResponse -import com.sygic.travel.sdk.api.responseWrappers.PlaceDetailedResponse -import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse -import com.sygic.travel.sdk.api.responseWrappers.TourResponse import com.sygic.travel.sdk.db.StDb import com.sygic.travel.sdk.model.media.Medium import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.place.Tour import com.sygic.travel.sdk.model.query.PlacesQuery import com.sygic.travel.sdk.model.query.ToursQuery -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposables -import io.reactivex.schedulers.Schedulers +import com.sygic.travel.sdk.provider.DataProvider import java.io.File /** - * * Provides public methods for requesting API. */ class StSDK internal constructor() { @@ -39,34 +31,11 @@ class StSDK internal constructor() { * @param back Callback. Either [Callback.onSuccess] with places is called, or * * [Callback.onFailure] in case of an error is called. */ - fun getPlaces( - placesQuery: PlacesQuery, - back: Callback<List<Place>?>? - ) { - val unpreparedObservable = getStApi().getPlaces( - placesQuery.query, - placesQuery.levelsQueryString, - placesQuery.categoriesQueryString, - placesQuery.mapTilesQueryString, - placesQuery.mapSpread, - placesQuery.boundsQueryString, - placesQuery.tagsQueryString, - placesQuery.parentsQueryString, - placesQuery.limit - ) - val callback = object : Callback<PlacesResponse>() { - override fun onSuccess(data: PlacesResponse) { - back?.onSuccess(data.getPlaces()) - } - - override fun onFailure(t: Throwable) { - back?.onFailure(t) - } - } - val preparedObservable = getPreparedObservable(unpreparedObservable) - disposable = preparedObservable.subscribeWith(StObserver(callback, false)) + fun getPlaces(placesQuery: PlacesQuery, back: Callback<List<Place>?>?) { + disposable = dataProvider?.getPlaces(placesQuery, back) } + /** * * Creates and sends a request to get place with detailed information. @@ -76,20 +45,10 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlaceDetailed(id: String, back: Callback<Place?>) { - val unpreparedObservable = getStApi().getPlaceDetailed(id) - val preparedObservable = getPreparedObservable(unpreparedObservable) - val callback = object : Callback<PlaceDetailedResponse>() { - override fun onSuccess(data: PlaceDetailedResponse) { - back.onSuccess(data.getPlace()) - } - - override fun onFailure(t: Throwable) { - back.onFailure(t) - } - } - disposable = preparedObservable.subscribeWith(StObserver(callback, false)) + disposable = dataProvider?.getPlaceDetailed(id, back) } + /** * * Creates and sends a request to get places with detailed information. @@ -99,21 +58,10 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlacesDetailed(ids: List<String>, back: Callback<List<Place>?>) { - val queryIds = ids.joinToString(PlacesQuery.Operator.OR.operator) - val unpreparedObservable = getStApi().getPlacesDetailed(queryIds) - val preparedObservable = getPreparedObservable(unpreparedObservable) - val callback = object : Callback<PlacesResponse>() { - override fun onSuccess(data: PlacesResponse) { - back.onSuccess(data.getPlaces()) - } - - override fun onFailure(t: Throwable) { - back.onFailure(t) - } - } - disposable = preparedObservable.subscribeWith(StObserver(callback, false)) + disposable = dataProvider?.getPlacesDetailed(ids, back) } + /** * * Creates and sends a request to get the place's media. @@ -123,20 +71,10 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlaceMedia(id: String, back: Callback<List<Medium>?>) { - val unpreparedObservable = getStApi().getPlaceMedia(id) - val preparedObservable = getPreparedObservable(unpreparedObservable) - val callback = object : Callback<MediaResponse>() { - override fun onSuccess(data: MediaResponse) { - back.onSuccess(data.getMedia()) - } - - override fun onFailure(t: Throwable) { - back.onFailure(t) - } - } - disposable = preparedObservable.subscribeWith(StObserver(callback, false)) + disposable = dataProvider?.getPlaceMedia(id, back) } + /** * Creates and sends a request to get the Tours. * @param toursQuery ToursQuery encapsulating data for API request. @@ -145,27 +83,11 @@ class StSDK internal constructor() { * [Callback.onFailure] in case of an error is called. */ fun getTours(toursQuery: ToursQuery, back: Callback<List<Tour>?>?) { - val unpreparedObservable = getStApi().getTours( - destinationId = toursQuery.destinationId, - page = toursQuery.page, - sortBy = toursQuery.sortBy?.string, - sortDirection = toursQuery.sortDirection?.string - ) - val preparedObservable = getPreparedObservable(unpreparedObservable) - val callback = object : Callback<TourResponse>() { - override fun onSuccess(data: TourResponse) { - back?.onSuccess(data.getTours()) - } - - override fun onFailure(t: Throwable) { - back?.onFailure(t) - } - } - disposable = preparedObservable.subscribeWith(StObserver(callback, false)) + disposable = dataProvider?.getTours(toursQuery, back) } + /** - * * Unsubscribes a subscribed observable. */ fun unsubscribeObservable() { @@ -177,56 +99,83 @@ class StSDK internal constructor() { /*------------------------------------------- PRIVATE MEMBERS & METHODS -------------------------------------------*/ + private val ST_SDK_NAME_AND_VERSION = "sygic-travel-sdk-android/sdk-version" + private val ANDROID_VERSION = "Android/" + Build.VERSION.RELEASE + private val DATABASE_NAME = "st-sdk-db" - private var stApi: StApi? = null - private var cacheDir: File? = null + private var dataProvider: DataProvider? = null + private var stApi: StApi? = null + private var stDb: StDb? = null private var disposable : Disposable = Disposables.empty() - /** - * - * Creates and returns an _instance of the [StApi] interface. - * @return Instance of the [StApi] interface. - */ - private fun getStApi(): StApi { - if (stApi == null) { - assert(cacheDir != null) - stApi = StApiGenerator.createStApi(StApi::class.java, cacheDir as File) - } - return stApi as StApi - } - /** - * - * Sets a cache directory. - * @param cacheDir Cache directorry. - */ - internal fun setCacheDir(cacheDir: File) { - this.cacheDir = cacheDir - } - - - /** - * - * Prepares an [Observable] - sets [schedulers][Scheduler]. - * @param unpreparedObservable Observable to be prepared. - * * - * @return Disposable ready to be subscribed to. - */ - fun <T> getPreparedObservable(unpreparedObservable: Observable<T>): Observable<T> { - return unpreparedObservable - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - } + /** + * @return UserAgent to be sent as a header in every request. + */ + private fun createUserAgent(context: Context): String { + var packageInfo: PackageInfo? = null + try { + packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + + var userAgent = "" + userAgent += context.packageName + "/" + userAgent += if (packageInfo != null) packageInfo.versionName + " " else "" + userAgent += ST_SDK_NAME_AND_VERSION + " " + userAgent += ANDROID_VERSION + return userAgent + } + + + /** + * Creates an instance of [DataProvider]. + * @param context Application's context. + */ + private fun intializeDataProvider(context: Context) { + if (dataProvider == null) { + dataProvider = DataProvider(getStApi(context.cacheDir), getStDb(context)) + } + } + + + /** + * Creates and returns an instance of the [StApi] interface. + * @return Instance of the [StApi] interface. + */ + private fun getStApi(cacheDir: File?): StApi { + if (stApi == null) { + assert(cacheDir != null) + stApi = StApiGenerator.createStApi(StApi::class.java, cacheDir as File) + } + return stApi as StApi + } + + /** + * Creates and returns an instance of [StDb]. + * @return Instance of the [StDb] interface. + */ + private fun getStDb(context: Context): StDb { + if (stDb == null) { + stDb = Room.databaseBuilder( + context, + StDb::class.java, + DATABASE_NAME + ).build() + } + return stDb as StDb + } companion object { - private val ST_SDK_NAME_AND_VERSION = "sygic-travel-sdk-android/sdk-version" - private val ANDROID_VERSION = "Android/" + Build.VERSION.RELEASE - private val DATABASE_NAME = "st-sdk-db" - private var _instance: StSDK? = null - internal var stDb: StDb? = null + + /** + * Creates and returns an instance of [StSDK]. + * @return SDK instance + */ fun getInstance(): StSDK { if (_instance == null) { synchronized(StSDK::class.java) { @@ -238,39 +187,17 @@ class StSDK internal constructor() { return _instance!! } + /** * Initialization of the SDK. + * @param xApiKey Api key - must be provided. + * @param context Application's context. */ fun initialize(xApiKey: String, context: Context) { StApiGenerator.headersInterceptor.setApiKey(xApiKey) - StApiGenerator.headersInterceptor.setUserAgent(createUserAgent(context)) - - stDb = Room.databaseBuilder( - context, - StDb::class.java, - DATABASE_NAME - ).build() - - getInstance().setCacheDir(context.cacheDir) - } - - /** - * @return UserAgent to be sent as a header in every request. - */ - private fun createUserAgent(context: Context): String { - var packageInfo: PackageInfo? = null - try { - packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) - } catch (e: PackageManager.NameNotFoundException) { - e.printStackTrace() - } + StApiGenerator.headersInterceptor.setUserAgent(getInstance().createUserAgent(context)) - var userAgent = "" - userAgent += context.packageName + "/" - userAgent += if (packageInfo != null) packageInfo.versionName + " " else "" - userAgent += ST_SDK_NAME_AND_VERSION + " " - userAgent += ANDROID_VERSION - return userAgent + getInstance().intializeDataProvider(context) } } } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt new file mode 100644 index 00000000..b134cf9f --- /dev/null +++ b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt @@ -0,0 +1,174 @@ +package com.sygic.travel.sdk.provider + +import com.sygic.travel.sdk.api.Callback +import com.sygic.travel.sdk.api.StApi +import com.sygic.travel.sdk.api.StObserver +import com.sygic.travel.sdk.api.responseWrappers.MediaResponse +import com.sygic.travel.sdk.api.responseWrappers.PlaceDetailedResponse +import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse +import com.sygic.travel.sdk.api.responseWrappers.TourResponse +import com.sygic.travel.sdk.db.StDb +import com.sygic.travel.sdk.model.media.Medium +import com.sygic.travel.sdk.model.place.Place +import com.sygic.travel.sdk.model.place.Tour +import com.sygic.travel.sdk.model.query.PlacesQuery +import com.sygic.travel.sdk.model.query.ToursQuery +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers + + +internal class DataProvider( + val stApi: StApi? = null, + val stDb: StDb? = null +) { + /** + * Creates and sends a request to get places, e.g. for map or list. + * @param placesQuery PlacesQuery encapsulating data for API request. + * * + * @param back Callback. Either [Callback.onSuccess] with places is called, or + * * [Callback.onFailure] in case of an error is called. + */ + fun getPlaces( + placesQuery: PlacesQuery, + back: Callback<List<Place>?>? + ): Disposable { + val unpreparedObservable = stApi?.getPlaces( + placesQuery.query, + placesQuery.levelsQueryString, + placesQuery.categoriesQueryString, + placesQuery.mapTilesQueryString, + placesQuery.mapSpread, + placesQuery.boundsQueryString, + placesQuery.tagsQueryString, + placesQuery.parentsQueryString, + placesQuery.limit + ) + val callback = object : Callback<PlacesResponse>() { + override fun onSuccess(data: PlacesResponse) { + back?.onSuccess(data.getPlaces()) + } + + override fun onFailure(t: Throwable) { + back?.onFailure(t) + } + } + val preparedObservable = getPreparedObservable(unpreparedObservable!!) + return preparedObservable.subscribeWith(StObserver(callback, false)) + } + + + /** + * + * Creates and sends a request to get place with detailed information. + * @param id Unique id of a place - detailed information about this place will be requested. + * * + * @param back Callback. Either [Callback.onSuccess] with place is called, or + * * [Callback.onFailure] in case of an error is called. + */ + fun getPlaceDetailed(id: String, back: Callback<Place?>?): Disposable { + val unpreparedObservable = stApi?.getPlaceDetailed(id) + val preparedObservable = getPreparedObservable(unpreparedObservable!!) + val callback = object : Callback<PlaceDetailedResponse>() { + override fun onSuccess(data: PlaceDetailedResponse) { + back?.onSuccess(data.getPlace()) + } + + override fun onFailure(t: Throwable) { + back?.onFailure(t) + } + } + return preparedObservable.subscribeWith(StObserver(callback, false)) + } + + /** + * + * Creates and sends a request to get places with detailed information. + * @param ids Ids of places - detailed information about these places will be requested. + * * + * @param back Callback. Either [Callback.onSuccess] with places is called, or + * * [Callback.onFailure] in case of an error is called. + */ + fun getPlacesDetailed(ids: List<String>, back: Callback<List<Place>?>?): Disposable { + val queryIds = ids.joinToString(PlacesQuery.Operator.OR.operator) + val unpreparedObservable = stApi?.getPlacesDetailed(queryIds) + val preparedObservable = getPreparedObservable(unpreparedObservable!!) + val callback = object : Callback<PlacesResponse>() { + override fun onSuccess(data: PlacesResponse) { + back?.onSuccess(data.getPlaces()) + } + + override fun onFailure(t: Throwable) { + back?.onFailure(t) + } + } + return preparedObservable.subscribeWith(StObserver(callback, false)) + } + + /** + * + * Creates and sends a request to get the place's media. + * @param id Unique id of a place - media for this place will be requested. + * * + * @param back Callback. Either [Callback.onSuccess] with places is called, or + * * [Callback.onFailure] in case of an error is called. + */ + fun getPlaceMedia(id: String, back: Callback<List<Medium>?>?): Disposable { + val unpreparedObservable = stApi?.getPlaceMedia(id) + val preparedObservable = getPreparedObservable(unpreparedObservable!!) + val callback = object : Callback<MediaResponse>() { + override fun onSuccess(data: MediaResponse) { + back?.onSuccess(data.getMedia()) + } + + override fun onFailure(t: Throwable) { + back?.onFailure(t) + } + } + return preparedObservable.subscribeWith(StObserver(callback, false)) + } + + /** + * Creates and sends a request to get the Tours. + * @param toursQuery ToursQuery encapsulating data for API request. + * + * @param back Callback. Either [Callback.onSuccess] with tours is called, or + * [Callback.onFailure] in case of an error is called. + */ + fun getTours(toursQuery: ToursQuery, back: Callback<List<Tour>?>?): Disposable { + val unpreparedObservable = stApi?.getTours( + destinationId = toursQuery.destinationId, + page = toursQuery.page, + sortBy = toursQuery.sortBy?.string, + sortDirection = toursQuery.sortDirection?.string + ) + val preparedObservable = getPreparedObservable(unpreparedObservable!!) + val callback = object : Callback<TourResponse>() { + override fun onSuccess(data: TourResponse) { + back?.onSuccess(data.getTours()) + } + + override fun onFailure(t: Throwable) { + back?.onFailure(t) + } + } + return preparedObservable.subscribeWith(StObserver(callback, false)) + } + + + /** + * + * Prepares an [Observable] - sets [schedulers][Scheduler]. + * @param unpreparedObservable Observable to be prepared. + * * + * @return Observable ready to be subscribed to. + */ + fun <T> getPreparedObservable( + unpreparedObservable: Observable<T> + ): Observable<T> { + return unpreparedObservable + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + } +} From 019a090a5aa7c8ce1dad0e2ef03eca49f02e57ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Tue, 4 Jul 2017 14:25:00 +0200 Subject: [PATCH 13/18] Favorites: db methods prepared to be called from app (no RX), FavoriteDao modified - 1 id arg, delete added, insert and delete return number of affected rows --- .../sygic/travel/sdkdemo/DemoMainActivity.kt | 11 ++--- sdk/build.gradle | 6 ++- .../main/java/com/sygic/travel/sdk/StSDK.kt | 25 ++++++++--- .../sygic/travel/sdk/db/dao/FavoriteDao.kt | 13 +++--- .../sygic/travel/sdk/provider/DataProvider.kt | 43 +++++++++++++++++++ 5 files changed, 78 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt index a8f24220..f0a709a9 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import com.sygic.travel.sdk.StSDK +import com.sygic.travel.sdk.api.Callback import com.sygic.travel.sdkdemo.list.PlacesListActivity import com.sygic.travel.sdkdemo.map.MapsActivity import com.sygic.travel.sdkdemo.search.SearchActivity @@ -28,11 +29,6 @@ class DemoMainActivity : AppCompatActivity() { findViewById(R.id.btn_tours_activity).setOnClickListener { startToursActivity() } } - private fun startToursActivity() { - val toursIntent = Intent(this, ToursActivity::class.java) - startActivity(toursIntent) - } - private fun startMapActivity() { val mapIntent = Intent(this, MapsActivity::class.java) startActivity(mapIntent) @@ -47,4 +43,9 @@ class DemoMainActivity : AppCompatActivity() { val searchIntent = Intent(this, SearchActivity::class.java) startActivity(searchIntent) } + + private fun startToursActivity() { + val toursIntent = Intent(this, ToursActivity::class.java) + startActivity(toursIntent) + } } diff --git a/sdk/build.gradle b/sdk/build.gradle index 0a574035..ebe26612 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -61,8 +61,10 @@ dependencies { compile 'com.squareup.okhttp3:logging-interceptor:3.8.1' compile 'com.squareup.okhttp3:okhttp:3.8.1' compile 'com.google.code.gson:gson:2.8.0' - compile 'io.reactivex.rxjava2:rxandroid:2.0.1' - compile 'io.reactivex.rxjava2:rxjava:2.1.1' + + // RX + compile 'io.reactivex.rxjava2:rxandroid:2.0.1' + compile 'io.reactivex.rxjava2:rxjava:2.1.1' // room persistance compile "android.arch.persistence.room:runtime:$room_version" diff --git a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt index 94e57a7f..c352af95 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/StSDK.kt @@ -32,7 +32,7 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlaces(placesQuery: PlacesQuery, back: Callback<List<Place>?>?) { - disposable = dataProvider?.getPlaces(placesQuery, back) + disposable = dataProvider?.getPlaces(placesQuery, back)!! } @@ -45,7 +45,7 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlaceDetailed(id: String, back: Callback<Place?>) { - disposable = dataProvider?.getPlaceDetailed(id, back) + disposable = dataProvider?.getPlaceDetailed(id, back)!! } @@ -58,7 +58,7 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlacesDetailed(ids: List<String>, back: Callback<List<Place>?>) { - disposable = dataProvider?.getPlacesDetailed(ids, back) + disposable = dataProvider?.getPlacesDetailed(ids, back)!! } @@ -71,7 +71,7 @@ class StSDK internal constructor() { * * [Callback.onFailure] in case of an error is called. */ fun getPlaceMedia(id: String, back: Callback<List<Medium>?>) { - disposable = dataProvider?.getPlaceMedia(id, back) + disposable = dataProvider?.getPlaceMedia(id, back)!! } @@ -83,10 +83,25 @@ class StSDK internal constructor() { * [Callback.onFailure] in case of an error is called. */ fun getTours(toursQuery: ToursQuery, back: Callback<List<Tour>?>?) { - disposable = dataProvider?.getTours(toursQuery, back) + disposable = dataProvider?.getTours(toursQuery, back)!! } + fun addPlaceToFavorites(id: String, back: Callback<String>?) { + dataProvider?.addPlaceToFavorites(id, back) + } + + + fun removePlaceFromFavorites(id: String, back: Callback<String>?) { + dataProvider?.removePlaceFromFavorites(id, back) + } + + + fun getFavoritesIds(callback: Callback<List<String>?>?) { + dataProvider?.getFavoritesIds(callback) + } + + /** * Unsubscribes a subscribed observable. */ diff --git a/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt b/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt index ec9d839b..57fcb790 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/db/dao/FavoriteDao.kt @@ -1,18 +1,15 @@ package com.sygic.travel.sdk.db.dao -import android.arch.persistence.room.Dao -import android.arch.persistence.room.Insert -import android.arch.persistence.room.OnConflictStrategy -import android.arch.persistence.room.Query +import android.arch.persistence.room.* import com.sygic.travel.sdk.model.place.Favorite @Dao interface FavoriteDao { @Query("SELECT * FROM favorite") - fun getAll(): List<Favorite> + fun loadAll(): List<Favorite> @Insert(onConflict = OnConflictStrategy.IGNORE) - fun insert(vararg placeId: Favorite) + fun insert(placeId: Favorite) : Long - @Insert(onConflict = OnConflictStrategy.IGNORE) - fun insert(placeId: List<Favorite>) + @Delete + fun delete(placeId: Favorite) : Int } diff --git a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt index b134cf9f..61277159 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt @@ -9,6 +9,7 @@ import com.sygic.travel.sdk.api.responseWrappers.PlacesResponse import com.sygic.travel.sdk.api.responseWrappers.TourResponse import com.sygic.travel.sdk.db.StDb import com.sygic.travel.sdk.model.media.Medium +import com.sygic.travel.sdk.model.place.Favorite import com.sygic.travel.sdk.model.place.Place import com.sygic.travel.sdk.model.place.Tour import com.sygic.travel.sdk.model.query.PlacesQuery @@ -155,6 +156,48 @@ internal class DataProvider( } return preparedObservable.subscribeWith(StObserver(callback, false)) } + + + fun addPlaceToFavorites(id: String, back: Callback<String>?) { + Thread(Runnable { + val insertedCount = stDb?.favoriteDao()?.insert(Favorite(id)) + if (insertedCount == 1L) { + back?.onSuccess("Success") + } else { + back?.onFailure(Exception("Favorite not added!")) + } + + }).start() + } + + + fun removePlaceFromFavorites(id: String, back: Callback<String>?) { + Thread(Runnable { + val insertedCount = stDb?.favoriteDao()?.delete(Favorite(id)) + if (insertedCount == 1) { + back?.onSuccess("Success") + } else { + back?.onFailure(Exception("Favorite not removed!")) + } + }).start() + } + + + fun getFavoritesIds(back: Callback<List<String>?>?) { + Thread(Runnable { + val favorites = stDb?.favoriteDao()?.loadAll() + val favoritesIds: MutableList<String> = mutableListOf() + favorites?.mapTo(favoritesIds) { + it.id!! + } + + if (favoritesIds.size > 0) { + back?.onSuccess(favoritesIds) + } else { + back?.onFailure(Exception("No favorites loaded from DB!")) + } + }).start() + } /** From 9a3210b4a8a21d3ab78cb22f1b4a8ae034c434f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Fri, 30 Jun 2017 10:25:08 +0200 Subject: [PATCH 14/18] Favorites: DataProvider added - StSDK calls it's methods to work with data --- sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt index 61277159..bbb37148 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt @@ -214,4 +214,4 @@ internal class DataProvider( .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) } -} +} \ No newline at end of file From 9e38c6fb6c03f1b0c7433d66aeb3d4e9d85fa17e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Tue, 4 Jul 2017 15:37:28 +0200 Subject: [PATCH 15/18] Favorites: favorites activity added, manifest ordered, activities' titles corrected --- app/src/main/AndroidManifest.xml | 19 ++-- .../sygic/travel/sdkdemo/DemoMainActivity.kt | 80 ++++++++------- .../sdkdemo/favorites/FavoritesActivity.kt | 99 +++++++++++++++++++ .../travel/sdkdemo/list/PlacesListActivity.kt | 4 +- .../travel/sdkdemo/tours/ToursActivity.kt | 3 - .../main/res/layout/activity_demo_main.xml | 13 +++ app/src/main/res/layout/activity_list.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- 8 files changed, 174 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 965bfeb1..2e7ce6cc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ </activity> <activity android:name=".list.PlacesListActivity" - android:label="@string/title_activity_list" + android:label="@string/title_activity_places" android:screenOrientation="portrait"> </activity> <activity @@ -39,14 +39,11 @@ android:label="@string/title_activity_place_detail" android:screenOrientation="portrait"> </activity> - <activity - android:name=".tours.ToursActivity" - android:label="@string/title_activity_list" - android:screenOrientation="portrait"></activity> <activity android:name=".gallery.GalleryActivity" android:label="@string/title_activity_gallery" - android:screenOrientation="portrait"></activity> + android:screenOrientation="portrait"> + </activity> <activity android:name=".gallery.PhotoActivity" android:configChanges="orientation|keyboardHidden|screenSize" @@ -67,5 +64,15 @@ android:label="@string/title_activity_search" android:screenOrientation="portrait"> </activity> + <activity + android:name=".tours.ToursActivity" + android:label="@string/title_activity_tours" + android:screenOrientation="portrait"> + </activity> + <activity + android:name=".favorites.FavoritesActivity" + android:label="@string/title_activity_favorites" + android:screenOrientation="portrait"> + </activity> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt index f0a709a9..2818eba4 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/DemoMainActivity.kt @@ -4,7 +4,7 @@ import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import com.sygic.travel.sdk.StSDK -import com.sygic.travel.sdk.api.Callback +import com.sygic.travel.sdkdemo.favorites.FavoritesActivity import com.sygic.travel.sdkdemo.list.PlacesListActivity import com.sygic.travel.sdkdemo.map.MapsActivity import com.sygic.travel.sdkdemo.search.SearchActivity @@ -12,40 +12,46 @@ import com.sygic.travel.sdkdemo.tours.ToursActivity class DemoMainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_demo_main) - - // Sygic Travel SDK initialization. Must be called on the application start. You can initialize the SDK - // in your Application class' onCreate() method. - StSDK.initialize(getString(R.string.api_key), this) - initUI() - } - - private fun initUI() { - findViewById(R.id.btn_map_activity).setOnClickListener { startMapActivity() } - findViewById(R.id.btn_list_activity).setOnClickListener { startListActivity() } - findViewById(R.id.btn_search_activity).setOnClickListener { startSearchActivity() } - findViewById(R.id.btn_tours_activity).setOnClickListener { startToursActivity() } - } - - private fun startMapActivity() { - val mapIntent = Intent(this, MapsActivity::class.java) - startActivity(mapIntent) - } - - private fun startListActivity() { - val mapIntent = Intent(this, PlacesListActivity::class.java) - startActivity(mapIntent) - } - - private fun startSearchActivity() { - val searchIntent = Intent(this, SearchActivity::class.java) - startActivity(searchIntent) - } - - private fun startToursActivity() { - val toursIntent = Intent(this, ToursActivity::class.java) - startActivity(toursIntent) - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_demo_main) + + // Sygic Travel SDK initialization. Must be called on the application start. You can initialize the SDK + // in your Application class' onCreate() method. + StSDK.initialize(getString(R.string.api_key), this) + initUI() + } + + private fun initUI() { + findViewById(R.id.btn_map_activity).setOnClickListener { startMapActivity() } + findViewById(R.id.btn_list_activity).setOnClickListener { startListActivity() } + findViewById(R.id.btn_search_activity).setOnClickListener { startSearchActivity() } + findViewById(R.id.btn_tours_activity).setOnClickListener { startToursActivity() } + findViewById(R.id.btn_favorites_activity).setOnClickListener { startFavoritesActivity() } + } + + private fun startMapActivity() { + val mapIntent = Intent(this, MapsActivity::class.java) + startActivity(mapIntent) + } + + private fun startListActivity() { + val mapIntent = Intent(this, PlacesListActivity::class.java) + startActivity(mapIntent) + } + + private fun startSearchActivity() { + val searchIntent = Intent(this, SearchActivity::class.java) + startActivity(searchIntent) + } + + private fun startToursActivity() { + val toursIntent = Intent(this, ToursActivity::class.java) + startActivity(toursIntent) + } + + private fun startFavoritesActivity() { + val favoritesIntent = Intent(this, FavoritesActivity::class.java) + startActivity(favoritesIntent) + } } diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt new file mode 100644 index 00000000..7128f924 --- /dev/null +++ b/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt @@ -0,0 +1,99 @@ +package com.sygic.travel.sdkdemo.favorites + +import android.content.Intent +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.DividerItemDecoration +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.widget.Toast +import com.sygic.travel.sdk.StSDK +import com.sygic.travel.sdk.api.Callback +import com.sygic.travel.sdk.model.place.Place +import com.sygic.travel.sdkdemo.R +import com.sygic.travel.sdkdemo.detail.PlaceDetailActivity +import com.sygic.travel.sdkdemo.list.PlacesAdapter +import com.sygic.travel.sdkdemo.utils.Utils + +class FavoritesActivity : AppCompatActivity() { + + private var rvPlaces: RecyclerView? = null + private var placesAdapter: PlacesAdapter? = null + private var places: List<Place>? = null + + private val favoritesIdsCallback = object : Callback<List<String>?>() { + override fun onSuccess(data: List<String>?) { + // Places are sorted by rating, best rated places are at the top of the list + loadFavorites(data!!) + } + + override fun onFailure(t: Throwable) { + Toast.makeText(this@FavoritesActivity, t.message, Toast.LENGTH_LONG).show() + t.printStackTrace() + } + } + + private val favoritesCallback = object : Callback<List<Place>?>() { + override fun onSuccess(data: List<Place>?) { + // Places are sorted by rating, best rated places are at the top of the list + renderPlacesList(data!!) + } + + override fun onFailure(t: Throwable) { + Toast.makeText(this@FavoritesActivity, t.message, Toast.LENGTH_LONG).show() + t.printStackTrace() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_list) + + initRecycler() + } + + override fun onResume() { + super.onResume() + loadFavoritesIds() + } + + // Recycler view initialization - list with dividers + private fun initRecycler() { + rvPlaces = findViewById(R.id.rv_places) as RecyclerView + rvPlaces!!.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + rvPlaces!!.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL)) + placesAdapter = PlacesAdapter(onPlaceClick, Utils.getDetailPhotoSize(this)) + rvPlaces!!.adapter = placesAdapter + } + + // On a place click listener. Opens it's detail. + private val onPlaceClick = object : PlacesAdapter.ViewHolder.PlaceClick { + override fun onPlaceClick(position: Int) { + val placeDetailIntent = Intent(this@FavoritesActivity, PlaceDetailActivity::class.java) + placeDetailIntent.putExtra(ID, places?.get(position)?.id) + startActivity(placeDetailIntent) + } + } + + // Use the SDK to load favorite places' ids from database + private fun loadFavoritesIds() { + StSDK.getInstance().getFavoritesIds(favoritesIdsCallback) + } + + // Use the SDK to load favorite place from api + private fun loadFavorites(favoritesIds: List<String>) { + StSDK.getInstance().getPlacesDetailed(favoritesIds, favoritesCallback) + } + + private fun renderPlacesList(places: List<Place>) { + this.places = places + placesAdapter!!.setPlaces(places) + placesAdapter!!.notifyDataSetChanged() + } + + companion object { + private val TAG = FavoritesActivity::class.java.simpleName + + val ID = "id" + } +} diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt index 4d220ec0..5122af51 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/list/PlacesListActivity.kt @@ -35,7 +35,7 @@ class PlacesListActivity : AppCompatActivity() { setContentView(R.layout.activity_list) categoriesDialog = CategoriesDialog(this, onCategoriesClick) - titlePattern = getString(R.string.title_activity_list) + " - %s" + titlePattern = getString(R.string.title_activity_places) + " - %s" initRecycler() loadPlaces() @@ -105,7 +105,7 @@ class PlacesListActivity : AppCompatActivity() { } if (categoryKey == "all") { selectedCateoriesKeys.clear() - title = getString(R.string.title_activity_list) // Set activity's title + title = getString(R.string.title_activity_places) // Set activity's title } else { selectedCateoriesKeys.add(categoryKey) title = String.format(titlePattern!!, categoryName) // Set activity's title diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt index 11c578f1..f861baa7 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/tours/ToursActivity.kt @@ -19,7 +19,6 @@ class ToursActivity : AppCompatActivity(), ToursAdapter.ListItemClickListener { private var rvTours: RecyclerView? = null private var toursAdapter: ToursAdapter? = null - private var titlePattern: String? = null private var tourCallback: Callback<List<Tour>?>? = null private var tours: List<Tour>? = null @@ -40,8 +39,6 @@ class ToursActivity : AppCompatActivity(), ToursAdapter.ListItemClickListener { super.onCreate(savedInstanceState) setContentView(R.layout.activity_tours_list) - titlePattern = getString(R.string.title_activity_list) + " - %s" - initRecycler() loadTours() } diff --git a/app/src/main/res/layout/activity_demo_main.xml b/app/src/main/res/layout/activity_demo_main.xml index d8443d29..934b8958 100644 --- a/app/src/main/res/layout/activity_demo_main.xml +++ b/app/src/main/res/layout/activity_demo_main.xml @@ -73,4 +73,17 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/btn_search_activity" /> + <Button + android:id="@+id/btn_favorites_activity" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:layout_marginTop="32dp" + android:text="Favorites Activity" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/btn_tours_activity" /> + </android.support.constraint.ConstraintLayout> diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml index e36caef0..1c9789dd 100644 --- a/app/src/main/res/layout/activity_list.xml +++ b/app/src/main/res/layout/activity_list.xml @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - tools:context="com.sygic.travel.sdkdemo.list.PlacesListActivity"> + android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_places" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 52e56b80..881957e5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,12 +2,14 @@ <string name="app_name">SDK Demo</string> <string name="title_activity_demo_main">SDK Demo</string> <string name="title_activity_maps">Map</string> - <string name="title_activity_list">List</string> + <string name="title_activity_places">Places</string> <string name="title_activity_place_detail">Place Detail</string> <string name="title_activity_gallery">Gallery</string> <string name="title_activity_photo">Photo</string> <string name="title_activity_reference">Reference</string> <string name="title_activity_search">Search</string> + <string name="title_activity_tours">Tours</string> + <string name="title_activity_favorites">Favorites</string> <string name="settings">Settings</string> From 00369039b53653a841ea4bbf05f7dd88800c7471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=83=C2=ADn?= <michal.murin@sygictravel.com> Date: Wed, 12 Jul 2017 16:54:58 +0200 Subject: [PATCH 16/18] Favorites: drawables added, star checkbox for adding/removing favorite added to detail activity, insert success check fixed --- .../sdkdemo/detail/PlaceDetailActivity.kt | 44 ++++++++++++++++--- .../sdkdemo/favorites/FavoritesActivity.kt | 8 +++- .../main/res/drawable/favorite_selector.xml | 5 +++ .../res/drawable/ic_favorite_star_off.xml | 11 +++++ .../main/res/drawable/ic_favorite_star_on.xml | 11 +++++ .../main/res/layout/activity_place_detail.xml | 13 ++++++ app/src/main/res/values/strings.xml | 4 ++ app/src/main/res/values/styles.xml | 3 ++ sdk/build.gradle | 4 +- .../sygic/travel/sdk/provider/DataProvider.kt | 2 +- 10 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/favorite_selector.xml create mode 100644 app/src/main/res/drawable/ic_favorite_star_off.xml create mode 100644 app/src/main/res/drawable/ic_favorite_star_on.xml diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt index 556f8755..dff2568b 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt @@ -5,10 +5,7 @@ import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.Gravity import android.view.View -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import android.widget.Toast +import android.widget.* import com.google.android.flexbox.FlexboxLayout import com.squareup.picasso.Picasso import com.sygic.travel.sdk.StSDK @@ -21,12 +18,34 @@ import com.sygic.travel.sdkdemo.gallery.GalleryActivity import com.sygic.travel.sdkdemo.utils.Utils class PlaceDetailActivity : AppCompatActivity() { + private val stSdk = StSDK.getInstance() - private var id: String? = null private var views: Views? = null + private var id: String? = null private var ratingPattern: String? = null private var tagPadding: Int = 0 + private val favoriteAddRemoveCallback = object : Callback<String?>() { + override fun onSuccess(data: String?) {} + + override fun onFailure(t: Throwable) { + runOnUiThread { Toast.makeText(this@PlaceDetailActivity, t.message, Toast.LENGTH_LONG).show() } + t.printStackTrace() + } + } + + private val loadAllFavoritesIdsCallback = object : Callback<List<String>?>() { + override fun onSuccess(data: List<String>?) { + val isFavorite = data?.contains(id)!! + views?.cbFavorite?.isChecked = isFavorite + setOnFavoriteChangeListener() + } + + override fun onFailure(t: Throwable) { + setOnFavoriteChangeListener() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_place_detail) @@ -36,6 +55,21 @@ class PlaceDetailActivity : AppCompatActivity() { ratingPattern = "Rating: %.2f" tagPadding = resources.getDimensionPixelSize(R.dimen.tag_padding) loadPlaceDetail() + loadAllFavoritesIds() + } + + private fun loadAllFavoritesIds() { + stSdk.getFavoritesIds(loadAllFavoritesIdsCallback) + } + + private fun setOnFavoriteChangeListener() { + views?.cbFavorite?.setOnCheckedChangeListener( { _, isChecked -> + if (isChecked) { + StSDK.getInstance().addPlaceToFavorites(id!!, favoriteAddRemoveCallback) + } else { + StSDK.getInstance().removePlaceFromFavorites(id!!, favoriteAddRemoveCallback) + } + } ) } override fun onPause() { diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt index 7128f924..b59553d9 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/favorites/FavoritesActivity.kt @@ -28,7 +28,9 @@ class FavoritesActivity : AppCompatActivity() { } override fun onFailure(t: Throwable) { - Toast.makeText(this@FavoritesActivity, t.message, Toast.LENGTH_LONG).show() + runOnUiThread { + Toast.makeText(this@FavoritesActivity, t.message, Toast.LENGTH_LONG).show() + } t.printStackTrace() } } @@ -40,7 +42,9 @@ class FavoritesActivity : AppCompatActivity() { } override fun onFailure(t: Throwable) { - Toast.makeText(this@FavoritesActivity, t.message, Toast.LENGTH_LONG).show() + runOnUiThread { + Toast.makeText(this@FavoritesActivity, t.message, Toast.LENGTH_LONG).show() + } t.printStackTrace() } } diff --git a/app/src/main/res/drawable/favorite_selector.xml b/app/src/main/res/drawable/favorite_selector.xml new file mode 100644 index 00000000..0dbde17e --- /dev/null +++ b/app/src/main/res/drawable/favorite_selector.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_checked="false" android:drawable="@drawable/ic_favorite_star_off" /> + <item android:state_checked="true" android:drawable="@drawable/ic_favorite_star_on" /> +</selector> diff --git a/app/src/main/res/drawable/ic_favorite_star_off.xml b/app/src/main/res/drawable/ic_favorite_star_off.xml new file mode 100644 index 00000000..11fd551f --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_star_off.xml @@ -0,0 +1,11 @@ +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:viewportWidth="24.0" + android:viewportHeight="24.0" + android:width="48dp" + android:height="48dp"> + + <path + android:fillColor="#f06292" + android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_favorite_star_on.xml b/app/src/main/res/drawable/ic_favorite_star_on.xml new file mode 100644 index 00000000..6fbf863f --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_star_on.xml @@ -0,0 +1,11 @@ +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:viewportWidth="24.0" + android:viewportHeight="24.0" + android:width="48dp" + android:height="48dp"> + + <path + android:fillColor="#FFF06292" + android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/> +</vector> diff --git a/app/src/main/res/layout/activity_place_detail.xml b/app/src/main/res/layout/activity_place_detail.xml index 60f7ee53..5dcfe30e 100644 --- a/app/src/main/res/layout/activity_place_detail.xml +++ b/app/src/main/res/layout/activity_place_detail.xml @@ -4,6 +4,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/sv_detail_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.sygic.travel.sdkdemo.detail.PlaceDetailActivity"> @@ -51,6 +52,18 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_name"/> + <CheckBox + android:id="@+id/cb_favorite" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="16dp" + android:background="@android:color/transparent" + style="@style/FavoriteStar" + app:layout_constraintBottom_toBottomOf="@+id/tv_name" + app:layout_constraintStart_toEndOf="@+id/tv_name" + app:layout_constraintTop_toTopOf="@+id/tv_name" + app:layout_constraintVertical_bias="0.5"/> + <LinearLayout android:id="@+id/ll_perex" android:layout_width="0dp" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 881957e5..ce1d8d84 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,4 +36,8 @@ <string name="filter_places">Filter places</string> <string name="places_search">Search places</string> + + <!-- Favourites --> + <string name="favorite_add">Add favorite</string> + <string name="favorite">Favorite</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 79a66e27..163fbdbe 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -8,4 +8,7 @@ <item name="colorAccent">@color/colorAccent</item> </style> + <style name="FavoriteStar"> + <item name="android:button">@drawable/favorite_selector</item> + </style> </resources> diff --git a/sdk/build.gradle b/sdk/build.gradle index ebe26612..118cbc0c 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -1,6 +1,5 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' ext { stRepo = 'maven' @@ -52,7 +51,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // http request, api calls compile 'com.squareup.retrofit2:retrofit:2.3.0' @@ -83,3 +82,4 @@ dependencies { apply from: 'maven.gradle' apply from: 'dokka.gradle' apply from: 'bintray.gradle' +apply plugin: 'kotlin-android-extensions' diff --git a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt index bbb37148..73491aa4 100644 --- a/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt +++ b/sdk/src/main/java/com/sygic/travel/sdk/provider/DataProvider.kt @@ -161,7 +161,7 @@ internal class DataProvider( fun addPlaceToFavorites(id: String, back: Callback<String>?) { Thread(Runnable { val insertedCount = stDb?.favoriteDao()?.insert(Favorite(id)) - if (insertedCount == 1L) { + if (insertedCount != null && insertedCount > 0L) { back?.onSuccess("Success") } else { back?.onFailure(Exception("Favorite not added!")) From 8da16fa1925c21e613ecbc58edf01c317c5b48e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Mon, 17 Jul 2017 14:38:52 +0200 Subject: [PATCH 17/18] Place detail activity views init modified --- .../sdkdemo/detail/PlaceDetailActivity.kt | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt b/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt index dff2568b..516be4fc 100644 --- a/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt +++ b/app/src/main/java/com/sygic/travel/sdkdemo/detail/PlaceDetailActivity.kt @@ -214,35 +214,20 @@ class PlaceDetailActivity : AppCompatActivity() { } private inner class Views internal constructor() { - internal var ivPhoto: ImageView - internal var tvName: TextView - internal var tvNameSuffix: TextView - internal var tvPerex: TextView - internal var tvDescription: TextView - internal var tvRating: TextView - internal var tvAddress: TextView - internal var tvPhone: TextView - internal var tvEmail: TextView - internal var tvAdmission: TextView - internal var tvOpeningHours: TextView - internal var fblTags: FlexboxLayout - internal var llReferencesList: LinearLayout - - init { - ivPhoto = findViewById(R.id.iv_detail_photo) as ImageView - tvName = findViewById(R.id.tv_name) as TextView - tvNameSuffix = findViewById(R.id.tv_name_suffix) as TextView - tvPerex = findViewById(R.id.tv_perex) as TextView - tvDescription = findViewById(R.id.tv_description) as TextView - tvRating = findViewById(R.id.tv_rating) as TextView - tvAddress = findViewById(R.id.tv_address) as TextView - tvPhone = findViewById(R.id.tv_phone) as TextView - tvEmail = findViewById(R.id.tv_email) as TextView - tvAdmission = findViewById(R.id.tv_admission) as TextView - tvOpeningHours = findViewById(R.id.tv_opening_hours) as TextView - fblTags = findViewById(R.id.fbl_tags) as FlexboxLayout - llReferencesList = findViewById(R.id.ll_references_list) as LinearLayout - } + internal var ivPhoto: ImageView = findViewById(R.id.iv_detail_photo) as ImageView + internal var tvName: TextView = findViewById(R.id.tv_name) as TextView + internal var tvNameSuffix: TextView = findViewById(R.id.tv_name_suffix) as TextView + internal var tvPerex: TextView = findViewById(R.id.tv_perex) as TextView + internal var tvDescription: TextView = findViewById(R.id.tv_description) as TextView + internal var tvRating: TextView = findViewById(R.id.tv_rating) as TextView + internal var tvAddress: TextView = findViewById(R.id.tv_address) as TextView + internal var tvPhone: TextView = findViewById(R.id.tv_phone) as TextView + internal var tvEmail: TextView = findViewById(R.id.tv_email) as TextView + internal var tvAdmission: TextView = findViewById(R.id.tv_admission) as TextView + internal var tvOpeningHours: TextView = findViewById(R.id.tv_opening_hours) as TextView + internal var fblTags: FlexboxLayout = findViewById(R.id.fbl_tags) as FlexboxLayout + internal var llReferencesList: LinearLayout = findViewById(R.id.ll_references_list) as LinearLayout + internal var cbFavorite: CheckBox = findViewById(R.id.cb_favorite) as CheckBox } companion object { From 06a7f5de954cd47589d807753be5d85ffbc3ff5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mur=C3=ADn?= <michal.murin@sygictravel.com> Date: Thu, 20 Jul 2017 08:40:33 +0200 Subject: [PATCH 18/18] Gradle: apply kotlin extension plugin moved up, OkHttp updated to v3.8.1 --- sdk/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/build.gradle b/sdk/build.gradle index 118cbc0c..627d4485 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' ext { stRepo = 'maven' @@ -82,4 +83,3 @@ dependencies { apply from: 'maven.gradle' apply from: 'dokka.gradle' apply from: 'bintray.gradle' -apply plugin: 'kotlin-android-extensions'