SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
Are you looking for a realtime infrastructure
behind your mobile app?
Well, Firebase may be what you need..and even more!
DroidconIT2016 – Alessandro Martellucci
I’m Alessandro Martellucci
alex.martellucci@gmail.com
martellux
+AlessandroMartellucci
@martellux
DroidconIT2016 – Alessandro Martellucci
Open Reply
•  Reply is a leading IT Services Company, with offices in Italy, Germany, UK, Benelux,
USA, Brazil, France and Poland.
•  Open Reply is the company of Reply Group focused on open source software,
multichannel solutions and mobile applications.
•  From Rome to Milan, our team is based on a young team of over 40 engineers 100%
focused on mobile development (iOS, Android & Windows Phone).
•  We are specialised in broadcasting, banking, Android OS Customisation, IoT and
M2M.
We are hiring! Contact us at jobs@reply.eu
DroidconIT2016 – Alessandro Martellucci
Lifecycle 0.2
A binder which let you manage async operations against
Android components lifecycle
•  Seamless execution async-rotation-response
•  Easily integration with third-party library
•  No crashes after Activity/Fragment rotation
•  Fragment transaction management
martellux/Lifecycle com.martellux:lifecycle:0.2.0
DroidconIT2016 – Alessandro Martellucci
Android Programmazione Avanzata
•  Multi-screen and multi device development
•  Functional Programming with RxJava
•  Testing & Code Mantainance
•  Android Wear
•  Bluetooth Classic & Low Energy
•  Google Cast and Chromecast
DroidconIT2016 – Alessandro Martellucci
Agenda
1.  What is Firebase
2.  NoSQL JSON database
3.  Demo
4.  Android integration
5.  Working with data
6.  Working offline
7.  FirebaseUI binding
8.  Rules management
9.  User authentication
10. Pricing
DroidconIT2016 – Alessandro Martellucci
What is Firebase
•  MBaaS
•  Data synchronization
•  Hosting (static assets, Node.js)
•  Authentication (Google, Facebook, Email & Password, Anonymous)
•  Realtime database (JSON)
DroidconIT2016 – Alessandro Martellucci
NoSQL Database
•  SQL & RDBMS
•  JSON
•  web format
•  agile
•  structure
•  friendliness
•  Drawbacks
•  navigational query
•  structure
DroidconIT2016 – Alessandro Martellucci
Firebase JSON
{
“event-name”:”Droidcon Italy”,
“location”: {
“latitude”:22,
“longitude”:22
},
“events”: [
{“name”: “Are you looking for a realtime…”,
“speaker”: “Alessandro Martellucci”,
“room”: “Sala Parigi”,
“time”: 000000
},
…
]
}
JSON	
DroidconIT2016 – Alessandro Martellucci
Firebase Web Console
DroidconIT2016 – Alessandro Martellucci
Firebase Vulcan Console
DroidconIT2016 – Alessandro Martellucci
DroidconIT 2016 FirebaseDemo
•  We’re going live
1.  Download app
2.  Hit your colour
3.  Be patient
DroidconIT2016 – Alessandro Martellucci
Source code at https://github.com/martellux/
Android integration
•  Account
•  Sign with Google
•  Dependecies
•  Right click -> Project Structure -> Cloud -> Firebase
•  Reference
•  Navigation path
DroidconIT2016 – Alessandro Martellucci
Firebase setup (1/2)
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.firebase:firebase-client-android:2.5.1+’
}
android {
packagingOptions {
exclude 'META-INF/LICENSE’
exclude 'META-INF/LICENSE-FIREBASE.txt’
exclude 'META-INF/NOTICE’
}
}
Configura.on	
DroidconIT2016 – Alessandro Martellucci
Firebase setup (2/2)
public class ApplicationInstance extends Application {
@Override
public void onCreate() {
super.onCreate();
Firebase.setAndroidContext(this);
}
}
Applica.on	
DroidconIT2016 – Alessandro Martellucci
public class MainPresenter extends Presenter {
private Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”);
}
Presenter
Reading data
•  Callbacks
•  Read Type
•  Value
•  Child
•  Firebase Listener
•  ValueEventListener
•  ChildEventListener (added, removed, changed)
DroidconIT2016 – Alessandro Martellucci
Read value changes
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”);
mFirebaseRef.child(“data”).addValueEventListener(new ValueEventListener() {
@Override public void onDataChange(DataSnapshot snapshot) {
Map<String, Object> value = snapshot.getValue(Map.class);
//or
MyBean myBean = snapshot.getValue(MyBean.class);
}
@Override public void onCancelled(FirebaseError firebaseError) {
Log.e(TAG, "The read failed: " + firebaseError.getMessage());
}
});
Value	Event	Listener	
DroidconIT2016 – Alessandro Martellucci
Read new child
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”);
mFirebaseRef.addChildEventListener(new ChildEventListener() {
@Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
MyBean myBean = snapshot.getValue(MyBean.class);
String foo = myBean.getFoo();
}
@Override public void onCancelled(FirebaseError firebaseError) {
Log.e(TAG, "The read failed: " + firebaseError.getMessage());
}
});
Child	Event	Listener	
DroidconIT2016 – Alessandro Martellucci
Read child updates
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”);
mFirebaseRef.addChildEventListener(new ChildEventListener() {
@Override public void onChildChanged(DataSnapshot snapshot, String previousChildKey) {
MyBean myBean = snapshot.getValue(MyBean.class);
Log.d(TAG, ”Prop foo has been updated to: " + myBean.getFoo());
}
@Override public void onCancelled(FirebaseError firebaseError) {
Log.e(TAG, "The read failed: " + firebaseError.getMessage());
}
});
Child	Event	Listener	
DroidconIT2016 – Alessandro Martellucci
Read removed child
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”);
mFirebaseRef.addChildEventListener(new ChildEventListener() {
@Override public void onChildRemoved(DataSnapshot snapshot) {
MyBean myBean = snapshot.getValue(MyBean.class);
System.out.println(”This entry has been removed: " + myBean.toString());
}
@Override public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
Child	Event	Listener	
DroidconIT2016 – Alessandro Martellucci
Saving Data
•  Non-concurrent
•  Insert
•  Update
•  Concurrent
•  IDs generation
•  Transaction
DroidconIT2016 – Alessandro Martellucci
Write or replace data (1/2)
{
…,
status: {
connectedUsers: 10,
...
},
...
}
Online	users	
DroidconIT2016 – Alessandro Martellucci
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”);
int connectedUsers = countConnectedUsers();
mFirebaseRef.child(“status/connectedUsers”).setValue(connectedUsers);
1)	Naviga.ng	by	subnodes
Write or replace data (2/2)
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”);
int connectedUsers = countConnectedUsers();
mFirebaseRef.child(“connectedUsers”).setValue(connectedUsers);
2)	Naviga.ng	direct	to	node	
DroidconIT2016 – Alessandro Martellucci
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”);
Map<String, String> statusMap = new HashMap<String, String>();
statusMap.put(“connectedUsers”, String.valueOf(countConnectedUsers());
mFirebaseRef.setValue(statusMap);
3)	Using	Map
Overwrite & delete
JSON	node	
DroidconIT2016 – Alessandro Martellucci
{ “status”:{
“connectedUsers”:1,
“startTime”:1456426772000,
“endTime”:1456426772000
}
}
{ “status”:{
“connectedUsers”:1
}
}
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”);
Map<String, String> statusMap = new HashMap<String, String>();
statusMap.put(“connectedUsers”, String.valueOf(countConnectedUsers());
mFirebaseRef.setValue(statusMap);
Java	Code
Update children
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”);
Map<String, String> statusMap = new HashMap<String, String>();
statusMap.put(“connectedUsers”, String.valueOf(countConnectedUsers());
mFirebaseRef.updateChildren(statusMap);
1)	Upda.ng	nodes	
DroidconIT2016 – Alessandro Martellucci
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”);
Map<String, String> statusMap = new HashMap<String, String>();
statusMap.put(“status/connectedUsers”, String.valueOf(countConnectedUsers());
mFirebaseRef.updateChildren(statusMap);
2)	Upda.ng	subnodes
Concurrent-indipendent insert
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”);
Firebase dataChildRef = mFirebaseRef.child(“data”);
Firebase newChildRef = dataChildRef.push();
Map<String, Object> colorMap = new HahsMap<String, Object>();
colorMap.put(“red”, “242”);
colorMap.put(“green”, “10”);
colorMap.put(“blue”, “22”);
newChildRef .setValue(colorMap);
Java	Code	
DroidconIT2016 – Alessandro Martellucci
Concurrent-dipendent insert
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”);
newChildRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData currentData) {
if((currentData.getValue() == null) {
currentData.setValue(1);
} else {
currentData.setValue((Long) currentData.getValue() + 1);
}
return Transaction.success(currentData);
}
@Override
public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) {
…
}
});
Java	Code	
DroidconIT2016 – Alessandro Martellucci
Working offline
•  Works offline
•  Seamless experience
•  Auto synchronization
DroidconIT2016 – Alessandro Martellucci
User authentication
DroidconIT2016 – Alessandro Martellucci
•  User identification
•  Email & password login
•  Easy integration
•  Facebook, GitHub, Google and Twitter
•  Session management
•  Single session
•  Custom token
FirebaseUI - Authentication
DroidconIT2016 – Alessandro Martellucci
1.  Add SDK dependencies
2.  Add Facebook/Twitter/Google keys to
strings.xml
3.  Change our AndroidManifest.xml
4.  Inherit from FirebaseLoginBaseActivity
5.  Enable authentication providers
6.  Call showFirebaseLoginDialog();
Facebook authentication
DroidconIT2016 – Alessandro Martellucci
Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”);
mFirebaseRef .addAuthStateListener(new Firebase.AuthStateListener() {
@Override
public void onAuthStateChanged(AuthData authData) {
if (authData != null) {
// user is logged in
Map<String, String> map = new HashMap<String, String>();
map.put("provider", authData.getProvider());
if(authData.getProviderData().containsKey("displayName")) {
map.put("displayName", authData.getProviderData().get("displayName").toString());
}
ref.child("users").child(authData.getUid()).setValue(map);
} else {
// user is not logged in
}
}
});
Authen.ca.on
Rules management (1/2)
DroidconIT2016 – Alessandro Martellucci
{
"rules": {
".read": true,
".write": true
}
}
Basic	rules	
•  JavaScript-like
•  Node permissions
•  Node validations
Rules management (2/2)
DroidconIT2016 – Alessandro Martellucci
{
“status”: {
“schedule”: {
“startTime”: 123456670292,
…
}
}
}
startTime	node	
{
"rules": {
"status": {
"schedule": {
"startTime": {
// readable
".read": true,
// data written must be a number
".validate": "newData.isNumber()”,
// write authorization
".write": "$user_id === auth.uid”
}}}}}
Rules	for	startTime	node
FirebaseUI
DroidconIT2016 – Alessandro Martellucci
•  Open source library
•  iOS support
•  Authentication
•  built-in dialog
•  List binding
•  ListView
•  RecyclerView
FirebaseUI – ListView
DroidconIT2016 – Alessandro Martellucci
@Override
protected void onCreate(Bundle savedInstanceState) {
…
ListView messagesView = (ListView) findViewById(R.id.messages_list);
mAdapter = new FirebaseListAdapter<MyBean>(this, MyBean.class,
R.layout.my_list_item, mFirebaseRef) {
@Override
protected void populateView(View view, MyBean myBean, int position) {
((TextView)view.findViewById(android.R.id.text1)).setText(myBean.getFoo());
}
};
messagesView.setAdapter(mAdapter);
}
Adapter
FirebaseUI – RecyclerView
DroidconIT2016 – Alessandro Martellucci
@Override
protected void onCreate(Bundle savedInstanceState) {
…
RecyclerView recycler = (RecyclerView) findViewById(R.id.messages_recycler);
recycler.setHasFixedSize(true);
recycler.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new FirebaseRecyclerAdapter<MyBean, MyBeanViewHolder>(MyBean.class, R.layout.my_line_list_item,
MyBeanViewHolder.class, mFirebaseRef) {
@Override
public void populateViewHolder(MyBeanViewHolder myBeanViewHolder, MyBean myBean, int position) {
myBeanViewHolder.nameText.setText(myBean.getFoo());
}
};
recycler.setAdapter(mAdapter);
}
Adapter
Pricing
DroidconIT2016 – Alessandro Martellucci
FREE	
(0$	forever)	
SPARK	
(5$	month)	
…	 INFERNO	
(1499$	month)	
DB	connec.ons	 100	 100	 …	 UNLIMITED	
DB	storage	 1	GB	 1	GB	 …	 300	GB	
DB	transfer	 10	GB	 10	GB	 …	 1.5	TB	
Private	Backups	 NO	 NO	 …	 YES	
Authen.ca.on	
UNLIMITED	
USERS	
UNLIMITED	
USERS	
…	
UNLIMITED	
USERS	
Hos.ng	Storage	 1	GB	 1	GB	 …	 10	GB	
Hos.ng	Transfer	 100	GB	 100	GB	 …	 1	TB	
Custom	Domain	 NO	 YES	 …	 YES
Resources
•  BLOG: https://www.firebase.com/blog
•  Twitter: @firebase
•  Facebook: Firebase
•  Google Plus: Firebase
•  Official: http://www.firebase.com
•  Github: https://github.com/firebase
•  YouTube: Firecast: Firebase Screencast
DroidconIT2016 – Alessandro Martellucci
THANK YOU ALL
DroidconIT2016 – Alessandro Martellucci

Más contenido relacionado

La actualidad más candente

Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019
Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019
Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019Matt Raible
 
A friend in need - A JS indeed
A friend in need - A JS indeedA friend in need - A JS indeed
A friend in need - A JS indeedYonatan Levin
 
Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Matt Raible
 
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...Matt Raible
 
Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Matt Raible
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13Fred Sauer
 
Seven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseSeven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseMatt Raible
 
Bootiful Development with Spring Boot and React - RWX 2017
Bootiful Development with Spring Boot and React - RWX 2017Bootiful Development with Spring Boot and React - RWX 2017
Bootiful Development with Spring Boot and React - RWX 2017Matt Raible
 
Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Matt Raible
 
Front End Development for Back End Java Developers - NYJavaSIG 2019
Front End Development for Back End Java Developers - NYJavaSIG 2019Front End Development for Back End Java Developers - NYJavaSIG 2019
Front End Development for Back End Java Developers - NYJavaSIG 2019Matt Raible
 
JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011Shreedhar Ganapathy
 
Spark IT 2011 - Developing RESTful Web services with JAX-RS
Spark IT 2011 - Developing RESTful Web services with JAX-RSSpark IT 2011 - Developing RESTful Web services with JAX-RS
Spark IT 2011 - Developing RESTful Web services with JAX-RSArun Gupta
 
Full Stack Reactive with React and Spring WebFlux - SpringOne 2018
Full Stack Reactive with React and Spring WebFlux - SpringOne 2018Full Stack Reactive with React and Spring WebFlux - SpringOne 2018
Full Stack Reactive with React and Spring WebFlux - SpringOne 2018Matt Raible
 
Grails 4: Upgrade your Game!
Grails 4: Upgrade your Game!Grails 4: Upgrade your Game!
Grails 4: Upgrade your Game!Zachary Klein
 
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019Matt Raible
 
A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019Matt Raible
 
Spring Up Your Graph
Spring Up Your GraphSpring Up Your Graph
Spring Up Your GraphVMware Tanzu
 
Front End Development for Back End Developers - vJUG24 2017
Front End Development for Back End Developers - vJUG24 2017Front End Development for Back End Developers - vJUG24 2017
Front End Development for Back End Developers - vJUG24 2017Matt Raible
 
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020Matt Raible
 
Containerizing ContentBox CMS
Containerizing ContentBox CMSContainerizing ContentBox CMS
Containerizing ContentBox CMSGavin Pickin
 

La actualidad más candente (20)

Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019
Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019
Spring Boot APIs and Angular Apps: Get Hip with JHipster! KCDC 2019
 
A friend in need - A JS indeed
A friend in need - A JS indeedA friend in need - A JS indeed
A friend in need - A JS indeed
 
Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019
 
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
 
Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
 
Seven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseSeven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuse
 
Bootiful Development with Spring Boot and React - RWX 2017
Bootiful Development with Spring Boot and React - RWX 2017Bootiful Development with Spring Boot and React - RWX 2017
Bootiful Development with Spring Boot and React - RWX 2017
 
Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020
 
Front End Development for Back End Java Developers - NYJavaSIG 2019
Front End Development for Back End Java Developers - NYJavaSIG 2019Front End Development for Back End Java Developers - NYJavaSIG 2019
Front End Development for Back End Java Developers - NYJavaSIG 2019
 
JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011
 
Spark IT 2011 - Developing RESTful Web services with JAX-RS
Spark IT 2011 - Developing RESTful Web services with JAX-RSSpark IT 2011 - Developing RESTful Web services with JAX-RS
Spark IT 2011 - Developing RESTful Web services with JAX-RS
 
Full Stack Reactive with React and Spring WebFlux - SpringOne 2018
Full Stack Reactive with React and Spring WebFlux - SpringOne 2018Full Stack Reactive with React and Spring WebFlux - SpringOne 2018
Full Stack Reactive with React and Spring WebFlux - SpringOne 2018
 
Grails 4: Upgrade your Game!
Grails 4: Upgrade your Game!Grails 4: Upgrade your Game!
Grails 4: Upgrade your Game!
 
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
 
A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019
 
Spring Up Your Graph
Spring Up Your GraphSpring Up Your Graph
Spring Up Your Graph
 
Front End Development for Back End Developers - vJUG24 2017
Front End Development for Back End Developers - vJUG24 2017Front End Development for Back End Developers - vJUG24 2017
Front End Development for Back End Developers - vJUG24 2017
 
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
 
Containerizing ContentBox CMS
Containerizing ContentBox CMSContainerizing ContentBox CMS
Containerizing ContentBox CMS
 

Destacado

Add ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxAdd ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxBoris Farber
 
Evolving the Android Core with Aspects
Evolving the Android Core with AspectsEvolving the Android Core with Aspects
Evolving the Android Core with AspectsCarlo Pescio
 
Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Hoang Huynh
 
World-Class Testing Development Pipeline for Android
 World-Class Testing Development Pipeline for Android World-Class Testing Development Pipeline for Android
World-Class Testing Development Pipeline for AndroidPedro Vicente Gómez Sánchez
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginXavier Hallade
 
Contextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEContextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEMarcos Placona
 
Tomasz Polanski - Automated mobile testing 2016 - Testing: why, when, how
Tomasz Polanski - Automated mobile testing 2016 - Testing: why, when, howTomasz Polanski - Automated mobile testing 2016 - Testing: why, when, how
Tomasz Polanski - Automated mobile testing 2016 - Testing: why, when, howTomasz Polanski
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Danny Preussler
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinKai Koenig
 
Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Matteo Bonifazi
 
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Kelly Shuster
 
Introduction to Firebase
Introduction to FirebaseIntroduction to Firebase
Introduction to FirebaseMustafa Şenel
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternFabio Collini
 

Destacado (16)

Add ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxAdd ClassyShark to your Android toolbox
Add ClassyShark to your Android toolbox
 
Evolving the Android Core with Aspects
Evolving the Android Core with AspectsEvolving the Android Core with Aspects
Evolving the Android Core with Aspects
 
Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016
 
World-Class Testing Development Pipeline for Android
 World-Class Testing Development Pipeline for Android World-Class Testing Development Pipeline for Android
World-Class Testing Development Pipeline for Android
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
 
Firebase Tech Talk By Atlogys
Firebase Tech Talk By AtlogysFirebase Tech Talk By Atlogys
Firebase Tech Talk By Atlogys
 
Contextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DEContextual communications and why you should care - Droidcon DE
Contextual communications and why you should care - Droidcon DE
 
Tomasz Polanski - Automated mobile testing 2016 - Testing: why, when, how
Tomasz Polanski - Automated mobile testing 2016 - Testing: why, when, howTomasz Polanski - Automated mobile testing 2016 - Testing: why, when, how
Tomasz Polanski - Automated mobile testing 2016 - Testing: why, when, how
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with Kotlin
 
Android Firebase
Android FirebaseAndroid Firebase
Android Firebase
 
Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016
 
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
 
Introduction to Firebase
Introduction to FirebaseIntroduction to Firebase
Introduction to Firebase
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM pattern
 
Building maintainable app
Building maintainable appBuilding maintainable app
Building maintainable app
 

Similar a A realtime infrastructure for Android apps: Firebase may be what you need..and even more!

2013 lecture-01-introduction
2013 lecture-01-introduction2013 lecture-01-introduction
2013 lecture-01-introductionPharo
 
How to Hybrid : Effective Tactics in HTML5-Native App Development
How to Hybrid : Effective Tactics in HTML5-Native App DevelopmentHow to Hybrid : Effective Tactics in HTML5-Native App Development
How to Hybrid : Effective Tactics in HTML5-Native App DevelopmentDroidConTLV
 
Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Christian Heilmann
 
Droidstat-X, Android Applications Security Analyser Xmind Generator
Droidstat-X, Android Applications Security Analyser Xmind GeneratorDroidstat-X, Android Applications Security Analyser Xmind Generator
Droidstat-X, Android Applications Security Analyser Xmind GeneratorCláudio André
 
What's new and next for mobile development with .NET
What's new and next for mobile development with .NETWhat's new and next for mobile development with .NET
What's new and next for mobile development with .NETJames Montemagno
 
Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017Xamarin
 
Resume-pierre-stephane-us
Resume-pierre-stephane-usResume-pierre-stephane-us
Resume-pierre-stephane-usStephane Pierre
 
NET !!! A must have tool under your belt
NET !!! A must have tool under your beltNET !!! A must have tool under your belt
NET !!! A must have tool under your beltHansamali Gamage
 
Flutter Beta but Better and Better
Flutter Beta but Better and BetterFlutter Beta but Better and Better
Flutter Beta but Better and BetterDonghyeok Kang
 
DevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve Poole
DevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve PooleDevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve Poole
DevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve PooleJAXLondon_Conference
 
PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...
PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...
PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...Pharo
 
Webinar - Analyzing Video
Webinar - Analyzing VideoWebinar - Analyzing Video
Webinar - Analyzing VideoTuri, Inc.
 
Faites évoluer votre accès aux données avec MongoDB Stitch
Faites évoluer votre accès aux données avec MongoDB StitchFaites évoluer votre accès aux données avec MongoDB Stitch
Faites évoluer votre accès aux données avec MongoDB StitchMongoDB
 
JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"
JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"
JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"Daniel Bryant
 
Scaling frontend applications with micro-frontends Presentation.pdf
Scaling frontend applications with micro-frontends Presentation.pdfScaling frontend applications with micro-frontends Presentation.pdf
Scaling frontend applications with micro-frontends Presentation.pdfKatamaRajuBandigari1
 
I/O Extended (GDG Bogor) - Sidiq Permana
I/O Extended (GDG Bogor) - Sidiq PermanaI/O Extended (GDG Bogor) - Sidiq Permana
I/O Extended (GDG Bogor) - Sidiq PermanaDicoding
 
WinOps meetup April 2016 DevOps lessons from Microsoft \\Build\
WinOps meetup April 2016   DevOps lessons from Microsoft \\Build\WinOps meetup April 2016   DevOps lessons from Microsoft \\Build\
WinOps meetup April 2016 DevOps lessons from Microsoft \\Build\DevOpsGroup
 
Outsmarting smartphones
Outsmarting smartphonesOutsmarting smartphones
Outsmarting smartphonesSensePost
 

Similar a A realtime infrastructure for Android apps: Firebase may be what you need..and even more! (20)

2013 lecture-01-introduction
2013 lecture-01-introduction2013 lecture-01-introduction
2013 lecture-01-introduction
 
How to Hybrid : Effective Tactics in HTML5-Native App Development
How to Hybrid : Effective Tactics in HTML5-Native App DevelopmentHow to Hybrid : Effective Tactics in HTML5-Native App Development
How to Hybrid : Effective Tactics in HTML5-Native App Development
 
Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010
 
Droidstat-X, Android Applications Security Analyser Xmind Generator
Droidstat-X, Android Applications Security Analyser Xmind GeneratorDroidstat-X, Android Applications Security Analyser Xmind Generator
Droidstat-X, Android Applications Security Analyser Xmind Generator
 
What's new and next for mobile development with .NET
What's new and next for mobile development with .NETWhat's new and next for mobile development with .NET
What's new and next for mobile development with .NET
 
Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017
 
Resume-pierre-stephane-us
Resume-pierre-stephane-usResume-pierre-stephane-us
Resume-pierre-stephane-us
 
NET !!! A must have tool under your belt
NET !!! A must have tool under your beltNET !!! A must have tool under your belt
NET !!! A must have tool under your belt
 
web-of-twins-20190604rzr
web-of-twins-20190604rzrweb-of-twins-20190604rzr
web-of-twins-20190604rzr
 
Flutter Beta but Better and Better
Flutter Beta but Better and BetterFlutter Beta but Better and Better
Flutter Beta but Better and Better
 
DevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve Poole
DevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve PooleDevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve Poole
DevOps and the cloud: all hail the (developer) king - Daniel Bryant, Steve Poole
 
PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...
PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...
PharoDAYS 2015: Consortium Message: Get involved, you can get an impact by St...
 
Webinar - Analyzing Video
Webinar - Analyzing VideoWebinar - Analyzing Video
Webinar - Analyzing Video
 
Faites évoluer votre accès aux données avec MongoDB Stitch
Faites évoluer votre accès aux données avec MongoDB StitchFaites évoluer votre accès aux données avec MongoDB Stitch
Faites évoluer votre accès aux données avec MongoDB Stitch
 
JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"
JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"
JAXLondon 2015 "DevOps and the Cloud: All Hail the (Developer) King"
 
Scaling frontend applications with micro-frontends Presentation.pdf
Scaling frontend applications with micro-frontends Presentation.pdfScaling frontend applications with micro-frontends Presentation.pdf
Scaling frontend applications with micro-frontends Presentation.pdf
 
I/O Extended (GDG Bogor) - Sidiq Permana
I/O Extended (GDG Bogor) - Sidiq PermanaI/O Extended (GDG Bogor) - Sidiq Permana
I/O Extended (GDG Bogor) - Sidiq Permana
 
WinOps meetup April 2016 DevOps lessons from Microsoft \\Build\
WinOps meetup April 2016   DevOps lessons from Microsoft \\Build\WinOps meetup April 2016   DevOps lessons from Microsoft \\Build\
WinOps meetup April 2016 DevOps lessons from Microsoft \\Build\
 
Krunal_Jani_CV
Krunal_Jani_CVKrunal_Jani_CV
Krunal_Jani_CV
 
Outsmarting smartphones
Outsmarting smartphonesOutsmarting smartphones
Outsmarting smartphones
 

Último

What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesVictoriaMetrics
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLionel Briand
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolsosttopstonverter
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics
 
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingOpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingShane Coughlan
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesKrzysztofKkol1
 

Último (20)

What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 Updates
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and Repair
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration tools
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024
 
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingOpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
 

A realtime infrastructure for Android apps: Firebase may be what you need..and even more!

  • 1. Are you looking for a realtime infrastructure behind your mobile app? Well, Firebase may be what you need..and even more! DroidconIT2016 – Alessandro Martellucci
  • 3. Open Reply •  Reply is a leading IT Services Company, with offices in Italy, Germany, UK, Benelux, USA, Brazil, France and Poland. •  Open Reply is the company of Reply Group focused on open source software, multichannel solutions and mobile applications. •  From Rome to Milan, our team is based on a young team of over 40 engineers 100% focused on mobile development (iOS, Android & Windows Phone). •  We are specialised in broadcasting, banking, Android OS Customisation, IoT and M2M. We are hiring! Contact us at jobs@reply.eu DroidconIT2016 – Alessandro Martellucci
  • 4. Lifecycle 0.2 A binder which let you manage async operations against Android components lifecycle •  Seamless execution async-rotation-response •  Easily integration with third-party library •  No crashes after Activity/Fragment rotation •  Fragment transaction management martellux/Lifecycle com.martellux:lifecycle:0.2.0 DroidconIT2016 – Alessandro Martellucci
  • 5. Android Programmazione Avanzata •  Multi-screen and multi device development •  Functional Programming with RxJava •  Testing & Code Mantainance •  Android Wear •  Bluetooth Classic & Low Energy •  Google Cast and Chromecast DroidconIT2016 – Alessandro Martellucci
  • 6. Agenda 1.  What is Firebase 2.  NoSQL JSON database 3.  Demo 4.  Android integration 5.  Working with data 6.  Working offline 7.  FirebaseUI binding 8.  Rules management 9.  User authentication 10. Pricing DroidconIT2016 – Alessandro Martellucci
  • 7. What is Firebase •  MBaaS •  Data synchronization •  Hosting (static assets, Node.js) •  Authentication (Google, Facebook, Email & Password, Anonymous) •  Realtime database (JSON) DroidconIT2016 – Alessandro Martellucci
  • 8. NoSQL Database •  SQL & RDBMS •  JSON •  web format •  agile •  structure •  friendliness •  Drawbacks •  navigational query •  structure DroidconIT2016 – Alessandro Martellucci
  • 9. Firebase JSON { “event-name”:”Droidcon Italy”, “location”: { “latitude”:22, “longitude”:22 }, “events”: [ {“name”: “Are you looking for a realtime…”, “speaker”: “Alessandro Martellucci”, “room”: “Sala Parigi”, “time”: 000000 }, … ] } JSON DroidconIT2016 – Alessandro Martellucci
  • 10. Firebase Web Console DroidconIT2016 – Alessandro Martellucci
  • 11. Firebase Vulcan Console DroidconIT2016 – Alessandro Martellucci
  • 12. DroidconIT 2016 FirebaseDemo •  We’re going live 1.  Download app 2.  Hit your colour 3.  Be patient DroidconIT2016 – Alessandro Martellucci Source code at https://github.com/martellux/
  • 13. Android integration •  Account •  Sign with Google •  Dependecies •  Right click -> Project Structure -> Cloud -> Firebase •  Reference •  Navigation path DroidconIT2016 – Alessandro Martellucci
  • 14. Firebase setup (1/2) dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.firebase:firebase-client-android:2.5.1+’ } android { packagingOptions { exclude 'META-INF/LICENSE’ exclude 'META-INF/LICENSE-FIREBASE.txt’ exclude 'META-INF/NOTICE’ } } Configura.on DroidconIT2016 – Alessandro Martellucci
  • 15. Firebase setup (2/2) public class ApplicationInstance extends Application { @Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); } } Applica.on DroidconIT2016 – Alessandro Martellucci public class MainPresenter extends Presenter { private Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”); } Presenter
  • 16. Reading data •  Callbacks •  Read Type •  Value •  Child •  Firebase Listener •  ValueEventListener •  ChildEventListener (added, removed, changed) DroidconIT2016 – Alessandro Martellucci
  • 17. Read value changes Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”); mFirebaseRef.child(“data”).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { Map<String, Object> value = snapshot.getValue(Map.class); //or MyBean myBean = snapshot.getValue(MyBean.class); } @Override public void onCancelled(FirebaseError firebaseError) { Log.e(TAG, "The read failed: " + firebaseError.getMessage()); } }); Value Event Listener DroidconIT2016 – Alessandro Martellucci
  • 18. Read new child Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”); mFirebaseRef.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) { MyBean myBean = snapshot.getValue(MyBean.class); String foo = myBean.getFoo(); } @Override public void onCancelled(FirebaseError firebaseError) { Log.e(TAG, "The read failed: " + firebaseError.getMessage()); } }); Child Event Listener DroidconIT2016 – Alessandro Martellucci
  • 19. Read child updates Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”); mFirebaseRef.addChildEventListener(new ChildEventListener() { @Override public void onChildChanged(DataSnapshot snapshot, String previousChildKey) { MyBean myBean = snapshot.getValue(MyBean.class); Log.d(TAG, ”Prop foo has been updated to: " + myBean.getFoo()); } @Override public void onCancelled(FirebaseError firebaseError) { Log.e(TAG, "The read failed: " + firebaseError.getMessage()); } }); Child Event Listener DroidconIT2016 – Alessandro Martellucci
  • 20. Read removed child Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”); mFirebaseRef.addChildEventListener(new ChildEventListener() { @Override public void onChildRemoved(DataSnapshot snapshot) { MyBean myBean = snapshot.getValue(MyBean.class); System.out.println(”This entry has been removed: " + myBean.toString()); } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println("The read failed: " + firebaseError.getMessage()); } }); Child Event Listener DroidconIT2016 – Alessandro Martellucci
  • 21. Saving Data •  Non-concurrent •  Insert •  Update •  Concurrent •  IDs generation •  Transaction DroidconIT2016 – Alessandro Martellucci
  • 22. Write or replace data (1/2) { …, status: { connectedUsers: 10, ... }, ... } Online users DroidconIT2016 – Alessandro Martellucci Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”); int connectedUsers = countConnectedUsers(); mFirebaseRef.child(“status/connectedUsers”).setValue(connectedUsers); 1) Naviga.ng by subnodes
  • 23. Write or replace data (2/2) Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”); int connectedUsers = countConnectedUsers(); mFirebaseRef.child(“connectedUsers”).setValue(connectedUsers); 2) Naviga.ng direct to node DroidconIT2016 – Alessandro Martellucci Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”); Map<String, String> statusMap = new HashMap<String, String>(); statusMap.put(“connectedUsers”, String.valueOf(countConnectedUsers()); mFirebaseRef.setValue(statusMap); 3) Using Map
  • 24. Overwrite & delete JSON node DroidconIT2016 – Alessandro Martellucci { “status”:{ “connectedUsers”:1, “startTime”:1456426772000, “endTime”:1456426772000 } } { “status”:{ “connectedUsers”:1 } } Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”); Map<String, String> statusMap = new HashMap<String, String>(); statusMap.put(“connectedUsers”, String.valueOf(countConnectedUsers()); mFirebaseRef.setValue(statusMap); Java Code
  • 25. Update children Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/status”); Map<String, String> statusMap = new HashMap<String, String>(); statusMap.put(“connectedUsers”, String.valueOf(countConnectedUsers()); mFirebaseRef.updateChildren(statusMap); 1) Upda.ng nodes DroidconIT2016 – Alessandro Martellucci Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”); Map<String, String> statusMap = new HashMap<String, String>(); statusMap.put(“status/connectedUsers”, String.valueOf(countConnectedUsers()); mFirebaseRef.updateChildren(statusMap); 2) Upda.ng subnodes
  • 26. Concurrent-indipendent insert Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com”); Firebase dataChildRef = mFirebaseRef.child(“data”); Firebase newChildRef = dataChildRef.push(); Map<String, Object> colorMap = new HahsMap<String, Object>(); colorMap.put(“red”, “242”); colorMap.put(“green”, “10”); colorMap.put(“blue”, “22”); newChildRef .setValue(colorMap); Java Code DroidconIT2016 – Alessandro Martellucci
  • 27. Concurrent-dipendent insert Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”); newChildRef.runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData currentData) { if((currentData.getValue() == null) { currentData.setValue(1); } else { currentData.setValue((Long) currentData.getValue() + 1); } return Transaction.success(currentData); } @Override public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) { … } }); Java Code DroidconIT2016 – Alessandro Martellucci
  • 28. Working offline •  Works offline •  Seamless experience •  Auto synchronization DroidconIT2016 – Alessandro Martellucci
  • 29. User authentication DroidconIT2016 – Alessandro Martellucci •  User identification •  Email & password login •  Easy integration •  Facebook, GitHub, Google and Twitter •  Session management •  Single session •  Custom token
  • 30. FirebaseUI - Authentication DroidconIT2016 – Alessandro Martellucci 1.  Add SDK dependencies 2.  Add Facebook/Twitter/Google keys to strings.xml 3.  Change our AndroidManifest.xml 4.  Inherit from FirebaseLoginBaseActivity 5.  Enable authentication providers 6.  Call showFirebaseLoginDialog();
  • 31. Facebook authentication DroidconIT2016 – Alessandro Martellucci Firebase mFirebaseRef = new Firebase(“https://droidconit2016-demo.firebaseio.com/data”); mFirebaseRef .addAuthStateListener(new Firebase.AuthStateListener() { @Override public void onAuthStateChanged(AuthData authData) { if (authData != null) { // user is logged in Map<String, String> map = new HashMap<String, String>(); map.put("provider", authData.getProvider()); if(authData.getProviderData().containsKey("displayName")) { map.put("displayName", authData.getProviderData().get("displayName").toString()); } ref.child("users").child(authData.getUid()).setValue(map); } else { // user is not logged in } } }); Authen.ca.on
  • 32. Rules management (1/2) DroidconIT2016 – Alessandro Martellucci { "rules": { ".read": true, ".write": true } } Basic rules •  JavaScript-like •  Node permissions •  Node validations
  • 33. Rules management (2/2) DroidconIT2016 – Alessandro Martellucci { “status”: { “schedule”: { “startTime”: 123456670292, … } } } startTime node { "rules": { "status": { "schedule": { "startTime": { // readable ".read": true, // data written must be a number ".validate": "newData.isNumber()”, // write authorization ".write": "$user_id === auth.uid” }}}}} Rules for startTime node
  • 34. FirebaseUI DroidconIT2016 – Alessandro Martellucci •  Open source library •  iOS support •  Authentication •  built-in dialog •  List binding •  ListView •  RecyclerView
  • 35. FirebaseUI – ListView DroidconIT2016 – Alessandro Martellucci @Override protected void onCreate(Bundle savedInstanceState) { … ListView messagesView = (ListView) findViewById(R.id.messages_list); mAdapter = new FirebaseListAdapter<MyBean>(this, MyBean.class, R.layout.my_list_item, mFirebaseRef) { @Override protected void populateView(View view, MyBean myBean, int position) { ((TextView)view.findViewById(android.R.id.text1)).setText(myBean.getFoo()); } }; messagesView.setAdapter(mAdapter); } Adapter
  • 36. FirebaseUI – RecyclerView DroidconIT2016 – Alessandro Martellucci @Override protected void onCreate(Bundle savedInstanceState) { … RecyclerView recycler = (RecyclerView) findViewById(R.id.messages_recycler); recycler.setHasFixedSize(true); recycler.setLayoutManager(new LinearLayoutManager(this)); mAdapter = new FirebaseRecyclerAdapter<MyBean, MyBeanViewHolder>(MyBean.class, R.layout.my_line_list_item, MyBeanViewHolder.class, mFirebaseRef) { @Override public void populateViewHolder(MyBeanViewHolder myBeanViewHolder, MyBean myBean, int position) { myBeanViewHolder.nameText.setText(myBean.getFoo()); } }; recycler.setAdapter(mAdapter); } Adapter
  • 37. Pricing DroidconIT2016 – Alessandro Martellucci FREE (0$ forever) SPARK (5$ month) … INFERNO (1499$ month) DB connec.ons 100 100 … UNLIMITED DB storage 1 GB 1 GB … 300 GB DB transfer 10 GB 10 GB … 1.5 TB Private Backups NO NO … YES Authen.ca.on UNLIMITED USERS UNLIMITED USERS … UNLIMITED USERS Hos.ng Storage 1 GB 1 GB … 10 GB Hos.ng Transfer 100 GB 100 GB … 1 TB Custom Domain NO YES … YES
  • 38. Resources •  BLOG: https://www.firebase.com/blog •  Twitter: @firebase •  Facebook: Firebase •  Google Plus: Firebase •  Official: http://www.firebase.com •  Github: https://github.com/firebase •  YouTube: Firecast: Firebase Screencast DroidconIT2016 – Alessandro Martellucci
  • 39. THANK YOU ALL DroidconIT2016 – Alessandro Martellucci