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
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.2k
3Dシーンの圧縮
fadis
1
770
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Webフレームワークの ベンチマークについて
yusukebe
0
170
dRuby over BLE
makicamel
2
340
OSもどきOS
arkw
0
570
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.1k
RTSPクライアントを自作してみた話
simotin13
0
610
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.6k
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Featured
See All Featured
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
230
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Thoughts on Productivity
jonyablonski
76
5.2k
30 Presentation Tips
portentint
PRO
1
330
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
We Are The Robots
honzajavorek
0
250
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
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