25
ANDROID + SCALA Iniciando o desenvolvimento Programação Reativa Funcional

Scala no Android

Embed Size (px)

Citation preview

Page 1: Scala no Android

ANDROID + SCALAIniciando o desenvolvimento

Programação Reativa Funcional

Page 2: Scala no Android

AGENDA• Por que Scala no Android?

• Build System (SBT)

• Scaloid

• Macroid

• FRP: RxJava + Scala vs. Scala.Rx

• Dificuldades

Page 3: Scala no Android

POR QUE……Scala no Android?

Page 4: Scala no Android

FUN & BYE BYE BOILERPLATE

• Diversão!!! =]

• Todas as vantagens do Scala sobre o Java

• Sintaxe limpa para o paradigma reativo funcional, que requer funções de ordem superior

• Diminuir código “boilerplate” necessário no Android

Page 5: Scala no Android

FRP: JAVA VS. SCALA

EditText message = (EditText)findViewById(R.id.message); final TextView charCount = (TextView)findViewById(R.id.char_count); Events.text(message).subscribe(new Action1<String>() { @Override public void call(String str) { charCount.setText(String.valueOf(str.length())); } });

val message = find[EditText](R.id.message) val charCount = find[TextView](R.id.char_count) Events.text(message).subscribe((str: String) => charCount.setText(str.length.toString))

Java

Scala

Page 6: Scala no Android

ESTAMOS EM 2014!

Page 7: Scala no Android

ESTAMOS EM 2014!

Mas ainda com return

Page 8: Scala no Android

SBT• Padrão para o Scala

• Convention over configuration

• Plugin maduro (02/2012) para Android:

• https://github.com/pfn/android-sdk-plugin

• Compatível com estrutura Ant ou Gradle

Page 9: Scala no Android

GRADLE + ANDROID

• Manter a estrutura exata do projeto Android Studio

• Plugin muito novo (02/2014) para Scala

• https://github.com/saturday06/gradle-android-scala-plugin

• Não funcionou nos meus testes

Page 10: Scala no Android

CRIANDO UM PROJETO• Conforme recomendação do android-sdk-plugin,

usamos IntelliJ, criamos uma aplicação Android

• Movemos o módulo app para a raiz

• Criamos o build.sbt e project/plugings.sbt

• Apagamos os arquivos gradle*

Page 11: Scala no Android

build.sbt// so we can use keywords from Android, such as 'Android' and 'proguardOptions' import android.Keys._ import android.Dependencies.{apklib,aar} !android.Plugin.androidBuild !name := "Reactive" !platformTarget in Android := "android-19" !versionCode in Android := Some(7) !versionName in Android := Some(“1.0") !proguardOptions in Android ++= Seq( "-dontobfuscate", "-dontoptimize", "-dontwarn android.**", "-dontwarn com.android.**" ) !libraryDependencies ++= Seq( "org.scaloid" %% "scaloid" % "3.2.1-8", "com.android.support" % "appcompat-v7" % "19.1.0" )

Page 12: Scala no Android

project/plugins.sbt

addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.2.17") !addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

project/build.propertiessbt.version=0.13.1

Page 13: Scala no Android

SCALOID• Biblioteca para Android em Scala

• Facilitar a vida tirando bastante boilerplate

• Sugere a criação de layouts em Scala

• Eu não gosto desse approach, por enquanto

• Muitos implicits

Page 14: Scala no Android

SCALOID: EXEMPLOS

Button send = (Button)findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(SecondActivity.this, "Clique!", Toast.LENGTH_SHORT).show(); } });

val send = find[Button](R.id.send) send.onClick(toast("Clique!"))

Java sem Scaloid

Scala com Scaloid

Page 15: Scala no Android

SCALOID: LAYOUTnew SVerticalLayout { STextView("Sign in").textSize(24.5 sp).<<.marginBottom(25 dip).>> STextView("ID") SEditText() STextView("Password") SEditText() inputType TEXT_PASSWORD SButton("Sign in") this += new SLinearLayout { SButton("Help") SButton("Sign up") } }.padding(20 dip)

Page 16: Scala no Android

MACROID• Mesma ideia do layout em Scala

• Implementado com macros

• Ferramentas para ligar ao código da aplicação

• UI Actions, Tweaks etc…

• Melhor pensado que o Scaloid para interface

• Mesmo assim não tem feedback imediato na IDE

http://macroid.github.io/

Page 17: Scala no Android

MACROID: LAYOUT

l[LinearLayout]( // set button caption w[Button] <~ text("Click me"), ! // set text and hide for the time being w[TextView] <~ text("Hello!") <~ hide ! // set layout orientation ) <~ vertical

Page 18: Scala no Android

FRP FTW!

• Comportamento do app é escrito de maneira declarativa

• Ganhos tradicionais do paradigma funcional

• Ações processadas através de funções

• Estado intimamente ligado à UI

• Funções puras são mais fáceis de testar que objetos

Page 19: Scala no Android

FRAMEWORKS DE FRP• RxJava + Scala

• https://github.com/Netflix/RxJava

• Java puro

• Funciona no Android sem Scala

• Baseado em stream de eventos

• Bindings para Scala

• Scala.Rx

• https://github.com/lihaoyi/scala.rx

• Scala puro

• Funciona em Scala.JS

• Baseado em valores

• Projeto de um homem só

Page 20: Scala no Android

FRP: APLICAÇÃO

• Tudo o que for assíncrono

• Eventos de UI

• Acesso serviços locais / remotos

• Quase tudo em um app…

Page 21: Scala no Android

CODE! CODE! CODE!

Page 22: Scala no Android

DIFICULDADES• Não consegui integrar o “run” do IntelliJ com o comando do SBT

• Sempre que alguma lib for trocada, é necessário rodar o sbt gen-idea

• Problemas com o Proguard

• Ele é necessário inclusive em DEBUG

• Problemas de método / classe não encontrada ao rodar requerem um sbt clean

Page 23: Scala no Android

PERGUNTAS?

Page 24: Scala no Android

OBRIGADO!

Page 25: Scala no Android

TRABALHE COM SCALAA Pinuts está contratando

Quer trabalhar com scala?

Fale comigo!

André Luiz Carvalho [email protected] @alcarv

RH da Pinuts [email protected]