Slide 1

Slide 1 text

'JSFCBTF׾ⵃ欽׃׋ "OESPJE،فٔꟚ涪 㹋騧ⰅꟌ 涯㿊俑䕕 !GVTIJSPZBNB

Slide 2

Slide 2 text

荈䊹稱➜ 涯㿊俑䕕 /JLLFJ*OD "OESPJE"QQ&OHJOFFS 馯㄂䧄㘋ծ㶨肪ג ս鸬鯹վأوم،فٔꟚ涪׾⸇鸞ׅ׷ 'JSFCBTF׾⢪׏ג׫״ֲ IUUQHJIZPKQEFWTFSJBMGJSFCBTF

Slide 3

Slide 3 text

劤傈ך،آؑٝت ˖ 'JSFCBTFך嚊銲ֶׁ׵ְ ˖ رٌ،فٔ稱➜ ˖ "VUIFOUJDBUJPO ˖ 3FBMUJNF%BUBCBTF ˖ 4UPSBHF ˖ 3FNPUF$POGJH ˖ ׉ך➭5JQT

Slide 4

Slide 4 text

'JSFCBTFך嚊銲ֶׁ׵ְ

Slide 5

Slide 5 text

'JSFCBTFך嚊銲ֶׁ׵ְ

Slide 6

Slide 6 text

'JSFCBTFך嚊銲ֶׁ׵ְ

Slide 7

Slide 7 text

'JSFCBTFך嚊銲ֶׁ׵ְ ˖ (PPHMF*0דًآٍ٦،حفر٦ز ˖ 窟さٌغ؎ٕفٓحزؿؓ٦يפה鹌⻉ ˖ "OBMZUJDT׾⚥呌ה׃גׁתׂתז؟٦ؽ أָ埆鯥ד鸬䵿

Slide 8

Slide 8 text

'JSFCBTFך嚊銲ֶׁ׵ְ ˖ (PPHMF*0דًآٍ٦،حفر٦ز ˖ 窟さٌغ؎ٕفٓحزؿؓ٦يפה鹌⻉ ˖ "OBMZUJDT׾⚥呌ה׃גׁתׂתז؟٦ؽ أָ埆鯥ד鸬䵿 劤傈כ'JSFCBTFך醱侧ך؟٦ؽأ׾⢪ְז ָ׵㹋騧涸ז"OESPJE،فٔך⡲׶倯׾稱 ➜׃תׅ

Slide 9

Slide 9 text

رٌ،فٔ稱➜

Slide 10

Slide 10 text

رٌ،فٔ稱➜ ׻ְ׻ְثٍحز IUUQTQMBZHPPHMFDPNTUPSFBQQT EFUBJMT JEVTTIJSPZBNBBOESPJEGJSFCBTFSFBMUJNFDIBU ˖ ٔ،ٕة؎يثٍحز ˖ 5XJUUFS钠鏾 ˖ ًحإ٦آך鷏⥋ ˖ 歗⫷ך،حفٗ٦س ˖ 荈ⴓך鷏׏׋ًحإ٦آך⵴ꤐ ˖ 荈ⴓך鷏׏׋歗⫷ך⵴ꤐ IUUQTHJUIVCDPNTSZN'JSFCBTF3FBM5JNF$IBU

Slide 11

Slide 11 text

رٌ،فٔ稱➜

Slide 12

Slide 12 text

'JSFCBTF4%,

Slide 13

Slide 13 text

// Top-level build file
 
 buildscript {
 repositories {
 jcenter()
 mavenCentral()
 }
 dependencies {
 classpath 'com.google.gms:google-services:3.0.0'
 }
 } فٗآؙؑزךCVJMEHSBEMF

Slide 14

Slide 14 text

def firebase_lib_version = '9.6.1'
 
 dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 
 compile "com.google.firebase:firebase-core:${firebase_lib_version}"
 }
 
 // THIS MUST BE AT THE BOTTOM
 apply plugin: 'com.google.gms.google-services' ،فٌٔآُ٦ٕךCVJMEHSBEMF

Slide 15

Slide 15 text

def firebase_lib_version = '9.6.1'
 
 dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 
 compile "com.google.firebase:firebase-core:${firebase_lib_version}"
 }
 
 // THIS MUST BE AT THE BOTTOM
 apply plugin: 'com.google.gms.google-services' ،فٌٔآُ٦ٕךCVJMEHSBEMF

Slide 16

Slide 16 text

"VUIFOUJDBUJPO

Slide 17

Slide 17 text

"VUIFOUJDBUJPO ˖ 'JSFCBTFך钠鏾㛇湍 ˖ 'JSFCBTF荈魦ָ*%1"44ח״׷钠鏾堣圓׾䭯׏ג ְ׷➭ծ(PPHMF 'BDFCPPL 5XJUUFS (JU)VCזו ך،ؕؐٝزד钠鏾דֹ׷ ˖ ⼡せךٙٝة؎ي钠鏾 ˖ 醱侧钠鏾فٗغ؎تך钠鏾䞔㜠ך窟さ ˖ ׻ְ׻ְثٍحزדכ5XJUUFS钠鏾׾ⵃ欽׃תׅ

Slide 18

Slide 18 text

"VUIFOUJDBUJPO

Slide 19

Slide 19 text

"VUIFOUJDBUJPO

Slide 20

Slide 20 text

"VUIFOUJDBUJPO

Slide 21

Slide 21 text

"VUIFOUJDBUJPO

Slide 22

Slide 22 text

"VUIFOUJDBUJPO

Slide 23

Slide 23 text

"VUIFOUJDBUJPO

Slide 24

Slide 24 text

"VUIFOUJDBUJPO ˖ BQQTUXJUUFSDPN ˖ $SFBUF/FX"QQ

Slide 25

Slide 25 text

"VUIFOUJDBUJPO ˖ BQQTUXJUUFSDPN ˖ $SFBUF/FX"QQ

Slide 26

Slide 26 text

"VUIFOUJDBUJPO

Slide 27

Slide 27 text

"VUIFOUJDBUJPO

Slide 28

Slide 28 text

"VUIFOUJDBUJPO

Slide 29

Slide 29 text

"VUIFOUJDBUJPO

Slide 30

Slide 30 text

def firebase_lib_version = '9.6.1'
 
 dependencies {
 compile "com.google.firebase:firebase-core:${firebase_lib_version}" compile "com.google.firebase:firebase-auth:${firebase_lib_version}"
 }
 
 // THIS MUST BE AT THE BOTTOM
 apply plugin: 'com.google.gms.google-services' ،فٌٔآُ٦ٕךCVJMEHSBEMF

Slide 31

Slide 31 text

"VUIFOUJDBUJPO "OESPJE4UVEJP

Slide 32

Slide 32 text

public class MyApplication extends Application {
 public ApplicationComponent applicationComponent;
 
 @Override
 public void onCreate() {
 super.onCreate();
 
 TwitterAuthConfig authConfig = new TwitterAuthConfig(BuildConfig.TWITTER_KEY, BuildConfig.TWITTER_SECRET);
 Fabric.with(this, new Twitter(authConfig), new Crashlytics());
 }
 
 }

Slide 33

Slide 33 text

public class MyApplication extends Application {
 public ApplicationComponent applicationComponent;
 
 @Override
 public void onCreate() {
 super.onCreate();
 
 TwitterAuthConfig authConfig = new TwitterAuthConfig(BuildConfig.TWITTER_KEY, BuildConfig.TWITTER_SECRET);
 Fabric.with(this, new Twitter(authConfig), new Crashlytics());
 }
 
 } "1*,FZ 4FDSFU

Slide 34

Slide 34 text


 
 
 


Slide 35

Slide 35 text


 
 
 
 5XJUUFSؚٗ؎ٝنةٝ

Slide 36

Slide 36 text

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 twitterLoginButton.onActivityResult(requestCode, resultCode, data);
 }

Slide 37

Slide 37 text

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 twitterLoginButton.onActivityResult(requestCode, resultCode, data);
 } 钠鏾䖓؝٦ٕغحؙ

Slide 38

Slide 38 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 });

Slide 39

Slide 39 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 }); ؙٔحؙ

Slide 40

Slide 40 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 }); 5XJUUFSךز٦ؙٝ

Slide 41

Slide 41 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 }); 'JSFCBTFך钠鏾彊⪒

Slide 42

Slide 42 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 }); 'JSFCBTFחؚٗ؎ٝ

Slide 43

Slide 43 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 }); 'JSFCBTFⰻךِ٦ؠ

Slide 44

Slide 44 text

twitterLoginButton.setCallback(new Callback() {
 @Override
 public void success(Result result) {
 TwitterSession session = result.data;
 TwitterAuthToken token = session.getAuthToken();
 AuthCredential credential = TwitterAuthProvider.getCredential(token.token, token.secret);
 
 FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
 firebaseAuth.signInWithCredential(credential)
 .addOnSuccessListener(authResult -> {
 FirebaseUser firebaseUser = authResult.getUser();
 String uid = firebaseUser.getUid();
 UserInfo twitterUser = firebaseUser.getProviderData().get(1);
 String name = twitterUser.getDisplayName();
 String thumbnail = twitterUser.getPhotoUrl().toString();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 }
 
 @Override
 public void failure(TwitterException exception) {
 }
 }); ♧䠐ז*%

Slide 45

Slide 45 text

if (firebaseAuth.getCurrentUser() != null) {
 FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
 String uid = firebaseUser.getUid();
 }

Slide 46

Slide 46 text

if (firebaseAuth.getCurrentUser() != null) {
 FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
 String uid = firebaseUser.getUid();
 } ؚٗ؎ٝ幥׫

Slide 47

Slide 47 text

@Override
 public boolean onOptionsItemSelected(MenuItem item) {
 switch (item.getItemId()) {
 case R.id.action_logout:
 firebaseAuth.signOut();
 return true;
 default:
 return super.onOptionsItemSelected(item);
 }
 }

Slide 48

Slide 48 text

@Override
 public boolean onOptionsItemSelected(MenuItem item) {
 switch (item.getItemId()) {
 case R.id.action_logout:
 firebaseAuth.signOut();
 return true;
 default:
 return super.onOptionsItemSelected(item);
 }
 } ؚٗ،ؐز

Slide 49

Slide 49 text

"VUIFOUJDBUJPO ˖ 钠鏾فٗغ؎تח״׏ג《䖤דֹ׷䞔㜠ח蕯䎁ך 䊴殯ָ֮׷ָծ㛇劤涸ז⢪ְ倯כ➭ךفٗغ؎ت ׮ずׄ ˖ 'JSFBCBTF6TFSHFU6JE ד《䖤דֹ׷6*%כفٗ غ؎ت׾ת׋ְד׮窫㼎חꅾ醱׃זְ♧䠐ד֮ ׷ֿהָ⥂鏾ׁ׸גְ׷ ˖ 6*ה钠鏾Ⳣ椚ָמהאחז׏׋'JSFBCBTF6* ك٦ةהְֲך׮֮׷

Slide 50

Slide 50 text

3FBMUJNF%BUBCBTF

Slide 51

Slide 51 text

3FBMUJNF%BUBCBTF ˖ ٔ،ٕة؎يחず劍ׁ׸׷ر٦ةك٦أ ˖ أؗ٦وٖأז/P42- ˖ ر٦ةכ+40/䕎䒭ד⥂䭯 ˖ ؔؿٓ؎ٝ؟ه٦ز ˖ "OESPJE J04 8FC ˖ 厫鮾ז،ؙإأⵖ䖴

Slide 52

Slide 52 text

ر٦ة圓鸡 { "users": { "alovelace": { "name": "Ada Lovelace", "contacts": { "ghopper": true }, }, "ghopper": { ... }, "eclarke": { ... } } } +40/ד邌植דֹ׷⟣䠐ךر٦ة圓鸡

Slide 53

Slide 53 text

ر٦ة圓鸡 劤傈䪔ֲر٦ة圓鸡 { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, ..... }, "users" : { "user01" : { "name" : "Steve", "thumbnail" : "http://example.com/img/user01.jpg" }, .... } }

Slide 54

Slide 54 text

ر٦ة圓鸡 ط؎ذ؍ـדٔأزכ؟ه٦زׁ׸זְ { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, ..... }, "users" : { "user01" : { "name" : "Steve", "thumbnail" : "http://example.com/img/user01.jpg" }, .... } }

Slide 55

Slide 55 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 56

Slide 56 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 57

Slide 57 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 58

Slide 58 text

ر٦ة圓鸡 { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, "message02" : { "body" : "how are you!", "senderUid" : "user0002", "type" : 0 }, .... } }

Slide 59

Slide 59 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 60

Slide 60 text

ر٦ة圓鸡 { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, "message02" : { "body" : "how are you!", "senderUid" : "user0002", "type" : 0 }, .... } }

Slide 61

Slide 61 text

3FBMUJNF%BUBCBTF ˖ ؎كٝزسٔـٌٝرٕ ˖ 妜׃ְة؎ىؚٝד《׶ח遤ֻךדכזֻծ圫ղ ז؎كٝزח㼎׃גٔأش׾涫ꐮ׃גֶֹծ؎ك ٝز涪欰׀הח؝٦ٕغحؙ׃ג׮׵ֲ ˖ ر٦ةךٔؿ؋ٖٝأח㼎׃גٔأش׾鏣㹀ׅ׷ ֿ׸׵ך暴䗙׾䬃ִׁגֶֻֿהָꅾ銲

Slide 62

Slide 62 text

؎كٝزٔأشך珏겲 ٔأش ؎كٝز 欽鷿 7BMVF&WFOU-JTUFOFS PO%BUB$IBOHF ػأך؝ٝذٝخח㼎ׅ׷ 㢌刿儗חㄎל׸׷ $IJME&WFOU-JTUFOFS PO$IJME"EEFE ٔأزח㶨銲稆ָ鷄⸇ׁ׸ ׋儗חㄎל׸׷ $IJME&WFOU-JTUFOFS PO$IJME$IBOHFE ٔأزך㶨銲稆ח㢌刿ָ֮ ׏׋儗חㄎל׸׷ $IJME&WFOU-JTUFOFS PO$IJME3FNPWFE ٔأزך㶨銲稆ָ⵴ꤐׁ׸ ׋儗חㄎל׸׷ $IJME&WFOU-JTUFOFS PO$IJME.PWFE ٔأزך㶨銲稆ך갫䎷ָ㢌 ׻׏׋儗חㄎל׸׷

Slide 63

Slide 63 text

def firebase_lib_version = '9.6.1'
 
 dependencies {
 compile "com.google.firebase:firebase-core:${firebase_lib_version}" compile "com.google.firebase:firebase-auth:${firebase_lib_version}" compile "com.google.firebase:firebase-database:${firebase_lib_version}"
 }
 
 // THIS MUST BE AT THE BOTTOM
 apply plugin: 'com.google.gms.google-services' ،فٌٔآُ٦ٕךCVJMEHSBEMF

Slide 64

Slide 64 text

ر٦ةך知⽃ז铣׫剅ֹ // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue("Hello, World!");

Slide 65

Slide 65 text

ر٦ةך知⽃ז剅ֹ鴥׫ // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue("Hello, World!"); ر٦ةك٦أפ،ؙإأׅ׷彊⪒

Slide 66

Slide 66 text

ر٦ةך知⽃ז剅ֹ鴥׫ // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue("Hello, World!"); NFTTBHFפך⿫撑

Slide 67

Slide 67 text

ر٦ةך知⽃ז剅ֹ鴥׫ // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue("Hello, World!"); NFTTBHF)FMMP 8PSMEה剅ֹ鴥׫

Slide 68

Slide 68 text

ر٦ةך知⽃ז铣׫⳿׃ FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference messageRef = database.getReference("message"); ValueEventListener messageListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String message = dataSnapshot.getValue(String.class); } @Override public void onCancelled(DatabaseError databaseError) { } }; messageRef.addValueEventListener(messageListener); NFTTBHFפך⿫撑

Slide 69

Slide 69 text

ر٦ةך知⽃ז铣׫⳿׃ FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference messageRef = database.getReference("message"); ValueEventListener messageListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String message = dataSnapshot.getValue(String.class); } @Override public void onCancelled(DatabaseError databaseError) { } }; messageRef.addValueEventListener(messageListener); 7BMVF&WFOU-JTUFOFSך⡲䧭

Slide 70

Slide 70 text

ر٦ةך知⽃ז铣׫⳿׃ FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference messageRef = database.getReference("message"); ValueEventListener messageListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String message = dataSnapshot.getValue(String.class); } @Override public void onCancelled(DatabaseError databaseError) { } }; messageRef.addValueEventListener(messageListener); ر٦ةך《׶⳿׃

Slide 71

Slide 71 text

ر٦ةך知⽃ז铣׫⳿׃ FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference messageRef = database.getReference("message"); ValueEventListener messageListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String message = dataSnapshot.getValue(String.class); } @Override public void onCancelled(DatabaseError databaseError) { } }; messageRef.addValueEventListener(messageListener); ٔأشך鏣㹀

Slide 72

Slide 72 text

׍ז׫ח˘ ٔؿ؋ٖٝأכDIJME ד⟣䠐ך 帾ׁתד䱠׏גְֻֿהָדֹ׷ private void writeNewUser(String userId, String name, String email) { User user = new User(name, email); mDatabase.child("users").child(userId).setValue(user); }

Slide 73

Slide 73 text

7BMVF&WFOU-JTUFOFS 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()); // ... } }; mPostReference.addValueEventListener(postListener);

Slide 74

Slide 74 text

7BMVF&WFOU-JTUFOFS 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()); // ... } }; mPostReference.addValueEventListener(postListener);

Slide 75

Slide 75 text

7BMVF&WFOU-JTUFOFS 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()); // ... } }; mPostReference.addValueEventListener(postListener);

Slide 76

Slide 76 text

7BMVF&WFOU-JTUFOFS 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()); // ... } }; mPostReference.addValueEventListener(postListener);

Slide 77

Slide 77 text

7BMVF&WFOU-JTUFOFS 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()); // ... } }; mPostReference.addValueEventListener(postListener); ⥂㶷׮铣׫⳿׃׮⟣䠐ך10+0ָ⢪欽〳腉

Slide 78

Slide 78 text

$IJME&WFOU-JTUFOFS ChildEventListener childEventListener = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); // A new comment has been added, add it to the displayed list Comment comment = dataSnapshot.getValue(Comment.class); // ... }

Slide 79

Slide 79 text

$IJME&WFOU-JTUFOFS ChildEventListener childEventListener = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); // A new comment has been added, add it to the displayed list Comment comment = dataSnapshot.getValue(Comment.class); // ... } PO$IJME"EEFE כ㶨銲稆ך鷄⸇

Slide 80

Slide 80 text

$IJME&WFOU-JTUFOFS @Override public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey()); // A comment has changed, use the key to determine if we are displaying this // comment and if so displayed the changed comment. Comment newComment = dataSnapshot.getValue(Comment.class); String commentKey = dataSnapshot.getKey(); // ... }

Slide 81

Slide 81 text

$IJME&WFOU-JTUFOFS @Override public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey()); // A comment has changed, use the key to determine if we are displaying this // comment and if so displayed the changed comment. Comment newComment = dataSnapshot.getValue(Comment.class); String commentKey = dataSnapshot.getKey(); // ... } PO$IJME$IBOHFE כ㶨銲稆ך㢌⻉

Slide 82

Slide 82 text

$IJME&WFOU-JTUFOFS @Override public void onChildRemoved(DataSnapshot dataSnapshot) { Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey()); // A comment has changed, use the key to determine if we are displaying this // comment and if so remove it. String commentKey = dataSnapshot.getKey(); // ... }

Slide 83

Slide 83 text

$IJME&WFOU-JTUFOFS @Override public void onChildRemoved(DataSnapshot dataSnapshot) { Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey()); // A comment has changed, use the key to determine if we are displaying this // comment and if so remove it. String commentKey = dataSnapshot.getKey(); // ... } PO$IJME3FNPWFE כ㶨銲稆ך⵴ꤐ

Slide 84

Slide 84 text

$IJME&WFOU-JTUFOFS @Override public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey()); // A comment has changed position, use the key to determine if we are // displaying this comment and if so move it. Comment movedComment = dataSnapshot.getValue(Comment.class); String commentKey = dataSnapshot.getKey(); // ... }

Slide 85

Slide 85 text

$IJME&WFOU-JTUFOFS @Override public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey()); // A comment has changed position, use the key to determine if we are // displaying this comment and if so move it. Comment movedComment = dataSnapshot.getValue(Comment.class); String commentKey = dataSnapshot.getKey(); // ... } PO$IJME.PWFE כ㶨銲稆ך갫殢Ⰵ剏

Slide 86

Slide 86 text

$IJME&WFOU-JTUFOFS @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "postComments:onCancelled", databaseError.toException()); Toast.makeText(mContext, "Failed to load comments.", Toast.LENGTH_SHORT).show(); } }; ref.addChildEventListener(childEventListener);

Slide 87

Slide 87 text

$IJME&WFOU-JTUFOFS @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "postComments:onCancelled", databaseError.toException()); Toast.makeText(mContext, "Failed to load comments.", Toast.LENGTH_SHORT).show(); } }; ref.addChildEventListener(childEventListener); BEE$IJME&WFOU-JTUFOFSחإحز 埄ꣲךؒٓ٦瘝

Slide 88

Slide 88 text

ٔأزח㶨銲稆׾鷄⸇ DatabaseReference newMessageRef = databaseReference.child("/messages").push();
 
 newMessageRef
 .setValue(message)
 .addOnSuccessListener(result -> Log.d(TAG, "try message send."))
 .addOnFailureListener(error -> handleError(error, R.string.message_sent_error));

Slide 89

Slide 89 text

ٔأزח㶨銲稆׾鷄⸇ DatabaseReference newMessageRef = databaseReference.child("/messages").push();
 
 newMessageRef
 .setValue(message)
 .addOnSuccessListener(result -> Log.d(TAG, "try message send."))
 .addOnFailureListener(error -> handleError(error, R.string.message_sent_error)); QVTI דة؎يأةٝفח㛇בֻLFZָ荈⹛涪遤ׁ׸׷

Slide 90

Slide 90 text

ٔأزח㶨銲稆׾鷄⸇ DatabaseReference newMessageRef = databaseReference.child("/messages").push();
 
 newMessageRef
 .setValue(message)
 .addOnSuccessListener(result -> Log.d(TAG, "try message send."))
 .addOnFailureListener(error -> handleError(error, R.string.message_sent_error)); ֮הכֿ׸תדず圫TFU7BMVFׅ׷׌ֽ

Slide 91

Slide 91 text

銲稆ך⚛ן剏ִ ًاحس 欽鷿 PSEFS#Z$IJME 䭷㹀׃׋㶨銲稆ך⦼׾׮הח⚛ן剏ִ PSEFS#Z,FZ 㶨銲稆ךؗ٦׾׮הח⚛ן剏ִ PSEFS#Z7BMVF 㶨銲稆荈魦ך⦼׾׮הח⚛ן剏ִ PSEFS#Z1SJPSJUZ ⮚⯓䏝׾׮הח⚛ן剏ִ

Slide 92

Slide 92 text

銲稆ך⚛ן剏ִ String myUserId = getUid(); Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId) .orderByChild("starCount"); myTopPostsQuery.addChildEventListener(new ChildEventListener() { // TODO: implement the ChildEventListener methods as documented above // ... });

Slide 93

Slide 93 text

銲稆ך⚛ן剏ִ String myUserId = getUid(); Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId) .orderByChild("starCount"); myTopPostsQuery.addChildEventListener(new ChildEventListener() { // TODO: implement the ChildEventListener methods as documented above // ... }); ⟣䠐ךٔؿ؋ٖٝأ׾⿫撑

Slide 94

Slide 94 text

銲稆ך⚛ן剏ִ String myUserId = getUid(); Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId) .orderByChild("starCount"); myTopPostsQuery.addChildEventListener(new ChildEventListener() { // TODO: implement the ChildEventListener methods as documented above // ... }); ا٦ز勴⟝׾䭷㹀

Slide 95

Slide 95 text

銲稆ך⚛ן剏ִ String myUserId = getUid(); Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId) .orderByChild("starCount"); myTopPostsQuery.addChildEventListener(new ChildEventListener() { // TODO: implement the ChildEventListener methods as documented above // ... }); ֿ׸תד鸐׶ٔأش׾إحز

Slide 96

Slide 96 text

銲稆ךؿ؍ٕة ًاحس 欽鷿 MJNJU5P'JSTU ⯓걧ַ׵O⟝《䖤 MJNJU5P-BTU 䖓倯ַ׵O⟝《䖤 TUBSU"U 勴⟝חوحثׅ׷⦼⟃꣬׾《䖤 FOE"U 勴⟝חوحثׅ׷⦼תד׾《䖤 FRVBM5P 勴⟝חوحثׅ׷⦼׾《䖤

Slide 97

Slide 97 text

銲稆ךؿ؍ٕة Query recentPostsQuery = databaseReference.child("posts") ɹɹɹɹɹ.orderByChild("starCount") .startAt(5) .limitToFirst(100);

Slide 98

Slide 98 text

銲稆ךؿ؍ٕة Query recentPostsQuery = databaseReference.child("posts") ɹɹɹɹɹ.orderByChild("starCount") .startAt(5) .limitToFirst(100);

Slide 99

Slide 99 text

銲稆ךؿ؍ٕة Query recentPostsQuery = databaseReference.child("posts") ɹɹɹɹɹ.orderByChild("starCount") .startAt(5) .limitToFirst(100); ا٦زה穈׫さ׻ׇ׷ֿה׮ծ⟣䠐ךؿ؍ٕةה♧筰ח ⢪ֲֿה׮דֹ׷

Slide 100

Slide 100 text

4UPSBHF

Slide 101

Slide 101 text

4UPSBHF ˖ (PPHMF$MPVE4UPSBHFךغ؛حز׾ⵃ欽׃׋غ؎ شٔر٦ة׾知⽃ַאإُؗ،ח䪔ֲֿהךדֹ ׷➬穈׫ ˖ 3FBMUJNF%BUBCBTFכأزٖ٦آָ넝⣣זךדծ ׉ֿח歗⫷ؿ؋؎ٕ瘝׾縧ֻֿהכ֮ת׶植㹋涸 דכזְ ˖ ٔؿ؋ٖٝأך➬穈׫瘝כ3FBMUJNF%BUBCBTFח ״ֻ⡂גֶ׶ꬊ䌢ח知⽃ח䪔ֲֿהָ〳腉

Slide 102

Slide 102 text

4UPSBHF

Slide 103

Slide 103 text

4UPSBHF

Slide 104

Slide 104 text

def firebase_lib_version = '9.6.1'
 
 dependencies {
 compile "com.google.firebase:firebase-core:${firebase_lib_version}" compile "com.google.firebase:firebase-auth:${firebase_lib_version}" compile "com.google.firebase:firebase-storage:${firebase_lib_version}"
 }
 
 // THIS MUST BE AT THE BOTTOM
 apply plugin: 'com.google.gms.google-services' ،فٌٔآُ٦ٕךCVJMEHSBEMF

Slide 105

Slide 105 text

4UPSBHF FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("gs://"); StorageReference imagesRef = storageRef.child("images"); StorageReference spaceRef = storageRef.child("images/space.jpg"); spaceRef.getPath(); spaceRef.getName(); spaceRef.getBucket();

Slide 106

Slide 106 text

4UPSBHF FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("gs://"); StorageReference imagesRef = storageRef.child("images"); StorageReference spaceRef = storageRef.child("images/space.jpg"); spaceRef.getPath(); spaceRef.getName(); spaceRef.getBucket();

Slide 107

Slide 107 text

4UPSBHF FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("gs://"); StorageReference imagesRef = storageRef.child("images"); StorageReference spaceRef = storageRef.child("images/space.jpg"); spaceRef.getPath(); spaceRef.getName(); spaceRef.getBucket();

Slide 108

Slide 108 text

4UPSBHF FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("gs://"); StorageReference imagesRef = storageRef.child("images"); StorageReference spaceRef = storageRef.child("images/space.jpg"); spaceRef.getPath(); spaceRef.getName(); spaceRef.getBucket();

Slide 109

Slide 109 text

4UPSBHF FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("gs://"); StorageReference imagesRef = storageRef.child("images"); StorageReference spaceRef = storageRef.child("images/space.jpg"); spaceRef.getPath(); spaceRef.getName(); spaceRef.getBucket();

Slide 110

Slide 110 text

4UPSBHFח،حفٗ٦س public void uploadImage(String filePath, boolean deletePath) {
 String fileName = UUID.randomUUID().toString();
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 
 try {
 InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
 target.putStream(inputStream)
 .addOnSuccessListener(taskSnapshot -> {
 Log.d(TAG, "upload succeeded.");
 long totalBytes = taskSnapshot.getTotalByteCount();
 Uri downloadUri = taskSnapshot.getDownloadUrl();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 } catch (FileNotFoundException e) {
 Log.e(TAG, e.getMessage(), e);
 }
 }

Slide 111

Slide 111 text

4UPSBHFח،حفٗ٦س public void uploadImage(String filePath, boolean deletePath) {
 String fileName = UUID.randomUUID().toString();
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 
 try {
 InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
 target.putStream(inputStream)
 .addOnSuccessListener(taskSnapshot -> {
 Log.d(TAG, "upload succeeded.");
 long totalBytes = taskSnapshot.getTotalByteCount();
 Uri downloadUri = taskSnapshot.getDownloadUrl();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 } catch (FileNotFoundException e) {
 Log.e(TAG, e.getMessage(), e);
 }
 }

Slide 112

Slide 112 text

4UPSBHFח،حفٗ٦س public void uploadImage(String filePath, boolean deletePath) {
 String fileName = UUID.randomUUID().toString();
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 
 try {
 InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
 target.putStream(inputStream)
 .addOnSuccessListener(taskSnapshot -> {
 Log.d(TAG, "upload succeeded.");
 long totalBytes = taskSnapshot.getTotalByteCount();
 Uri downloadUri = taskSnapshot.getDownloadUrl();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 } catch (FileNotFoundException e) {
 Log.e(TAG, e.getMessage(), e);
 }
 }

Slide 113

Slide 113 text

4UPSBHFח،حفٗ٦س public void uploadImage(String filePath, boolean deletePath) {
 String fileName = UUID.randomUUID().toString();
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 
 try {
 InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
 target.putStream(inputStream)
 .addOnSuccessListener(taskSnapshot -> {
 Log.d(TAG, "upload succeeded.");
 long totalBytes = taskSnapshot.getTotalByteCount();
 Uri downloadUri = taskSnapshot.getDownloadUrl();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 } catch (FileNotFoundException e) {
 Log.e(TAG, e.getMessage(), e);
 }
 }

Slide 114

Slide 114 text

4UPSBHFח،حفٗ٦س public void uploadImage(String filePath, boolean deletePath) {
 String fileName = UUID.randomUUID().toString();
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 
 try {
 InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
 target.putStream(inputStream)
 .addOnSuccessListener(taskSnapshot -> {
 Log.d(TAG, "upload succeeded.");
 long totalBytes = taskSnapshot.getTotalByteCount();
 Uri downloadUri = taskSnapshot.getDownloadUrl();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 } catch (FileNotFoundException e) {
 Log.e(TAG, e.getMessage(), e);
 }
 }

Slide 115

Slide 115 text

4UPSBHFח،حفٗ٦س public void uploadImage(String filePath, boolean deletePath) {
 String fileName = UUID.randomUUID().toString();
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 
 try {
 InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
 target.putStream(inputStream)
 .addOnSuccessListener(taskSnapshot -> {
 Log.d(TAG, "upload succeeded.");
 long totalBytes = taskSnapshot.getTotalByteCount();
 Uri downloadUri = taskSnapshot.getDownloadUrl();
 })
 .addOnFailureListener(e -> Log.e(TAG, e.getMessage(), e));
 } catch (FileNotFoundException e) {
 Log.e(TAG, e.getMessage(), e);
 }
 } ؙٓ؎،ٝزכֿ׸׾تؐٝٗ٦س

Slide 116

Slide 116 text

4UPSBHFַ׵⵴ꤐ public void deleteImage(String fileName) {
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 target.delete()
 .addOnSuccessListener(result -> Log.d(TAG, "image delete ok."))
 .addOnFailureListener(error -> Log.e(TAG, error.getMessage(), error));
 }

Slide 117

Slide 117 text

4UPSBHFַ׵⵴ꤐ public void deleteImage(String fileName) {
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 target.delete()
 .addOnSuccessListener(result -> Log.d(TAG, "image delete ok."))
 .addOnFailureListener(error -> Log.e(TAG, error.getMessage(), error));
 }

Slide 118

Slide 118 text

4UPSBHFַ׵⵴ꤐ public void deleteImage(String fileName) {
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 target.delete()
 .addOnSuccessListener(result -> Log.d(TAG, "image delete ok."))
 .addOnFailureListener(error -> Log.e(TAG, error.getMessage(), error));
 }

Slide 119

Slide 119 text

4UPSBHFַ׵⵴ꤐ public void deleteImage(String fileName) {
 StorageReference target = storageReference
 .child(IMG_DIR)
 .child(fileName);
 target.delete()
 .addOnSuccessListener(result -> Log.d(TAG, "image delete ok."))
 .addOnFailureListener(error -> Log.e(TAG, error.getMessage(), error));
 }

Slide 120

Slide 120 text

3FNPUF$POGJH

Slide 121

Slide 121 text

3FNPUF$POGJH ˖ "#ذأزזו׾ꬊ䌢ח知⽃ח遤ֲ➬穈׫ ˖ "#ذأز⟃㢩ח׮㕂ח״׷؝ٝذٝخ⳿׃ⴓ ֽծؙٓ؎،ٝزךٔٔ٦أז׃ח俑鎉ך䊴׃剏 ִזו ˖ ؔٝٓ؎ٝ,FZ7BMVF4UPSFך״ֲז׮ך׌ָծ طحزꬊ䱸竲儗ח׮ؒٓ٦搀ֻⵃ欽〳腉

Slide 122

Slide 122 text

3FNPUF$POGJH

Slide 123

Slide 123 text

3FNPUF$POGJH

Slide 124

Slide 124 text

3FNPUF$POGJH

Slide 125

Slide 125 text

3FNPUF$POGJH

Slide 126

Slide 126 text

3FNPUF$POGJH

Slide 127

Slide 127 text

def firebase_lib_version = '9.6.1'
 
 dependencies {
 compile "com.google.firebase:firebase-core:${firebase_lib_version}" compile "com.google.firebase:firebase-auth:${firebase_lib_version}" compile "com.google.firebase:firebase-storage:${firebase_lib_version}" compile "com.google.firebase:firebase-config:${firebase_lib_version}"
 }
 
 // THIS MUST BE AT THE BOTTOM
 apply plugin: 'com.google.gms.google-services' ،فٌٔآُ٦ٕךCVJMEHSBEMF

Slide 128

Slide 128 text

3FNPUF$POGJH

Slide 129

Slide 129 text

3FNPUF$POGJH 
 
 
 chat_bg_color
 #87ceeb
 


Slide 130

Slide 130 text

3FNPUF$POGJH 
 
 
 chat_bg_color
 #87ceeb
 


Slide 131

Slide 131 text

3FNPUF$POGJH FirebaseRemoteConfigSettings remoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
 .setDeveloperModeEnabled(BuildConfig.DEBUG)
 .build();
 
 FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
 firebaseRemoteConfig.setConfigSettings(remoteConfigSettings);
 firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
 
 if (firebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
 cacheExpiration = 0;
 }
 
 firebaseRemoteConfig.fetch(cacheExpiration)
 .addOnSuccessListener(result -> Log.d(TAG, "Fetch succeeded."))
 .addOnFailureListener(e -> Log.e(TAG, "Fetch failed.", e));

Slide 132

Slide 132 text

3FNPUF$POGJH FirebaseRemoteConfigSettings remoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
 .setDeveloperModeEnabled(BuildConfig.DEBUG)
 .build();
 
 FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
 firebaseRemoteConfig.setConfigSettings(remoteConfigSettings);
 firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
 
 if (firebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
 cacheExpiration = 0;
 }
 
 firebaseRemoteConfig.fetch(cacheExpiration)
 .addOnSuccessListener(result -> Log.d(TAG, "Fetch succeeded."))
 .addOnFailureListener(e -> Log.e(TAG, "Fetch failed.", e));

Slide 133

Slide 133 text

3FNPUF$POGJH FirebaseRemoteConfigSettings remoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
 .setDeveloperModeEnabled(BuildConfig.DEBUG)
 .build();
 
 FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
 firebaseRemoteConfig.setConfigSettings(remoteConfigSettings);
 firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
 
 if (firebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
 cacheExpiration = 0;
 }
 
 firebaseRemoteConfig.fetch(cacheExpiration)
 .addOnSuccessListener(result -> Log.d(TAG, "Fetch succeeded."))
 .addOnFailureListener(e -> Log.e(TAG, "Fetch failed.", e));

Slide 134

Slide 134 text

3FNPUF$POGJH FirebaseRemoteConfigSettings remoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
 .setDeveloperModeEnabled(BuildConfig.DEBUG)
 .build();
 
 FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
 firebaseRemoteConfig.setConfigSettings(remoteConfigSettings);
 firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
 
 if (firebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
 cacheExpiration = 0;
 }
 
 firebaseRemoteConfig.fetch(cacheExpiration)
 .addOnSuccessListener(result -> Log.d(TAG, "Fetch succeeded."))
 .addOnFailureListener(e -> Log.e(TAG, "Fetch failed.", e));

Slide 135

Slide 135 text

3FNPUF$POGJH FirebaseRemoteConfigSettings remoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
 .setDeveloperModeEnabled(BuildConfig.DEBUG)
 .build();
 
 FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
 firebaseRemoteConfig.setConfigSettings(remoteConfigSettings);
 firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
 
 if (firebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
 cacheExpiration = 0;
 }
 
 firebaseRemoteConfig.fetch(cacheExpiration)
 .addOnSuccessListener(result -> Log.d(TAG, "Fetch succeeded."))
 .addOnFailureListener(e -> Log.e(TAG, "Fetch failed.", e));

Slide 136

Slide 136 text

3FNPUF$POGJH public void setBackgroundColor(View target) {
 String colorHex = firebaseRemoteConfig.getString("chat_bg_color");
 Log.d(TAG, "colorHex: " + colorHex);
 int color = Color.parseColor(colorHex);
 target.setBackgroundColor(color);
 }

Slide 137

Slide 137 text

3FNPUF$POGJH public void setBackgroundColor(View target) {
 String colorHex = firebaseRemoteConfig.getString("chat_bg_color");
 Log.d(TAG, "colorHex: " + colorHex);
 int color = Color.parseColor(colorHex);
 target.setBackgroundColor(color);
 }

Slide 138

Slide 138 text

3FNPUF$POGJH

Slide 139

Slide 139 text

3FNPUF$POGJH ˖ Ꟛ涪罏ٌ٦س׾剣⸬ח׃זְה儗꟦דؙٔؒأ ز׃ַדֹזְזוعؤه؎ٝز֮׶ ˖ ずֻׄծQSPEVDUJPO橆㞮ד♧䏝⦼׾《䖤ׅ׷ה رؿٕؓزד儗꟦ٍؗحءׁُ׸׷זוծ濼׵ זְהعو׷ه؎ٝزָ֮׷ ˖ ず劍涸ח《䖤ׅ׷⢪ְ倯ָ姻׃ְַוֲַכ嗚鎢 ך⡭㖑֮׶կأفٓحءُד《䖤ׅ׷ծغحؙؒ ٝسד《䖤׃ג如㔐饯⹛儗ח剣⸬⻉ׅ׷זוװ׶ 倯כ圫ղկ

Slide 140

Slide 140 text

׉ך➭5JQT

Slide 141

Slide 141 text

鷞갫ا٦ز ׉ך➭5JQT

Slide 142

Slide 142 text

׉ך➭5JQT ˖ 3FBMUJNF%BUBCBTFכرؿٕؓزד鷞갫ا٦زָ דֹזְ ˖ 1SJPSJUZ⮚⯓䏝׾⢪׏׋ٙ٦ؙ،ٓؐٝسָ ♧菙涸 ˖ 1SJPSJUZכ⟣䠐ךٔؿ؋ٖٝأח⟣䠐ך⦼׾鏣㹀 דֹ׷կ

Slide 143

Slide 143 text

׉ך➭5JQT DatabaseReference newMessage = databaseReference.child(Message.PATH).push();
 newMessage.setPriority(-timestamp);

Slide 144

Slide 144 text

׉ך➭5JQT DatabaseReference newMessage = databaseReference.child(Message.PATH).push();
 newMessage.setPriority(-timestamp);

Slide 145

Slide 145 text

׉ך➭5JQT DatabaseReference newMessage = databaseReference.child(Message.PATH).push();
 newMessage.setPriority(-timestamp); ׋הִל5JNFTUBNQ׾痗〾⿾鯄

Slide 146

Slide 146 text

׉ך➭5JQT databaseReference.child(Message.PATH).orderByPriority();

Slide 147

Slide 147 text

1VMM5P3FGSFTI ׉ך➭5JQT

Slide 148

Slide 148 text

׉ך➭5JQT ˖ ٔأز朐ךر٦ة׾《䖤ׅ׷ꥷծ7BMVF&WFOUד ♧孡ח《׷倯岀׮֮׸לծ$IJME&WFOUדBEEׁ׸ ׷ך׾䖉א倯岀׮֮׷կ ˖ 䖓罏כծ1VMM5P3FGSFTI儗זוחוֿדر٦ةך 「⥋ָ鷿ⴖ׸׷ַⴻ倖דֹזְկ ˖ ׃׋ָ׏גծPOFTIPUך7BMVF&WFOUה $IJME&WFOU׾穈׫さ׻ׇ׷ךָ⸬卓涸

Slide 149

Slide 149 text

׉ך➭5JQT private ValueEventListener singleShotListener = new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
 Message message = getMessageWithId(snapshot); // தུ
 updateTimestamp(message.getTimestamp());
 } ɹɹɹɹɹ// தུ
 
 databaseReference.child(Message.PATH) .orderByChild(Message.KEY_TIMESTAMP) .startAt(lastTimestamp + 1) .addChildEventListener(childAddListener);
 }
 
 @Override
 public void onCancelled(DatabaseError databaseError) { }
 };

Slide 150

Slide 150 text

׉ך➭5JQT private ValueEventListener singleShotListener = new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
 Message message = getMessageWithId(snapshot); // தུ
 updateTimestamp(message.getTimestamp());
 } ɹɹɹɹɹ// தུ
 
 databaseReference.child(Message.PATH) .orderByChild(Message.KEY_TIMESTAMP) .startAt(lastTimestamp + 1) .addChildEventListener(childAddListener);
 }
 
 @Override
 public void onCancelled(DatabaseError databaseError) { }
 };

Slide 151

Slide 151 text

׉ך➭5JQT private ValueEventListener singleShotListener = new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
 Message message = getMessageWithId(snapshot); // தུ
 updateTimestamp(message.getTimestamp());
 } ɹɹɹɹɹ// தུ
 
 databaseReference.child(Message.PATH) .orderByChild(Message.KEY_TIMESTAMP) .startAt(lastTimestamp + 1) .addChildEventListener(childAddListener);
 }
 
 @Override
 public void onCancelled(DatabaseError databaseError) { }
 };

Slide 152

Slide 152 text

׉ך➭5JQT private ValueEventListener singleShotListener = new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
 Message message = getMessageWithId(snapshot); // தུ
 updateTimestamp(message.getTimestamp());
 } ɹɹɹɹɹ// தུ
 
 databaseReference.child(Message.PATH) .orderByChild(Message.KEY_TIMESTAMP) .startAt(lastTimestamp + 1) .addChildEventListener(childAddListener);
 }
 
 @Override
 public void onCancelled(DatabaseError databaseError) { }
 };

Slide 153

Slide 153 text

׉ך➭5JQT private ValueEventListener singleShotListener = new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
 Message message = getMessageWithId(snapshot); // தུ
 updateTimestamp(message.getTimestamp());
 } ɹɹɹɹɹ// தུ
 
 databaseReference.child(Message.PATH) .orderByChild(Message.KEY_TIMESTAMP) .startAt(lastTimestamp + 1) .addChildEventListener(childAddListener);
 }
 
 @Override
 public void onCancelled(DatabaseError databaseError) { }
 };

Slide 154

Slide 154 text

،ؙإأⵖ䖴 ׉ך➭5JQT

Slide 155

Slide 155 text

׉ך➭5JQT { "rules": { ".read": false, ".write": false, "users": { ".read": "auth != null", "$user_id": { ".write": "auth != null && auth.uid === $user_id" } }, "messages": { ".read": "auth != null", ".indexOn": ["timestamp"], "$message_id": { ".write": "(auth != null && auth.uid === newData.child('senderUid').val()) || (auth != null && auth.uid === data.child('senderUid').val())" } } }, }

Slide 156

Slide 156 text

׉ך➭5JQT { "rules": { ".read": false, ".write": false, "users": { ".read": "auth != null", "$user_id": { ".write": "auth != null && auth.uid === $user_id" } }, "messages": { ".read": "auth != null", ".indexOn": ["timestamp"], "$message_id": { ".write": "(auth != null && auth.uid === newData.child('senderUid').val()) || (auth != null && auth.uid === data.child('senderUid').val())" } } }, } 钠鏾幥׫

Slide 157

Slide 157 text

׉ך➭5JQT { "rules": { ".read": false, ".write": false, "users": { ".read": "auth != null", "$user_id": { ".write": "auth != null && auth.uid === $user_id" } }, "messages": { ".read": "auth != null", ".indexOn": ["timestamp"], "$message_id": { ".write": "(auth != null && auth.uid === newData.child('senderUid').val()) || (auth != null && auth.uid === data.child('senderUid').val())" } } }, } 倜׃ֻ剅ֹ鴥ת׸׷ر٦ة

Slide 158

Slide 158 text

׉ך➭5JQT { "rules": { ".read": false, ".write": false, "users": { ".read": "auth != null", "$user_id": { ".write": "auth != null && auth.uid === $user_id" } }, "messages": { ".read": "auth != null", ".indexOn": ["timestamp"], "$message_id": { ".write": "(auth != null && auth.uid === newData.child('senderUid').val()) || (auth != null && auth.uid === data.child('senderUid').val())" } } }, } ֿ׸ַ׵⵴ꤐׅ׷ر٦ة

Slide 159

Slide 159 text

תה׭ ˖ (JU)VCךٖهآزٔהرٌ،فٔ׾僽ꬊ ⹛ַ׃ג׫גֻ׌ְׁ

Slide 160

Slide 160 text

5IBOL:PV ׀꫼耮֮׶ָהֲ׀ְׂת׃׋կ 涯㿊俑䕕 !GVTIJSPZBNB