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
Remote Control your App
Search
Stan Kocken
April 23, 2018
Technology
500
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Remote Control your App
AndroidMakers 2018 talk
Stan Kocken
April 23, 2018
More Decks by Stan Kocken
See All by Stan Kocken
MVP on Android: why do you need it?
stankocken
1
190
Unit Test your code, even your UI
stankocken
1
310
EfficientAdapter
stankocken
1
120
Other Decks in Technology
See All in Technology
グローバルチームと挑むプロダクト開発
sansantech
PRO
1
130
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
220
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
340
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
7.9k
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.8k
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
330
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
160
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
1
130
AI駆動開発におけるQAエンジニアの役割事例 〜AI駆動開発の現場から〜
kobayashiyorimitsu
0
210
WebGIS AI Agentの紹介
_shimizu
0
610
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
740
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
A Modern Web Designer's Workflow
chriscoyier
698
190k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Facilitating Awesome Meetings
lara
57
7k
The SEO Collaboration Effect
kristinabergwall1
1
500
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Practical Orchestrator
shlominoach
191
11k
Transcript
Remote Control your App AndroidMakers 2018 - Stan Kocken
Why? 2
Release Cycle 3
Different company, different style: max time between updates 4 Source:
appannie.com - updates on the store between 1st April 2017 and 1st April 2018 - 75% - 95% confidence interval 5-6 days 9-16 days 7-17 days 15-21 days 63-66 days 11-15 days
Frequent updates is the way to go? 5
Daily updates […] Everybody can see it's because of too
little testing - real review of a user 6
7 Less frequent update: the main reasons Event-based application No
dev working actively on it Expensive release
Our release cycle: Release Train 8 5.12.0 5.13.X 5.13.0 5.14.X
Week 1 Week 2 Week 3 Week 4 beta 5% 20% 100% beta 5% 20% 100% alpha alpha
App Release Feature Release 9 ≠ Our Release Train Engineers
Product/Marketing
How do you do that? 10
Remote Control your App AndroidMakers 2018 - Stan Kocken
But… I need to change this text… I want to
test this… - product owner 12
Remote Control your App AndroidMakers 2018 - Stan Kocken
WebView 14
A View that displays web pages - https://developer.android.com/reference/android/webkit/WebView.html 15
16 How? 99% Hybrid Low-touch Facebook lite 1.6MB Installs: 500,000,000+
4.3/5 ~ Mobile website vs vs Native and Web None or just few pages Eurostar v1 (2011) • Help pages • Credit card payments • …
17 Advantages Full control without app update Cross-platform “I know
HTML, I can make an app” Cheaper: Lower price
18 Disadvantages Full control without app update Cross-platform “I know
HTML, I can make an app” Cheaper: Lower price BAD quality So nobody feel at home
If even Facebook cannot make it great, how can
you? 19
20 WebView: Take-away - no budget - limited part -
“lite” application - everything else BAD GOOD
Remote Screen Configuration 21
Configuration 22 UI
23 "render": { "card_premium": { "title": { "resource": "configurable_premium_title" },
"color": "#25B41E", "descriptionItems": [ { "title": { "resource": "configurable_premium_item_title_backup" }, "description": { "resource": "configurable_premium_item_description_backup" }, "icon": { "defaultResource": "configurable_premium_features_backup" } }, { "title": { "resource": "configurable_premium_item_title_sync" }, "description": { "resource": "configurable_premium_item_description_sync" }, "icon": { "defaultResource": "configurable_premium_features_sync" } }, …
24 WebView Remote Screen Configuration 100% remotely controlled Cross-platform definition
Native UI look&feel Cost $ $$$ remotely controlled
Remote Copy 25
I need to change this text. When can we have
this live? - product owner 26
But… the text is within Strings.xml… Strings.xml within the app…
So we need an update. - dev 27
28 getString(R.string.hello_world) <string name="hello_world">Hello World</string> "Hello World" + = Strings.xml
What about a JSON file? - dev 29
jsonObject.optString("hello_world") 30 "Hello World" + = {"hello_world": "Hello World"} Simple
JSON
Where should I put the French version? - product owner
31
32 Localised JSON { "en": { "hello_world": "Hello World" },
"fr": { "hello_world": "Bonjour le monde" } } jsonObject.getJSONObject(“fr").optString("hello_world") “Bonjour le monde” + =
A user is Spanish should see the English version -
QA 33
34 Auto-select language res - values - default_strings.xml - values-fr
- default_strings.xml <resources> <string name="locale">en</string> </resources> <resources> <string name="locale">fr</string> </resources> jsonObject.getJSONObject(getString(R.string.locale)) .optString("hello_world")
Hmmm, and from my XML layout? - dev 35
36 XML Layout: the keys <TextView … android:text="hello_world" />
37 Custom Layout Inflator class MyLayoutInflater(context: Context, private val translator:
Translator) : LayoutInflater(context) { override fun onCreateView(parent: View?, name: String?, attrs: AttributeSet?): View { val view = super.onCreateView(parent, name, attrs) (view as? TextView)?.let { replaceTextKeyByValue(it) } return view } private fun replaceTextKeyByValue(textView: TextView) { textView.text = translator.replaceByValueIfNecessary(textView.text) textView.hint = translator.replaceByValueIfNecessary(textView.hint) }
38 Custom Layout Inflator class MyLayoutInflater(context: Context, private val translator:
Translator) : LayoutInflater(context) { override fun onCreateView(parent: View?, name: String?, attrs: AttributeSet?): View { val view = super.onCreateView(parent, name, attrs) (view as? TextView)?.let { replaceTextKeyByValue(it) } return view } private fun replaceTextKeyByValue(textView: TextView) { textView.text = translator.replaceByValueIfNecessary(textView.text) textView.hint = translator.replaceByValueIfNecessary(textView.hint) }
What about plurals? And a different text per app version?
And “Welcome %s to our app” 39
• Standard i18n functions (plurals, context, interpolation, format) • JSON
format • Created for Javascript • Android reader: https://github.com/i18next/i18next-android Written by myself 5 years ago 40 .com
A/B Testing 41
Compare two (or more) experiences to choose the best 42
Example 43
44 https://medium.com/wolfgangbremer/amazon-is-the-king-of-a-b-testing-f46008e3b528
45 Maxime Lorant - https://commons.wikimedia.org/wiki/File:A-B_testing_simple_example.png
Local or Server 46 A or B? Random().nextInt() % 2
=> Save locally => Send to Analytics Cross-platform A or B
47 KEEP CALM AND WAIT FOR IT…
48 Wait From minutes, TO MONTHS!
How long should I wait? 49
One at the time 50
Feature Flip 51
Remotely decide when a feature is enable 52
App Release Feature Release 53 ≠ Store update Feature Flip
A/B test Feature Flip 54 ≠ Find best experiences Progressive
Rollout Synchronise cross-platform Beta test
A/B Test, Feature Flip: tools 55 Braze (formerly Appboy), hack
of newsfeed Firebase Remote Config Home-made solution
Dashlane usage 56
Dashlane Recipe • Release: every two weeks • WebView: very
limited part • Remote Screen Configuration: for the premium page • Remote Copy: we don’t • A/B Test: home-made solution • Feature Flip: home-made solution, highly used 57
App Release Feature Release 58 ≠ Engineers Product/Marketing
Thank you @stan_kocken 59