Remote Control your App

Remote Control your App

AndroidMakers 2018 talk

30ec7b2d4dae5107b36c52fff7a29894?s=128

Stan Kocken

April 23, 2018
Tweet

Transcript

  1. Remote Control your App AndroidMakers 2018 - Stan Kocken

  2. Why? 2

  3. Release Cycle 3

  4. 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
  5. Frequent updates is the way to go? 5

  6. Daily updates […] Everybody can see it's because of too

    little testing - real review of a user 6
  7. 7 Less frequent update: the main reasons Event-based application No

    dev working actively on it Expensive release
  8. 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
  9. App Release Feature Release 9 ≠ Our Release Train Engineers

    Product/Marketing
  10. How do you do that? 10

  11. Remote Control your App AndroidMakers 2018 - Stan Kocken

  12. But… I need to change this text… I want to

    test this… - product owner 12
  13. Remote Control your App AndroidMakers 2018 - Stan Kocken

  14. WebView 14

  15. A View that displays web pages - https://developer.android.com/reference/android/webkit/WebView.html 15

  16. 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. 17 Advantages Full control without app update Cross-platform “I know

    HTML, I can make an app” Cheaper: Lower price
  18. 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
  19. If even Facebook cannot make it great, 
 how can

    you? 19
  20. 20 WebView: Take-away - no budget - limited part -

    “lite” application - everything else BAD GOOD
  21. Remote Screen Configuration 21

  22. Configuration 22 UI

  23. 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. 24 WebView Remote Screen
 Configuration 100% remotely controlled Cross-platform definition

    Native UI look&feel Cost $ $$$ remotely controlled
  25. Remote Copy 25

  26. I need to change this text. When can we have

    this live? - product owner 26
  27. But… the text is within Strings.xml… Strings.xml within the app…

    So we need an update. - dev 27
  28. 28 getString(R.string.hello_world) <string name="hello_world">Hello World</string> "Hello World" + = Strings.xml

  29. What about a JSON file? - dev 29

  30. jsonObject.optString("hello_world") 30 "Hello World" + = {"hello_world": "Hello World"} Simple

    JSON
  31. Where should I put the French version? - product owner

    31
  32. 32 Localised JSON { "en": { "hello_world": "Hello World" },

    "fr": { "hello_world": "Bonjour le monde" } } jsonObject.getJSONObject(“fr").optString("hello_world") “Bonjour le monde” + =
  33. A user is Spanish should see the English version -

    QA 33
  34. 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")
  35. Hmmm, and from my XML layout? - dev 35

  36. 36 XML Layout: the keys <TextView … android:text="hello_world" />

  37. 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. 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) }
  39. What about plurals? And a different text per app version?

    And “Welcome %s to our app” 39
  40. • 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
  41. A/B Testing 41

  42. Compare two (or more) experiences to choose the best 42

  43. Example 43

  44. 44 https://medium.com/wolfgangbremer/amazon-is-the-king-of-a-b-testing-f46008e3b528

  45. 45 Maxime Lorant - https://commons.wikimedia.org/wiki/File:A-B_testing_simple_example.png

  46. Local or Server 46 A or B? Random().nextInt() % 2

    => Save locally => Send to Analytics Cross-platform A or B
  47. 47 KEEP CALM AND WAIT FOR
 IT…

  48. 48 Wait
 From minutes, TO MONTHS!

  49. How long should I wait? 49

  50. One at the time 50

  51. Feature Flip 51

  52. Remotely decide when a feature is enable 52

  53. App Release Feature Release 53 ≠ Store update Feature Flip

  54. A/B test Feature Flip 54 ≠ Find best experiences Progressive

    Rollout Synchronise cross-platform Beta test
  55. A/B Test, Feature Flip: tools 55 Braze (formerly Appboy), hack

    of newsfeed Firebase Remote Config Home-made solution
  56. Dashlane usage 56

  57. 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
  58. App Release Feature Release 58 ≠ Engineers Product/Marketing

  59. Thank you @stan_kocken 59