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
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
51
Kotlin in production
johnkil
0
150
Life without Fragments
johnkil
1
540
6. Создание UI
johnkil
0
86
3. Создание Android приложения
johnkil
0
80
4. Структура Android приложения
johnkil
0
160
5. Android ресурсы
johnkil
0
80
1. Введение в Android
johnkil
0
77
2. Настройка среды разработки
johnkil
0
92
Other Decks in Programming
See All in Programming
Foundry Localでエージェント開発
seosoft
0
130
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
980
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
230
What We Talk About When We Talk About XP
m_seki
2
350
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
810
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
570
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
110
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
260
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
200
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
140
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
Code Reviewing Like a Champion
maltzj
528
40k
Building the Perfect Custom Keyboard
takai
2
860
My Coaching Mixtape
mlcsv
0
300
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
The Curse of the Amulet
leimatthew05
2
14k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Side Projects
sachag
455
43k
Navigating Weather and Climate Data
rabernat
0
510
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Believing is Seeing
oripsolob
1
210
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