Slide 1

Slide 1 text

Beyond Serverless Saul Diaz Android Dev @ chicisimo.com @sefford [email protected]

Slide 2

Slide 2 text

Previously... Product Design Engineering Mobile App Web App API Product Growth Monetization Business Firebase

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Firebase Analytics

Slide 5

Slide 5 text

VS

Slide 6

Slide 6 text

1. compile 'com.google.firebase:firebase-core:9.2.1' 2. firebase = FirebaseAnalytics. getInstance((Context) object); 3. final Bundle props = new Bundle(); props.putString( "type", type); firebase.logEvent("login_completed", props); Firebase Analytics

Slide 7

Slide 7 text

SEGMENT FUNNEL COHORT

Slide 8

Slide 8 text

WORK TODAY, LEARN TOMORROW

Slide 9

Slide 9 text

Firebase Crash Reporting 1. compile 'com.google.firebase:firebase-crash:9.2.1' 2. FirebaseCrash.log( "Non-critical error message"); FirebaseCrash. report(exception);

Slide 10

Slide 10 text

REAL-TIME(ISH)

Slide 11

Slide 11 text

Firebase Remote Config 1. compile 'com.google.firebase:firebase-crash:9.2.1' 2. mFirebaseRemoteConfig = FirebaseRemoteConfig .getInstance(); FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig. DEBUG) .build(); firebase.setConfigSettings(configSettings);

Slide 12

Slide 12 text

firebase.fetch(cacheExpirationTime) .addOnSuccessListener( new OnSuccessListener() { @Override public void onSuccess(Void aVoid) { Log. d(TAG, "Fetch Succeeded"); // Once the config is successfully fetched it must be activated before newly fetched // values are returned. firebase.activateFetched(); // Set A/B Values } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { Log. d(TAG, "Fetch failed"); // Set default values } }); Firebase Remote Config

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Firebase App Invites 1. compile 'com.google.firebase:firebase-invites:9.2.1' 2. this.client = new GoogleApiClient.Builder(context) .addApi(AppInvite. API) .build(); 3. final Intent intent = new AppInviteInvitation.IntentBuilder("Invite users to BeAuthentic") .setMessage("BeAuthentic is the ultimate demo app") .setDeepLink(Uri.parse("http://beauthentic.com/invite")) .build(); startActivityForResult(intent, REQUEST_INVITE);

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Firebase App Links

Slide 18

Slide 18 text

https://example.app.goo.gl/?link=https://www.example.com/someresource &apn=com.example.android // Android Package &amv=3 // Min Android Version &al=exampleapp://someresource //Alternate URL for Android App &afl=http://play.google.com // Open if Android app is not installed &ibi=com.example.ios // iOS Package &isi=1234567 //iOS Min version &ius=exampleapp // iOS Custom Schema &ifl=http://itunes.apple.com // Open if iOS app is not installed &ipbi=com.example.ios // The same, for iPads &ipfl=http://itunes.apple.com

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

AppInvite.AppInviteApi.getInvitation(client, this, true) .setResultCallback( new ResultCallback() { @Override public void onResult(@NonNull AppInviteInvitationResult result) { if (result.getStatus().isSuccess()) { // Extract deep link from Intent Intent intent = result.getInvitationIntent(); String deepLink = AppInviteReferral.getDeepLink(intent); // Do whatever you want with the deeplink } } });

Slide 21

Slide 21 text

Firebase App Indexing 1. compile 'com.google.android.gms:play-services-appindexing:9.2.1' 2. new GoogleApiClient.Builder(this).addApi(AppIndex.API).build()

Slide 22

Slide 22 text

Web content Google Search Indexed by User Searches Results App content Identifies

Slide 23

Slide 23 text

* Results may have been dramatized

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Thing object = new Thing.Builder() .setName("Zara looks") // all this is localizable! .setDescription("A collection of Zara looks") .setUrl(Uri.parse("https://chicisimo.com/albums/213f62")) .build(); Action action = new Action.Builder(Action.TYPE_VIEW) .setObject(object) .setActionStatus(Action.STATUS_TYPE_COMPLETED) .build(); AppIndex.AppIndexApi.start(client, action); // When finishing with the screen AppIndex.AppIndexApi.end(client, action);

Slide 26

Slide 26 text

FINAL THOUGHTS

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Q&A?

Slide 29

Slide 29 text

THANKS! https://speakerdeck.com/sefford/beyond-serverless Saul Diaz Android Dev @ chicisimo.com @sefford [email protected]