Advertisement
Guest User

MessageActivity

a guest
Jan 19th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.03 KB | None | 0 0
  1. package com.androidchatapp;
  2.  
  3. import android.content.Intent;
  4. import android.database.Cursor;
  5. import android.net.Uri;
  6. import android.provider.OpenableColumns;
  7. import android.support.annotation.NonNull;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.os.Bundle;
  10. import android.text.Editable;
  11. import android.text.TextWatcher;
  12. import android.util.Log;
  13. import android.view.*;
  14. import android.widget.AdapterView;
  15. import android.widget.Button;
  16. import android.widget.EditText;
  17. import android.widget.ImageButton;
  18. import android.widget.ImageView;
  19. import android.widget.ListView;
  20. import android.widget.TextView;
  21. import android.widget.Toast;
  22.  
  23. import com.android.volley.Request;
  24. import com.android.volley.RequestQueue;
  25. import com.android.volley.Response;
  26. import com.android.volley.VolleyError;
  27. import com.android.volley.toolbox.StringRequest;
  28. import com.android.volley.toolbox.Volley;
  29. import com.firebase.client.Firebase;
  30. import com.firebase.ui.auth.AuthUI;
  31. import com.google.android.gms.tasks.OnSuccessListener;
  32. import com.google.firebase.auth.FirebaseAuth;
  33. import com.google.firebase.auth.FirebaseUser;
  34. import com.google.firebase.database.ChildEventListener;
  35. import com.google.firebase.database.DataSnapshot;
  36. import com.google.firebase.database.DatabaseError;
  37. import com.google.firebase.database.DatabaseReference;
  38. import com.google.firebase.database.FirebaseDatabase;
  39. import com.google.firebase.database.ValueEventListener;
  40. import com.google.firebase.storage.FirebaseStorage;
  41. import com.google.firebase.storage.StorageReference;
  42. import com.google.firebase.storage.UploadTask;
  43.  
  44. import org.json.JSONException;
  45. import org.json.JSONObject;
  46.  
  47. import java.util.ArrayList;
  48. import java.util.Arrays;
  49. import java.util.HashMap;
  50. import java.util.Iterator;
  51. import java.util.Map;
  52.  
  53. public class MessageActivity extends AppCompatActivity {
  54.  
  55.     public static final String ANONYMOUS = "anonymous";
  56.  
  57.     public static final int SIGN_IN_REQUEST_CODE = 1;
  58.     public static final int PHOTO_PICKER_REQUEST_CODE = 2;
  59.  
  60.     private ListView messageListView;
  61.     private ImageButton imageButton;
  62.     private EditText editTextField;
  63.     private Button sendButton;
  64.  
  65.     private String username;
  66.     private MessageAdapter messageAdapter;
  67.  
  68.     private FirebaseAuth firebaseAuth;
  69.     private FirebaseDatabase firebaseDatabase;
  70.     private FirebaseStorage firebaseStorage;
  71.     private DatabaseReference databaseReference;
  72.     private StorageReference storageReference;
  73.     private FirebaseAuth.AuthStateListener authStateListener;
  74.     private ChildEventListener childEventListener;
  75.  
  76.  
  77.     @Override
  78.     protected void onCreate(Bundle savedInstanceState) {
  79.         super.onCreate(savedInstanceState);
  80.         setContentView(R.layout.activity_message);
  81. //        Toast.makeText(getApplicationContext(),"oke "+UserDetails.chatWith,Toast.LENGTH_LONG).show();
  82.  
  83.  
  84.         initializeInstanceVariables();
  85.         setArrayAdapter();
  86.         initializeFirebaseVariables();
  87.         setStatus();
  88.         authorizeAndManageStates();
  89.         addListenerToEditText();
  90.         attachClickListenerToSendButton();
  91.         setClickListenerOnPhotoPicker();
  92.  
  93.     }
  94.  
  95.     private void initializeInstanceVariables()
  96.     {
  97.         messageListView = findViewById(R.id.messageListView);
  98.         imageButton = findViewById(R.id.photoPickerButton);
  99.         editTextField = findViewById(R.id.messageEditText);
  100.         sendButton = findViewById(R.id.sendButton);
  101.     }
  102.  
  103.  
  104.     private void setArrayAdapter()
  105.     {
  106.         messageAdapter = new MessageAdapter(this, R.layout.message_item, new ArrayList<Message>());
  107.         messageListView.setAdapter(messageAdapter);
  108.  
  109.     }
  110.  
  111.  
  112.  
  113.  
  114.     private void initializeFirebaseVariables()
  115.     {
  116.         firebaseAuth = FirebaseAuth.getInstance();
  117.         firebaseDatabase = FirebaseDatabase.getInstance();
  118.         firebaseStorage = FirebaseStorage.getInstance();
  119.         databaseReference = firebaseDatabase.getReference().child("messages");
  120.         storageReference = firebaseStorage.getReference().child("chat-photos");
  121.  
  122.     }
  123.  
  124.  
  125.     private void addListenerToEditText()
  126.     {
  127.         editTextField.addTextChangedListener(new TextWatcher() {
  128.             @Override
  129.             public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
  130.             @Override
  131.             public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  132.                 if(charSequence.toString().trim().length() > 0)
  133.                     sendButton.setEnabled(true);
  134.                 else
  135.                     sendButton.setEnabled(false);
  136.             }
  137.             @Override
  138.             public void afterTextChanged(Editable editable) { }
  139.         });
  140.     }
  141.  
  142.  
  143.     private void attachClickListenerToSendButton()
  144.     {
  145.         sendButton.setOnClickListener(new View.OnClickListener() {
  146.             @Override
  147.             public void onClick(View view) {
  148.                 String textInEditText = editTextField.getText().toString();
  149.                 databaseReference.push().setValue(new Message(textInEditText, username,  UserDetails.chatWith, "terkirim", null, null/*, null*/));
  150.                 setRelated();
  151.                 editTextField.setText("");
  152.  
  153.             }
  154.         });
  155.     }
  156.  
  157.  
  158.     private void setClickListenerOnPhotoPicker()
  159.     {
  160.         imageButton.setOnClickListener(new View.OnClickListener() {
  161.             @Override
  162.             public void onClick(View view) {
  163.                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  164.                 intent.setType("image/jpeg");
  165.                 intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
  166.                 startActivityForResult(Intent.createChooser(intent, "Complete Action Using"), PHOTO_PICKER_REQUEST_CODE);
  167.                 //the result is returned using onActivityResult()
  168.             }
  169.         });
  170.     }
  171.  
  172.  
  173.     private void authorizeAndManageStates()
  174.     {
  175.         authStateListener = new FirebaseAuth.AuthStateListener() {
  176.             @Override
  177.             public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
  178.                 FirebaseUser user = firebaseAuth.getCurrentUser();
  179.  
  180.                 if(user != null)
  181.                     onSignedInInitialize(user.getDisplayName());
  182.                 else
  183.                 {
  184.                     onSignedOutCleanUp();
  185.  
  186.                     //if not signed in, we use FirebaseUI to display a sign in screen
  187.                     startActivityForResult(AuthUI.getInstance()
  188.                             .createSignInIntentBuilder()
  189.                             .setIsSmartLockEnabled(false)
  190.                             .setAvailableProviders(
  191.                                     Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
  192.                                             new AuthUI.IdpConfig.Builder(AuthUI.PHONE_VERIFICATION_PROVIDER).build(),
  193.                                             new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build())).build(), SIGN_IN_REQUEST_CODE);
  194.                 }
  195.             }
  196.         };
  197.         firebaseAuth.addAuthStateListener(authStateListener);
  198.     }
  199.  
  200.  
  201.     private void onSignedInInitialize(String username)
  202.     {
  203.         this.username = UserDetails.username;//username;
  204.         attachListenerToDatabaseReference();
  205.     }
  206.  
  207.  
  208.     private void attachListenerToDatabaseReference() {
  209.         //when a new message added to database, this method notifies us. And we display it
  210.         databaseReference.addChildEventListener(new ChildEventListener() {
  211.             @Override
  212.             public void onChildAdded(DataSnapshot dataSnapshot, String s) {
  213.  
  214.                 if(dataSnapshot.hasChild("to") && dataSnapshot.hasChild("user")){
  215.                     if(
  216.                             (dataSnapshot.child("to").getValue().equals(UserDetails.chatWith) && dataSnapshot.child("user").getValue().equals(UserDetails.username)) ||
  217.                             (dataSnapshot.child("user").getValue().equals(UserDetails.chatWith) && dataSnapshot.child("to").getValue().equals(UserDetails.username))
  218.                        )
  219.                     {
  220.                         Message tempMessage = dataSnapshot.getValue(Message.class);
  221.                         messageAdapter.add(tempMessage);
  222.                     }
  223.                 }
  224.  
  225.             }
  226.             @Override
  227.             public void onChildChanged(DataSnapshot dataSnapshot, String s) { }
  228.             @Override
  229.             public void onChildRemoved(DataSnapshot dataSnapshot) { }
  230.             @Override
  231.             public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
  232.             @Override
  233.             public void onCancelled(DatabaseError databaseError) { }
  234.         });
  235.     }
  236.  
  237.  
  238.  
  239.  
  240.     private void onSignedOutCleanUp()
  241.     {
  242.         username = ANONYMOUS;
  243.         messageAdapter.clear();
  244.     }
  245.  
  246.  
  247.     @Override
  248.     public boolean onCreateOptionsMenu(android.view.Menu menu)
  249.     {
  250.         //displaying custom menu on the screen
  251.         MenuInflater menuInflater = getMenuInflater();
  252.         menuInflater.inflate(R.menu.menu_chat, menu);
  253.         return true;
  254.     }
  255.  
  256.  
  257.     @Override
  258.     public boolean onOptionsItemSelected(MenuItem item) {
  259.         //Called when the user presses sign out in menu
  260.         switch(item.getItemId())
  261.         {
  262.             case R.id.send_file:
  263. //                AuthUI.getInstance().signOut(this);
  264.                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  265.                 intent.setType("*/*");
  266.                 intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
  267.                 startActivityForResult(Intent.createChooser(intent, "Complete Action Using"), 1);
  268.                 return true;
  269.         }
  270.         return super.onOptionsItemSelected(item);
  271.     }
  272.  
  273.  
  274.     @Override
  275.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  276.         //when we request from Firebase and a result comes back,
  277.         //its sent with this method
  278.         super.onActivityResult(requestCode, resultCode, data);
  279.  
  280.         if(requestCode == PHOTO_PICKER_REQUEST_CODE && resultCode == RESULT_OK){
  281.             storePhotoAndDisplay(data);
  282.             Toast.makeText(this, "Photo", Toast.LENGTH_SHORT).show();
  283.         }
  284.         else if(requestCode == 1 && resultCode == RESULT_OK){
  285.             storeFile(data);
  286.             Toast.makeText(this, "File", Toast.LENGTH_SHORT).show();
  287.         }
  288.  
  289.     }
  290.  
  291.     private void storePhotoAndDisplay(Intent data)
  292.     {
  293.         Uri chosenPhotoUri = data.getData();
  294.         StorageReference storageReferenceToSave = storageReference.child(chosenPhotoUri.getLastPathSegment());
  295.         storageReferenceToSave.putFile(chosenPhotoUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
  296.             @Override
  297.             public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
  298.                 Uri downloadUriInStorage = taskSnapshot.getDownloadUrl();
  299.                 databaseReference.push().setValue(new Message(null, username, UserDetails.chatWith, "terkirim", downloadUriInStorage.toString(), "image"/*, null*/));
  300.             }
  301.         });
  302.     }
  303.  
  304.     private void storeFile(Intent data)
  305.     {
  306.         Uri chosenUri = data.getData();
  307.  
  308.         StorageReference storageReferenceToSave = storageReference.child(chosenUri.getLastPathSegment());
  309.         storageReferenceToSave.putFile(chosenUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
  310.             @Override
  311.             public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
  312.                 Uri downloadUriInStorage = taskSnapshot.getDownloadUrl();
  313.                 databaseReference.push().setValue(new Message(null, username, UserDetails.chatWith, "terkirim", downloadUriInStorage.toString(), "file"/*, filename*/));
  314.             }
  315.         });
  316.     }
  317.  
  318.     private void setStatus(){
  319.         String url = "https://chatharis-6788f.firebaseio.com/messages.json";
  320.  
  321.         StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>(){
  322.             @Override public void onResponse(String s) {
  323.  
  324.                 try{
  325.                     JSONObject obj = new JSONObject(s);
  326.  
  327.                     Iterator i = obj.keys();
  328.                     String key,userTo,userFrom;
  329.  
  330.                     while(i.hasNext()){
  331.                         key = i.next().toString();
  332.                         userTo = obj.getJSONObject(key).getString("to");
  333.                         userFrom = obj.getJSONObject(key).getString("user");
  334.  
  335.                         if(userTo.equals(UserDetails.username) && userFrom.equals(UserDetails.chatWith)){
  336.                             Log.d("CREATION", "key "+key+ " | to: "+userTo);
  337.  
  338.                             Map<String, Object> hopperUpdates = new HashMap<String, Object>();
  339.                             hopperUpdates.put("status", "dibaca");
  340.                             databaseReference.child(key).updateChildren(hopperUpdates);
  341.                         }
  342.  
  343.                     }
  344.  
  345.                 }catch (JSONException e) {
  346.                     e.printStackTrace();
  347.                 }
  348.             }
  349.         },new Response.ErrorListener(){
  350.             @Override
  351.             public void onErrorResponse(VolleyError volleyError) {
  352.                 System.out.println("" + volleyError);
  353.             }
  354.         });
  355.  
  356.         RequestQueue rQueue = Volley.newRequestQueue(MessageActivity.this);
  357.         rQueue.add(request);
  358.     }
  359.  
  360.     private void setRelated(){
  361.  
  362.         DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
  363.         rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
  364.             @Override
  365.             public void onDataChange(DataSnapshot dataSnapshot) {
  366.  
  367. //                Toast.makeText(MessageActivity.this, "o ", Toast.LENGTH_LONG).show();
  368.  
  369.                 DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
  370.  
  371.                 // Check if "relateduser" exist
  372.                 if (dataSnapshot.hasChild("relateduser"))
  373.                 {
  374. //                    Toast.makeText(MessageActivity.this, "m ", Toast.LENGTH_LONG).show();
  375.  
  376.                     // check user1
  377.                     if(dataSnapshot.child("relateduser").hasChild(UserDetails.username)) {
  378.                         int i = 0;
  379.                         for (com.google.firebase.database.DataSnapshot data : dataSnapshot.child("relateduser").child(UserDetails.username).getChildren()) {
  380.                             if (data.child("user").getValue().equals(UserDetails.chatWith)) {
  381.                                 i++;
  382.                             }
  383.                         }
  384.  
  385.                         if (i <= 0) {
  386.                             Map<String, String> map = new HashMap<String, String>();
  387.                             map.put("user", UserDetails.chatWith);
  388.                             reference.child("relateduser/"+UserDetails.username).push().setValue(map);
  389.                         }
  390.                     }
  391.                     else{
  392.                         Map<String, String> map2 = new HashMap<String, String>();
  393.                         map2.put("user", UserDetails.chatWith);
  394.                         reference.child("relateduser/"+UserDetails.username).push().setValue(map2);
  395.                     }
  396.  
  397.                     // check user2
  398.                     if(dataSnapshot.child("relateduser").hasChild(UserDetails.username)) {
  399.                         int i = 0;
  400.                         for (com.google.firebase.database.DataSnapshot data : dataSnapshot.child("relateduser").child(UserDetails.chatWith).getChildren()) {
  401.                             if (data.child("user").getValue().equals(UserDetails.username)) {
  402.                                 i++;
  403.                             }
  404.                         }
  405.  
  406.                         if (i <= 0) {
  407.                             Map<String, String> map = new HashMap<String, String>();
  408.                             map.put("user", UserDetails.username);
  409.                             reference.child("relateduser/"+UserDetails.chatWith).push().setValue(map);
  410.                         }
  411.  
  412.                     }
  413.                     else{
  414.                         Map<String, String> map2 = new HashMap<String, String>();
  415.                         map2.put("user", UserDetails.username);
  416.                         reference.child("relateduser/"+UserDetails.chatWith).push().setValue(map2);
  417.                     }
  418.                 }
  419.                 else
  420.                 {
  421. //                    Toast.makeText(MessageActivity.this, "n ", Toast.LENGTH_LONG).show();
  422.                     Map<String, String> map = new HashMap<String, String>();
  423.                     map.put("user", UserDetails.chatWith);
  424.                     reference.child("relateduser/"+UserDetails.username).push().setValue(map);
  425.  
  426.                     Map<String, String> map2 = new HashMap<String, String>();
  427.                     map2.put("user", UserDetails.username);
  428.                     reference.child("relateduser/"+UserDetails.chatWith).push().setValue(map2);
  429.                 }
  430.             }
  431.  
  432.  
  433.             @Override
  434.             public void onCancelled(DatabaseError databaseError) {
  435.  
  436.             }
  437.  
  438.         });
  439.     }
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement