Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Develop a weather app with Kotlin (AndroidMakers 17)

Develop a weather app with Kotlin (AndroidMakers 17)

Laurent BARESSE

April 10, 2017
Tweet

More Decks by Laurent BARESSE

Other Decks in Programming

Transcript

  1. Develop a
    weather app
    with K

    View full-size slide

  2. Develop a weather app with
    https://github.com/Ekito/2017-handson-kotlinAndroid
    Grab your stuff !
    #androiddev #kotlin #AndroidMakersFr @ekito
    WIFI: AndroidMakers / Makers2017

    View full-size slide

  3. Schedule
    9:45 - Introduction

    9:50 - Intro to Kotlin part 1

    10:10 - Project presentation & setup

    10:20 - Hands-on part 1 (55 minutes)

    11:15 - Coffee break

    11:30 - Intro to Kotlin part 2

    11:45 - Hands-on part 2 (55 minutes)

    12:40 - Final Part
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  4. Practical notes
    https://github.com/Ekito/2017-handson-kotlinAndroid
    Grab your stuff !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  5. @Baresse
    Work @ ekito
    Developer & Geek
    Fullstack & Mobile
    Laurent BARESSE
    @arnogiu
    Work @ ekito
    Core & Gear Maker
    Mobile & Cloud
    Arnaud GIULIANI
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  6. https://www.ekito.fr/careers
    Join the team !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  7. Intro to
    part 1
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  8. « production ready »
    15.02.2016
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  9. Kotlin 1.1.1 @ 15.03.2017
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  10. Yet another JVM
    Language ?
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  11. The new « Swift »
    for Android ?
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  12. #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  13. Kotlin clearly considered
    by the Java community !
    https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-
    spring-framework-5-0
    http://www.javamagazine.mozaicreader.com/
    #&pageSet=5&page=0&contentItem=0 (March/April
    2017)
    https://www.thoughtworks.com/radar/languages-and-frameworks/kotlin

    View full-size slide

  14. - Conciseness & Smarter API
    - Null Safety & Immutability protection
    - Type Inference, Static Typing & Smart Casts
    - Open programming styles
    - Java Interop
    Why
    Kotlin ?

    View full-size slide

  15. What’s
    Kotlin ?
    - Fully open source (built by Jetbrains)
    - Run on Java 6+
    - Static typing & type inference
    - Modern language features
    - 1st grade tooling
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  16. More About
    Kotlin …
    - String templates
    - Properties
    - Lambdas
    - Data class
    - Smart cast
    - Null safety
    - Lazy property
    - Default values for function
    parameters
    - Extension Functions
    - No more ;
    - Single-expression
    functions
    - When expression
    - let, apply, use, with
    - Collections
    - Android Extensions Plugin
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  17. Compare with
    Same conciseness and expressive code, but
    Kotlin static typing and null-safety make a big
    difference.
    "Some people say Kotlin has 80% the power of
    Scala, with 20% of the features" * 

    "Kotlin is a software engineering language in
    contrast to Scala which is a computing science
    language." *
    Swift and Kotlin are VERY similar. Swift is LLVM
    based and has C interop while Kotlin is JVM based
    and has Java interop.
    * Quotes from Kotlin: The Ying and Yang of Programming Languages
    @
    sdeleuze
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  18. is Kotlin Android friendly ?
    https://github.com/SidneyXu/AndroidDemoIn4Languages
    Method counts by Language
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  19. KOTLIN is not just about writing
    your app with lesser lines.
    It’s all about writing
    SAFER & BETTER APPS !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  20. 20
    Let’s Go !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  21. Typing & Inference
    val a: Int = 1

    val b = 1 // `Int` type is inferred
    var x = 5 // `Int` type is inferred

    x += 1
    Inferred values
    Mutable values
    val : constant value - IMMUTABLE
    var : variable value - MUTABLE
    USE VAL AS MUCH AS POSSIBLE !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  22. Safety with Optionals
    var stringA: String = "foo"

    stringA = null //Compilation error - stringA is a String (non optional)


    var stringB: String? = "bar" // stringB is an Optional String

    stringB = null //ok
    Optional value
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  23. // set length default value manually

    val length = if (stringB != null) stringB.length else -1

    //or with the Elvis operator

    val length = stringB?.length ?: -1
    Default Value & Elvis Operator
    val length = stringB.length // Compilation error - stringB can be null !

    // use ? the safe call operator

    val length = stringB?.length //Value or null - length is type Int?
    val length = stringB!!.length // Value or explicit throw NPE - length is type Int
    Safe call with ?. or Explicit call with !!.
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  24. Example
    Working with optional values
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  25. Example
    Null check safety & Smart cast
    Securing with default values
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  26. Class
    class User (

    val userName: String,

    val firstName: String,

    val lastName: String,

    var location: Point? = null

    )
    POJO +
    - Getter
    - Setter
    - Constructors
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  27. Data Class
    data class User (

    val userName: String,

    val firstName: String,

    val lastName: String,

    var location: Point? = null

    )
    POJO +
    - Getter
    - Setter
    - Constructors
    - toString
    - hashcode
    - equals
    - copy
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  28. POJO ?
    Kotlin
    Java
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  29. Properties
    // readonly property

    val isEmpty: Boolean

    get() = this.size == 0
    Properties can be declared in constructor or in class
    You can also handle getter & setter
    // customer getter & setter

    var stringRepresentation: String
    set(value) {


    }
    class ApiKey(var weatherKey: String, var geocodeKey: String){

    var debug : Boolean = false

    }
    * Late initialization, Lazy, Delegates …
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  30. Example
    data class User(val name: String = "", val age: Int = 0)
    val jack = User(name = "Jack", age = 1) //no new keyword

    val anotherJack = jack.copy(age = 2)
    Data Class usage
    A simple GSon Class
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  31. Object Class
    // singleton

    object Resource {

    val name = "Name"

    }
    class StringCalculator{
    // class helper

    companion object{

    val operators = arrayOf("+","-","x","/")

    }

    }
    Singleton Class
    Companion Object
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  32. When
    in ->
    is ->
    expression ->
    when (s) {

    1 -> print("x == 1")

    2 -> print("x == 2")

    else -> { // Note the block

    print("x is neither 1 nor 2")

    }

    }
    Flow Control (replace your old if blocks)
    when (x) {

    in 1..10 -> print("x is in the range")

    in validNumbers -> print("x is valid")

    !in 10..20 -> print("x is outside the range")

    else -> print("none of the above")

    }
    Pattern Matching
    * can match with operators : in, as, is, range …
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  33. Example
    Android Page Adapter
    Pattern Matching
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  34. Collections
    // immutable map

    val map = mapOf("a" to 1, "b" to 2, "c" to 3)

    for ((k, v) in map) {

    println("$k -> $v")

    }

    map2["a"] = "my value" // direct map access with array style
    // range

    for (i in 1..100) { //... }
    // immutable list

    val list = listOf("a", "b", "c","aa")

    list.filter { it.startsWith("a") }
    * collections operators : map, filter, take, flatMap, forEach, firstOrNull, last …
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  35. Example
    Kotlin Collection
    Java 7 Collection
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  36. InterOp Kotlin/Java
    Java
    Kotlin
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  37. InterOp Java/Kotlin
    object UserSingleton{

    fun stringify(user : User) : String{

    // …

    }

    }
    fun WhatIsyourAge(user : User){

    println("Your age is ${user.age}")

    }
    data class User (val name: String, val age : Int){

    companion object{

    fun sayHello(user : User){
    //…

    }

    }

    }
    User u = new User("toto",42);

    User.Companion.sayHello(u);
    UserUtilsKt.WhatIsyourAge(u);
    UserSingleton.INSTANCE.stringify(u)
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  38. Project presentation
    & setup
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  39. My Weather app
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  40. Get the project
    https://github.com/Ekito/2017-handson-kotlinAndroid
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  41. Create your branch
    https://github.com/Ekito/2017-handson-kotlinAndroid/blob/master/README.pdf
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  42. Check your Kotlin plugin

    View full-size slide

  43. Adapt the config
    #androiddev #kotlin #AndroidMakersFr @ekito
    In app & weathersdk modules:
    - Android.BuildToolsVersion ~ 24.0.3
    - com.android.support ~ 24.1.1
    In root build.gradle:
    - kotlin_version : 1.0.6+ (1.1.1)
    - retrofit_version : 2.1.0+
    - okhttp_version : 3.3.1+
    In weathersdk module:
    - rxjava : 1.2.0+ (2.0.5)
    - rxandroid : 1.1.5 (2.0.1)
    In root build.gradle:
    - com.android.tools.build:gradle: 2.2.3
    Do not upgrade to Gradle 2.3+ !

    View full-size slide

  44. MainApplication MainActivity
    DailyForecastModel
    DialogHelper
    WeatherSDKUtil
    WeatherSDK
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  45. Hands-on
    part 1
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  46. 9:45 - Introduction

    9:50 - Intro to Kotlin part 1

    10:10 - Project presentation & setup

    10:20 - Hands-on part 1 (55 minutes)
    11:15 - Coffee break

    11:30 - Intro to Kotlin part 2

    11:45 - Hands-on part 2 (55 minutes)

    12:40 - Final Part
    #androiddev #kotlin #AndroidMakersFr @ekito
    Hands-on !

    View full-size slide

  47. 9:45 - Introduction

    9:50 - Intro to Kotlin part 1

    10:10 - Project presentation & setup

    10:20 - Hands-on part 1 (55 minutes)

    11:15 - Coffee break
    11:30 - Intro to Kotlin part 2

    11:45 - Hands-on part 2 (55 minutes)

    12:40 - Final Part
    #androiddev #kotlin #AndroidMakersFr @ekito
    Coffee Break !

    View full-size slide

  48. Intro to
    part 2
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  49. Sweet stuffs for
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  50. Kotlin’s Android
    Extensions
    apply plugin: 'com.android.application'
    apply plugin: ‘kotlin-android’
    apply plugin: ‘kotlin-android-extensions’ // if use extensions
    In your build.gradle
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  51. Kotlin
    Java
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  52. Lambdas
    val fab = findViewById(R.id.fab) as FloatingActionButton

    fab.setOnClickListener { view -> popLocationDialog(view) }
    A lambda expression or an anonymous function is a “function literal”, i.e. a function that is
    not declared, but passed immediately as an expression
    - A lambda expression is always surrounded by curly braces
    - Its parameters (if any) are declared before -> (parameter types may be omitted),
    - The body goes after -> (when present).
    myNumber.split("\n").flatMap { it.split(separator) }

    .map(Integer::parseInt)

    .map(::checkPositiveNumber)

    .filter { it <= 1000 }

    .sum()
    * Method references are not surrounded by curly braces !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  53. Functions
    fun reformat(str: String,

    normalizeCase: Boolean = true,

    upperCaseFirstLetter: Boolean = true,

    wordSeparator: Char = ' '): String {


    }
    Named Parameters & default values
    reformat(str, true, true, '_') // old way to call

    reformat(str, wordSeparator = '_') // using default values & named params
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  54. Extensions Functions
    Extension declaration
    Usage
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  55. Reactive
    Programming
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  56. Lamba expressions
    Functional Programming
    Reactive Streams
    http://reactivex.io/documentation/operators.html
    http://www.reactive-streams.org/
    https://spring.io/blog/2016/06/07/notes-on-reactive-
    programming-part-i-the-reactive-landscape
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  57. Example - Rx/Retrofit
    Kotlin
    Java
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  58. Hands-on
    part 2
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  59. 9:45 - Introduction

    9:50 - Intro to Kotlin part 1

    10:10 - Project presentation & setup

    10:20 - Hands-on part 1 (55 minutes)

    11:15 - Coffee break

    11:30 - Intro to Kotlin part 2

    11:45 - Hands-on part 2 (55 minutes)
    12:40 - Final Part
    #androiddev #kotlin #AndroidMakersFr @ekito
    Hands-on !

    View full-size slide

  60. Final Part
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  61. Time is over !
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide

  62. Smarter development for the JVM
    Kotlin
    #androiddev #kotlin #AndroidMakersFr @ekito
    70% less !

    View full-size slide

  63. Thank you for
    coming
    #androiddev #kotlin #AndroidMakersFr @ekito

    View full-size slide