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
510
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
200
Unit Test your code, even your UI
stankocken
1
320
EfficientAdapter
stankocken
1
120
Other Decks in Technology
See All in Technology
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
0
210
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
220
Bet AI Day 2026丨AIによって本質に戻るシステムリスク管理
layerx
PRO
0
1.3k
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
260
enechainの内製セルフサービスプラットフォーム
hiyosi
0
130
Bet AI Day 2026丨Agentは、「金融」という巨大産業の何を変えられるのか
layerx
PRO
0
1.2k
Autonomous AI Databaseサービス・アップデート(FY27)/ adb-service-update-jp-fy27
oracle4engineer
PRO
0
130
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
170
Kiro Crewしか勝たん!?
miu_crescent
PRO
0
190
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
630
When Does a Local Qwen Start to Break
morshoto
0
190
omasushiというライブラリを作った
polidog
PRO
0
120
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.7k
Test your architecture with Archunit
thirion
2
2.4k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
400
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
We Are The Robots
honzajavorek
0
340
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
340
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Navigating Team Friction
lara
192
16k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
ラッコキーワード サービス紹介資料
rakko
1
4.8M
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
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