Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Aviasales Отели - практический опыт объединени...
Search
Evgeny Shishkin
November 27, 2018
Programming
99
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Aviasales Отели - практический опыт объединения двух приложений
Evgeny Shishkin
November 27, 2018
More Decks by Evgeny Shishkin
See All by Evgeny Shishkin
Создать собственное приложение для планирования путешествий за 60 секунд
johnkil
0
46
Kotlin in production
johnkil
0
150
Life without Fragments
johnkil
1
530
6. Создание UI
johnkil
0
80
3. Создание Android приложения
johnkil
0
77
4. Структура Android приложения
johnkil
0
150
5. Android ресурсы
johnkil
0
77
1. Введение в Android
johnkil
0
69
2. Настройка среды разработки
johnkil
0
83
Other Decks in Programming
See All in Programming
ふつうのFeature Flag実践入門
irof
7
4k
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
150
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
250
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
340
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
100
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
Agentic UI
manfredsteyer
PRO
0
170
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
180
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
3Dシーンの圧縮
fadis
1
770
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
250
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
My Coaching Mixtape
mlcsv
0
150
Paper Plane (Part 1)
katiecoart
PRO
0
9.1k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
AI: The stuff that nobody shows you
jnunemaker
PRO
8
720
Writing Fast Ruby
sferik
630
63k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
490
HDC tutorial
michielstock
2
720
Ethics towards AI in product and experience design
skipperchong
2
310
Transcript
Практический опыт объединения двух приложений Евгений Шишкин, Aviasales +
Hotellook — метапоиск отелей
700 000 hotels 205 countries
None
Try to merge
+
Git
Mono-Repository
AS HL
AS HL HL Features
AS HL HL Features
AS HL HL Features
AS HL HL Features AS Features
AS HL HL Features AS Features
AS HL HL Features AS Features
AS HL HL Features HL Release AS Features
AS HL HL Features HL Release AS Features
AS HL HL Features HL Release AS Features hl_5.1.0
AS HL HL Features HL Release AS Features hl_5.1.0
AS HL HL Features HL Release AS Features hl_5.1.0
AS HL HL Features HL Release AS Release AS Features
hl_5.1.0
AS HL HL Features HL Release AS Release AS Features
hl_5.1.0
AS HL HL Features HL Release AS Release AS Features
hl_5.1.0 as_3.4.0
AS HL HL Features HL Release AS Release AS Features
hl_5.1.0 as_3.4.0
AS HL HL Features HL Release AS Release AS Features
hl_5.1.0 as_3.4.0
Renaming
Hotellook hl_app/ hl_wear/ hl_core/ hl_base/ hl_location/ hl_maps/ hl_utils/ Modules Aviasales
as_app/ as_wear/ as_core/
Hotellook/ res/ color/ hl_color.xml drawable/ hl_drawable.xml layout/ hl_layout.xml menu/ hl_menu.xml
… Aviasales/ res/ color/ color.xml drawable/ drawable.xml layout/ layout.xml menu/ menu.xml … Resources
Dependencies
OutOfMemoryError
OutOfMemoryError android:largeHeap="true"
Mainframer
Mainframer Tool that allows you to move build process from
a local machine to a remote one.
• CPU: Intel Core i7-8700K • Motherboard: MSI Z370 •
Memory: DDR4 Corsair 2x16Gb 3200MHz • SSD: Samsung 970 PRO • …
• CPU: Intel Core i7-8700K • Motherboard: MSI Z370 •
Memory: DDR4 Corsair 2x16Gb 3200MHz • SSD: Samsung 970 PRO • … ≈ 100k RUB
• CPU: Intel Core i7-8700K • Motherboard: MSI Z370 •
Memory: DDR4 Corsair 2x16Gb 3200MHz • SSD: Samsung 970 PRO • … ≈ 100k RUB cheaper than slowest mbp 13
3x faster builds
None
Insides
1. Permissions
Check List • Base on RxJava • Singleton • Mockable
• SuppoF logging
API
PermissionCheckResult PermissionGranted PermissionDenied val permission: String val permission: String val
shouldShowRequestPermissionRationale: Boolean Result
request(Manifest.permission.ACCESS_FINE_LOCATION)
subscribe() request(Manifest.permission.ACCESS_FINE_LOCATION)
subscribe() request(Manifest.permission.ACCESS_FINE_LOCATION)
subscribe() false request(Manifest.permission.ACCESS_FINE_LOCATION)
subscribe() subscribe() false request(Manifest.permission.ACCESS_FINE_LOCATION)
subscribe() subscribe() false request(Manifest.permission.ACCESS_FINE_LOCATION)
subscribe() subscribe() false true request(Manifest.permission.ACCESS_FINE_LOCATION)
requestSingle(Manifest.permission.ACCESS_FINE_LOCATION) subscribe() subscribe() PermissionDenied PermissionGranted
requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION)
requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION) subscribe()
subscribe() requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION)
requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION) subscribe()
requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION) subscribe() PermissionDenied ACCESS_FINE_LOCATION
requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION) subscribe() PermissionDenied PermissionGranted ACCESS_FINE_LOCATION READ_CONTACTS
requestEach( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION) subscribe() PermissionDenied PermissionGranted ACCESS_FINE_LOCATION READ_CONTACTS
require(Manifest.permission.ACCESS_FINE_LOCATION)
require(Manifest.permission.ACCESS_FINE_LOCATION) subscribe()
require(Manifest.permission.ACCESS_FINE_LOCATION) subscribe()
require(Manifest.permission.ACCESS_FINE_LOCATION) subscribe() PermissionsDeniedException
require(Manifest.permission.ACCESS_FINE_LOCATION) subscribe() subscribe() PermissionsDeniedException
require(Manifest.permission.ACCESS_FINE_LOCATION) subscribe() subscribe() PermissionsDeniedException
require(Manifest.permission.ACCESS_FINE_LOCATION) subscribe() subscribe() PermissionsDeniedException
Mockable class Permissions( private val permissionsHandler: PermissionsHandler, private val logger:
((message: String) -> Unit)? = null )
Mockable interface PermissionsHandler { fun checkPermissions(vararg permissions: String): Observable<PermissionCheckResult> fun
requestPermissions(vararg permissions: String): Observable<PermissionCheckResult> }
Singleton abstract class PermissionsDelegate<in T : Any> : PermissionsHandler {
fun attach(component: T) {…} fun detach() {…} fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {…} PermissionsActivityDelegate PermissionsFragmentDelegate
Logging class Permissions( private val permissionsHandler: PermissionsHandler, private val logger:
((message: String) -> Unit)? = null ) Permissions: Request android.permission.CAMERA, android.permission.ACCESS_FINE_LOCATION Permissions: PermissionDenied(permission=android.permission.CAMERA, shouldShowRequestPermissionRationale=false) Permissions: PermissionGranted(permission=android.permission.ACCESS_FINE_LOCATION)
hips://github.com/JetradarMobile/mrbutler
2. Navigation
None
Navigation Navigation #1 Navigation #2 Navigation #3 Navigation #4 Navigator
Router Activity Application * Command 1_1 * Command 1_2 * Command 1_3 * Command 2_1 * Command 2_2 * Command 2_3 * Command 3_1 * Command 3_2 * Command 3_3 * Command 4_1 * Command 4_2 * Command 4_3
hips://github.com/JetradarMobile/nautilus
Thank you @johnkill