Site icon C1CTech

Android Working With Firebase Realtime Database and Storage

<h4><strong><span style&equals;"color&colon; &num;000080&semi;">Firebase<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>A fully managed platform for building<strong><span style&equals;"color&colon; &num;008000&semi;"> iOS&comma; Android&comma; and web apps<&sol;span><&sol;strong> that provides automatic data synchronization&comma; authentication services&comma; messaging&comma; file storage&comma; analytics&comma; and more&period;<&sol;p>&NewLine;<p>All the data is stored in <span style&equals;"color&colon; &num;008000&semi;"><strong>JSON<&sol;strong><&sol;span> format and any changes in data&comma; reflects immediately by performing a <strong><span style&equals;"color&colon; &num;008000&semi;">sync<&sol;span><&sol;strong> across all the <strong><span style&equals;"color&colon; &num;008000&semi;">platforms<&sol;span><&sol;strong> &amp&semi; <strong><span style&equals;"color&colon; &num;008000&semi;">devices<&sol;span><&sol;strong>&period; This allows us to build more flexible <strong><span style&equals;"color&colon; &num;008000&semi;">realtime apps<&sol;span><&sol;strong> easily with minimal effort&period;<&sol;p>&NewLine;<p>This article covers basics integration of firebase <strong><span style&equals;"color&colon; &num;008000&semi;">Realtime Database<&sol;span><&sol;strong> and  <strong><span style&equals;"color&colon; &num;008000&semi;">Storage<&sol;span><&sol;strong>&period; The other concepts like performs <strong><span style&equals;"color&colon; &num;008000&semi;">data validations<&sol;span><&sol;strong>&comma; firebase <strong><span style&equals;"color&colon; &num;008000&semi;">access rules<&sol;span><&sol;strong> also covered&period; If you are new to firebase&comma; then this article helps you a lot in understanding the basic knowledge of working with firebase&period;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-318 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;Screenshot&lowbar;2018-03-23-18-17-501&period;png" alt&equals;"" width&equals;"480" height&equals;"800" &sol;><&sol;p>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">1&period; How the Data is Stored – JSON Structured<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>Firebase realtime database is a <strong><span style&equals;"color&colon; &num;008000&semi;">schemaless<&sol;span><&sol;strong> database in which the data is stored in<span style&equals;"color&colon; &num;008000&semi;"><strong> JSON <&sol;strong><&sol;span>format&period; Basically the entire database is a big JSON tree with multiple <strong><span style&equals;"color&colon; &num;008000&semi;">nodes<&sol;span><&sol;strong>&period; So when you plan your database&comma; you need to prepare the json structure in way that the data is accessible in easier way by <strong><span style&equals;"color&colon; &num;008000&semi;">avoiding nesting of child nodes<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<p>Here is an example of storing list of message in<strong><span style&equals;"color&colon; &num;008000&semi;"> json<&sol;span><&sol;strong> tree&period; You can go through firebase  <span style&equals;"color&colon; &num;000080&semi;"><strong><a style&equals;"color&colon; &num;000080&semi;" href&equals;"https&colon;&sol;&sol;firebase&period;google&period;com&sol;docs&sol;database&sol;android&sol;structure-data">Structure Your Database<&sol;a><&sol;strong><&sol;span>  guide to learn the best practices while defining the database structure&period;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-308 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;json2-1&period;jpg" alt&equals;"" width&equals;"610" height&equals;"294" &sol;><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">2&period; Offline Data<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>Firebase provides great support when comes to offline data&period; It automatically stores the data offline when there is no<strong><span style&equals;"color&colon; &num;008000&semi;"> internet<&sol;span> <&sol;strong>connection&period; When the device connects to internet&comma; all the data will be pushed to <span style&equals;"color&colon; &num;008000&semi;"><strong>realtime database<&sol;strong><&sol;span>&period; However enabling <span style&equals;"color&colon; &num;008000&semi;"><strong>disk persistence<&sol;strong><&sol;span> stores the data offline even though app restarts&period; Disk persistence can be <span style&equals;"color&colon; &num;008000&semi;"><strong>enabled<&sol;strong><&sol;span> by calling below one line code&period; Here is complete guide about firebase<strong><span style&equals;"color&colon; &num;000080&semi;">  <a style&equals;"color&colon; &num;000080&semi;" href&equals;"https&colon;&sol;&sol;firebase&period;google&period;com&sol;docs&sol;database&sol;android&sol;offline-capabilities">offline capabilities<&sol;a><&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<pre><span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;supports offline data<&sol;strong><&sol;span>&NewLine;FirebaseDatabase&period;getInstance&lpar;&rpar;&period;setPersistenceEnabled&lpar;true&rpar;&semi;<&sol;pre>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">3&period; Inserting Data<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>The realtime database accepts multiple data types <span style&equals;"color&colon; &num;008000&semi;"><strong>String<&sol;strong>&comma; <strong>Long<&sol;strong>&comma; <strong>Double<&sol;strong>&comma; <strong>Boolean<&sol;strong>&comma; <strong>Map&lt&semi;String&comma; Object&gt&semi;<&sol;strong>&comma; <strong>List&lt&semi;Object&gt&semi;<&sol;strong><&sol;span> to store the data&period; You can also use <span style&equals;"color&colon; &num;008000&semi;"><strong>custom java objects<&sol;strong><&sol;span> to store the data which is very helpful when storing model class directly in database&period;<&sol;p>&NewLine;<p>Let’s say you want to store <span style&equals;"color&colon; &num;008000&semi;"><strong>message details <&sol;strong><&sol;span>in the database&period; First you need to create  model with an <strong><span style&equals;"color&colon; &num;008000&semi;">empty constructor<&sol;span><&sol;strong> and other properties&period;<&sol;p>&NewLine;<pre>public class FriendlyMessage &lbrace;&NewLine;&NewLine; private String text&semi;&NewLine; private String name&semi;&NewLine; private String photoUrl&semi;&NewLine;&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; Default constructor required for calls to<&sol;strong><&sol;span>&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; DataSnapshot&period;getValue&lpar;FriendlyMessage&period;class&rpar;<&sol;strong><&sol;span>&NewLine; public FriendlyMessage&lpar;&rpar; &lbrace;&NewLine; &rcub;&NewLine;&NewLine; public FriendlyMessage&lpar;String text&comma; String name&comma; String photoUrl&rpar; &lbrace;&NewLine; this&period;text &equals; text&semi;&NewLine; this&period;name &equals; name&semi;&NewLine; this&period;photoUrl &equals; photoUrl&semi;&NewLine; &rcub;&NewLine;&NewLine;&rcub;<&sol;pre>&NewLine;<p>As every <span style&equals;"color&colon; &num;008000&semi;"><strong>FriendlyMessage<&sol;strong><&sol;span> needs a unique Id&comma; you can generate one by calling <span style&equals;"color&colon; &num;008000&semi;"><em><strong>push&lpar;&rpar;<&sol;strong><&sol;em><&sol;span> method which creates an empty node with unique key&period; Then get the reference to <span style&equals;"color&colon; &num;008000&semi;"><strong>&OpenCurlyQuote;message’<&sol;strong><&sol;span> node using <span style&equals;"color&colon; &num;008000&semi;"><em><strong>child&lpar;&rpar;<&sol;strong><&sol;em><&sol;span> method&period; Finally use<span style&equals;"color&colon; &num;008000&semi;"> <em><strong>setValue&lpar;&rpar;<&sol;strong><&sol;em><&sol;span> method to store the FriendlyMessage data&period;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<pre>DatabaseReference mMessagesDatabaseRef&semi;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;database reference<&sol;strong><&sol;span>&NewLine;mMessagesDatabaseRef &equals; FirebaseDatabase&period;getInstance&lpar;&rpar;&period;getReference&lpar;&rpar;&period;child&lpar;"message"&rpar;&semi;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; creating FriendlyMessage object<&sol;span><&sol;strong>&NewLine;FriendlyMessage message &equals; new FriendlyMessage&lpar;text&comma; mUsername&comma; null&rpar;&semi;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; pushing message to 'message' node using the userId<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;push&lpar;&rpar; will automatically generate a uniqueId<&sol;span><&sol;strong>&NewLine;mMessagesDatabaseRef&period;push&lpar;&rpar;&period;setValue&lpar;message&rpar;&semi;&NewLine;&NewLine;<&sol;pre>&NewLine;<p>By running the above code&comma; a new user node will be inserted in database with a unique key value&period;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-308 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;json2-1&period;jpg" alt&equals;"" width&equals;"610" height&equals;"294" &sol;><&sol;p>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">4&period; Reading Data<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>To read the data&comma; you need to attach the <span style&equals;"color&colon; &num;008000&semi;"><strong>ChildEventListener&lpar;&rpar;<&sol;strong><&sol;span> to the database reference&period; This event will be triggered  for all existing childs and also for the added one&period;<&sol;p>&NewLine;<pre>mChildEventListener &equals; new ChildEventListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onChildAdded&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine; FriendlyMessage friendlyMessage &equals; dataSnapshot&period;getValue&lpar;FriendlyMessage&period;class&rpar;&semi;&NewLine;&NewLine; mMessageAdapter&period;add&lpar;friendlyMessage&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildChanged&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildRemoved&lpar;DataSnapshot dataSnapshot&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildMoved&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onCancelled&lpar;DatabaseError databaseError&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&rcub;&semi;&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;ChildEventListener triggered for each child in message and also for the new child added<&sol;strong><&sol;span>&NewLine;mMessagesDatabaseRef&period;addChildEventListener&lpar;mChildEventListener&rpar;&semi;&NewLine;&NewLine;<&sol;pre>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">5&period; Firebase Storage<&sol;span><&sol;strong><&sol;h4>&NewLine;<p><strong><span style&equals;"color&colon; &num;008000&semi;">Cloud Storage<&sol;span><&sol;strong> is built for app developers who need to store and serve user-generated content&comma; such as <span style&equals;"color&colon; &num;008000&semi;"><strong>photos<&sol;strong><&sol;span> or <strong><span style&equals;"color&colon; &num;008000&semi;">videos<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<ol start&equals;"5">&NewLine;<li>1 <span style&equals;"color&colon; &num;0000ff&semi;"><strong>Uploading Files to Firebase Storage<&sol;strong><&sol;span><&sol;li>&NewLine;<&sol;ol>&NewLine;<pre>Uri selectedImageUri &equals; data&period;getData&lpar;&rpar;&semi;&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;get a reference to store file at chat&lowbar;photos&sol;&lt&semi;FILENAME&gt&semi;<&sol;span><&sol;strong>&NewLine;StorageReference photoRef &equals; mChatPhotosStorageRef&period;child&lpar;selectedImageUri&period;getLastPathSegment&lpar;&rpar;&rpar;&semi;&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Upload file to firebase storage<&sol;span><&sol;strong>&NewLine;photoRef&period;putFile&lpar;selectedImageUri&rpar;&period;addOnSuccessListener&lpar;new OnSuccessListener&lt&semi;UploadTask&period;TaskSnapshot&gt&semi;&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onSuccess&lpar;UploadTask&period;TaskSnapshot taskSnapshot&rpar; &lbrace;&NewLine;&NewLine; Uri downloadUrl &equals; taskSnapshot&period;getDownloadUrl&lpar;&rpar;&semi;&NewLine; &NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;<&sol;pre>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<ol start&equals;"5">&NewLine;<li>2 <span style&equals;"color&colon; &num;0000ff&semi;"><strong>Retrieving Uploaded Files from Firebase Storage<&sol;strong><&sol;span><&sol;li>&NewLine;<&sol;ol>&NewLine;<pre style&equals;"padding-left&colon; 60px&semi;">Uri selectedImageUri &equals; data&period;getData&lpar;&rpar;&semi;&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;get a reference to store file at chat&lowbar;photos&sol;&lt&semi;FILENAME&gt&semi;<&sol;strong><&sol;span>&NewLine;StorageReference photoRef &equals; mChatPhotosStorageRef&period;child&lpar;selectedImageUri&period;getLastPathSegment&lpar;&rpar;&rpar;&semi;&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;Upload file to firebase storage<&sol;strong><&sol;span>&NewLine;photoRef&period;putFile&lpar;selectedImageUri&rpar;&period;addOnSuccessListener&lpar;new OnSuccessListener&lt&semi;UploadTask&period;TaskSnapshot&gt&semi;&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onSuccess&lpar;UploadTask&period;TaskSnapshot taskSnapshot&rpar; &lbrace;&NewLine;&NewLine; Uri downloadUrl &equals; taskSnapshot&period;getDownloadUrl&lpar;&rpar;&semi;&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Here i am getting the upload file uri&lpar;downloadUrl&rpar; and setting it into FirebaseDatabase object&NewLine; &sol;&sol;&lpar;mMessagesDatabaseRef&rpar; using model class object&period;<&sol;span><&sol;strong> &NewLine; FriendlyMessage friendlyMessage &equals; new FriendlyMessage&lpar;null&comma; mUsername&comma; downloadUrl&period;toString&lpar;&rpar;&rpar;&semi;&NewLine; mMessagesDatabaseRef&period;push&lpar;&rpar;&period;setValue&lpar;friendlyMessage&rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;<&sol;pre>&NewLine;<p>Here i am getting the <span style&equals;"color&colon; &num;008000&semi;"><strong>FriendlyMessage<&sol;strong><&sol;span> object using <strong><span style&equals;"color&colon; &num;008000&semi;">dataSnapshot&period;getValue&lpar;FriendlyMessage&period;class&rpar; <&sol;span><&sol;strong>and adding it into listView using <strong><span style&equals;"color&colon; &num;008000&semi;">mMessageAdapter<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<pre>mChildEventListener &equals; new ChildEventListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onChildAdded&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine; FriendlyMessage friendlyMessage &equals; dataSnapshot&period;getValue&lpar;FriendlyMessage&period;class&rpar;&semi;&NewLine;&NewLine; mMessageAdapter&period;add&lpar;friendlyMessage&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildChanged&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildRemoved&lpar;DataSnapshot dataSnapshot&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildMoved&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onCancelled&lpar;DatabaseError databaseError&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&rcub;&semi;&NewLine;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;ChildEventListener triggered for each child in message and also for the new child added<&sol;strong><&sol;span>&NewLine;mMessagesDatabaseRef&period;addChildEventListener&lpar;mChildEventListener&rpar;&semi;<&sol;pre>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">6&period; Security &amp&semi; Rules<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>Firebase rules provides a way to identify user role while performing<span style&equals;"color&colon; &num;008000&semi;"><strong> read and write<&sol;strong><&sol;span> operations&period; These rules will acts a security layer on the server before perform any <strong><span style&equals;"color&colon; &num;008000&semi;">CRUD<&sol;span><&sol;strong> operation&period; By default the rules allows user to perform read &amp&semi; write operation only after authentication&period;<&sol;p>&NewLine;<p>The below rules allow authenticated users only to read or write data&period;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-309 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;Capture1&period;jpg" alt&equals;"" width&equals;"774" height&equals;"154" &sol;><&sol;p>&NewLine;<p>Below rules allows everyone to read &amp&semi; write data without authentication&period;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-310 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;Capture2&period;jpg" alt&equals;"" width&equals;"772" height&equals;"157" &sol;><&sol;p>&NewLine;<p>You can also use these rules to validate data before inserting into database&period; For example below rules validates the <span style&equals;"color&colon; &num;008000&semi;"><strong>name to be less than 50 chars<&sol;strong><&sol;span> and <span style&equals;"color&colon; &num;008000&semi;"><strong>text to be less than 200 chars<&sol;strong><&sol;span>&period;<&sol;p>&NewLine;<p><img class&equals;"wp-image-311 size-full aligncenter" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;cap3&period;jpg" alt&equals;"" width&equals;"753" height&equals;"310" &sol;><&sol;p>&NewLine;<p>Go through firebase <strong><span style&equals;"color&colon; &num;000080&semi;"><a style&equals;"color&colon; &num;000080&semi;" href&equals;"https&colon;&sol;&sol;firebase&period;google&period;com&sol;docs&sol;database&sol;security&sol;">security &amp&semi; rules<&sol;a><&sol;span><&sol;strong> guide to learn more about the security concepts&period;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p>Now we have enough knowledge to get started with an android project&period; Let’s create one and see how to integrate the<strong><span style&equals;"color&colon; &num;008000&semi;"> realtime database and cloud storage<&sol;span><&sol;strong> with an <strong><span style&equals;"color&colon; &num;008000&semi;">FriendlyChatApp<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<h4><strong><span style&equals;"color&colon; &num;000080&semi;">7&period; Creating Android Project<&sol;span><&sol;strong><&sol;h4>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">1&period; First thing you need to do is go to <span style&equals;"color&colon; &num;000080&semi;"><strong><a style&equals;"color&colon; &num;000080&semi;" href&equals;"https&colon;&sol;&sol;firebase&period;google&period;com&sol;">https&colon;&sol;&sol;firebase&period;google&period;com&sol;<&sol;a><&sol;strong><&sol;span>and make an account to gain access to their console&period; After you gain  access to the console you can start by creating your first project&period;<&sol;p>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">2&period; Give the package name of your project  in which you are going to integrate the <strong><span style&equals;"color&colon; &num;008000&semi;">Firebase<&sol;span><&sol;strong>&period; Here the <strong>google-services&period;json <&sol;strong>file will be downloaded when you press add app button&period;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-313 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;forthpage&period;jpg" alt&equals;"" width&equals;"694" height&equals;"577" &sol;><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">3&period; Create a new project in Android Studio from <span style&equals;"color&colon; &num;008000&semi;"><strong>File <&sol;strong><strong>&Implies; New Project<&sol;strong><&sol;span>&period; While filling the project details&comma; use the same package name which you gave in firebase<span style&equals;"color&colon; &num;008000&semi;"><strong> console<&sol;strong><&sol;span>&period;<&sol;p>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">4&period; Paste the <span style&equals;"color&colon; &num;008000&semi;"><strong>google-services&period;json <&sol;strong><&sol;span>file to your project’s <span style&equals;"color&colon; &num;008000&semi;"><strong>app<&sol;strong><&sol;span> This step is very important as your project won’t build without this file&period;<&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-314 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;fifthpage&period;jpg" alt&equals;"" width&equals;"692" height&equals;"636" &sol;><&sol;p>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">5&period;  Now open the <span style&equals;"color&colon; &num;008000&semi;"><strong>build&period;<&sol;strong><strong>gradle <&sol;strong><&sol;span>located in project’s home directory and add google <strong><span style&equals;"color&colon; &num;008000&semi;">playstore<&sol;span> <&sol;strong>dependency&period;<&sol;p>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">6&period; Open<span style&equals;"color&colon; &num;008000&semi;"> <&sol;span><strong><span style&equals;"color&colon; &num;008000&semi;">app&sol;build&period;gradle<&sol;span> <&sol;strong>and add <span style&equals;"color&colon; &num;008000&semi;"><strong>firebase database<&sol;strong><&sol;span>  dependency&period;At the very bottom of the file&comma; add <strong><span style&equals;"color&colon; &num;008000&semi;">apply plugin&colon;<&sol;span> <span style&equals;"color&colon; &num;008000&semi;">&OpenCurlyQuote;com&period;google&period;gms&period;google-services’<&sol;span><&sol;strong><&sol;p>&NewLine;<p><img class&equals;"aligncenter wp-image-315 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;sixthpage&period;jpg" alt&equals;"" width&equals;"699" height&equals;"639" &sol;><&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">7&period; In order to store messages&comma; we need a <strong><span style&equals;"color&colon; &num;008000&semi;">model<&sol;span><&sol;strong> class called <span style&equals;"color&colon; &num;008000&semi;"><strong>FriendlyMessage&period;java<&sol;strong><&sol;span>&period; Create a class named <span style&equals;"color&colon; &num;008000&semi;"><strong>FriendlyMessage&period;java<&sol;strong><&sol;span> and add below code&period;<&sol;p>&NewLine;<pre>package com&period;example&period;lenovo&period;friendlychatapp&period;model&semi;&NewLine;&NewLine;&NewLine;public class FriendlyMessage &lbrace;&NewLine;&NewLine; private String text&semi;&NewLine; private String name&semi;&NewLine; private String photoUrl&semi;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; Default constructor required for calls to<&sol;strong><&sol;span>&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; DataSnapshot&period;getValue&lpar;FriendlyMessage&period;class&rpar;<&sol;strong><&sol;span>&NewLine;&NewLine; public FriendlyMessage&lpar;&rpar; &lbrace;&NewLine; &rcub;&NewLine;&NewLine; public FriendlyMessage&lpar;String text&comma; String name&comma; String photoUrl&rpar; &lbrace;&NewLine; this&period;text &equals; text&semi;&NewLine; this&period;name &equals; name&semi;&NewLine; this&period;photoUrl &equals; photoUrl&semi;&NewLine; &rcub;&NewLine;&NewLine; public String getText&lpar;&rpar; &lbrace;&NewLine; return text&semi;&NewLine; &rcub;&NewLine;&NewLine; public void setText&lpar;String text&rpar; &lbrace;&NewLine; this&period;text &equals; text&semi;&NewLine; &rcub;&NewLine;&NewLine; public String getName&lpar;&rpar; &lbrace;&NewLine; return name&semi;&NewLine; &rcub;&NewLine;&NewLine; public void setName&lpar;String name&rpar; &lbrace;&NewLine; this&period;name &equals; name&semi;&NewLine; &rcub;&NewLine;&NewLine; public String getPhotoUrl&lpar;&rpar; &lbrace;&NewLine; return photoUrl&semi;&NewLine; &rcub;&NewLine;&NewLine; public void setPhotoUrl&lpar;String photoUrl&rpar; &lbrace;&NewLine; this&period;photoUrl &equals; photoUrl&semi;&NewLine; &rcub;&NewLine;&rcub;<&sol;pre>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">8&period;  Open the <span style&equals;"color&colon; &num;008000&semi;"><strong>activity&lowbar;main&period;xml <&sol;strong><&sol;span>and add the below code&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>activity&lowbar;main&period;xml<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;RelativeLayout xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; xmlns&colon;tools&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;tools"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"match&lowbar;parent"&NewLine;&NewLine; tools&colon;context&equals;"com&period;example&period;lenovo&period;friendlychatapp&period;MainActivity"&gt&semi;&NewLine;&NewLine; &lt&semi;ListView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;messageListView"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;above&equals;"&commat;&plus;id&sol;linearLayout"&NewLine; android&colon;divider&equals;"&commat;android&colon;color&sol;transparent"&NewLine; android&colon;stackFromBottom&equals;"true"&NewLine; android&colon;transcriptMode&equals;"alwaysScroll"&NewLine; tools&colon;listitem&equals;"&commat;layout&sol;item&lowbar;message" &sol;&gt&semi;&NewLine;&NewLine;&NewLine; &lt&semi;LinearLayout&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;linearLayout"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;alignParentBottom&equals;"true"&NewLine; android&colon;layout&lowbar;alignParentLeft&equals;"true"&NewLine; android&colon;layout&lowbar;alignParentStart&equals;"true"&NewLine; android&colon;orientation&equals;"horizontal"&gt&semi;&NewLine;&NewLine; &lt&semi;ImageButton&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;photoPickerButton"&NewLine; android&colon;layout&lowbar;width&equals;"36dp"&NewLine; android&colon;layout&lowbar;height&equals;"36dp"&NewLine; android&colon;background&equals;"&commat;android&colon;drawable&sol;ic&lowbar;menu&lowbar;gallery" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;EditText&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;messageEditText"&NewLine; android&colon;layout&lowbar;width&equals;"0dp"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;gravity&equals;"center&lowbar;vertical"&NewLine; android&colon;layout&lowbar;weight&equals;"1" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;Button&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;sendButton"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;gravity&equals;"bottom"&NewLine; android&colon;enabled&equals;"false"&NewLine; android&colon;text&equals;"send" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;&sol;LinearLayout&gt&semi;&NewLine;&NewLine;&NewLine;&lt&semi;&sol;RelativeLayout&gt&semi;<&sol;pre>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">9&period;Open <span style&equals;"color&colon; &num;008000&semi;"><strong>item&lowbar;message&period;xml<&sol;strong><&sol;span> and add the below code&period;This layout defines one single item of listview&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>item&lowbar;message&period;xml<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;LinearLayout xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; xmlns&colon;tools&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;tools"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;orientation&equals;"vertical"&gt&semi;&NewLine;&NewLine; &lt&semi;ImageView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;photoImageView"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;adjustViewBounds&equals;"true" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;messageTextView"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;weight&equals;"0"&NewLine; android&colon;textAppearance&equals;"&quest;android&colon;attr&sol;textAppearanceLarge"&NewLine; tools&colon;text&equals;"Message" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;nameTextView"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;weight&equals;"0"&NewLine; android&colon;textAppearance&equals;"&quest;android&colon;attr&sol;textAppearanceSmall"&NewLine; tools&colon;text&equals;"Name" &sol;&gt&semi;&NewLine;&NewLine;&lt&semi;&sol;LinearLayout&gt&semi;&NewLine;&NewLine;<&sol;pre>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">10&period; Open <span style&equals;"color&colon; &num;008000&semi;"><strong>MessageAdapter&period;Java<&sol;strong><&sol;span> and add the below code&period; This adapter will  show list of messages retrieve from database in listview&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>MessageAdapter&period;Java<&sol;strong><&sol;span><&sol;p>&NewLine;<pre style&equals;"padding-left&colon; 30px&semi;">package com&period;example&period;lenovo&period;friendlychatapp&semi;&NewLine;&NewLine;import android&period;app&period;Activity&semi;&NewLine;import android&period;content&period;Context&semi;&NewLine;import android&period;view&period;View&semi;&NewLine;import android&period;view&period;ViewGroup&semi;&NewLine;import android&period;widget&period;ArrayAdapter&semi;&NewLine;import android&period;widget&period;ImageView&semi;&NewLine;import android&period;widget&period;TextView&semi;&NewLine;import com&period;bumptech&period;glide&period;Glide&semi;&NewLine;import com&period;example&period;lenovo&period;friendlychatapp&period;model&period;FriendlyMessage&semi;&NewLine;import java&period;util&period;List&semi;&NewLine;&NewLine;public class MessageAdapter extends ArrayAdapter&lt&semi;FriendlyMessage&gt&semi; &lbrace;&NewLine;&NewLine; public MessageAdapter&lpar;Context context&comma; int resource&comma; List&lt&semi;FriendlyMessage&gt&semi; objects&rpar; &lbrace;&NewLine; super&lpar;context&comma; resource&comma; objects&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public View getView&lpar;int position&comma; View convertView&comma; ViewGroup parent&rpar; &lbrace;&NewLine; if &lpar;convertView &equals;&equals; null&rpar; &lbrace;&NewLine; convertView &equals; &lpar;&lpar;Activity&rpar; getContext&lpar;&rpar;&rpar;&period;getLayoutInflater&lpar;&rpar;&period;inflate&lpar;R&period;layout&period;item&lowbar;message&comma; parent&comma; false&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; ImageView photoImageView &equals; &lpar;ImageView&rpar; convertView&period;findViewById&lpar;R&period;id&period;photoImageView&rpar;&semi;&NewLine; TextView messageTextView &equals; &lpar;TextView&rpar; convertView&period;findViewById&lpar;R&period;id&period;messageTextView&rpar;&semi;&NewLine; TextView authorTextView &equals; &lpar;TextView&rpar; convertView&period;findViewById&lpar;R&period;id&period;nameTextView&rpar;&semi;&NewLine;&NewLine; FriendlyMessage message &equals; getItem&lpar;position&rpar;&semi;&NewLine;&NewLine; boolean isPhoto &equals; message&period;getPhotoUrl&lpar;&rpar; &excl;&equals; null&semi;&NewLine; if &lpar;isPhoto&rpar; &lbrace;&NewLine; messageTextView&period;setVisibility&lpar;View&period;GONE&rpar;&semi;&NewLine; photoImageView&period;setVisibility&lpar;View&period;VISIBLE&rpar;&semi;&NewLine; Glide&period;with&lpar;photoImageView&period;getContext&lpar;&rpar;&rpar;&NewLine; &period;load&lpar;message&period;getPhotoUrl&lpar;&rpar;&rpar;&NewLine; &period;into&lpar;photoImageView&rpar;&semi;&NewLine; &rcub; else &lbrace;&NewLine; messageTextView&period;setVisibility&lpar;View&period;VISIBLE&rpar;&semi;&NewLine; photoImageView&period;setVisibility&lpar;View&period;GONE&rpar;&semi;&NewLine; messageTextView&period;setText&lpar;message&period;getText&lpar;&rpar;&rpar;&semi;&NewLine; &rcub;&NewLine; authorTextView&period;setText&lpar;message&period;getName&lpar;&rpar;&rpar;&semi;&NewLine;&NewLine; return convertView&semi;&NewLine; &rcub;&NewLine;&rcub;&NewLine;<&sol;pre>&NewLine;<p style&equals;"padding-left&colon; 30px&semi;">11&period; Open <strong><span style&equals;"color&colon; &num;008000&semi;">MainActivity&period;Java<&sol;span><&sol;strong><b> <&sol;b>and add the below code&period; The code is very simple and easily understandable&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>MainActivity&period;Java<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>package com&period;example&period;lenovo&period;friendlychatapp&semi;&NewLine;&NewLine;import android&period;content&period;Intent&semi;&NewLine;import android&period;net&period;Uri&semi;&NewLine;import android&period;support&period;v7&period;app&period;AppCompatActivity&semi;&NewLine;import android&period;os&period;Bundle&semi;&NewLine;import android&period;text&period;Editable&semi;&NewLine;import android&period;text&period;TextWatcher&semi;&NewLine;import android&period;view&period;View&semi;&NewLine;import android&period;widget&period;Button&semi;&NewLine;import android&period;widget&period;EditText&semi;&NewLine;import android&period;widget&period;ImageButton&semi;&NewLine;import android&period;widget&period;ListView&semi;&NewLine;import com&period;example&period;lenovo&period;friendlychatapp&period;model&period;FriendlyMessage&semi;&NewLine;import com&period;google&period;android&period;gms&period;tasks&period;OnSuccessListener&semi;&NewLine;import com&period;google&period;firebase&period;database&period;ChildEventListener&semi;&NewLine;import com&period;google&period;firebase&period;database&period;DataSnapshot&semi;&NewLine;import com&period;google&period;firebase&period;database&period;DatabaseError&semi;&NewLine;import com&period;google&period;firebase&period;database&period;DatabaseReference&semi;&NewLine;import com&period;google&period;firebase&period;database&period;FirebaseDatabase&semi;&NewLine;import com&period;google&period;firebase&period;storage&period;FirebaseStorage&semi;&NewLine;import com&period;google&period;firebase&period;storage&period;StorageReference&semi;&NewLine;import com&period;google&period;firebase&period;storage&period;UploadTask&semi;&NewLine;import java&period;util&period;ArrayList&semi;&NewLine;import java&period;util&period;List&semi;&NewLine;&NewLine;public class MainActivity extends AppCompatActivity &lbrace;&NewLine;&NewLine; private static final int RC&lowbar;PHOTO&lowbar;PICKER &equals; 2&semi;&NewLine;&NewLine;&NewLine; private MessageAdapter mMessageAdapter&semi;&NewLine; private ImageButton mPhotoPickerButton&semi;&NewLine; private EditText mMessageEditText&semi;&NewLine; private Button mSendButton&semi;&NewLine; List&lt&semi;FriendlyMessage&gt&semi; friendlyMessages&semi;&NewLine; ListView mMessageListView&semi;&NewLine; private String mUsername&semi;&NewLine; DatabaseReference mMessagesDatabaseRef&semi;&NewLine; StorageReference mChatPhotosStorageRef&semi;&NewLine; private ChildEventListener mChildEventListener&semi;&NewLine;&NewLine;&NewLine; &commat;Override&NewLine; protected void onCreate&lpar;Bundle savedInstanceState&rpar; &lbrace;&NewLine; super&period;onCreate&lpar;savedInstanceState&rpar;&semi;&NewLine; setContentView&lpar;R&period;layout&period;activity&lowbar;main&rpar;&semi;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; you can give any name<&sol;strong><&sol;span>&NewLine; mUsername &equals; "Arun Kumar"&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;supports offline data<&sol;span><&sol;strong>&NewLine; FirebaseDatabase&period;getInstance&lpar;&rpar;&period;setPersistenceEnabled&lpar;true&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;database reference<&sol;span><&sol;strong>&NewLine; mMessagesDatabaseRef &equals; FirebaseDatabase&period;getInstance&lpar;&rpar;&period;getReference&lpar;&rpar;&period;child&lpar;"message"&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;storage reference<&sol;span><&sol;strong>&NewLine; mChatPhotosStorageRef &equals; FirebaseStorage&period;getInstance&lpar;&rpar;&period;getReference&lpar;&rpar;&period;child&lpar;"chat&lowbar;photos"&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Initialize references to views<&sol;span><&sol;strong>&NewLine; mMessageListView &equals; &lpar;ListView&rpar; findViewById&lpar;R&period;id&period;messageListView&rpar;&semi;&NewLine; mPhotoPickerButton &equals; &lpar;ImageButton&rpar; findViewById&lpar;R&period;id&period;photoPickerButton&rpar;&semi;&NewLine; mMessageEditText &equals; &lpar;EditText&rpar; findViewById&lpar;R&period;id&period;messageEditText&rpar;&semi;&NewLine; mSendButton &equals; &lpar;Button&rpar; findViewById&lpar;R&period;id&period;sendButton&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Initialize message ListView and its adapter<&sol;span><&sol;strong>&NewLine; friendlyMessages &equals; new ArrayList&lt&semi;&gt&semi;&lpar;&rpar;&semi;&NewLine; mMessageAdapter &equals; new MessageAdapter&lpar;this&comma; R&period;layout&period;item&lowbar;message&comma; friendlyMessages&rpar;&semi;&NewLine; mMessageListView&period;setAdapter&lpar;mMessageAdapter&rpar;&semi;&NewLine;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Enable Send button when there's text to send<&sol;span><&sol;strong>&NewLine; mMessageEditText&period;addTextChangedListener&lpar;new TextWatcher&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void beforeTextChanged&lpar;CharSequence charSequence&comma; int i&comma; int i1&comma; int i2&rpar; &lbrace;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onTextChanged&lpar;CharSequence charSequence&comma; int i&comma; int i1&comma; int i2&rpar; &lbrace;&NewLine; if &lpar;charSequence&period;toString&lpar;&rpar;&period;trim&lpar;&rpar;&period;length&lpar;&rpar; &gt&semi; 0&rpar; &lbrace;&NewLine; mSendButton&period;setEnabled&lpar;true&rpar;&semi;&NewLine; &rcub; else &lbrace;&NewLine; mSendButton&period;setEnabled&lpar;false&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void afterTextChanged&lpar;Editable editable&rpar; &lbrace;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Send button sends a message and clears the EditText<&sol;span><&sol;strong>&NewLine; mSendButton&period;setOnClickListener&lpar;new View&period;OnClickListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onClick&lpar;View view&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Send messages on click<&sol;span><&sol;strong>&NewLine; String text &equals; mMessageEditText&period;getText&lpar;&rpar;&period;toString&lpar;&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; creating FriendlyMessage object<&sol;span><&sol;strong>&NewLine; FriendlyMessage message &equals; new FriendlyMessage&lpar;text&comma; mUsername&comma; null&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; pushing message to 'message' node using the userId<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;push&lpar;&rpar; will automatically generate a uniqueId<&sol;span><&sol;strong>&NewLine; mMessagesDatabaseRef&period;push&lpar;&rpar;&period;setValue&lpar;message&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Clear input box<&sol;span><&sol;strong>&NewLine; mMessageEditText&period;setText&lpar;""&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine;&NewLine;&NewLine; mChildEventListener &equals; new ChildEventListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onChildAdded&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine; FriendlyMessage friendlyMessage &equals; dataSnapshot&period;getValue&lpar;FriendlyMessage&period;class&rpar;&semi;&NewLine;&NewLine; mMessageAdapter&period;add&lpar;friendlyMessage&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildChanged&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildRemoved&lpar;DataSnapshot dataSnapshot&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onChildMoved&lpar;DataSnapshot dataSnapshot&comma; String s&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onCancelled&lpar;DatabaseError databaseError&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine; &rcub;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;ChildEventListener triggered for each child in message and also for the new child added<&sol;span><&sol;strong>&NewLine; mMessagesDatabaseRef&period;addChildEventListener&lpar;mChildEventListener&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; ImagePickerButton shows an image picker to upload a image for a message<&sol;span><&sol;strong>&NewLine; mPhotoPickerButton&period;setOnClickListener&lpar;new View&period;OnClickListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onClick&lpar;View view&rpar; &lbrace;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; ImagePickerButton shows an image picker to upload a image for a message<&sol;span><&sol;strong>&NewLine;&NewLine; Intent intent &equals; new Intent&lpar;Intent&period;ACTION&lowbar;GET&lowbar;CONTENT&rpar;&semi;&NewLine; intent&period;setType&lpar;"image&sol;jpeg"&rpar;&semi;&NewLine; intent&period;putExtra&lpar;Intent&period;EXTRA&lowbar;LOCAL&lowbar;ONLY&comma; true&rpar;&semi;&NewLine; startActivityForResult&lpar;Intent&period;createChooser&lpar;intent&comma; "Complete action using"&rpar;&comma; RC&lowbar;PHOTO&lowbar;PICKER&rpar;&semi;&NewLine;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine;&NewLine; &rcub;&NewLine;&NewLine;&NewLine; &commat;Override&NewLine; protected void onActivityResult&lpar;int requestCode&comma; int resultCode&comma; Intent data&rpar; &lbrace;&NewLine; super&period;onActivityResult&lpar;requestCode&comma; resultCode&comma; data&rpar;&semi;&NewLine; if &lpar;requestCode &equals;&equals; RC&lowbar;PHOTO&lowbar;PICKER &amp&semi;&amp&semi; resultCode &equals;&equals; RESULT&lowbar;OK&rpar; &lbrace;&NewLine;&NewLine; Uri selectedImageUri &equals; data&period;getData&lpar;&rpar;&semi;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;get a reference to store file at chat&lowbar;photos&sol;&lt&semi;FILENAME&gt&semi;<&sol;strong><&sol;span>&NewLine; StorageReference photoRef &equals; mChatPhotosStorageRef&period;child&lpar;selectedImageUri&period;getLastPathSegment&lpar;&rpar;&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol;Upload file to firebase storage<&sol;span><&sol;strong>&NewLine; photoRef&period;putFile&lpar;selectedImageUri&rpar;&period;addOnSuccessListener&lpar;new OnSuccessListener&lt&semi;UploadTask&period;TaskSnapshot&gt&semi;&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onSuccess&lpar;UploadTask&period;TaskSnapshot taskSnapshot&rpar; &lbrace;&NewLine;&NewLine; Uri downloadUrl &equals; taskSnapshot&period;getDownloadUrl&lpar;&rpar;&semi;&NewLine; FriendlyMessage friendlyMessage &equals; new FriendlyMessage&lpar;null&comma; mUsername&comma; downloadUrl&period;toString&lpar;&rpar;&rpar;&semi;&NewLine; mMessagesDatabaseRef&period;push&lpar;&rpar;&period;setValue&lpar;friendlyMessage&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine;&NewLine;&rcub;<&sol;pre>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><b>When you run the app it will look like this &colon;<&sol;b><&sol;span><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p><img class&equals;"alignnone wp-image-318" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;Screenshot&lowbar;2018-03-23-18-17-501-180x300&period;png" alt&equals;"" width&equals;"215" height&equals;"358" &sol;><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;008000&semi;">When you click on ImagePicker button it will ask <span style&equals;"color&colon; &num;003366&semi;">Complete action Using<&sol;span>&period;Using one select an image you want to send and then click ok&period;<&sol;span><&sol;strong><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p><img class&equals;"alignnone wp-image-316" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;Screenshot&lowbar;2018-03-23-18-19-221-180x300&period;png" alt&equals;"" width&equals;"200" height&equals;"333" &sol;>          <img class&equals;"alignnone wp-image-317" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;03&sol;Screenshot&lowbar;2018-03-23-18-20-491-180x300&period;png" alt&equals;"" width&equals;"200" height&equals;"334" &sol;><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;&NewLine;

Exit mobile version