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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
600
TypeScript入門 2026
recruitengineers
PRO
2
460
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
200
ラジオの科学
frievea
0
260
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
認知負荷をGemini で溶かす — GKE 基盤「Orbit」における AI エージェントの実践
sansantech
PRO
1
260
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
770
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
360
20260801_スクフェス大阪
kgnkhkr
2
1.2k
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
190
名古屋の市バスGTFS-JPデータ×スガキヤ 最寄りバス停検索をAmazon ElastiCache Serverless for Valkeyで最適化する
usanchuu
1
410
取引先から届く 「セキュリティチェックシート」の読み解き方
kamadamakoto
0
120
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
980
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Building the Perfect Custom Keyboard
takai
2
830
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Leo the Paperboy
mayatellez
8
2.1k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Facilitating Awesome Meetings
lara
57
7.1k
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