178
Scala Android Konrad Malawski / @ktosopl GDG / PJUG / KSUG / SCKRK KrakDroid 14.12.2012 Sunday, December 16, 12

KrakDroid: Scala on Android

Embed Size (px)

DESCRIPTION

A revamped talk about #scala programming on #android. Presentation given at krakdroid 2012. http://krakdroid.pl

Citation preview

Page 2: KrakDroid: Scala on Android

Sunday, December 16, 12

Page 3: KrakDroid: Scala on Android

Sunday, December 16, 12

Page 4: KrakDroid: Scala on Android

Scala is

Sunday, December 16, 12

Page 5: KrakDroid: Scala on Android

Scala is

Sunday, December 16, 12

Page 6: KrakDroid: Scala on Android

Scala is

Sunday, December 16, 12

Page 7: KrakDroid: Scala on Android

Scala is

Sunday, December 16, 12

Page 8: KrakDroid: Scala on Android

Scala is

Simple

Sunday, December 16, 12

Page 9: KrakDroid: Scala on Android

Scala is

Simple , but Hard.

Sunday, December 16, 12

Page 10: KrakDroid: Scala on Android

Scala is Simple.

Sunday, December 16, 12

Page 11: KrakDroid: Scala on Android

Scala is Simple.

Sunday, December 16, 12

Page 13: KrakDroid: Scala on Android

Scala is Hard.object  Param  {

   implicit  def  pToT[A[_],  B[_]](f:  (p:  Param[A])  =>  B[p.T]):  A~>B  =  new  (A  ~>  B)  {        def  apply[s](a:  A[s]):  B[s]  =  {            val  v:  Param[A]  {  type  T  =  s}  =  new  Param[A]  {                  type  T  =  s                def  in  =  a            }            f(v)        }    }

}

http://apocalisp.wordpress.com/2010/10/26/type-level-programming

-in-scala-part-7-natural-transformation%C2%A0literals/Sunday, December 16, 12

Page 14: KrakDroid: Scala on Android

Scala is

Sunday, December 16, 12

Page 15: KrakDroid: Scala on Android

Scala is

A Functional,

Sunday, December 16, 12

Page 16: KrakDroid: Scala on Android

Scala is

A Functional,Object Oriented,

Sunday, December 16, 12

Page 17: KrakDroid: Scala on Android

Scala is

A Functional,Object Oriented,Statically Typed,

Sunday, December 16, 12

Page 18: KrakDroid: Scala on Android

Scala is

A Functional,Object Oriented,Statically Typed,

Scalable,

Sunday, December 16, 12

Page 19: KrakDroid: Scala on Android

Scala is

A Functional,Object Oriented,Statically Typed,

Scalable,Language...

Sunday, December 16, 12

Page 20: KrakDroid: Scala on Android

Scala is

A Functional,Object Oriented,Statically Typed,

Scalable,Language...

...running on the JVM and DVM!

Sunday, December 16, 12

Page 21: KrakDroid: Scala on Android

Android

Sunday, December 16, 12

Page 22: KrakDroid: Scala on Android

findViewByIdpublic class MyActivity extends Activity {

ListView comments; Button newComment;

@Override void onCreate(Bundle bundle) { super.onCreate(bundle); comments = (ListView) findViewById(R.id.comments); newComment = (Button) findViewById(R.id.new_comment); // ... }}

Sunday, December 16, 12

Page 23: KrakDroid: Scala on Android

findViewByIdpublic class MyActivity extends Activity {

ListView comments; Button newComment;

@Override void onCreate(Bundle bundle) { super.onCreate(bundle); comments = (ListView) findViewById(R.id.comments); newComment = (Button) findViewById(R.id.new_comment); // ... }}

is null at first...

Sunday, December 16, 12

Page 24: KrakDroid: Scala on Android

findViewByIdpublic class MyActivity extends Activity {

ListView comments; Button newComment;

@Override void onCreate(Bundle bundle) { super.onCreate(bundle); comments = (ListView) findViewById(R.id.comments); newComment = (Button) findViewById(R.id.new_comment); // ... }}

initialized in method...

Sunday, December 16, 12

Page 25: KrakDroid: Scala on Android

findViewByIdpublic class MyActivity extends Activity {

ListView comments; Button newComment;

@Override void onCreate(Bundle bundle) { super.onCreate(bundle); comments = (ListView) findViewById(R.id.comments); newComment = (Button) findViewById(R.id.new_comment); // ... }} Explicit casting!

Sunday, December 16, 12

Page 26: KrakDroid: Scala on Android

Robo Guicepublic class MakeANoteActivity extends Activity implements View.OnClickListener{ public static final String PHOTO_PATH = "picture_path"; public static final String PHOTO_ATTACHED = "photo_attached";

@Inject SessionManager sessionManager; @Inject LocationHelper locationHelper; @Inject PhotoHelper photoHelper; @Inject Application context;

@Inject CalibrationHelper calibrationHelper;

@InjectView(R.id.attach_photo) Button attachPhoto; @InjectView(R.id.note_text) EditText noteText; @InjectView(R.id.save_button) Button save; @InjectView(R.id.date) TextView dateText; @InjectView(R.id.share) Button share;

@InjectResource(R.string.im_aircasting) String imAircasting; @InjectResource(R.string.share_with) String shareWith;

// ... }

So many words...

Sunday, December 16, 12

Page 27: KrakDroid: Scala on Android

Robo Guicepublic class MakeANoteActivity extends RoboActivity implements View.OnClickListener{ public static final String PHOTO_PATH = "picture_path"; public static final String PHOTO_ATTACHED = "photo_attached";

@Inject SessionManager sessionManager; @Inject LocationHelper locationHelper; @Inject PhotoHelper photoHelper; @Inject Application context;

@Inject CalibrationHelper calibrationHelper;

@InjectView(R.id.attach_photo) Button attachPhoto; @InjectView(R.id.note_text) EditText noteText; @InjectView(R.id.save_button) Button save; @InjectView(R.id.date) TextView dateText; @InjectView(R.id.share) Button share;

@InjectResource(R.string.im_aircasting) String imAircasting; @InjectResource(R.string.share_with) String shareWith;

// ... }

Type changes in XML, but not here...

ClassCastException!

Sunday, December 16, 12

Page 28: KrakDroid: Scala on Android

Robo Guicepublic class MakeANoteActivity extends RoboActivity implements View.OnClickListener{ public static final String PHOTO_PATH = "picture_path"; public static final String PHOTO_ATTACHED = "photo_attached";

@Inject SessionManager sessionManager; @Inject LocationHelper locationHelper; @Inject PhotoHelper photoHelper; @Inject Application context;

@Inject CalibrationHelper calibrationHelper;

@InjectView(R.id.attach_photo) Button attachPhoto; @InjectView(R.id.note_text) EditText noteText; @InjectView(R.id.save_button) Button save; @InjectView(R.id.date) TextView dateText; @InjectView(R.id.share) Button share;

@InjectResource(R.string.im_aircasting) String imAircasting; @InjectResource(R.string.share_with) String shareWith;

// ... }

Guice is eager. Startup can take a few seconds!

Sunday, December 16, 12

Page 29: KrakDroid: Scala on Android

Stairway to Scala

Sunday, December 16, 12

Page 30: KrakDroid: Scala on Android

Another look at the Java codepublic class MakeANoteActivity extends RoboActivity implements View.OnClickListener

{ public static final String PHOTO_PATH = "picture_path"; public static final String PHOTO_ATTACHED = "photo_attached";

@Inject SessionManager sessionManager; @Inject LocationHelper locationHelper; @Inject PhotoHelper photoHelper; @Inject Application context;

@Inject CalibrationHelper calibrationHelper;

@InjectView(R.id.attach_photo) Button attachPhoto; @InjectView(R.id.note_text) EditText noteText; @InjectView(R.id.save_button) Button save; @InjectView(R.id.date) TextView dateText; @InjectView(R.id.share) Button share;

@InjectResource(R.string.im_aircasting) String imAircasting; @InjectResource(R.string.share_with) String shareWith;

// ... }

Sunday, December 16, 12

Page 31: KrakDroid: Scala on Android

public class MakeANoteActivity extends RoboActivity implements View.OnClickListener

{ public static final String PHOTO_PATH = "picture_path"; public static final String PHOTO_ATTACHED = "photo_attached";

@Inject SessionManager sessionManager; @Inject LocationHelper locationHelper; @Inject PhotoHelper photoHelper; @Inject Application context;

@Inject CalibrationHelper calibrationHelper;

@InjectView(R.id.attach_photo) Button attachPhoto; @InjectView(R.id.note_text) EditText noteText; @InjectView(R.id.save_button) Button save; @InjectView(R.id.date) TextView dateText; @InjectView(R.id.share) Button share;

@InjectResource(R.string.im_aircasting) String imAircasting; @InjectResource(R.string.share_with) String shareWith;

// ... }

What if... Scala?

Sunday, December 16, 12

Page 32: KrakDroid: Scala on Android

class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val imAircasting = findResource[String](R.string.im_aircasting) val shareWith = findResource[String](R.string.share_with)

def toastConferenceName() = "KrakDroid".toast()}

What if... Scala?

Sunday, December 16, 12

Page 33: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

public is default.

Sunday, December 16, 12

Page 34: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

ScalaActivity gives us some magic methods

Sunday, December 16, 12

Page 35: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

ScalaActivity gives us some magic methods

It’s so easy, YOU can implement it!

Sunday, December 16, 12

Page 36: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

ScalaActivity gives us some magic methods

It’s so easy, YOU can implement it!

Sunday, December 16, 12

Page 37: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Instead of “...Helper”,use Traits.

Sunday, December 16, 12

Page 38: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Type Inference

Sunday, December 16, 12

Page 39: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Who’s missing here?

Sunday, December 16, 12

Page 40: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

lazy initialization

Sunday, December 16, 12

Page 41: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Needs Context

Sunday, December 16, 12

Page 42: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

What’s the type here?!?

Sunday, December 16, 12

Page 43: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

What’s the type here?!?

Typed Resource - “a better R”

Sunday, December 16, 12

Page 44: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

What’s the type here?!?

Typed Resource - “a better R”

XML Type changes... Type here changes!

Sunday, December 16, 12

Page 45: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share: Button = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

What’s the type here?!?

Typed Resource - “a better R”

You can be explicit though!

Sunday, December 16, 12

Page 46: KrakDroid: Scala on Android

class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

What if... Scala?

Like @InjectResource, but smarter

Manifests vs. Type Erasure

Sunday, December 16, 12

Page 47: KrakDroid: Scala on Android

What if... Scala?class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Does String have a toast() method?

Implicit Conversion

Sunday, December 16, 12

Page 48: KrakDroid: Scala on Android

Typed Resource

Sunday, December 16, 12

Page 49: KrakDroid: Scala on Android

Typed Resource = Better R

Sunday, December 16, 12

Page 50: KrakDroid: Scala on Android

Typed Resource = Better R

Sunday, December 16, 12

Page 51: KrakDroid: Scala on Android

class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Typed Resource = Better R

Sunday, December 16, 12

Page 52: KrakDroid: Scala on Android

class MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get lazy val locationManager = LocationManager.get

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

val username = findResource[String](R.string.my_username) val friends = findResource[List[String]](R.string.friends)

def toastConferenceName() = "KrakDroid".toast()}

Typed Resource

Typed Resource = Better R

Sunday, December 16, 12

Page 53: KrakDroid: Scala on Android

case class TypedResource[T](id: Int)case class TypedLayout(id: Int)

object TR { val columns_pager = TypedResource[ViewPager](R.id.columns_pager)

val workspaces = TypedResource[ExpandableListView](R.id.workspaces)

val subtask_txt = TypedResource[TextView](R.id.subtask_txt) // ...

}

Typed Resource = Better R

Sunday, December 16, 12

Page 54: KrakDroid: Scala on Android

Typed Resource = Better R

case class TypedResource[T](id: Int)case class TypedLayout(id: Int)

object TR { val columns_pager = TypedResource[ViewPager](R.id.columns_pager)

val workspaces = TypedResource[ExpandableListView](R.id.workspaces)

val subtask_txt = TypedResource[TextView](R.id.subtask_txt) // ...

}

Sunday, December 16, 12

Page 55: KrakDroid: Scala on Android

Typed Resource = Better R

case class TypedResource[T](id: Int)case class TypedLayout(id: Int)

object TR { val columns_pager = TypedResource[ViewPager](R.id.columns_pager)

val workspaces = TypedResource[ExpandableListView](R.id.workspaces)

val subtask_txt = TypedResource[TextView](R.id.subtask_txt) // ...

}

Wrappers

Sunday, December 16, 12

Page 56: KrakDroid: Scala on Android

Typed Resource = Better R

case class TypedResource[T](id: Int)case class TypedLayout(id: Int)

object TR { val columns_pager = TypedResource[ViewPager](R.id.columns_pager)

val workspaces = TypedResource[ExpandableListView](R.id.workspaces)

val subtask_txt = TypedResource[TextView](R.id.subtask_txt) // ...

}

Sunday, December 16, 12

Page 57: KrakDroid: Scala on Android

Typed Resource = Better R

case class TypedResource[T](id: Int)case class TypedLayout(id: Int)

object TR { val columns_pager = TypedResource[ViewPager](R.id.columns_pager)

val workspaces = TypedResource[ExpandableListView](R.id.workspaces)

val subtask_txt = TypedResource[TextView](R.id.subtask_txt) // ...

}

Sunday, December 16, 12

Page 58: KrakDroid: Scala on Android

TR in Actionclass MakeANoteActivity extends ScalaActivity with View.OnClickListener with PhotoOperations with CalibrationOperations{ val PhotoPath = "picture_path" val PhotoAttached = "photo_attached"

lazy val sessionManager = SessionManager.get // magic here but lazy val locationManager = LocationManager.get // we’ll see this later!

lazy val attachPhoto = findView(TR.attach_photo) lazy val noteText = findView(TR.note_text) lazy val save = findView(TR.save_button) lazy val dateText = findView(TR.date) lazy val share = findView(TR.share)

// magic here too, but we’ll implement this in a few slides! val imAircasting = findResource[String](R.string.im_aircasting) val shareWith = findResource[String](R.string.share_with)

// ...}

Sunday, December 16, 12

Page 59: KrakDroid: Scala on Android

Types

Sunday, December 16, 12

Page 60: KrakDroid: Scala on Android

Types

You always have the type information at hand.

Sunday, December 16, 12

Page 61: KrakDroid: Scala on Android

Types

You always have the type information at hand.

(IntelliJ IDEA, Ensmine/Emacs, Eclipse)⌘ SHIFT I

ALT =

Sunday, December 16, 12

Page 62: KrakDroid: Scala on Android

An Implicit Context

Sunday, December 16, 12

Page 63: KrakDroid: Scala on Android

An Implicit Context

Implicit != Explicit

Sunday, December 16, 12

Page 64: KrakDroid: Scala on Android

An Implicit ContextImplicit != Explicit

def toastMyName(name: String, ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

toastMyName(”Siegfried”, getContext)

Sunday, December 16, 12

Page 65: KrakDroid: Scala on Android

def toastMyName(name: String, ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

toastMyName(”Siegfried”, getContext)

An Implicit ContextImplicit != Explicit

Explicit Parameter

Sunday, December 16, 12

Page 66: KrakDroid: Scala on Android

def toastMyName(name: String, ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

toastMyName(”Siegfried”, getContext)

An Implicit ContextImplicit != Explicit

Explicit ParameterExplicit Parameter

Sunday, December 16, 12

Page 67: KrakDroid: Scala on Android

def toastMyName(name: String, ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

toastMyName(”Siegfried”, getContext)

An Implicit ContextImplicit != Explicit

Import inside a method!

Sunday, December 16, 12

Page 68: KrakDroid: Scala on Android

def toastMyName(name: String, ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

toastMyName(”Siegfried”, getContext)

An Implicit ContextImplicit != Explicit

Sunday, December 16, 12

Page 69: KrakDroid: Scala on Android

def toastMyName(name: String)(implicit ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

An Implicit ContextImplicit != Explicit

Sunday, December 16, 12

Page 70: KrakDroid: Scala on Android

Implicit ParametersImplicit != Explicit

def toastMyName(name: String)(implicit ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

Implicit Parameter

Sunday, December 16, 12

Page 71: KrakDroid: Scala on Android

Implicit ParametersImplicit != Explicit

def toastMyName(name: String)(implicit ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

Sunday, December 16, 12

Page 72: KrakDroid: Scala on Android

Implicit ParametersImplicit != Explicit

def toastMyName(name: String)(implicit ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

toastMyName("Siegfried")

Sunday, December 16, 12

Page 73: KrakDroid: Scala on Android

Implicit ParametersImplicit != Explicit

def toastMyName(name: String)(implicit ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

implicit val context: Context = getContext

toastMyName("Siegfried")

Sunday, December 16, 12

Page 74: KrakDroid: Scala on Android

Implicit ParametersImplicit != Explicit

def toastMyName(name: String)(implicit ctx: Context) { import android.widget.Toast._ makeText(ctx, msg, LENGTH_LONG).show()}

implicit val context: Context = getContext

toastMyName("Siegfried")

toastMyName("Siegfried")(context)

Sunday, December 16, 12

Page 75: KrakDroid: Scala on Android

An Implicit Context

class ScalaActivity extends Activity with ImplicitContext

Sunday, December 16, 12

Page 76: KrakDroid: Scala on Android

An Implicit Context

trait ImplicitContext { this: Activity => implicit val ctx = getContext}

class ScalaActivity extends Activity with ImplicitContext

Sunday, December 16, 12

Page 77: KrakDroid: Scala on Android

An Implicit Context

trait ImplicitContext { this: Activity => implicit val ctx = getContext}

class ScalaActivity extends Activity with ImplicitContext

“I can be only mixed intoan Activity.”

Sunday, December 16, 12

Page 78: KrakDroid: Scala on Android

An Implicit Context

trait ImplicitContext { this: Activity => implicit val ctx = getContext}

class ScalaActivity extends Activity with ImplicitContext

“I can be only mixed intoan Activity.”

So I know this method!

Sunday, December 16, 12

Page 79: KrakDroid: Scala on Android

Manifests vs. Type Erasure

Sunday, December 16, 12

Page 80: KrakDroid: Scala on Android

Manifests vs. Type Erasure

Sunday, December 16, 12

Page 81: KrakDroid: Scala on Android

List<Thing> t = marshaller.parseList("[]")

Manifests vs. Type Erasure

Java

Sunday, December 16, 12

Page 82: KrakDroid: Scala on Android

List<Thing> t = marshaller.parseList("[]")

Manifests vs. Type Erasure

Java

Uhm... List<Object>...?

Sunday, December 16, 12

Page 83: KrakDroid: Scala on Android

List<Thing> t = marshaller.parseList("[]")

List<Thing> t = marshaller.parseList("[]", Thing.class)

Manifests vs. Type Erasure

Java

Uhm... List<Object>...?

Sunday, December 16, 12

Page 84: KrakDroid: Scala on Android

List<Thing> t = marshaller.parseList("[]")

List<Thing> t = marshaller.parseList("[]", Thing.class)

Manifests vs. Type Erasure

Java

Uhm... List<Object>...?

Oh! List<Thing>, sure!

Sunday, December 16, 12

Page 85: KrakDroid: Scala on Android

List<Thing> t = marshaller.parseList("[]")

List<Thing> t = marshaller.parseList("[]", Thing.class)

val t: List[Thing] = marshaller.parseList("[]")

Manifests vs. Type Erasure

Java

Scala

Uhm... List<Object>...?

Oh! List<Thing>, sure!

Sunday, December 16, 12

Page 86: KrakDroid: Scala on Android

List<Thing> t = marshaller.parseList("[]")

List<Thing> t = marshaller.parseList("[]", Thing.class)

val t: List[Thing] = marshaller.parseList("[]")

Manifests vs. Type Erasure

Java

Scala

Uhm... List<Object>...?

Oh! List<Thing>, sure!

List[Thing]!

Sunday, December 16, 12

Page 87: KrakDroid: Scala on Android

val shareWith = findResource[String](R.string.share_with)

Manifests vs. Type Erasure

Sunday, December 16, 12

Page 88: KrakDroid: Scala on Android

Manifests vs. Type Erasure

val shareWith = findResource[String](R.string.share_with)

Sunday, December 16, 12

Page 89: KrakDroid: Scala on Android

Manifests vs. Type Erasure

val shareWith = findResource[String](R.string.share_with)

def findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T]

case other => throw new UnableToResolveResource(ofType = other, id = id) }

Sunday, December 16, 12

Page 90: KrakDroid: Scala on Android

Manifests vs. Type Erasuredef findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T]

case other => throw new UnableToResolveResource(ofType = other, id = id) }

val shareWith = findResource[String](R.string.share_with)

implicit

Sunday, December 16, 12

Page 91: KrakDroid: Scala on Android

Manifests vs. Type Erasuredef findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T]

case other => throw new UnableToResolveResource(ofType = other, id = id) }

val shareWith = findResource[String](R.string.share_with)

implicit Manifest

Sunday, December 16, 12

Page 92: KrakDroid: Scala on Android

Manifests vs. Type Erasuredef findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T]

case other => throw new UnableToResolveResource(ofType = other, id = id) }

val shareWith = findResource[String](R.string.share_with)

the type signature

Sunday, December 16, 12

Page 93: KrakDroid: Scala on Android

Manifests vs. Type Erasuredef findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T] case "java.util.ArrayList[java.lang.String]" => newArrayList(ctx.getString(id).asInstanceOf[T])

case other => throw new UnableToResolveResource(ofType = other, id = id) }

val shareWith = findResource[String](R.string.share_with)

see the type... at runtime

Sunday, December 16, 12

Page 94: KrakDroid: Scala on Android

Manifests vs. Type Erasuredef findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T] case "java.util.ArrayList[java.lang.String]" => newArrayList(ctx.getString(id).asInstanceOf[T])

case "Int" => ctx.getString(id).toInt.asInstanceOf[T]

case other => throw new UnableToResolveResource(ofType = other, id = id) }

val shareWith = findResource[String](R.string.share_with)

Sunday, December 16, 12

Page 95: KrakDroid: Scala on Android

Manifests vs. Type Erasuredef findResource[T](id: Int)(implicit ctx: Context, m: Manifest[T]): T = m.toString match { case "java.lang.String" => ctx.getString(id).asInstanceOf[T] case "java.util.ArrayList[java.lang.String]" => newArrayList(ctx.getString(id).asInstanceOf[T])

case "Int" => ctx.getString(id).toInt.asInstanceOf[T]

case other => throw new UnableToResolveResource(ofType = other, id = id) }

val shareWith = findResource[String](R.string.share_with)

java.lang.String has this...?

Sunday, December 16, 12

Page 96: KrakDroid: Scala on Android

Implicit Conversions

Sunday, December 16, 12

Page 97: KrakDroid: Scala on Android

Implicit Conversions

Implicit != Explicit

Sunday, December 16, 12

Page 98: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

Sunday, December 16, 12

Page 99: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

Sunday, December 16, 12

Page 100: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

toastMyName("Siegfried")

Sunday, December 16, 12

Page 101: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

toastMyName("Siegfried")

Implicit Context, remember?

Sunday, December 16, 12

Page 102: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

toastMyName("Siegfried")

What if we could...

Sunday, December 16, 12

Page 103: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

toastMyName("Siegfried")

"Siegfried".toast()

What if we could...

Sunday, December 16, 12

Page 104: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

Sunday, December 16, 12

Page 105: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

Sunday, December 16, 12

Page 106: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

Decorator

Sunday, December 16, 12

Page 107: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

DecoratorConstructor

Sunday, December 16, 12

Page 108: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

new Toastable("Hello!").toast()

Sunday, December 16, 12

Page 109: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

Sunday, December 16, 12

Page 110: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)}

Sunday, December 16, 12

Page 111: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)}

Implicit Conversion: String => Toastable

Sunday, December 16, 12

Page 112: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)}

asToastable("Hello!").toast()

Implicit Conversion: String => Toastable

Sunday, December 16, 12

Page 113: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)}

Implicit Conversion: String => Toastable

Sunday, December 16, 12

Page 114: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)}

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

Sunday, December 16, 12

Page 115: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)}

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

Sunday, December 16, 12

Page 116: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)} "Hello!".toast()

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

Sunday, December 16, 12

Page 117: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)} "Hello!".toast()

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

Sunday, December 16, 12

Page 118: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)} "Hello!".toast()

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

Sunday, December 16, 12

Page 119: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)} "Hello!".toast()

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

Sunday, December 16, 12

Page 120: KrakDroid: Scala on Android

Implicit ConversionsImplicit != Explicit

class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}

trait ScalaToasts {

implicit def asToastable(str: String) = new Toastable(str)} "Hello!".toast()

class ExampleActivity extends Activity with ImplicitContext with ScalaToasts

asToastable("Hello!").toast()

Sunday, December 16, 12

Page 121: KrakDroid: Scala on Android

Implicit Conversions

Sunday, December 16, 12

Page 122: KrakDroid: Scala on Android

Collections

Sunday, December 16, 12

Page 123: KrakDroid: Scala on Android

POJO

Sunday, December 16, 12

Page 124: KrakDroid: Scala on Android

POJOpublic class Person { private final String name; private final String nick;

public Person(String name, String nick) { this.name = name; this.nick = nick; }

public String getName() { return name; }

public String getNick() { return nick; }

@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false;

Person person = (Person) o;

if (name != null ? !name.equals(person.name) : person.name != null) return false; if (nick != null ? !nick.equals(person.nick) : person.nick != null) return false;

return true; }

@Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (surname != null ? surname.hashCode() : 0); return result; }}

Sunday, December 16, 12

Page 125: KrakDroid: Scala on Android

POJOpublic class Person { private final String name; private final String nick;

public Person(String name, String nick) { this.name = name; this.nick = nick; }

public String getName() { return name; }

public String getNick() { return nick; }

@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false;

Person person = (Person) o;

if (name != null ? !name.equals(person.name) : person.name != null) return false; if (nick != null ? !nick.equals(person.nick) : person.nick != null) return false;

return true; }

@Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (surname != null ? surname.hashCode() : 0); return result; }}

Sunday, December 16, 12

Page 126: KrakDroid: Scala on Android

POSO**Actually just a Case Class

case class Person(name: String, nick: String)

Sunday, December 16, 12

Page 127: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

val name: String

POSO**Actually just a Case Class

Sunday, December 16, 12

Page 128: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

Case Classes

Sunday, December 16, 12

Page 129: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

Case Classes

Sunday, December 16, 12

Page 130: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

val person = Person("Bruce Wayne", "Manbat") // whoops!

Case Classes

Sunday, December 16, 12

Page 131: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

val person = Person("Bruce Wayne", "Manbat") // whoops!

Case Classes

val fixed = person.copy(nick = "Batman")

Sunday, December 16, 12

Page 132: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

val person = Person("Bruce Wayne", "Manbat") // whoops!

val self = Person(nick = "Ktoso" , name = "Konrad")

Case Classes

val fixed = person.copy(nick = "Batman")

Sunday, December 16, 12

Page 133: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

val person = Person("Bruce Wayne", "Manbat") // whoops!

val self = Person(nick = "Ktoso" , name = "Konrad")

val Person(name, hero) = personval hello = ”Hello” + name + ” ” + surname

Case Classes

val fixed = person.copy(nick = "Batman")

Sunday, December 16, 12

Page 134: KrakDroid: Scala on Android

case class Person(name: String, nick: String)

val person = Person("Bruce Wayne", "Manbat") // whoops!

val self = Person(nick = "Ktoso" , name = "Konrad")

val Person(name, hero) = personval hello = ”Hello” + name + ” ” + surname

fixed.toString should equal (”Person(Bruce Wayne, Batman)”)

Case Classes

Still thinking assertThat().isEqualTo() is clean?

val fixed = person.copy(nick = "Batman")

Sunday, December 16, 12

Page 135: KrakDroid: Scala on Android

Given a list of People,return all the Hero names.

Sunday, December 16, 12

Page 136: KrakDroid: Scala on Android

public List<String> heroNames(List<Person> allPersons) { List<String> donePersons = new ArrayList<String>(allPersons.size());

for (Person person : allPersons) { if (person.isHero()) { donePersons.add(person.getName()); } }

return ImmutableList.copyOf(donePersons); }

Given a list of People,return all the Hero names.

Sunday, December 16, 12

Page 137: KrakDroid: Scala on Android

Java with Guava at their BestGiven a list of People,

return all the Hero names.

Sunday, December 16, 12

Page 138: KrakDroid: Scala on Android

Java with Guava at their Best

return FluentIterable .from(people) .filter(new Predicate<Person>() { @Override public boolean apply(Person person) { return person != null && person.isHero(); } }) .transform(new Function<Person, String>() { @Override public String apply(Person input) { return input.getName(); } }) .toImmutableList();

Given a list of People,return all the Hero names.

Sunday, December 16, 12

Page 139: KrakDroid: Scala on Android

Sunday, December 16, 12

Page 140: KrakDroid: Scala on Android

Java + Guava at their bestGiven a list of People,

return all the Hero names.

Sunday, December 16, 12

Page 141: KrakDroid: Scala on Android

Java + Guava at their best

return FluentIterable .from(people) .filter(isSuperHero) .transform(heroToName) .toImmutableList();

Java, yet pretty slick :-)I <3 Guava.

Given a list of People,return all the Hero names.

Sunday, December 16, 12

Page 142: KrakDroid: Scala on Android

Scala Collections at WorkGiven a list of People,

return all the Hero names.

Sunday, December 16, 12

Page 143: KrakDroid: Scala on Android

def heroNames(people: List[Person]) = people filter(_.isHero) map { _.name}

Scala Collections at WorkGiven a list of People,

return all the Hero names.

Sunday, December 16, 12

Page 144: KrakDroid: Scala on Android

And there’s more!

Sunday, December 16, 12

Page 145: KrakDroid: Scala on Android

Simple Threading

Sunday, December 16, 12

Page 146: KrakDroid: Scala on Android

Simple Threading

implicit val handler = new Handler

Sunday, December 16, 12

Page 147: KrakDroid: Scala on Android

Simple Threading

implicit val handler = new Handler

inUiThread { // ...}

Sunday, December 16, 12

Page 148: KrakDroid: Scala on Android

Simple Threading

implicit val handler = new Handler

inFutureWithProgressDialog(timeout = 10.seconds) { // ...}

inUiThread { // ...}

Sunday, December 16, 12

Page 149: KrakDroid: Scala on Android

Simple Threading

implicit val handler = new Handler

inFutureWithProgressDialog(timeout = 10.seconds) { // ...}

inUiThread { // ...}

Implicit Conversion on Int

Sunday, December 16, 12

Page 150: KrakDroid: Scala on Android

on___

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // ... }});

Java

Sunday, December 16, 12

Page 151: KrakDroid: Scala on Android

on___

button onClick { view => // ...}

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // ... }});

Java

Scala

Sunday, December 16, 12

Page 152: KrakDroid: Scala on Android

SharedPreferences

Sunday, December 16, 12

Page 153: KrakDroid: Scala on Android

SharedPreferences

KanbaneryPreferences.projectId = projectId

Sunday, December 16, 12

Page 154: KrakDroid: Scala on Android

SharedPreferences

KanbaneryPreferences.projectId = projectId

val name: Option[Long] = KanbaneryPreferences.projectId

Sunday, December 16, 12

Page 155: KrakDroid: Scala on Android

SharedPreferences

KanbaneryPreferences.projectId = projectId

val name: Option[Long] = KanbaneryPreferences.projectId

What? No implicits?! Assume it works! Skip!

Sunday, December 16, 12

Page 156: KrakDroid: Scala on Android

SharedPreferencesobject KanbaneryPreferences {

private val KeyLogin = "login"

private def sharedPreferences(implicit ctx: Context) = ???

def login(implicit ctx: Context) = sharedPreferences.getString(KeyLogin, "")

Sunday, December 16, 12

Page 157: KrakDroid: Scala on Android

SharedPreferencesobject KanbaneryPreferences {

private val KeyLogin = "login"

private def sharedPreferences(implicit ctx: Context) = ???

def login(implicit ctx: Context) = sharedPreferences.getString(KeyLogin, "")

Sunday, December 16, 12

Page 158: KrakDroid: Scala on Android

SharedPreferencesobject KanbaneryPreferences {

private val KeyLogin = "login"

private def sharedPreferences(implicit ctx: Context) = ???

def login_=(number: String)(implicit ctx: Context) { withSharedPreferencesEditor { _.putString(KeyLogin, number) }

}

Sunday, December 16, 12

Page 159: KrakDroid: Scala on Android

SharedPreferencesobject KanbaneryPreferences {

private val KeyLogin = "login"

private def sharedPreferences(implicit ctx: Context) = ???

def login_=(number: String)(implicit ctx: Context) { withSharedPreferencesEditor { _.putString(KeyLogin, number) }

}

Sunday, December 16, 12

Page 160: KrakDroid: Scala on Android

SharedPreferences

def withSharedPreferencesEditor (block: SharedPreferences.Editor => Unit) (implicit ctx: Context) {

val editor = sharedPreferences.edit()

block(editor)

editor.commit()}

Sunday, December 16, 12

Page 161: KrakDroid: Scala on Android

SharedPreferences

def withSharedPreferencesEditor (block: SharedPreferences.Editor => Unit) (implicit ctx: Context) {

val editor = sharedPreferences.edit()

block(editor)

editor.commit()}

Sunday, December 16, 12

Page 162: KrakDroid: Scala on Android

SharedPreferences

def withSharedPreferencesEditor (block: SharedPreferences.Editor => Unit) (implicit ctx: Context) {

val editor = sharedPreferences.edit()

block(editor)

editor.commit()}

Sunday, December 16, 12

Page 163: KrakDroid: Scala on Android

SharedPreferences

def withSharedPreferencesEditor (block: SharedPreferences.Editor => Unit) (implicit ctx: Context) {

val editor = sharedPreferences.edit()

block(editor)

editor.commit()}

withSharedPreferencesEditor { _.putString(KeyLogin, number) }

Sunday, December 16, 12

Page 164: KrakDroid: Scala on Android

String interpolation(scala 2.10)

Sunday, December 16, 12

Page 165: KrakDroid: Scala on Android

String interpolation(scala 2.10)

Sunday, December 16, 12

Page 166: KrakDroid: Scala on Android

String interpolation(scala 2.10)

Sunday, December 16, 12

Page 167: KrakDroid: Scala on Android

String interpolation(scala 2.10)

Won’t compile!

Sunday, December 16, 12

Page 168: KrakDroid: Scala on Android

Let me warn you...

Sunday, December 16, 12

Page 169: KrakDroid: Scala on Android

Let me warn you...

Scala is addictive.

Sunday, December 16, 12

Page 170: KrakDroid: Scala on Android

Let me warn you...

Scala is addictive.

Sunday, December 16, 12

Page 171: KrakDroid: Scala on Android

Scala is addictive.

Sunday, December 16, 12

Page 172: KrakDroid: Scala on Android

Scala is addictive.

Sunday, December 16, 12

Page 173: KrakDroid: Scala on Android

Scala is addictive.

Sunday, December 16, 12

Page 174: KrakDroid: Scala on Android

Scala is addictive.

Sunday, December 16, 12

Page 175: KrakDroid: Scala on Android

def links = • Scala Lang http://www.scala-lang.org/

• Scala Koans http://www.scalakoans.org

• Blog.Project13.pl - http://www.blog.project13.pl

• SBT Android Plugin - https://github.com/jberkel/android-plugin

• Kanbanery for Android - https://github.com/ktoso/kanbanery-tv• Check pl.project13.scala.android.*• Now OpenSource, in Scala, and Lunar Logic is helping to dev :-)• New version soon! Pull and play with it!

• Scaloid https://github.com/pocorall/scaloid• Though I don’t think their impl. is very clean some things are v. nice!

Sunday, December 16, 12

Page 176: KrakDroid: Scala on Android

def links = • Scala Lang http://www.scala-lang.org/

• Scala Koans http://www.scalakoans.org

• Blog.Project13.pl - http://www.blog.project13.pl

• SBT Android Plugin - https://github.com/jberkel/android-plugin

• Kanbanery for Android - https://github.com/ktoso/kanbanery-tv• Check pl.project13.scala.android.*• Now OpenSource, in Scala, and Lunar Logic is helping to dev :-)• New version soon! Pull and play with it!

• Scaloid https://github.com/pocorall/scaloid• Though I don’t think their impl. is very clean some things are v. nice!

Mailing lists rock!

Sunday, December 16, 12

Page 177: KrakDroid: Scala on Android

Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK

KrakDroid 14.12.2012Sunday, December 16, 12

Page 178: KrakDroid: Scala on Android

Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK

KrakDroid 14.12.2012

I love feedback! <3

Sunday, December 16, 12