for developers who are interested in Google's developer technology; everything from the Android, App Engine, and Google Chrome platforms, to product APIs like the Maps API, YouTube API and Google Calendar API. A GDG can take many forms -- from just a few people getting together to watch our latest video, to large gatherings with demos and tech talks, to events like code sprints and hackathons. However, at the core, GDGs are focused on developers and technical content, and the core audience should be developers.
the developer community • A place to learn about Google Technologies and Tools for developers. • A place to see what local companies and developers are doing with these technologies • Focused on developers and educational technical content • Open to the public with a public membership • A place to meet cool and smart people in tech :)
founded Envolve, that provided developers an API that let them integrate online chat into their websites April 2012 - Tamplin and Lee decided to separate the chat system and the real-time architecture that powered it, founding Firebase as a separate company 21 October 2014 - Firebase announced it had been acquired by Google
video series for Firebase developers May 18, 2016 - James Tamplin and Francis Ma present Firebase Overview on Google I/O ‘16 January 18, 2017 - Google announced that it signed an agreement to acquire Fabric and Crashlytics from Twitter, and that those services would join the Firebase team.
{ @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); // If sign in fails, display a message to the user. If sign in succeeds // the auth state listener will be notified and logic to handle the // signed in user can be handled in the listener. if (!task.isSuccessful()) { Log.w(TAG, "signInWithCredential", task.getException()); Toast.makeText(GoogleSignInActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } // ... } }); Authentication (Google Sign In)
status; public BatteryStatus() { } public BatteryStatus(int level, int status) { this.level = level; this.status = status; } } Use POJOs or primitive types
because iterating the children // of the "chats" node to get a list of conversation titles requires // potentially downloading hundreds of megabytes of messages "chats": { "one": { "title": "Phone battery discussions", "messages": { "m1": { "sender": "droid_ninja", "message": "Looks like Doze Mode doesn’t help" }, "m2": { ... }, // a very long list of messages } }, "two": { ... } } } Avoid nesting
by chat conversation ID "members": { // we'll talk about indices like this below "one": { "droid_ninja": true, "fire_tamplin": true, "raspbery_pike": true }, "two": { ... }, "three": { ... } }, Flatten data structures
{ "droid_ninja": { "name": "Droid Ninja", // Index Ada's groups in her profile "groups": { // the value here doesn't matter, just that the key exists "gdg": true, "geeks": true "foreigners": false } }, ... }, Use an index
ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) { // TODO: handle the post } } @Override public void onCancelled(DatabaseError databaseError) {} }); Filtering example