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'