Painless Android Development with Scala

Painless Android Development with Scala

A joint talk with @javielinux about #Scala as an alternative for better #Android Development where some common android development pitfalls are shown and how they can be solved with Scala.

Ad2476bf0540dfaa0fc30cb62c8e07da?s=128

Raúl Raja Martínez

January 31, 2015
Tweet

Transcript

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

  2. 㱺 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
  3. Build Tools (Scala on Android) 㱺 Painless Android Development with

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

    Painless Android Development with Scala 4
  5. SBT 㱺 Android SDK Plugin — Supports all Android SDK

    tasks — dex — typedResourcesGenerator — proguard — buildConfigGenerator — (+ 20... more) (Scala on Android) 㱺 Painless Android Development with Scala 5
  6. 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
  7. SBT 㱺 Android SDK Plugin 㱺 proguard Size Matters Scala

    byte code size reduced ~ (2.8M) (Scala on Android) 㱺 Painless Android Development with Scala 7
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. Java Vs Scala 㱺 Async public class MyTask1 extends AsyncTask<Void,

    Void, Integer> { protected Integer doInBackground(Void... v) { return r1; } protected void onPostExecute(Integer result) { new MyTask2().execute(result); } } public class MyTask2 extends AsyncTask<Integer, Void, Integer> { 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
  17. 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
  18. Java Vs Scala 㱺 Async Future.reduce(List(Future(1), Future(2))) { (a, b)

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

    (Scala on Android) 㱺 Painless Android Development with Scala 19
  20. 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
  21. Java Vs Scala 㱺 Models case class Person( name :

    String, lastName : String) (Scala on Android) 㱺 Painless Android Development with Scala 21
  22. 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
  23. 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
  24. 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
  25. 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
  26. Java Vs Scala 㱺 Singletons object MySingleton { def bar

    = ... } (Scala on Android) 㱺 Painless Android Development with Scala 26
  27. Java Vs Scala 㱺 Mixins class Mammal class PlatyPus extends

    Mammal new PlatyPus().eggs() <- Compilation Error!!! (Scala on Android) 㱺 Painless Android Development with Scala 27
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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