Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Aviasales Отели - практический опыт объединени...
Search
Evgeny Shishkin
November 27, 2018
Programming
100
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
52
Kotlin in production
johnkil
0
150
Life without Fragments
johnkil
1
550
6. Создание UI
johnkil
0
88
3. Создание Android приложения
johnkil
0
82
4. Структура Android приложения
johnkil
0
160
5. Android ресурсы
johnkil
0
80
1. Введение в Android
johnkil
0
81
2. Настройка среды разработки
johnkil
0
93
Other Decks in Programming
See All in Programming
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.7k
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
気持ちぃ〜角丸 Squircle
ryu1013
0
320
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
contenteditable と日本語入力に向き合う
colorful12
0
200
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
980
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
440
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Building Adaptive Systems
keathley
44
3.3k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
Writing Fast Ruby
sferik
630
63k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
KATA
mclloyd
PRO
35
16k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
The Cult of Friendly URLs
andyhume
79
7k
Making Projects Easy
brettharned
120
6.8k
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