krakdroid: scala on android
DESCRIPTION
A revamped talk about #scala programming on #android. Presentation given at krakdroid 2012. http://krakdroid.plTRANSCRIPT
![Page 1: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/1.jpg)
Scala Android
Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
KrakDroid 14.12.2012Sunday, December 16, 12
![Page 2: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/2.jpg)
Sunday, December 16, 12
![Page 3: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/3.jpg)
Sunday, December 16, 12
![Page 4: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/4.jpg)
Scala is
Sunday, December 16, 12
![Page 5: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/5.jpg)
Scala is
Sunday, December 16, 12
![Page 6: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/6.jpg)
Scala is
Sunday, December 16, 12
![Page 7: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/7.jpg)
Scala is
Sunday, December 16, 12
![Page 8: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/8.jpg)
Scala is
Simple
Sunday, December 16, 12
![Page 9: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/9.jpg)
Scala is
Simple , but Hard.
Sunday, December 16, 12
![Page 10: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/10.jpg)
Scala is Simple.
Sunday, December 16, 12
![Page 11: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/11.jpg)
Scala is Simple.
Sunday, December 16, 12
![Page 12: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/12.jpg)
Scala is Hard.
http://apocalisp.wordpress.com/2010/10/26/type-level-programming
-in-scala-part-7-natural-transformation%C2%A0literals/Sunday, December 16, 12
![Page 13: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/13.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/14.jpg)
Scala is
Sunday, December 16, 12
![Page 15: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/15.jpg)
Scala is
A Functional,
Sunday, December 16, 12
![Page 16: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/16.jpg)
Scala is
A Functional,Object Oriented,
Sunday, December 16, 12
![Page 17: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/17.jpg)
Scala is
A Functional,Object Oriented,Statically Typed,
Sunday, December 16, 12
![Page 18: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/18.jpg)
Scala is
A Functional,Object Oriented,Statically Typed,
Scalable,
Sunday, December 16, 12
![Page 19: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/19.jpg)
Scala is
A Functional,Object Oriented,Statically Typed,
Scalable,Language...
Sunday, December 16, 12
![Page 20: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/20.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/21.jpg)
Android
Sunday, December 16, 12
![Page 22: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/22.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/23.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/24.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/25.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/26.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/27.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/28.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/29.jpg)
Stairway to Scala
Sunday, December 16, 12
![Page 30: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/30.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/31.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/32.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/33.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/34.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/35.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/36.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/37.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/38.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/39.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/40.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/41.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/42.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/43.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/44.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/45.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/46.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/47.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/48.jpg)
Typed Resource
Sunday, December 16, 12
![Page 49: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/49.jpg)
Typed Resource = Better R
Sunday, December 16, 12
![Page 50: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/50.jpg)
Typed Resource = Better R
Sunday, December 16, 12
![Page 51: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/51.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/52.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/53.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/54.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/55.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/56.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/57.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/58.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/59.jpg)
Types
Sunday, December 16, 12
![Page 60: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/60.jpg)
Types
You always have the type information at hand.
Sunday, December 16, 12
![Page 61: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/61.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/62.jpg)
An Implicit Context
Sunday, December 16, 12
![Page 63: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/63.jpg)
An Implicit Context
Implicit != Explicit
Sunday, December 16, 12
![Page 64: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/64.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/65.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/66.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/67.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/68.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/69.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/70.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/71.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/72.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/73.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/74.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/75.jpg)
An Implicit Context
class ScalaActivity extends Activity with ImplicitContext
Sunday, December 16, 12
![Page 76: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/76.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/77.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/78.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/79.jpg)
Manifests vs. Type Erasure
Sunday, December 16, 12
![Page 80: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/80.jpg)
Manifests vs. Type Erasure
Sunday, December 16, 12
![Page 81: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/81.jpg)
List<Thing> t = marshaller.parseList("[]")
Manifests vs. Type Erasure
Java
Sunday, December 16, 12
![Page 82: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/82.jpg)
List<Thing> t = marshaller.parseList("[]")
Manifests vs. Type Erasure
Java
Uhm... List<Object>...?
Sunday, December 16, 12
![Page 83: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/83.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/84.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/85.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/86.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/87.jpg)
val shareWith = findResource[String](R.string.share_with)
Manifests vs. Type Erasure
Sunday, December 16, 12
![Page 88: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/88.jpg)
Manifests vs. Type Erasure
val shareWith = findResource[String](R.string.share_with)
Sunday, December 16, 12
![Page 89: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/89.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/90.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/91.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/92.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/93.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/94.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/95.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/96.jpg)
Implicit Conversions
Sunday, December 16, 12
![Page 97: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/97.jpg)
Implicit Conversions
Implicit != Explicit
Sunday, December 16, 12
![Page 98: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/98.jpg)
Implicit ConversionsImplicit != Explicit
Sunday, December 16, 12
![Page 99: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/99.jpg)
Implicit ConversionsImplicit != Explicit
Sunday, December 16, 12
![Page 100: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/100.jpg)
Implicit ConversionsImplicit != Explicit
toastMyName("Siegfried")
Sunday, December 16, 12
![Page 101: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/101.jpg)
Implicit ConversionsImplicit != Explicit
toastMyName("Siegfried")
Implicit Context, remember?
Sunday, December 16, 12
![Page 102: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/102.jpg)
Implicit ConversionsImplicit != Explicit
toastMyName("Siegfried")
What if we could...
Sunday, December 16, 12
![Page 103: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/103.jpg)
Implicit ConversionsImplicit != Explicit
toastMyName("Siegfried")
"Siegfried".toast()
What if we could...
Sunday, December 16, 12
![Page 104: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/104.jpg)
Implicit ConversionsImplicit != Explicit
Sunday, December 16, 12
![Page 105: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/105.jpg)
Implicit ConversionsImplicit != Explicit
class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}
Sunday, December 16, 12
![Page 106: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/106.jpg)
Implicit ConversionsImplicit != Explicit
class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}
Decorator
Sunday, December 16, 12
![Page 107: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/107.jpg)
Implicit ConversionsImplicit != Explicit
class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}
DecoratorConstructor
Sunday, December 16, 12
![Page 108: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/108.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/109.jpg)
Implicit ConversionsImplicit != Explicit
class Toastable(msg: String) { def toast()(implicit ctx: Context) = ???}
Sunday, December 16, 12
![Page 110: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/110.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/111.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/112.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/113.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/114.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/115.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/116.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/117.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/118.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/119.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/120.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/121.jpg)
Implicit Conversions
Sunday, December 16, 12
![Page 122: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/122.jpg)
Collections
Sunday, December 16, 12
![Page 123: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/123.jpg)
POJO
Sunday, December 16, 12
![Page 124: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/124.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/125.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/126.jpg)
POSO**Actually just a Case Class
case class Person(name: String, nick: String)
Sunday, December 16, 12
![Page 127: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/127.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/128.jpg)
case class Person(name: String, nick: String)
Case Classes
Sunday, December 16, 12
![Page 129: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/129.jpg)
case class Person(name: String, nick: String)
Case Classes
Sunday, December 16, 12
![Page 130: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/130.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/131.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/132.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/133.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/134.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/135.jpg)
Given a list of People,return all the Hero names.
Sunday, December 16, 12
![Page 136: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/136.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/137.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/138.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/139.jpg)
Sunday, December 16, 12
![Page 140: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/140.jpg)
Java + Guava at their bestGiven a list of People,
return all the Hero names.
Sunday, December 16, 12
![Page 141: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/141.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/142.jpg)
Scala Collections at WorkGiven a list of People,
return all the Hero names.
Sunday, December 16, 12
![Page 143: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/143.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/144.jpg)
And there’s more!
Sunday, December 16, 12
![Page 145: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/145.jpg)
Simple Threading
Sunday, December 16, 12
![Page 146: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/146.jpg)
Simple Threading
implicit val handler = new Handler
Sunday, December 16, 12
![Page 147: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/147.jpg)
Simple Threading
implicit val handler = new Handler
inUiThread { // ...}
Sunday, December 16, 12
![Page 148: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/148.jpg)
Simple Threading
implicit val handler = new Handler
inFutureWithProgressDialog(timeout = 10.seconds) { // ...}
inUiThread { // ...}
Sunday, December 16, 12
![Page 149: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/149.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/150.jpg)
on___
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // ... }});
Java
Sunday, December 16, 12
![Page 151: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/151.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/152.jpg)
SharedPreferences
Sunday, December 16, 12
![Page 153: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/153.jpg)
SharedPreferences
KanbaneryPreferences.projectId = projectId
Sunday, December 16, 12
![Page 154: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/154.jpg)
SharedPreferences
KanbaneryPreferences.projectId = projectId
val name: Option[Long] = KanbaneryPreferences.projectId
Sunday, December 16, 12
![Page 155: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/155.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/156.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/157.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/158.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/159.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/160.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/161.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/162.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/163.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/164.jpg)
String interpolation(scala 2.10)
Sunday, December 16, 12
![Page 165: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/165.jpg)
String interpolation(scala 2.10)
Sunday, December 16, 12
![Page 166: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/166.jpg)
String interpolation(scala 2.10)
Sunday, December 16, 12
![Page 167: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/167.jpg)
String interpolation(scala 2.10)
Won’t compile!
Sunday, December 16, 12
![Page 168: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/168.jpg)
Let me warn you...
Sunday, December 16, 12
![Page 169: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/169.jpg)
Let me warn you...
Scala is addictive.
Sunday, December 16, 12
![Page 170: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/170.jpg)
Let me warn you...
Scala is addictive.
Sunday, December 16, 12
![Page 171: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/171.jpg)
Scala is addictive.
Sunday, December 16, 12
![Page 172: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/172.jpg)
Scala is addictive.
Sunday, December 16, 12
![Page 173: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/173.jpg)
Scala is addictive.
Sunday, December 16, 12
![Page 174: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/174.jpg)
Scala is addictive.
Sunday, December 16, 12
![Page 175: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/175.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/176.jpg)
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](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/177.jpg)
Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
KrakDroid 14.12.2012Sunday, December 16, 12
![Page 178: KrakDroid: Scala on Android](https://reader035.vdocuments.us/reader035/viewer/2022062418/555181c7b4c90596028b4915/html5/thumbnails/178.jpg)
Konrad Malawski / @ktosoplGDG / PJUG / KSUG / SCKRK
KrakDroid 14.12.2012
I love feedback! <3
Sunday, December 16, 12