Slide 1

Slide 1 text

'JSFCBTFGPS"OESPJE ׾崞欽׃׋ 旗鸞،فٔꟚ涪ⰅꟌ 涯㿊俑䕕 !GVTIJSPZBNB

Slide 2

Slide 2 text

荈䊹稱➜ 'VNJIJLP4IJSPZBNB !GVTIJSPZBNB /JLLFJ*OD "OESPJE"QQ%FWFMPQFS 'JSFCBTF-PWFS

Slide 3

Slide 3 text

"OESPJE5FTUJOH#PPUDBNQ ˖ "OESPJE5FTUJOH#PPUDBNQװ׏גתׅ ˖ IUUQTBOESPJEUFTUJOHCPPUDBNQDPOOQBTTDPN ˖ "OESPJEךذأز갹䓸׏גְֹת׃׳ֲהְֲ⠓ ˖ ꟼ銮ח׮僽ꬊㄎ׿דֻ׌ְׁ ˖ $加刑傈銮㖑⼒׭ـٗحؙB ˖ չ僇傈ַ׵⢪ִ׷"OESPJE荈⹛ذأزⰅꟌպ

Slide 4

Slide 4 text

劤傈ך،آؑٝت ˖ 'JSFCBTFך嚊銲ֶׁ׵ְ ˖ 'JSFCBTF׾⢪׏׋旗鸞Ꟛ涪 ˖ رٌ،فٔ稱➜ ˖ "OBMZUJDT ˖ "VUIFOUJDBUJPO ˖ $SBTI3FQPSUJOH ˖ 3FBMUJNF%BUBCBTF ˖ 4UPSBHF ˖ 3FNPUF$POGJH

Slide 5

Slide 5 text

'JSFCBTFך嚊銲ֶׁ׵ְ

Slide 6

Slide 6 text

'JSFCBTFך嚊銲ֶׁ׵ְ

Slide 7

Slide 7 text

'JSFCBTFך嚊銲ֶׁ׵ְ

Slide 8

Slide 8 text

'JSFCBTFך嚊銲ֶׁ׵ְ ˖ (PPHMF*0דًآٍ٦،حفر٦ز ˖ 窟さٌغ؎ٕفٓحزؿؓ٦يפה鹌⻉ ˖ "OBMZUJDT׾⚥呌ה׃גծ،فٔך䧭ꞿ׾ %FWFMPQ٥(SPX٥&BSOךأذ٦آד⸇ 鸞ׅ׷

Slide 9

Slide 9 text

'JSFCBTFך嚊銲ֶׁ׵ְ 劤傈כ'JSFCBTFך醱侧ך؟٦ؽأ׾⢪ְז ָ׵㹋騧涸ז"OESPJE،فٔך⡲׶倯׾稱 ➜׃תׅ ˖ (PPHMF*0דًآٍ٦،حفر٦ز ˖ 窟さٌغ؎ٕفٓحزؿؓ٦يפה鹌⻉ ˖ "OBMZUJDT׾⚥呌ה׃גծ،فٔך䧭ꞿ׾ %FWFMPQ٥(SPX٥&BSOךأذ٦آד⸇ 鸞ׅ׷

Slide 10

Slide 10 text

'JSFCBTF׾⢪׏׋旗鸞Ꟛ涪

Slide 11

Slide 11 text

رٌ،فٔ稱➜ 'JSFCBTF׾⢪׏׋旗鸞Ꟛ涪

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

رٌ،فٔ稱➜

Slide 14

Slide 14 text

"OBMZUJDT

Slide 15

Slide 15 text

"OBMZUJDT

Slide 16

Slide 16 text

"OBMZUJDT ˖ 㸣Ⰻ搀俱ծ搀ⵖꣲ ˖ 荈⹛ٖه٦ز ˖ ؙٗأفٓحزؿؓ٦ي ˖ ؿ؋طٕծ؝م٦زؚٓؿ瘝׮؟ه٦ز ˖ #JH2VFSZהך鸬䵿 ˖ 'JSFCBTFךぐ؟٦ؽأהך鸬䵿

Slide 17

Slide 17 text

؎ٝأز٦ٕ倯岀 "OBMZUJDT

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

def firebase_lib_version = '10.0.0'
 
 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 21

Slide 21 text

،فٌٔآُ٦ٕךCVJMEHSBEMF def firebase_lib_version = '10.0.0'
 
 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'

Slide 22

Slide 22 text

"OBMZUJDT ˖ 㛇劤כֿ׸׌ֽ ˖ %"6 8"6 ."6 ˖ ،فٔך؎ٝأز٦ٕծ刿倜ծ،ٝ؎ٝ أز٦ٕ ˖ ぐ珏ؿ؍ٕة ˖ فٔ㹀纏ך؎كٝزך鷏⳿ ˖ 杝荈؎كٝز׮鷏⳿〳腉

Slide 23

Slide 23 text

؎كٝزך鷏⳿ "OBMZUJDT

Slide 24

Slide 24 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 
 Bundle purchaseInfo = new Bundle();
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_ID, "item_id_01234");
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_NAME, "FANCY WATCH"); 
 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_TO_CART, purchaseInfo);

Slide 25

Slide 25 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 
 Bundle purchaseInfo = new Bundle();
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_ID, "item_id_01234");
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_NAME, "FANCY WATCH"); 
 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_TO_CART, purchaseInfo);

Slide 26

Slide 26 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 
 Bundle purchaseInfo = new Bundle();
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_ID, "item_id_01234");
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_NAME, "FANCY WATCH"); 
 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_TO_CART, purchaseInfo); 'JSFCBTF"OBMZUJDT1BSBNח فٔ㹀纏ךػًٓ٦ة纇ָ֮׷

Slide 27

Slide 27 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 
 Bundle purchaseInfo = new Bundle();
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_ID, "item_id_01234");
 purchaseInfo.putString(FirebaseAnalytics.Param.ITEM_NAME, "FANCY WATCH"); 
 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_TO_CART, purchaseInfo); 'JSFCBTF"OBMZUJDT&WFOUח فٔ㹀纏ך؎كٝز纇ָ֮׷

Slide 28

Slide 28 text

杝荈؎كٝزך鷏⳿ "OBMZUJDT

Slide 29

Slide 29 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 Bundle params = new Bundle();
 params.putString("param_screen_name", "LoginActivity");
 firebaseAnalytics.logEvent("event_open_screen", params);

Slide 30

Slide 30 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 Bundle params = new Bundle();
 params.putString("param_screen_name", "LoginActivity");
 firebaseAnalytics.logEvent("event_open_screen", params); 杝荈ך؎كٝزהػًٓ٦ة׾鷏׷׌ֽ

Slide 31

Slide 31 text

FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
 Bundle params = new Bundle();
 params.putString("param_screen_name", "LoginActivity");
 firebaseAnalytics.logEvent("event_open_screen", params); 杝荈ך؎كٝزהػًٓ٦ة׾鷏׷׌ֽ 杝荈؎كٝزךػًٓ٦ة׾ろ׭׋ⴓ匿כ 垥彊דכ⳿勻זְךד銲#JH2VFSZ

Slide 32

Slide 32 text

"6%*&/$&4 "OBMZUJDT

Slide 33

Slide 33 text

"OBMZUJDT

Slide 34

Slide 34 text

"OBMZUJDT

Slide 35

Slide 35 text

"OBMZUJDT

Slide 36

Slide 36 text

"OBMZUJDT

Slide 37

Slide 37 text

"OBMZUJDT ˖ "VEJFODFTכ勴⟝ח״׏גِ٦ؠ׾إؚ ًٝزⴓֽׅ׷倯岀 ˖ ؿ؍ٕةה׃גⵃ欽דֹ׷➭ծ /PUJGJDBUJPOTה鸬䵿׃׋׶ׅ׷ֿה׮ד ֹ׷

Slide 38

Slide 38 text

"VUIFOUJDBUJPO

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

"VUIFOUJDBUJPO

Slide 41

Slide 41 text

"VUIFOUJDBUJPO

Slide 42

Slide 42 text

"VUIFOUJDBUJPO

Slide 43

Slide 43 text

"VUIFOUJDBUJPO

Slide 44

Slide 44 text

"VUIFOUJDBUJPO

Slide 45

Slide 45 text

"VUIFOUJDBUJPO 钠鏾䖓ך؝٦ٕغحؙ63-׾؝ؾ٦

Slide 46

Slide 46 text

"VUIFOUJDBUJPO ˖ BQQTUXJUUFSDPN ˖ $SFBUF/FX"QQ

Slide 47

Slide 47 text

"VUIFOUJDBUJPO ˖ BQQTUXJUUFSDPN ˖ $SFBUF/FX"QQ 钠鏾䖓ך؝٦ٕغحؙ63-׾ل٦أز

Slide 48

Slide 48 text

"VUIFOUJDBUJPO

Slide 49

Slide 49 text

"VUIFOUJDBUJPO ,FZ 4FDSFU׾؝ؾ٦

Slide 50

Slide 50 text

"VUIFOUJDBUJPO

Slide 51

Slide 51 text

"VUIFOUJDBUJPO ,FZ 4FDSFU׾ل٦أز

Slide 52

Slide 52 text

def firebase_lib_version = '10.0.0'
 
 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 53

Slide 53 text

"VUIFOUJDBUJPO "OESPJE4UVEJP

Slide 54

Slide 54 text

public class MyApplication extends Application {
 
 @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 55

Slide 55 text

public class MyApplication extends Application {
 
 @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 56

Slide 56 text


 
 
 


Slide 57

Slide 57 text


 
 
 
 5XJUUFSؚٗ؎ٝنةٝ

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 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 61

Slide 61 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 62

Slide 62 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 63

Slide 63 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 64

Slide 64 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 65

Slide 65 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 66

Slide 66 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 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 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 70

Slide 70 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 71

Slide 71 text

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

Slide 72

Slide 72 text

$SBTI3FQPSUJOH

Slide 73

Slide 73 text

$SBTI3FQPSUJOH ˖ 畭涸חְֲה$SBTIMZUJDT涸זװא ˖ *446&ך0QFO$MPTFח㼎䘔 ˖ "OBMZUJDTהך湱䚍ָ״ֻծؙٓحءُ儗ך؝ٝ ذؗأزָⴓַ׷

Slide 74

Slide 74 text

$SBTI3FQPSUJOH ؎ٝأز٦ٕ倯岀

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

$SBTI3FQPSUJOH

Slide 77

Slide 77 text

$SBTI3FQPSUJOH

Slide 78

Slide 78 text

$SBTI3FQPSUJOH

Slide 79

Slide 79 text

$SBTI3FQPSUJOH

Slide 80

Slide 80 text

$SBTI3FQPSUJOH

Slide 81

Slide 81 text

$SBTI3FQPSUJOH

Slide 82

Slide 82 text

$SBTI3FQPSUJOH

Slide 83

Slide 83 text

3FBMUJNF%BUBCBTF

Slide 84

Slide 84 text

3FBMUJNF%BUBCBTF ٔ،ٕة؎يず劍

Slide 85

Slide 85 text

ٔ،ٕة؎يず劍

Slide 86

Slide 86 text

͜Μʹͪ͸ʂ ٔ،ٕة؎يず劍

Slide 87

Slide 87 text

͜Μʹͪ͸ ϩʔΧϧ%#ʹอଘ ٔ،ٕة؎يず劍

Slide 88

Slide 88 text

͜Μʹͪ͸ ಉظ ͜Μʹͪ͸ 'JSFCBTF ٔ،ٕة؎يず劍

Slide 89

Slide 89 text

͜Μʹͪ͸ ಉظ ͜Μʹͪ͸ 'JSFCBTF ͜Μʹͪ͸ ͜Μʹͪ͸ ಉظ ٔ،ٕة؎يず劍

Slide 90

Slide 90 text

3FBMUJNF%BUBCBTF ؔؿٓ؎ٝ؟ه٦ز

Slide 91

Slide 91 text

͜Μʹͪ͸ ͜Μʹͪ͸ ΦϯϥΠϯ ͜Μʹͪ͸ ͜Μʹͪ͸ ؔؿٓ؎ٝ؟ه٦ز

Slide 92

Slide 92 text

͜Μʹͪ͸ ϒϥδϧͷਓ ฉ͑͜·͔͢ ͜Μʹͪ͸ ΦϑϥΠϯ ͜Μʹͪ͸ ͜Μʹͪ͸ ☓ ϒϥδϧͷਓʂ ฉ͑͜·͔͢ʂ ؔؿٓ؎ٝ؟ه٦ز

Slide 93

Slide 93 text

͜Μʹͪ͸ ϒϥδϧͷਓ ฉ͑͜·͔͢ ΦϯϥΠϯ෮ؼ ˓ ͜Μʹͪ͸ ϒϥδϧͷਓ ฉ͑͜·͔͢ ͜Μʹͪ͸ ϒϥδϧͷਓ ฉ͑͜·͔͢ ಉظ ಉظ ؔؿٓ؎ٝ؟ه٦ز

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

ر٦ة圓鸡 { "users": { "alovelace": { "name": "Ada Lovelace", "contacts": { "ghopper": true }, }, "ghopper": { ... }, "eclarke": { ... } } } +40/ד邌植דֹ׷⟣䠐ךر٦ة圓鸡 ˟׋׌׃ٔأزכ؟ه٦زׁ׸זְ ϋογϡͰදݱ͢Δ

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

ر٦ة圓鸡 ًحإ٦آ׾呓秛ׅ׷خٔ٦ { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, ..... }, "users" : { "user01" : { "name" : "Steve", "thumbnail" : "http://example.com/img/user01.jpg" }, .... } }

Slide 99

Slide 99 text

ر٦ة圓鸡 ِ٦ؠ׾呓秛ׅ׷خٔ٦ { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, ..... }, "users" : { "user01" : { "name" : "Steve", "thumbnail" : "http://example.com/img/user01.jpg" }, .... } }

Slide 100

Slide 100 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 101

Slide 101 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 102

Slide 102 text

ر٦ة圓鸡 { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, "message02" : { "body" : "How are you doing? :)", "senderUid" : "user0001", "type" : 0 }, .....ʢུʣ } }

Slide 103

Slide 103 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 104

Slide 104 text

➙傈䠐陎׃ג妜׃ְֿה

Slide 105

Slide 105 text

ر٦ة圓鸡 { "messages" : { "message01" : { "body" : "hello!", "senderUid" : "user0001", "type" : 0 }, "message02" : { "body" : "How are you doing? :)", "senderUid" : "user0001", "type" : 0 }, .....ʢུʣ "message10" : { "body" : "ฦ৴͠·ͨ͠ʂ", "senderUid" : "user0002", "type" : 0 } } } ௥Ճʂ

Slide 106

Slide 106 text

3FBMUJNF%BUBCBTF ؎ٝأز٦ٕ倯岀

Slide 107

Slide 107 text

def firebase_lib_version = '10.0.0'
 
 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 108

Slide 108 text

3FBMUJNF%BUBCBTF 3FBMUJNF%BUBCBTFך暴䗙

Slide 109

Slide 109 text

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

Slide 110

Slide 110 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 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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

Slide 115

Slide 115 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 116

Slide 116 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 117

Slide 117 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 118

Slide 118 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 119

Slide 119 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 120

Slide 120 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 121

Slide 121 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 122

Slide 122 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 123

Slide 123 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 124

Slide 124 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 125

Slide 125 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 126

Slide 126 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 127

Slide 127 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 128

Slide 128 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 129

Slide 129 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 130

Slide 130 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 131

Slide 131 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 132

Slide 132 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 133

Slide 133 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 134

Slide 134 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 135

Slide 135 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 136

Slide 136 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 137

Slide 137 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 138

Slide 138 text

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

Slide 139

Slide 139 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 140

Slide 140 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 141

Slide 141 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 142

Slide 142 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 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

4UPSBHF

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

4UPSBHF

Slide 150

Slide 150 text

4UPSBHF

Slide 151

Slide 151 text

def firebase_lib_version = '10.0.0'
 
 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 152

Slide 152 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 153

Slide 153 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 154

Slide 154 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 155

Slide 155 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 156

Slide 156 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 157

Slide 157 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 158

Slide 158 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 159

Slide 159 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 160

Slide 160 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 161

Slide 161 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 162

Slide 162 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 163

Slide 163 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 164

Slide 164 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 165

Slide 165 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 166

Slide 166 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 167

Slide 167 text

3FNPUF$POGJH

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

3FNPUF$POGJH

Slide 170

Slide 170 text

3FNPUF$POGJH

Slide 171

Slide 171 text

3FNPUF$POGJH

Slide 172

Slide 172 text

3FNPUF$POGJH

Slide 173

Slide 173 text

3FNPUF$POGJH

Slide 174

Slide 174 text

def firebase_lib_version = '10.0.0'
 
 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 175

Slide 175 text

3FNPUF$POGJH

Slide 176

Slide 176 text

3FNPUF$POGJH 
 
 
 chat_bg_color
 #87ceeb
 


Slide 177

Slide 177 text

3FNPUF$POGJH 
 
 
 chat_bg_color
 #87ceeb
 


Slide 178

Slide 178 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 179

Slide 179 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 180

Slide 180 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 181

Slide 181 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 182

Slide 182 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 183

Slide 183 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 184

Slide 184 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 185

Slide 185 text

3FNPUF$POGJH

Slide 186

Slide 186 text

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

Slide 187

Slide 187 text

׉ך➭5JQT

Slide 188

Slide 188 text

鷞갫ا٦ز ׉ך➭5JQT

Slide 189

Slide 189 text

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

Slide 190

Slide 190 text

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

Slide 191

Slide 191 text

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

Slide 192

Slide 192 text

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

Slide 193

Slide 193 text

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

Slide 194

Slide 194 text

1VMM5P3FGSFTI ׉ך➭5JQT

Slide 195

Slide 195 text

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

Slide 196

Slide 196 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 197

Slide 197 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 198

Slide 198 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 199

Slide 199 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 200

Slide 200 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 201

Slide 201 text

،ؙإأⵖ䖴 ׉ך➭5JQT

Slide 202

Slide 202 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 203

Slide 203 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 204

Slide 204 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 205

Slide 205 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 206

Slide 206 text

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

Slide 207

Slide 207 text

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