$30 off During Our Annual Pro Sale. View Details »

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.

Raúl Raja Martínez

January 31, 2015
Tweet

More Decks by Raúl Raja Martínez

Other Decks in Technology

Transcript

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  16. 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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide