Slide 1

Slide 1 text

Develop a weather app with K

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

#androiddev #kotlin #AndroidMakersFr @ekito

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

19 Let’s Go ! #androiddev #kotlin #AndroidMakersFr @ekito

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

// 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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Class class User (
 val userName: String,
 val firstName: String,
 val lastName: String,
 var location: Point? = null
 ) POJO + - Getter - Setter - Constructors #androiddev #kotlin #AndroidMakersFr @ekito

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

My Weather app #androiddev #kotlin #AndroidMakersFr @ekito

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Check your Kotlin plugin

Slide 42

Slide 42 text

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)

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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 !

Slide 46

Slide 46 text

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 !

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Sweet stuffs for #androiddev #kotlin #AndroidMakersFr @ekito

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

Kotlin Java #androiddev #kotlin #AndroidMakersFr @ekito

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Reactive Programming #androiddev #kotlin #AndroidMakersFr @ekito

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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 !

Slide 59

Slide 59 text

Final Part #androiddev #kotlin #AndroidMakersFr @ekito

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

Smarter development for the JVM Kotlin #androiddev #kotlin #AndroidMakersFr @ekito 70% Less !

Slide 62

Slide 62 text

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