ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… ·...

41

Transcript of ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… ·...

Page 1: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening
Page 2: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

ezhome is a new breed of gardening company that’s revolutionizing the way gardening is done. We’re using technology to help gardeners with their work, enable better communication, and vastly improve the customer experience.

Page 3: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening
Page 4: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

@ezhomeinc

Page 5: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Gardener App Capabilities

Real-time database

Coordinators & Monitoring team

Page 6: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

More...

Easy & Secure authentication

Page 7: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

More...

Offline gardener actions

Offline photos uploading

Share state

Page 8: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

More...

Real-time Feature Toggle

Page 9: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening
Page 10: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Firebase Database

• Cloud-hosted NoSQL database• Real-time - Non HTTP• Data stored as JSON• Offline • Accessible by different devices• Security rules• Multiple Authentication Providers

Page 11: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Firebase Authentication

Page 12: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Plan Data Structure

Need to take care how the data:• is going to be saved• is going to be retrieved

{ "users": { "alovelace": { "name": "Ada Lovelace", "contacts": { "ghopper": true }, }, "ghopper": { }, "eclarke": { } }}

Page 13: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Plan Nested Data Structure

NoSQL databases does not allow JOINS. The solution is to use embedded data with nested data structure. Firebase allows nesting data up to 32 levels deep

{ "chats": { "one": { "title": "Historical Tech Pioneers", "messages": { "m1": { "sender": "ghopper", "message": "Test text." }, "m2": { }, } }, "two": { } }}

Page 14: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Avoid nesting data

When you fetch data at a location in firebase, you also retrieve all of its child nodes.

ExampleI want show the conversation titles from chats:

databaseReference.child("chats");

Page 15: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

More... Fatal Exception: java.lang.RuntimeException: Uncaught exception in Firebase runloop. Please report to [email protected]

at com.firebase.client.android.AndroidPlatform$1$1.run(AndroidPlatform.java:59)

at android.os.Handler.handleCallback(Handler.java:733)

at android.os.Handler.dispatchMessage(Handler.java:95)

at android.os.Looper.loop(Looper.java:136)

at android.app.ActivityThread.main(ActivityThread.java:5057)

at java.lang.reflect.Method.invokeNative(Method.java)

at java.lang.reflect.Method.invoke(Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)

at dalvik.system.NativeStart.main(NativeStart.java)

Page 16: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Caused by java.lang.OutOfMemoryError: [memory exhausted] at dalvik.system.NativeStart.main(NativeStart.java)

More...

Page 17: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Flatten data structure FTW

{ "chats": { "one": { "title": "Historical Tech Pioneers", "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", "timestamp": 1459361875666 }, "two": {}, "three": {} }}

{ "members": { "one": { "ghopper": true, "alovelace": true, "eclarke": true }, "two": { }, "three": { } }}

Page 18: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

More...{ "messages": { "one": { "m1": { "name": "eclarke", "message": "The relay seems to be malfunctioning.", "timestamp": 1459361875337 }, "m2": { ... }, "m3": { ... } }, "two": { ... }, "three": { ... } }}

Page 19: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Nested VS Flatten

Flatten Nested Flatten

Page 20: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Firebase usage FirebaseDatabase.getInstance().setPersistenceEnabled(true);

DatabaseReference postsRef = FirebaseDatabase.getInstance().getReference("posts");ValueEventListener postListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Get Post object and use the values to update the UI Post post = dataSnapshot.getValue(Post.class); }

@Override public void onCancelled(DatabaseError databaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); }};postsRef.addValueEventListener(postListener);

Page 21: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Keep in mind...

• Synchronizes and stores a local copy of the data for active listeners

• You can keep the data fresh even if the reference has no active listeners (but be careful)

DatabaseReference postsRef = FirebaseDatabase.getInstance().getReference("posts");postsRef.keepSynced(true);

Page 22: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Gardener App Architecture + RxJava

Inspired by@fernando_cejas of

SoundCloud

Page 23: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

RxFirebase by ezhome

RxJava wrapper on top of Firebase. The library includes:• RxFirebaseAuth• RxFirebaseDatabase

https://github.com/ezhome/Android-RxFirebase

Page 24: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

RxFirebaseAuth//Observes sign-in in Firebase with Auth Providers

Observable<FirebaseUser> observeSignIn(final AuthCredential authCredential);

//Observes sign-in in Firebase with Custom token

Observable<FirebaseUser> observeSignIn(final String token);

//Observes the sign-out

Observable<Boolean> observeSignOut();

//Observes the authentication state

Observable<FirebaseUser> observeAuthState();

Page 25: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes sign-in in Firebase with Auth Providers

Observable<FirebaseUser> observeSignIn(final AuthCredential authCredential);

//Observes sign-in in Firebase with Custom token

Observable<FirebaseUser> observeSignIn(final String token);

//Observes the sign-out

Observable<Boolean> observeSignOut();

//Observes the authentication state

Observable<FirebaseUser> observeAuthState();

RxFirebaseAuth

Page 26: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes sign-in in Firebase with Auth Providers

Observable<FirebaseUser> observeSignIn(final AuthCredential authCredential);

//Observes sign-in in Firebase with Custom token

Observable<FirebaseUser> observeSignIn(final String token);

//Observes the sign-out

Observable<Boolean> observeSignOut();

//Observes the authentication state

Observable<FirebaseUser> observeAuthState();

RxFirebaseAuth

Page 27: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes sign-in in Firebase with Auth Providers

Observable<FirebaseUser> observeSignIn(final AuthCredential authCredential);

//Observes sign-in in Firebase with Custom token

Observable<FirebaseUser> observeSignIn(final String token);

//Observes the sign-out

Observable<Boolean> observeSignOut();

//Observes the authentication state

Observable<FirebaseUser> observeAuthState();

RxFirebaseAuth

Page 28: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes sign-in in Firebase with Auth Providers

Observable<FirebaseUser> observeSignIn(final AuthCredential authCredential);

//Observes sign-in in Firebase with Custom token

Observable<FirebaseUser> observeSignIn(final String token);

//Observes the sign-out

Observable<Boolean> observeSignOut();

//Observes the authentication state

Observable<FirebaseUser> observeAuthState();

RxFirebaseAuth

Page 29: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes saving data and returns the generated key

Observable<String> observeValuePush(final DatabaseReference firebaseRef, final Object object);

//Observes retrieve data and emits when data changed in a specific Firebase Query

Observable<DataSnapshot> observeValueEvent(final Query firebaseRef);

//Observes new additions in a specific Firebase Query

Observable<FirebaseChildEvent> observeChildAdded(final Query firebaseRef);

more…….

RxFirebaseDatabase

Page 30: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes saving data and returns the generated key

Observable<String> observeValuePush(final DatabaseReference firebaseRef, final Object object);

//Observes retrieve data and emits when data changed in a specific Firebase Query

Observable<DataSnapshot> observeValueEvent(final Query firebaseRef);

//Observes new additions in a specific Firebase Query

Observable<FirebaseChildEvent> observeChildAdded(final Query firebaseRef);

more…….

RxFirebaseDatabase

Page 31: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes saving data and returns the generated key

Observable<String> observeValuePush(final DatabaseReference firebaseRef, final Object object);

//Observes retrieve data and emits when data changed in a specific Firebase Query

Observable<DataSnapshot> observeValueEvent(final Query firebaseRef);

//Observes new additions in a specific Firebase Query

Observable<FirebaseChildEvent> observeChildAdded(final Query firebaseRef);

more…….

RxFirebaseDatabase

Page 32: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

//Observes saving data and returns the generated key

Observable<String> observeValuePush(final DatabaseReference firebaseRef, final Object object);

//Observes retrieve data and emits when data changed in a specific Firebase Query

Observable<DataSnapshot> observeValueEvent(final Query firebaseRef);

//Observes new additions in a specific Firebase Query

Observable<FirebaseChildEvent> observeChildAdded(final Query firebaseRef);

more…….

RxFirebaseDatabase

Page 33: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

RxFirebaseDatabasepublic Observable<DataSnapshot> observeValueEvent(final Query firebaseRef) { return Observable.create(new Observable.OnSubscribe<DataSnapshot>() { @Override public void call(final Subscriber<? super DataSnapshot> subscriber) { final ValueEventListener listener = firebaseRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { subscriber.onNext(dataSnapshot); }

@Override public void onCancelled(DatabaseError error) { FirebaseDatabaseErrorFactory.buildError(subscriber, error); }); subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { firebaseRef.removeEventListener(listener); } })); } });}

Page 34: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

RxFirebaseDatabase public Observable<DataSnapshot> observeValueEvent(final Query firebaseRef) { return Observable.create(new Observable.OnSubscribe<DataSnapshot>() { @Override public void call(final Subscriber<? super DataSnapshot> subscriber) { final ValueEventListener listener = firebaseRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { subscriber.onNext(dataSnapshot); }

@Override public void onCancelled(DatabaseError error) { FirebaseDatabaseErrorFactory.buildError(subscriber, error); } }); subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { firebaseRef.removeEventListener(listener); } })); } });}

Page 35: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

RxFirebaseDatabasepublic Observable<DataSnapshot> observeValueEvent(final Query firebaseRef) { return Observable.create(new Observable.OnSubscribe<DataSnapshot>() { @Override public void call(final Subscriber<? super DataSnapshot> subscriber) { final ValueEventListener listener = firebaseRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(ataSnapshot dataSnapshot) { subscriber.onNext(dataSnapshot); }

@Override public void onCancelled(FirebaseError error) { attachErrorHandler(subscriber, error); } }); subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { firebaseRef.removeEventListener(listener); } })); } });}

Page 36: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Why Observable.create()?

Observable.defer() : create a new Observable each time you get a subscriberObserable.create() : can use same function for each subscriber. More efficient!

OthersObservable.fromCallable() : not really works with exceptions as it’s expectedObservable.fromAsync() : quickly deprecated by RxJava (they were undecided)Observable.fromEmitter : seems final but still RxJava guys doing work (not tested yet by us)

Page 37: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Old VS New

Firebase v2.5.2

• No dependencies• No control over conflict resolution• UI browser super slow

Firebase by Google v9.x

• Google Play services• No control over conflict resolution• UI browser super fast BUT buggy• Remote config• Notifications• Dynamic links• Analytics• Crash reporting• Images upload

Page 38: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Pos & Cons

Pos

• Autoscaling built-in• Robust APIs - Cross platform• Realtime• Declarative Security Rules model

Cons

• Storage format is in JSON, migration is hard to different system

• No reporting tools to analyze Firebase queries

• Need to build indexes manually• Data validation is hard• Costs

Page 39: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Is it production ready?

Page 40: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

Questions

Page 41: ezhome - files.meetup.comfiles.meetup.com/20372995/Firebase_and_RxJava - 1st Athens Andro… · ezhome is a new breed of gardening company that’s revolutionizing the way gardening

We are hiring!!!ezhome.com/careers

github.com/ezhomegithub.com/spirosoik

@spirosoik