Repository: kiwicom/mobile
Pull request #1152 (2018-09-27 12:00:29)

Transportation: replacing TextIcons with Orbit icons


Patch:
diff --git a/.build/package.json b/.build/package.json
index 04197ab8..225482be 100644
--- a/.build/package.json
+++ b/.build/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@kiwicom/react-native-app-hotels",
-  "version": "0.0.29",
+  "version": "0.0.30",
   "private": false,
   "main": "index.js",
   "dependencies": {
diff --git a/RNAndroidPlayground/app/src/main/AndroidManifest.xml b/RNAndroidPlayground/app/src/main/AndroidManifest.xml
index fc41c81d..1e7b7d19 100644
--- a/RNAndroidPlayground/app/src/main/AndroidManifest.xml
+++ b/RNAndroidPlayground/app/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 
     <application
+        android:name=".PlaygroundApplication"
         android:allowBackup="false"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
@@ -31,7 +32,7 @@
         </activity>
         <activity android:name=".HotelsActivity">
         </activity>
-        <activity android:name=".NewHotelActivity">
+        <activity android:name=".HotelsActivityFragment">
         </activity>
         <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
     </application>
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelActivity.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelActivity.kt
deleted file mode 100644
index 415f778f..00000000
--- a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelActivity.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.kiwi.rnandroidplayground
-
-import android.content.pm.ActivityInfo
-import android.os.Bundle
-import com.kiwi.rnkiwimobile.RNHotelsActivity
-
-class HotelsActivity : RNHotelsActivity(HotelsModulesInjection) {
-  companion object {
-    fun getViewModelClass(): Class<HotelsActivity> =
-      HotelsActivity::class.java
-  }
-
-  override fun onCreate(savedInstanceState: Bundle?) {
-    super.onCreate(savedInstanceState)
-    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-  }
-
-  override fun getInitialProperties(): Bundle? {
-    return Bundle().apply{
-      putString("language", "en")
-      putString("currency", "EUR")
-      putString("bookingComAffiliate", "")
-      putString("checkin", "2018-12-01")
-      putString("checkout", "2018-12-05")
-      putString("cityName", "Barcelona")
-      putString("cityId", "aG90ZWxDaXR5Oi0zNzI0OTA")
-      putBundle("roomsConfiguration", Bundle()
-              .apply {
-                putInt("adultsCount", 1)
-              })
-      putBundle("coordinates", Bundle()
-              .apply {
-                putDouble("latitude", 59.9139)
-                putDouble("longitude", 10.7522)
-              })
-    }
-  }
-}
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsActivity.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsActivity.kt
new file mode 100644
index 00000000..bb74bab2
--- /dev/null
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsActivity.kt
@@ -0,0 +1,20 @@
+package com.kiwi.rnandroidplayground
+
+import android.content.pm.ActivityInfo
+import android.os.Bundle
+import com.facebook.react.ReactInstanceManager
+import com.kiwi.rnkiwimobile.hotels.RNHotelsActivity
+
+class HotelsActivity : RNHotelsActivity(HotelsData.getInitialProperties()) {
+  companion object {
+    fun getViewModelClass(): Class<HotelsActivity> =
+        HotelsActivity::class.java
+  }
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+  }
+
+  override fun getReactNativeInstanceManager(): ReactInstanceManager = (application as PlaygroundApplication).reactNativeHost.reactInstanceManager
+}
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsActivityFragment.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsActivityFragment.kt
new file mode 100644
index 00000000..ee34e408
--- /dev/null
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsActivityFragment.kt
@@ -0,0 +1,59 @@
+package com.kiwi.rnandroidplayground
+
+import android.annotation.TargetApi
+import android.app.Activity
+import android.os.Build
+import android.os.Bundle
+
+import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
+import com.facebook.react.modules.core.PermissionAwareActivity
+import com.facebook.react.modules.core.PermissionListener
+
+class HotelsActivityFragment : Activity(), DefaultHardwareBackBtnHandler, PermissionAwareActivity {
+
+  private var mPermissionListener: PermissionListener? = null
+
+  companion object {
+    fun getViewModelClass(): Class<HotelsActivityFragment> =
+        HotelsActivityFragment::class.java
+  }
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    setContentView(R.layout.activity_fragment)
+
+    if (savedInstanceState == null) {
+      val hotelFragment = HotelsFragment()
+
+      fragmentManager
+          .beginTransaction()
+          .add(R.id.container_main, hotelFragment)
+          .commit()
+    }
+  }
+
+  // region BackButton
+  override fun invokeDefaultOnBackPressed() {
+    super.onBackPressed()
+  }
+
+  override fun onBackPressed() {
+    (application as PlaygroundApplication).reactNativeHost.reactInstanceManager.onBackPressed()
+  }
+  // endregion
+
+  // region PermissionAwareActivity
+  override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
+    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+    if (mPermissionListener != null && mPermissionListener!!.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
+      mPermissionListener = null
+    }
+  }
+
+  @TargetApi(Build.VERSION_CODES.M)
+  override fun requestPermissions(permissions: Array<String>, requestCode: Int, listener: PermissionListener) {
+    mPermissionListener = listener
+    requestPermissions(permissions, requestCode)
+  }
+  // endregion
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsData.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsData.kt
new file mode 100644
index 00000000..1f7570ac
--- /dev/null
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsData.kt
@@ -0,0 +1,26 @@
+package com.kiwi.rnandroidplayground
+
+import com.kiwi.rnkiwimobile.hotels.RNHotelsCoordinates
+import com.kiwi.rnkiwimobile.hotels.RNHotelsInitialProperties
+import com.kiwi.rnkiwimobile.hotels.RNHotelsRoomsConfiguration
+
+object HotelsData {
+  fun getInitialProperties(): RNHotelsInitialProperties {
+    return RNHotelsInitialProperties(
+        "en",
+        "2018-12-01",
+        "2018-12-25",
+        "2018-12-20",
+        "2018-12-25",
+        "Barcelona",
+        "aG90ZWxDaXR5Oi0zNzI0OTA",
+        RNHotelsRoomsConfiguration(
+            1
+        ),
+        RNHotelsCoordinates(
+            59.9139,
+            10.7522
+        )
+    )
+  }
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsFragment.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsFragment.kt
new file mode 100644
index 00000000..40a38f5a
--- /dev/null
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsFragment.kt
@@ -0,0 +1,8 @@
+package com.kiwi.rnandroidplayground
+
+import com.facebook.react.ReactNativeHost
+import com.kiwi.rnkiwimobile.hotels.RNHotelsFragment
+
+class HotelsFragment : RNHotelsFragment(HotelsData.getInitialProperties()) {
+  override fun getReactNativeHost(): ReactNativeHost = (activity.application as PlaygroundApplication).reactNativeHost
+}
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsModulesInjection.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsModulesInjection.kt
index ab23ec7e..111603d6 100644
--- a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsModulesInjection.kt
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/HotelsModulesInjection.kt
@@ -1,10 +1,10 @@
 package com.kiwi.rnandroidplayground
 
-import com.kiwi.rnkiwimobile.RNHotelsModulesInjection
+import com.kiwi.rnkiwimobile.hotels.RNHotelsModulesInjection
 import com.skypicker.reactnative.nativemodules.currency.CurrencyChangeCallback
 import com.skypicker.reactnative.nativemodules.translation.ResourceStringCallback
 
-object HotelsModulesInjection : RNHotelsModulesInjection {
+open class HotelsModulesInjection : RNHotelsModulesInjection {
   override val translationCallback = object: ResourceStringCallback {
     override fun getTranslation(key: String) = key
   }
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/MainActivity.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/MainActivity.kt
index c4be45f4..5be9c223 100644
--- a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/MainActivity.kt
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/MainActivity.kt
@@ -6,13 +6,23 @@ import android.support.v7.app.AppCompatActivity
 import kotlinx.android.synthetic.main.activity_main.*
 
 class MainActivity : AppCompatActivity() {
-
   override fun onCreate(savedInstanceState: Bundle?) {
+    (application as PlaygroundApplication).startReactNative()
+
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)
 
     button_hotels.setOnClickListener {
       startActivity(Intent(this, HotelsActivity.getViewModelClass()))
     }
+
+    button_hotels_fragment.setOnClickListener {
+      startActivity(Intent(this, HotelsActivityFragment.getViewModelClass()))
+    }
+  }
+
+  override fun onDestroy() {
+    super.onDestroy()
+    (application as PlaygroundApplication).clearReactNative()
   }
 }
diff --git a/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/PlaygroundApplication.kt b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/PlaygroundApplication.kt
new file mode 100644
index 00000000..c644f381
--- /dev/null
+++ b/RNAndroidPlayground/app/src/main/java/com/kiwi/rnandroidplayground/PlaygroundApplication.kt
@@ -0,0 +1,25 @@
+package com.kiwi.rnandroidplayground
+
+import android.app.Application
+import com.facebook.react.ReactNativeHost
+import com.kiwi.rnkiwimobile.RNKiwiHost
+import com.kiwi.rnkiwimobile.hotels.RNHotelsModule
+
+class PlaygroundApplication : Application() {
+
+  lateinit var reactNativeHost: ReactNativeHost
+
+  fun startReactNative() {
+    val hotelModulesInjection = HotelsModulesInjection()
+    reactNativeHost = RNKiwiHost(
+        this,
+        RNHotelsModule.jsEntryPoint,
+        RNHotelsModule.getPackages(hotelModulesInjection))
+    // Init the bridge and everything in advance
+    reactNativeHost.reactInstanceManager.createReactContextInBackground()
+  }
+
+  fun clearReactNative() {
+    reactNativeHost.clear()
+  }
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/app/src/main/res/layout/activity_fragment.xml b/RNAndroidPlayground/app/src/main/res/layout/activity_fragment.xml
new file mode 100644
index 00000000..4a2c7d3a
--- /dev/null
+++ b/RNAndroidPlayground/app/src/main/res/layout/activity_fragment.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="#009688">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="16dp"
+        android:layout_marginTop="24dp"
+        android:textColor="@android:color/white"
+        style="@style/Base.TextAppearance.AppCompat.Title"
+        android:text="RN fragment"/>
+
+    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/container_main"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="16dp" />
+</LinearLayout>
\ No newline at end of file
diff --git a/RNAndroidPlayground/app/src/main/res/layout/activity_main.xml b/RNAndroidPlayground/app/src/main/res/layout/activity_main.xml
index d224c447..acfea430 100644
--- a/RNAndroidPlayground/app/src/main/res/layout/activity_main.xml
+++ b/RNAndroidPlayground/app/src/main/res/layout/activity_main.xml
@@ -19,4 +19,14 @@
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent"/>
 
+    <Button
+        android:id="@+id/button_hotels_fragment"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Hotels Fragment"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"/>
+
 </LinearLayout>
\ No newline at end of file
diff --git a/RNAndroidPlayground/build.gradle b/RNAndroidPlayground/build.gradle
index d68de6e5..a78f43d7 100644
--- a/RNAndroidPlayground/build.gradle
+++ b/RNAndroidPlayground/build.gradle
@@ -1,13 +1,14 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
-
 buildscript {
+    apply from: "./dependencies.gradle"
+
     repositories {
         google()
         jcenter()
     }
     dependencies {
-        classpath "com.android.tools.build:gradle:3.0.1"
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.31"
+        classpath "com.android.tools.build:gradle:$gradlePluginVersion"
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
diff --git a/RNAndroidPlayground/dependencies.gradle b/RNAndroidPlayground/dependencies.gradle
index 12e074e9..4c5032ec 100644
--- a/RNAndroidPlayground/dependencies.gradle
+++ b/RNAndroidPlayground/dependencies.gradle
@@ -1,20 +1,19 @@
 import groovy.json.JsonSlurper
 
-def inputFile = new File("${projectDir}/../../.build/package.json")
+def inputFile = new File("${rootDir}/../.build/package.json")
 def packageJson = new JsonSlurper().parseText(inputFile.text)
 
-def rnModulesFile = new File("${projectDir}/../../packages/rnmodules/package.json")
+def rnModulesFile = new File("${rootDir}/../packages/rnmodules/package.json")
 def rnModulesPackageJson = new JsonSlurper().parseText(rnModulesFile.text)
 
 ext {
-    gradlePluginVersion = "3.0.1"
+    gradlePluginVersion = "3.2.0"
 
     minSdkVersionVar = 16
     compileSdkVersionVar = 27
     targetSdkVersionVar = 27
-    buildToolsVersionVar = "27.0.3"
 
-    kotlinVersion = "1.2.31"
+    kotlinVersion = "1.2.51"
 
     supportVersion = "27.0.2"
 
diff --git a/RNAndroidPlayground/gradle/wrapper/gradle-wrapper.properties b/RNAndroidPlayground/gradle/wrapper/gradle-wrapper.properties
index 681eb333..22d40d80 100644
--- a/RNAndroidPlayground/gradle/wrapper/gradle-wrapper.properties
+++ b/RNAndroidPlayground/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
diff --git a/RNAndroidPlayground/react-native-native-modules/build.gradle b/RNAndroidPlayground/react-native-native-modules/build.gradle
index 8afca9a4..ad84fd7c 100644
--- a/RNAndroidPlayground/react-native-native-modules/build.gradle
+++ b/RNAndroidPlayground/react-native-native-modules/build.gradle
@@ -9,7 +9,6 @@ android {
         compileSdkVersion compileSdkVersionVar
         targetSdkVersion targetSdkVersionVar
 
-        buildToolsVersion buildToolsVersionVar
         versionCode 1
         versionName "1.0"
 
diff --git a/RNAndroidPlayground/rnkiwimobile/build.gradle b/RNAndroidPlayground/rnkiwimobile/build.gradle
index 1ebb4df7..b65efcc4 100644
--- a/RNAndroidPlayground/rnkiwimobile/build.gradle
+++ b/RNAndroidPlayground/rnkiwimobile/build.gradle
@@ -9,7 +9,6 @@ android {
         compileSdkVersion compileSdkVersionVar
         targetSdkVersion targetSdkVersionVar
 
-        buildToolsVersion buildToolsVersionVar
         versionCode 1
         versionName "1.0"
 
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNHotelsActivity.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNHotelsActivity.kt
deleted file mode 100644
index 7bb0cd59..00000000
--- a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNHotelsActivity.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.kiwi.rnkiwimobile
-
-import com.airbnb.android.react.maps.MapsPackage
-import com.facebook.react.ReactPackage
-import com.oblador.vectoricons.VectorIconsPackage
-import com.reactlibrary.RNTooltipsPackage
-import com.skypicker.reactnative.nativemodules.currency.CurrencyChangeCallback
-import com.skypicker.reactnative.nativemodules.currency.RNCurrencyManagerPackage
-import com.skypicker.reactnative.nativemodules.device.RNDeviceInfoPackage
-import com.skypicker.reactnative.nativemodules.logging.RNLoggingPackage
-import com.skypicker.reactnative.nativemodules.translation.RNTranslationManagerPackage
-import com.skypicker.reactnative.nativemodules.translation.ResourceStringCallback
-
-interface RNHotelsModulesInjection {
-  val translationCallback: ResourceStringCallback
-  val currencyCallback: CurrencyChangeCallback
-  val hasActiveBooking: Boolean
-}
-
-abstract class RNHotelsActivity(private val rnHotelsModules: RNHotelsModulesInjection) : RNKiwiActivity() {
-  override fun getModuleName(): String {
-    return "NewKiwiHotels"
-  }
-
-  override fun getJSEntryPoint(): String {
-    return "app/native"
-  }
-
-  override fun getPackages(): MutableList<ReactPackage> {
-    return mutableListOf(RNTooltipsPackage(),
-      RNDeviceInfoPackage(),
-      MapsPackage(),
-      RNCurrencyManagerPackage(rnHotelsModules.currencyCallback),
-      RNTranslationManagerPackage(rnHotelsModules.translationCallback),
-      RNLoggingPackage(rnHotelsModules.hasActiveBooking),
-      VectorIconsPackage())
-  }
-}
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiActivity.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiActivity.kt
index 3f3816e8..f022350c 100644
--- a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiActivity.kt
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiActivity.kt
@@ -1,25 +1,26 @@
 package com.kiwi.rnkiwimobile
 
+import android.annotation.TargetApi
 import android.app.Activity
+import android.os.Build
 import android.os.Bundle
 import com.facebook.react.ReactInstanceManager
-import com.facebook.react.ReactPackage
 import com.facebook.react.ReactRootView
-import com.facebook.react.common.LifecycleState
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
-import com.facebook.react.shell.MainReactPackage
-import com.trinerdis.skypicker.nkiwimobile.BuildConfig
+import com.facebook.react.modules.core.PermissionAwareActivity
+import com.facebook.react.modules.core.PermissionListener
 
-
-abstract class RNKiwiActivity :
+abstract class RNKiwiActivity(private val initialProperties: Bundle?) :
   Activity(),
-  DefaultHardwareBackBtnHandler {
+  DefaultHardwareBackBtnHandler, PermissionAwareActivity {
 
   // region Private Properties
 
-  private lateinit var reactRootView: ReactRootView
+  private lateinit var mReactRootView: ReactRootView
+
+  private lateinit var mReactInstanceManager: ReactInstanceManager
 
-  private lateinit var reactInstanceManager: ReactInstanceManager
+  private var mPermissionListener: PermissionListener? = null
 
   // endregion
 
@@ -30,20 +31,16 @@ abstract class RNKiwiActivity :
   }
 
   override fun onBackPressed() {
-    reactInstanceManager.onBackPressed()
+    mReactInstanceManager.onBackPressed()
   }
 
   // endregion
 
   // region Protected Abstract Methods
 
-  protected abstract fun getModuleName(): String
-
-  protected abstract fun getPackages(): MutableList<ReactPackage>
-
-  protected abstract fun getJSEntryPoint(): String
+  protected abstract fun getReactNativeInstanceManager(): ReactInstanceManager
 
-  protected abstract fun getInitialProperties(): Bundle?
+  protected abstract fun getModuleName(): String
 
   // endregion
 
@@ -52,50 +49,44 @@ abstract class RNKiwiActivity :
   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
 
-    val properties = getInitialProperties()
-
-    val packages = mutableListOf(
-      MainReactPackage(),
-      RNKiwiBackButtonPackage())
-
-    packages.addAll(getPackages())
+    mReactInstanceManager = getReactNativeInstanceManager()
 
-    reactInstanceManager = ReactInstanceManager.builder()
-      .setApplication(application)
-      .setBundleAssetName("index.android.bundle")
-      .setJSMainModulePath(getJSEntryPoint())
-      .addPackages(packages)
-      .setUseDeveloperSupport(BuildConfig.DEBUG)
-      .setInitialLifecycleState(LifecycleState.RESUMED)
-      .build()
+    mReactRootView = ReactRootView(this)
+    mReactRootView.startReactApplication(mReactInstanceManager, getModuleName(), initialProperties)
 
-    reactRootView = ReactRootView(this)
-    reactRootView.startReactApplication(reactInstanceManager, getModuleName(), properties)
-
-    setContentView(reactRootView)
+    setContentView(mReactRootView)
   }
 
   override fun onPause() {
     super.onPause()
-
-    if (reactInstanceManager !== null) {
-      reactInstanceManager.onHostPause(this)
-    }
+    mReactInstanceManager.onHostPause(this)
   }
 
   override fun onResume() {
     super.onResume()
-
-    if (reactInstanceManager !== null) {
-      reactInstanceManager.onHostResume(this, this)
-    }
+    mReactInstanceManager.onHostResume(this, this)
   }
 
   override fun onDestroy() {
     super.onDestroy()
+    mReactInstanceManager.onHostDestroy(this)
+    mReactRootView.unmountReactApplication()
+  }
 
-    if (reactInstanceManager !== null) {
-      reactInstanceManager.onHostDestroy(this)
+  // endregion
+
+  // region PermissionAwareActivity
+  override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
+    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+    if (mPermissionListener != null && mPermissionListener!!.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
+      mPermissionListener = null
     }
   }
+
+  @TargetApi(Build.VERSION_CODES.M)
+  override fun requestPermissions(permissions: Array<String>, requestCode: Int, listener: PermissionListener) {
+    mPermissionListener = listener
+    requestPermissions(permissions, requestCode)
+  }
+  // endregion
 }
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonModule.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonModule.kt
index d5ad7f4c..4687b316 100644
--- a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonModule.kt
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonModule.kt
@@ -6,19 +6,12 @@ import com.facebook.react.bridge.ReactMethod
 
 class RNKiwiBackButtonModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), NativeBackButtonCallback {
 
-  companion object {
-    val hasBackButtons = HashMap<String, Boolean>()
-  }
-
   override fun getName(): String {
     return "RNKiwiBackButton"
   }
 
   override fun onInvokeDefaultBackButton() {
-    val currentActivity = reactApplicationContext.currentActivity
-    if (currentActivity !== null) {
-      currentActivity.finish()
-    }
+    currentActivity?.finish()
   }
 
   @ReactMethod
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonPackage.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonPackage.kt
index 049b619a..4c5776fd 100644
--- a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonPackage.kt
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiBackButtonPackage.kt
@@ -1,5 +1,6 @@
 package com.kiwi.rnkiwimobile
 
+import android.app.Activity
 import android.view.View
 import com.facebook.react.ReactPackage
 import com.facebook.react.bridge.NativeModule
@@ -8,7 +9,11 @@ import com.facebook.react.uimanager.ReactShadowNode
 import com.facebook.react.uimanager.ViewManager
 import java.util.*
 
-class RNKiwiBackButtonPackage: ReactPackage {
+interface RNKiwiBackButtonInterface {
+  var currentActivity: Activity
+}
+
+class RNKiwiBackButtonPackage(): ReactPackage {
 
   override fun createNativeModules(reactContext: ReactApplicationContext): MutableList<NativeModule> {
     return Collections.singletonList(RNKiwiBackButtonModule(reactContext))
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiFragment.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiFragment.kt
new file mode 100644
index 00000000..f4c48b15
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiFragment.kt
@@ -0,0 +1,77 @@
+package com.kiwi.rnkiwimobile
+
+/*
+ * Based on https://github.com/hudl/react-native-android-fragment
+ * Apache License 2.0
+ * Copyright 2017 Agile Sports Technologies, Inc.
+ */
+
+import android.app.Fragment
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactRootView
+import com.facebook.react.devsupport.DoubleTapReloadRecognizer
+import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
+
+/**
+ * A [Fragment] which loads a React Native Component from your React Native JS Bundle.
+ */
+abstract class RNKiwiFragment(private val initialProperties: Bundle?) : Fragment() {
+
+
+  protected abstract fun getModuleName(): String
+
+  protected abstract fun getReactNativeHost(): ReactNativeHost
+
+  private lateinit var mReactRootView: ReactRootView
+
+  private lateinit var nReactNativeHost: ReactNativeHost
+
+  private var mDoubleTapReloadRecognizer: DoubleTapReloadRecognizer? = null
+
+  // endregion
+
+  // region Lifecycle
+
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    nReactNativeHost = getReactNativeHost()
+    mDoubleTapReloadRecognizer = DoubleTapReloadRecognizer()
+  }
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+    mReactRootView = ReactRootView(activity)
+    mReactRootView.startReactApplication(
+        nReactNativeHost.reactInstanceManager,
+        getModuleName(),
+        initialProperties)
+    return mReactRootView
+  }
+
+  override fun onResume() {
+    super.onResume()
+    if (nReactNativeHost.hasInstance()) {
+      nReactNativeHost.reactInstanceManager.onHostResume(activity, activity as DefaultHardwareBackBtnHandler?)
+    }
+  }
+
+  override fun onPause() {
+    super.onPause()
+    if (nReactNativeHost.hasInstance()) {
+      nReactNativeHost.reactInstanceManager.onHostPause(activity!!)
+    }
+  }
+
+  override fun onDestroy() {
+    super.onDestroy()
+    if (nReactNativeHost.hasInstance()) {
+      nReactNativeHost.reactInstanceManager.onHostDestroy(activity!!)
+      mReactRootView.unmountReactApplication()
+    }
+  }
+
+  // endregion
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiHost.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiHost.kt
new file mode 100644
index 00000000..ca62844d
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/RNKiwiHost.kt
@@ -0,0 +1,34 @@
+package com.kiwi.rnkiwimobile
+
+import android.app.Application
+import com.facebook.react.ReactInstanceManager
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactPackage
+import com.facebook.react.common.LifecycleState
+import com.facebook.react.shell.MainReactPackage
+import com.trinerdis.skypicker.nkiwimobile.BuildConfig
+
+class RNKiwiHost(private val hostApplication: Application, private val jsEntryPoint: String, private val customPackages: MutableList<ReactPackage>) : ReactNativeHost(hostApplication) {
+
+  override fun getPackages(): MutableList<ReactPackage> {
+    val packages = mutableListOf(
+        MainReactPackage(),
+        RNKiwiBackButtonPackage())
+
+    packages.addAll(customPackages)
+    return packages
+  }
+
+  override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
+
+  override fun createReactInstanceManager(): ReactInstanceManager {
+    return ReactInstanceManager.builder()
+        .setApplication(hostApplication)
+        .setBundleAssetName("index.android.bundle")
+        .setJSMainModulePath(jsEntryPoint)
+        .addPackages(packages)
+        .setUseDeveloperSupport(BuildConfig.DEBUG)
+        .setInitialLifecycleState(LifecycleState.BEFORE_RESUME)
+        .build()
+  }
+}
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsActivity.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsActivity.kt
new file mode 100644
index 00000000..9682a876
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsActivity.kt
@@ -0,0 +1,9 @@
+package com.kiwi.rnkiwimobile.hotels
+
+import com.kiwi.rnkiwimobile.RNKiwiActivity
+
+abstract class RNHotelsActivity(initialProperties: RNHotelsInitialProperties) : RNKiwiActivity(RNHotelsModule.getInitialProperties(initialProperties)) {
+  override fun getModuleName(): String {
+    return RNHotelsModule.moduleName
+  }
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsFragment.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsFragment.kt
new file mode 100644
index 00000000..6a81f8ff
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsFragment.kt
@@ -0,0 +1,9 @@
+package com.kiwi.rnkiwimobile.hotels
+
+import com.kiwi.rnkiwimobile.RNKiwiFragment
+
+abstract class RNHotelsFragment(initialProperties: RNHotelsInitialProperties) : RNKiwiFragment(RNHotelsModule.getInitialProperties(initialProperties)) {
+  override fun getModuleName(): String {
+    return RNHotelsModule.moduleName
+  }
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsInitialProperties.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsInitialProperties.kt
new file mode 100644
index 00000000..80467476
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsInitialProperties.kt
@@ -0,0 +1,22 @@
+package com.kiwi.rnkiwimobile.hotels
+
+data class RNHotelsInitialProperties(
+    val language: String,
+    val currency: String,
+    val bookingComAffiliate: String,
+    val checkin: String,
+    val checkout: String,
+    val cityName: String,
+    val cityId: String,
+    val roomsConfiguration: RNHotelsRoomsConfiguration,
+    val hotelsCoordinates: RNHotelsCoordinates
+)
+
+data class RNHotelsRoomsConfiguration(
+    val adultsCount: Int
+)
+
+data class RNHotelsCoordinates(
+    val latitude: Double,
+    val longitude: Double
+)
\ No newline at end of file
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsModule.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsModule.kt
new file mode 100644
index 00000000..34a92241
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsModule.kt
@@ -0,0 +1,46 @@
+package com.kiwi.rnkiwimobile.hotels
+
+import android.os.Bundle
+import com.airbnb.android.react.maps.MapsPackage
+import com.facebook.react.ReactPackage
+import com.oblador.vectoricons.VectorIconsPackage
+import com.reactlibrary.RNTooltipsPackage
+import com.skypicker.reactnative.nativemodules.currency.RNCurrencyManagerPackage
+import com.skypicker.reactnative.nativemodules.device.RNDeviceInfoPackage
+import com.skypicker.reactnative.nativemodules.logging.RNLoggingPackage
+import com.skypicker.reactnative.nativemodules.translation.RNTranslationManagerPackage
+
+object RNHotelsModule {
+  const val jsEntryPoint = "app/native"
+  const val moduleName = "NewKiwiHotels"
+
+  fun getPackages(hotelModulesInjection: RNHotelsModulesInjection): MutableList<ReactPackage> {
+    return mutableListOf(RNTooltipsPackage(),
+        RNDeviceInfoPackage(),
+        MapsPackage(),
+        RNCurrencyManagerPackage(hotelModulesInjection.currencyCallback),
+        RNTranslationManagerPackage(hotelModulesInjection.translationCallback),
+        RNLoggingPackage(hotelModulesInjection.hasActiveBooking),
+        VectorIconsPackage())
+  }
+  fun getInitialProperties(initialProperties: RNHotelsInitialProperties): Bundle? {
+    return Bundle().apply {
+      putString("language", initialProperties.language)
+      putString("currency", "EUR")
+      putString("bookingComAffiliate", "")
+      putString("checkin", initialProperties.checkin)
+      putString("checkout", initialProperties.checkout)
+      putString("cityName", "Barcelona")
+      putString("cityId", "aG90ZWxDaXR5Oi0zNzI0OTA")
+      putBundle("roomsConfiguration", Bundle()
+          .apply {
+            putInt("adultsCount", 1)
+          })
+      putBundle("coordinates", Bundle()
+          .apply {
+            putDouble("latitude", 59.9139)
+            putDouble("longitude", 10.7522)
+          })
+    }
+  }
+}
\ No newline at end of file
diff --git a/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsModuleInjection.kt b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsModuleInjection.kt
new file mode 100644
index 00000000..48be46b9
--- /dev/null
+++ b/RNAndroidPlayground/rnkiwimobile/src/main/java/com/kiwi/rnkiwimobile/hotels/RNHotelsModuleInjection.kt
@@ -0,0 +1,10 @@
+package com.kiwi.rnkiwimobile.hotels
+
+import com.skypicker.reactnative.nativemodules.currency.CurrencyChangeCallback
+import com.skypicker.reactnative.nativemodules.translation.ResourceStringCallback
+
+interface RNHotelsModulesInjection {
+  val translationCallback: ResourceStringCallback
+  val currencyCallback: CurrencyChangeCallback
+  val hasActiveBooking: Boolean
+}
\ No newline at end of file
diff --git a/app/MMB/src/scenes/FlightServices.js b/app/MMB/src/scenes/FlightServices.js
deleted file mode 100644
index 2ac7b63c..00000000
--- a/app/MMB/src/scenes/FlightServices.js
+++ /dev/null
@@ -1,120 +0,0 @@
-// @flow
-
-import * as React from 'react';
-import { Translation } from '@kiwicom/mobile-localization';
-import { ScrollView } from 'react-native';
-import { TextIcon } from '@kiwicom/mobile-shared';
-import {
-  TitledMenuGroup,
-  MenuItem,
-  type RouteNamesType,
-  type NavigationType,
-} from '@kiwicom/mobile-navigation';
-
-import Deeplink from '../components/Deeplink';
-
-type Props = {|
-  +navigation: NavigationType,
-|};
-
-export default class FlightServices extends React.Component<Props> {
-  navigate = (key: RouteNamesType) => {
-    this.props.navigation.navigate(key);
-  };
-
-  handleOpenBaggage = () => {
-    this.navigate('mmb.flight_services.checked_baggage');
-  };
-
-  handleOpenAllocatedSeating = () => {
-    this.navigate('mmb.flight_services.allocated_seating');
-  };
-
-  handleOpenSportsEquipment = () => {
-    this.navigate('mmb.flight_services.sports_equipment');
-  };
-
-  handleOpenMusicalEquipment = () => {
-    this.navigate('mmb.flight_services.musical_equipment');
-  };
-
-  handleOpenSpecialAssitance = () => {
-    this.navigate('mmb.flight_services.special_assistance');
-  };
-
-  handleOpenPetPassengers = () => {
-    this.navigate('mmb.flight_services.pets');
-  };
-
-  render = () => (
-    <ScrollView>
-      <TitledMenuGroup
-        title={<Translation id="mmb.flight_services.title_services" />}
-      >
-        <MenuItem
-          title={<Translation id="mmb.flight_services.additional_baggage" />}
-          onPress={this.handleOpenBaggage}
-          icon={<TextIcon code="&#xe071;" />}
-        />
-        <MenuItem
-          title={<Translation id="mmb.flight_services.allocated_seating" />}
-          onPress={this.handleOpenAllocatedSeating}
-          icon={<TextIcon code="&#xe02a;" />}
-        />
-        <MenuItem
-          title={<Translation id="mmb.flight_services.sports_equipment" />}
-          onPress={this.handleOpenSportsEquipment}
-          icon={<TextIcon code="&#xe089;" />}
-        />
-        <MenuItem
-          title={<Translation id="mmb.flight_services.musical_equipment" />}
-          onPress={this.handleOpenMusicalEquipment}
-          icon={<TextIcon code="&#xe086;" />}
-        />
-        <MenuItem
-          title={<Translation id="mmb.flight_services.special_assistance" />}
-          onPress={this.handleOpenSpecialAssitance}
-          icon={<TextIcon code="&#xe088;" />}
-        />
-        <MenuItem
-          title={<Translation id="mmb.flight_services.traveling_with_pets" />}
-          onPress={this.handleOpenPetPassengers}
-          icon={<TextIcon code="&#xe043;" />}
-        />
-      </TitledMenuGroup>
-    </ScrollView>
-  );
-}
-
-export const FlightServicesSubmenuItems = {
-  'mmb.flight_services.checked_baggage': {
-    screen: function OpenCheckedBaggage() {
-      return <Deeplink to="BAGS" />;
-    },
-  },
-  'mmb.flight_services.allocated_seating': {
-    screen: function OpenAllocatedSeating() {
-      return <Deeplink to="SEATING" />;
-    },
-  },
-  'mmb.flight_services.sports_equipment': {
-    screen: function OpenSportsEquipment() {
-      return <Deeplink to="SPORT_EQUIPMENT" />;
-    },
-  },
-  'mmb.flight_services.musical_equipment': {
-    screen: function OpenMusicalEquipment() {
-      return <Deeplink to="MUSICAL_EQUIPMENT" />;
-    },
-  },
-  'mmb.flight_services.special_assistance': {
-    screen: function OpenSpecialAssistance() {
-      return <Deeplink to="ASSISTANCE" />;
-    },
-  },
-  'mmb.flight_services.pets': {
-    screen: function OpenPetPassengers() {
-      return <Deeplink to="PETS" />;
-    },
-  },
-};
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js
index 9eddcf88..26eff341 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js
@@ -27,7 +27,7 @@ export const BoardingPassMultiCity = (props: Props) => {
       <FlightSegments
         key={index}
         data={trip}
-        icon={<TextIcon code="&#xe103;" style={styles.textIcon} />}
+        icon={<TextIcon code="&#xe103;" style={styles.textIcon} orbit={true} />}
         iconTitle={
           <Translation
             passThrough={idx(trip, _ => _.arrival.airport.city.name)}
diff --git a/app/MMB/src/scenes/tripServices/transportation/AddressLocationInput.js b/app/MMB/src/scenes/tripServices/transportation/AddressLocationInput.js
index 5f2a0766..23849706 100644
--- a/app/MMB/src/scenes/tripServices/transportation/AddressLocationInput.js
+++ b/app/MMB/src/scenes/tripServices/transportation/AddressLocationInput.js
@@ -18,7 +18,7 @@ export default function AddressLocationInput(props: Props) {
   return (
     <View style={styles.wrapper}>
       <View style={[styles.iconWrapper, styles.inputWrapperStyle]}>
-        <TextIcon code="B" style={styles.icon} />
+        <TextIcon code="$" style={styles.icon} orbit={true} />
         <Text style={styles.text}>
           <Translation id="mmb.trip_services.transportation.address_picker.input.placeholder" />
         </Text>
@@ -61,7 +61,7 @@ const styles = StyleSheet.create({
     borderBottomStartRadius: 6,
   },
   icon: {
-    fontSize: 14,
+    fontSize: 16,
     padding: 10,
     color: defaultTokens.paletteInkLight,
   },
diff --git a/app/MMB/src/scenes/tripServices/transportation/AddressLocationLegend.js b/app/MMB/src/scenes/tripServices/transportation/AddressLocationLegend.js
index 57df34e4..0119da78 100644
--- a/app/MMB/src/scenes/tripServices/transportation/AddressLocationLegend.js
+++ b/app/MMB/src/scenes/tripServices/transportation/AddressLocationLegend.js
@@ -13,7 +13,7 @@ export default function AddressLocationLegend() {
         <Text style={styles.text}>
           <Translation id="mmb.trip_service.transportation.map.legend.long_tap" />
         </Text>
-        <TextIcon code="j" style={[styles.icon, styles.markerA]} />
+        <TextIcon code="j" style={[styles.icon, styles.markerA]} orbit={true} />
         <Text style={styles.text}>
           <Translation id="mmb.trip_service.transportation.map.legend.markerA" />
         </Text>
@@ -22,7 +22,7 @@ export default function AddressLocationLegend() {
         <Text style={styles.text}>
           <Translation id="mmb.trip_service.transportation.map.legend.tap" />
         </Text>
-        <TextIcon code="k" style={[styles.icon, styles.markerB]} />
+        <TextIcon code="k" style={[styles.icon, styles.markerB]} orbit={true} />
         <Text style={styles.text}>
           <Translation id="mmb.trip_service.transportation.map.legend.markerB" />
         </Text>
@@ -64,7 +64,7 @@ const styles = StyleSheet.create({
     shadowOffset: { height: 0, width: 0 },
   },
   icon: {
-    fontSize: 15,
+    fontSize: 17,
     alignSelf: 'center',
     paddingHorizontal: 5,
   },
diff --git a/app/MMB/src/scenes/tripServices/transportation/CurrentPositionButton.js b/app/MMB/src/scenes/tripServices/transportation/CurrentPositionButton.js
index db92ad24..3586aef2 100644
--- a/app/MMB/src/scenes/tripServices/transportation/CurrentPositionButton.js
+++ b/app/MMB/src/scenes/tripServices/transportation/CurrentPositionButton.js
@@ -63,7 +63,7 @@ class CurrentPositionButton extends React.Component<Props, State> {
       <TouchableWithoutFeedback onPress={this.getLocation}>
         <View style={styles.roundButton}>
           <View>
-            <TextIcon code="&quot;" style={styles.icon} />
+            <TextIcon code="&quot;" style={styles.icon} orbit={true} />
           </View>
         </View>
       </TouchableWithoutFeedback>
@@ -91,7 +91,7 @@ const styles = StyleSheet.create({
   },
   icon: {
     color: defaultTokens.paletteProductNormal,
-    fontSize: 20,
+    fontSize: 21,
   },
 });
 
diff --git a/app/MMB/src/scenes/tripServices/transportation/MarkerLocationButton.js b/app/MMB/src/scenes/tripServices/transportation/MarkerLocationButton.js
index aa11c002..03091fac 100644
--- a/app/MMB/src/scenes/tripServices/transportation/MarkerLocationButton.js
+++ b/app/MMB/src/scenes/tripServices/transportation/MarkerLocationButton.js
@@ -21,7 +21,7 @@ export default function MarkerLocationButton(props: Props) {
     <View style={styles.container}>
       <TouchableWithoutFeedback onPress={props.onPress}>
         <View style={styles.locationButton}>
-          <TextIcon code="B" style={styles.icon} />
+          <TextIcon code="$" style={styles.icon} orbit={true} />
           <Text
             numberOfLines={1}
             style={
@@ -73,5 +73,6 @@ const styles = StyleSheet.create({
     marginHorizontal: 10,
     alignSelf: 'center',
     color: defaultTokens.paletteInkLight,
+    fontSize: 16,
   },
 });
diff --git a/packages/shared/src/Duration.js b/packages/shared/src/Duration.js
index 7665fbc7..e189d344 100644
--- a/packages/shared/src/Duration.js
+++ b/packages/shared/src/Duration.js
@@ -36,7 +36,11 @@ export default function Duration(props: Props) {
   return (
     <View style={styleSheet.row}>
       {props.showIcon && (
-        <TextIcon code="e" style={[styleSheet.durationText, props.iconStyle]} />
+        <TextIcon
+          code="e"
+          orbit={true}
+          style={[styleSheet.durationIcon, props.iconStyle]}
+        />
       )}
       <Text style={[styleSheet.durationText, props.style]}>
         <Translation passThrough=" " />
@@ -63,4 +67,8 @@ const styleSheet = StyleSheet.create({
     fontSize: 10,
     color: defaultTokens.colorTextSecondary,
   },
+  durationIcon: {
+    fontSize: 13,
+    color: defaultTokens.colorTextSecondary,
+  },
 });
diff --git a/packages/shared/src/PositionMarker.js b/packages/shared/src/PositionMarker.js
index 50e34f90..e2edb254 100644
--- a/packages/shared/src/PositionMarker.js
+++ b/packages/shared/src/PositionMarker.js
@@ -34,6 +34,6 @@ export default class PositionMarker extends React.Component<Props> {
     const { size, code, color } = this.props;
 
     const styles = this.createStyles(size, color);
-    return <TextIcon code={code || 'B'} style={styles.icon} />;
+    return <TextIcon code={code || '$'} style={styles.icon} orbit={true} />;
   }
 }


Test patch:
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/__tests__/__snapshots__/BoardingPassMultiCity.test.js.snap b/app/MMB/src/scenes/tickets/boardingPasses/__tests__/__snapshots__/BoardingPassMultiCity.test.js.snap
index b76c5144..da8a5653 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/__tests__/__snapshots__/BoardingPassMultiCity.test.js.snap
+++ b/app/MMB/src/scenes/tickets/boardingPasses/__tests__/__snapshots__/BoardingPassMultiCity.test.js.snap
@@ -7,7 +7,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#00a991",
@@ -22,7 +22,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#fbad18",
@@ -37,7 +37,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#d50c6a",
@@ -52,7 +52,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#35dc93",
@@ -67,7 +67,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#ef7209",
@@ -82,7 +82,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#863ccd",
@@ -97,7 +97,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#006dc7",
@@ -112,7 +112,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#4fb52e",
@@ -127,7 +127,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#30363d",
@@ -142,7 +142,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#ff80ce",
@@ -157,7 +157,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#ff2424",
@@ -172,7 +172,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#ff2424",
@@ -187,7 +187,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#ff2424",
@@ -202,7 +202,7 @@ Array [
     icon={
       <TextIcon
         code=""
-        orbit={false}
+        orbit={true}
         style={
           Object {
             "color": "#ff2424",
diff --git a/packages/shared/src/__tests__/__snapshots__/Duration.test.js.snap b/packages/shared/src/__tests__/__snapshots__/Duration.test.js.snap
index 680f7e50..5528841a 100644
--- a/packages/shared/src/__tests__/__snapshots__/Duration.test.js.snap
+++ b/packages/shared/src/__tests__/__snapshots__/Duration.test.js.snap
@@ -11,12 +11,12 @@ exports[`works with broken input 1`] = `
 >
   <TextIcon
     code="e"
-    orbit={false}
+    orbit={true}
     style={
       Array [
         Object {
           "color": "#7f91a8",
-          "fontSize": 10,
+          "fontSize": 13,
         },
         undefined,
       ]
@@ -66,12 +66,12 @@ exports[`works with broken input 2`] = `
 >
   <TextIcon
     code="e"
-    orbit={false}
+    orbit={true}
     style={
       Array [
         Object {
           "color": "#7f91a8",
-          "fontSize": 10,
+          "fontSize": 13,
         },
         undefined,
       ]
diff --git a/packages/shared/src/forms/datePicker/__tests__/DatePicker.test.js b/packages/shared/src/forms/datePicker/__tests__/DatePicker.test.js
index 0a0f3000..30eefd46 100644
--- a/packages/shared/src/forms/datePicker/__tests__/DatePicker.test.js
+++ b/packages/shared/src/forms/datePicker/__tests__/DatePicker.test.js
@@ -25,7 +25,7 @@ class PickerWrapper extends React.Component<{}, {| date: Date |}> {
     <DatePicker
       date={this.state.date}
       onDateChange={this.onDateChange}
-      iconComponent={<TextIcon code="&#xe0a2;" />}
+      iconComponent={<TextIcon code="z" orbit={true} />}
       {...this.props}
     />
   );
diff --git a/packages/shared/src/forms/datePicker/__tests__/__snapshots__/DatePicker.test.js.snap b/packages/shared/src/forms/datePicker/__tests__/__snapshots__/DatePicker.test.js.snap
index 58c42b0e..b944f609 100644
--- a/packages/shared/src/forms/datePicker/__tests__/__snapshots__/DatePicker.test.js.snap
+++ b/packages/shared/src/forms/datePicker/__tests__/__snapshots__/DatePicker.test.js.snap
@@ -6,8 +6,8 @@ exports[`DatePicker renders in playground 1`] = `
   disabled={false}
   iconComponent={
     <TextIcon
-      code=""
-      orbit={false}
+      code="z"
+      orbit={true}
     />
   }
   onDateChange={[Function]}
@@ -20,8 +20,8 @@ exports[`DatePicker works with max date 1`] = `
   disabled={false}
   iconComponent={
     <TextIcon
-      code=""
-      orbit={false}
+      code="z"
+      orbit={true}
     />
   }
   maxDate={2018-01-01T00:00:00.000Z}
@@ -35,8 +35,8 @@ exports[`DatePicker works with min date 1`] = `
   disabled={false}
   iconComponent={
     <TextIcon
-      code=""
-      orbit={false}
+      code="z"
+      orbit={true}
     />
   }
   minDate={2018-01-01T00:00:00.000Z}
@@ -51,8 +51,8 @@ exports[`DatePicker works with other date formats 1`] = `
   format="L"
   iconComponent={
     <TextIcon
-      code=""
-      orbit={false}
+      code="z"
+      orbit={true}
     />
   }
   onDateChange={[Function]}