Slide 1

Slide 1 text

(Scala on Android) 㱺 Painless Android Development with Scala 1

Slide 2

Slide 2 text

㱺 47 Degrees, a global consulting agency & Typesafe Consulting Partner. @raulraja @javielinux @47deg http://47deg.com/blog (Scala on Android) 㱺 Painless Android Development with Scala 2

Slide 3

Slide 3 text

Build Tools (Scala on Android) 㱺 Painless Android Development with Scala 3

Slide 4

Slide 4 text

SBT 㱺 Android SDK Plugin https://github.com/pfn/android-sdk-plugin (Scala on Android) 㱺 Painless Android Development with Scala 4

Slide 5

Slide 5 text

SBT 㱺 Android SDK Plugin — Supports all Android SDK tasks — dex — typedResourcesGenerator — proguard — buildConfigGenerator — (+ 20... more) (Scala on Android) 㱺 Painless Android Development with Scala 5

Slide 6

Slide 6 text

SBT 㱺 Android SDK Plugin 㱺 typedResourcesGenerator object TR { val title = TypedResource[TextView](R.id.title) object layout { val abc_screen_toolbar = TypedLayout[ActionBarOverlayLayout](R.layout.abc_screen_toolbar) } } class MyActivity extends AppCompatActivity with TypedActivity { val titleTextView = findView(title) //titleTextView inferred as TextView, no casting needed } (Scala on Android) 㱺 Painless Android Development with Scala 6

Slide 7

Slide 7 text

SBT 㱺 Android SDK Plugin 㱺 proguard Size Matters Scala byte code size reduced ~ (2.8M) (Scala on Android) 㱺 Painless Android Development with Scala 7

Slide 8

Slide 8 text

SBT 㱺 Android SDK Plugin — https://github.com/pfn/android-sdk-plugin — Active — Fast (incremental compilation and proguard caching) — Proguard + MultiDexApplication integration (Circumvents 65K method limit) — Supports AAR, JAR and APK artifact types (Scala on Android) 㱺 Painless Android Development with Scala 8

Slide 9

Slide 9 text

Java Vs Scala 㱺 NullPointerExceptions Person person = getPerson(); String name = null; if (person != null && person.getJob() != null) { name = person.getJob().getName(); } if (name != null) { return name; } else { return DEFAULT_NAME; } (Scala on Android) 㱺 Painless Android Development with Scala 9

Slide 10

Slide 10 text

Java Vs Scala 㱺 NullPointerExceptions val jobName : Option[String] = person.job map (_.name) OR val jobName : Option[String] = for { job <- person.job } yield job.name OR Option, Try, Either, \/, Validation (Scala on Android) 㱺 Painless Android Development with Scala 10

Slide 11

Slide 11 text

Java Vs Scala 㱺 Contexts public class MainActivity extends Activity { public void bar() { FooUtils.get(getContext(), R.string.name); } } public class FooUtils { static String get(Context c, int res) { return c.getString(res); } } (Scala on Android) 㱺 Painless Android Development with Scala 11

Slide 12

Slide 12 text

Java Vs Scala 㱺 Contexts class MainActivity extends Activity { implicit val ctx = getApplicationContext def bar = FooUtils.get(R.string.name) } object FooUtils { def get(res : Int)(implicit ctx : Context) = { ctx.getString(res) } } (Scala on Android) 㱺 Painless Android Development with Scala 12

Slide 13

Slide 13 text

Java Vs Scala 㱺 Contexts trait Contexts { self : Activity => implicit val appContext = getApplicationContext implicit val activityContext = this } class MainActivity extends Activity with Contexts { def bar = FooUtils.get(R.string.name) } object FooUtils { def get(res : Int)(implicit ctx : Context) = { ctx.getString(res) } } (Scala on Android) 㱺 Painless Android Development with Scala 13

Slide 14

Slide 14 text

Java Vs Scala 㱺 Implicit Classes public class TextViewUtils { public void loadFont(TextView textView, String font) { textView.setFontType(font,...) } } TextViewUtils.loadFont(textView, "robotto"); (Scala on Android) 㱺 Painless Android Development with Scala 14

Slide 15

Slide 15 text

Java Vs Scala 㱺 Implicit Classes object Helpers { implicit class TextViewHelpers(textView: TextView) { def loadFont(font: String) = ??? } } import Helpers._ textView.loadFont(“Roboto.ttf”) (Scala on Android) 㱺 Painless Android Development with Scala 15

Slide 16

Slide 16 text

Java Vs Scala 㱺 Async public class MyTask1 extends AsyncTask { protected Integer doInBackground(Void... v) { return r1; } protected void onPostExecute(Integer result) { new MyTask2().execute(result); } } public class MyTask2 extends AsyncTask { protected Integer doInBackground(Integer... r1) { return r2; } protected void onPostExecute(Integer result) { r1 + r2; } } new MyTask1().execute(); (Scala on Android) 㱺 Painless Android Development with Scala 16

Slide 17

Slide 17 text

Java Vs Scala 㱺 Async def myTask1: Future[Int] = Future(1) def myTask2: Future[Int] = Future(2) def sumResponses: Future[Int] = for { r1 <- myTaks1 r2 <- myTaks2 } yield (r1 + r2) sumResponses map println (Scala on Android) 㱺 Painless Android Development with Scala 17

Slide 18

Slide 18 text

Java Vs Scala 㱺 Async Future.reduce(List(Future(1), Future(2))) { (a, b) => a + b } (Scala on Android) 㱺 Painless Android Development with Scala 18

Slide 19

Slide 19 text

Java Vs Scala 㱺 Async Future.reduce(List(Future(1), Future(2))) (_ + _) (Scala on Android) 㱺 Painless Android Development with Scala 19

Slide 20

Slide 20 text

Java Vs Scala 㱺 Models public class Person { private String name; private String lastName; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } (Scala on Android) 㱺 Painless Android Development with Scala 20

Slide 21

Slide 21 text

Java Vs Scala 㱺 Models case class Person( name : String, lastName : String) (Scala on Android) 㱺 Painless Android Development with Scala 21

Slide 22

Slide 22 text

Java Vs Scala 㱺 Pattern Matching public boolean onTouchEvent(MotionEvent ev) { ... switch (action) { case MotionEvent.ACTION_DOWN: ... break; case MotionEvent.ACTION_MOVE: ... break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: ... break; } } (Scala on Android) 㱺 Painless Android Development with Scala 22

Slide 23

Slide 23 text

Java Vs Scala 㱺 Pattern Matching def onTouchEvent(ev: MotionEvent) { import MotionEvent._ action match { case ACTION_DOWN => ??? case ACTION_MOVE => ??? case ACTION_UP | ACTION_CANCEL => ??? } } (Scala on Android) 㱺 Painless Android Development with Scala 23

Slide 24

Slide 24 text

Java Vs Scala 㱺 Pattern Matching person match { case Person(_, lastName) if lastName == “Pacheco” => println(“Guapetón”) case Person(name, _) if name == “Raúl” => println(“Resultón”) case _ => println(“Programadores Java”) } (Scala on Android) 㱺 Painless Android Development with Scala 24

Slide 25

Slide 25 text

Java Vs Scala 㱺 Singletons public class MySingleton { private MySingleton(){} public synchronized static MySingleton getInstance() { if(instance == null) instance = new MySingleton (); return instance; } public void bar(){ ... } } (Scala on Android) 㱺 Painless Android Development with Scala 25

Slide 26

Slide 26 text

Java Vs Scala 㱺 Singletons object MySingleton { def bar = ... } (Scala on Android) 㱺 Painless Android Development with Scala 26

Slide 27

Slide 27 text

Java Vs Scala 㱺 Mixins class Mammal class PlatyPus extends Mammal new PlatyPus().eggs() <- Compilation Error!!! (Scala on Android) 㱺 Painless Android Development with Scala 27

Slide 28

Slide 28 text

Java Vs Scala 㱺 Mixins trait Mammal trait EggsSupport { def eggs : Eggs } class PlatyPus extends Mammal with EggsSupport PlatyPus().eggs <- Success!!! (Scala on Android) 㱺 Painless Android Development with Scala 28

Slide 29

Slide 29 text

OS Apps 㱺 Translate Bubble https://play.google.com/store/apps/details?id=com.fortysevendeg.translatebubble https://github.com/47deg/translate-bubble-android (Scala on Android) 㱺 Painless Android Development with Scala 29

Slide 30

Slide 30 text

OS Apps 㱺 Scala Days Official App https://play.google.com/store/apps/details?id=com.fortysevendeg.android.scaladays https://github.com/47deg/scala-days-android (Scala on Android) 㱺 Painless Android Development with Scala 30

Slide 31

Slide 31 text

OS Apps 㱺 Scala API Demos https://play.google.com/store/apps/details?id=com.fortysevendeg.scala.android https://github.com/47deg/scala-android (Scala on Android) 㱺 Painless Android Development with Scala 31

Slide 32

Slide 32 text

Thank you @47deg @javielinux @raulraja http://47deg.com/blog https://speakerdeck.com/raulraja/painless-android-development-with-scala- deck https://github.com/47deg/painless-android-development-with-scala-deck (Scala on Android) 㱺 Painless Android Development with Scala 32