From 24d8781fc887fa0ef7b0e71fda18062264655227 Mon Sep 17 00:00:00 2001
From: priagungs <priagungsatyagama@gmail.com>
Date: Sun, 24 Feb 2019 22:06:07 +0700
Subject: [PATCH] fix major bug

---
 .../com/chatman/activity/AuthActivity.java    |  69 ++++++++-
 .../com/chatman/activity/MainActivity.java    |   1 +
 .../com/chatman/fragment/HomeFragment.java    |  41 ++++--
 .../com/chatman/fragment/ProfileFragment.java |  20 ++-
 .../fragment/StartChatDialogFragment.java     | 133 ++++++++++++++++++
 .../app/src/main/res/layout/fragment_home.xml |   4 +-
 .../src/main/res/layout/start_chat_dialog.xml |  27 ++++
 .../app/src/main/res/values-v21/strings.xml   |   4 +
 android/app/src/main/res/values/strings.xml   |   4 +
 9 files changed, 288 insertions(+), 15 deletions(-)
 create mode 100644 android/app/src/main/java/com/chatman/fragment/StartChatDialogFragment.java
 create mode 100644 android/app/src/main/res/layout/start_chat_dialog.xml

diff --git a/android/app/src/main/java/com/chatman/activity/AuthActivity.java b/android/app/src/main/java/com/chatman/activity/AuthActivity.java
index db0da6b..5dd844d 100644
--- a/android/app/src/main/java/com/chatman/activity/AuthActivity.java
+++ b/android/app/src/main/java/com/chatman/activity/AuthActivity.java
@@ -8,6 +8,7 @@ import android.support.annotation.NonNull;
 import android.support.design.widget.Snackbar;
 import android.support.v7.app.AppCompatActivity;
 import android.transition.TransitionManager;
+import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
@@ -24,6 +25,7 @@ import com.google.android.gms.tasks.OnCompleteListener;
 import com.google.android.gms.tasks.Task;
 import com.google.firebase.database.DataSnapshot;
 import com.google.firebase.database.DatabaseError;
+import com.google.firebase.database.FirebaseDatabase;
 import com.google.firebase.database.ValueEventListener;
 import com.google.firebase.iid.FirebaseInstanceId;
 import com.google.firebase.iid.InstanceIdResult;
@@ -33,6 +35,8 @@ import java.security.NoSuchAlgorithmException;
 
 public class AuthActivity extends AppCompatActivity {
 
+    private static final String TAG = AuthActivity.class.getSimpleName();
+
     // view component
     private LinearLayout authContainer;
     private EditText emailEditText;
@@ -84,6 +88,9 @@ public class AuthActivity extends AppCompatActivity {
         final String email = emailEditText.getText().toString().trim();
         final String password = passwordEditText.getText().toString().trim();
 
+        Log.d(TAG, "login: instance id di sharedpref " + PreferencesHelper.getToken(AuthActivity.this));
+
+
         FirebaseHelper.dbUser.addListenerForSingleValueEvent(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
@@ -102,11 +109,18 @@ public class AuthActivity extends AppCompatActivity {
 
     private boolean loginAsUser(DataSnapshot dataSnapshot, String email, String password) {
         for (DataSnapshot ds : dataSnapshot.getChildren()) {
-            User user = ds.getValue(User.class);
+            final User user = ds.getValue(User.class);
             if (user.getEmail().equals(email) && user.getPassword().equals(md5(password))) {
                 PreferencesHelper.setUserFirebaseId(AuthActivity.this, user.getId());
-                FirebaseHelper.dbUser.child(PreferencesHelper.getUserFirebaseKey(this)).child("key").setValue(PreferencesHelper.getToken(this));
                 PreferencesHelper.setUserName(this, user.getName());
+                FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
+                    @Override
+                    public void onComplete(@NonNull Task<InstanceIdResult> task) {
+                        Log.d(TAG, "onComplete: instance id waktu login awal " + task.getResult().getToken());
+                        Log.d(TAG, "onComplete: instance id di sharedpref " + PreferencesHelper.getToken(AuthActivity.this));
+                        updateInstanceId(task.getResult().getToken(), user.getKey());
+                    }
+                });
                 PreferencesHelper.setHasLogin(this, true);
                 finish();
                 startActivity(new Intent(this, MainActivity.class));
@@ -116,6 +130,57 @@ public class AuthActivity extends AppCompatActivity {
         return false;
     }
 
+    private void updateInstanceId(final String instanceId, final String oldInstanceId) {
+        PreferencesHelper.setTokenKey(this, instanceId);
+        FirebaseDatabase.getInstance().getReference("chatroom").addListenerForSingleValueEvent(new ValueEventListener() {
+            @Override
+            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
+                Log.d(TAG, "onDataChange: id database " + PreferencesHelper.getUserFirebaseKey(AuthActivity.this));
+                FirebaseHelper.dbUser.child(PreferencesHelper.getUserFirebaseKey(AuthActivity.this)).child("key").setValue(instanceId);
+                for (DataSnapshot ds : dataSnapshot.getChildren()) {
+                    String idUser1 = (String) ds.child("users/0").getValue();
+                    String idUser2 = (String) ds.child("users/1").getValue();
+                    if (idUser1.equals(oldInstanceId)) {
+                        ds.child("users/0").getRef().setValue(instanceId);
+                        updateMessages(ds.child("messages"), instanceId, oldInstanceId);
+                    }
+                    if (idUser2.equals(oldInstanceId)) {
+                        ds.child("users/1").getRef().setValue(instanceId);
+                        updateMessages(ds.child("messages"), instanceId, oldInstanceId);
+                    }
+                }
+            }
+
+            @Override
+            public void onCancelled(@NonNull DatabaseError databaseError) {
+
+            }
+        });
+    }
+
+    private void updateMessages(DataSnapshot messages, final String instanceId, final String oldInstanceId) {
+        for (final DataSnapshot message: messages.getChildren()) {
+            FirebaseHelper.dbMessage.child((String) message.getValue()).addListenerForSingleValueEvent(new ValueEventListener() {
+                @Override
+                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
+                    String idReceiver = (String) dataSnapshot.child("idReceiver").getValue();
+                    String idSender = (String) dataSnapshot.child("idSender").getValue();
+                    if (idReceiver.equals(oldInstanceId)) {
+                        dataSnapshot.child("idReceiver").getRef().setValue(instanceId);
+                    }
+                    if (idSender.equals(oldInstanceId)) {
+                        dataSnapshot.child("idSender").getRef().setValue(instanceId);
+                    }
+                }
+
+                @Override
+                public void onCancelled(@NonNull DatabaseError databaseError) {
+
+                }
+            });
+        }
+    }
+
     private String md5(final String s) {
         final String MD5 = "MD5";
         try {
diff --git a/android/app/src/main/java/com/chatman/activity/MainActivity.java b/android/app/src/main/java/com/chatman/activity/MainActivity.java
index b8e0339..bfb7e4e 100644
--- a/android/app/src/main/java/com/chatman/activity/MainActivity.java
+++ b/android/app/src/main/java/com/chatman/activity/MainActivity.java
@@ -21,6 +21,7 @@ import com.chatman.R;
 import com.chatman.fragment.BotFragment;
 import com.chatman.fragment.HomeFragment;
 import com.chatman.fragment.ProfileFragment;
+import com.chatman.helper.PreferencesHelper;
 
 public class MainActivity extends AppCompatActivity implements
         ProfileFragment.OnFragmentInteractionListener,
diff --git a/android/app/src/main/java/com/chatman/fragment/HomeFragment.java b/android/app/src/main/java/com/chatman/fragment/HomeFragment.java
index 78af406..036f9f4 100644
--- a/android/app/src/main/java/com/chatman/fragment/HomeFragment.java
+++ b/android/app/src/main/java/com/chatman/fragment/HomeFragment.java
@@ -5,6 +5,7 @@ import android.net.Uri;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.design.widget.FloatingActionButton;
 import android.support.v4.app.Fragment;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -42,6 +43,10 @@ public class HomeFragment extends Fragment {
     private RecyclerView recycler;
     private ChatListAdapter adapter;
     private List<ChatList> chatLists;
+    private FloatingActionButton fab;
+    private StartChatDialogFragment dialog;
+
+    private Context mContext;
 
     private OnFragmentInteractionListener mListener;
 
@@ -64,6 +69,17 @@ public class HomeFragment extends Fragment {
                              Bundle savedInstanceState) {
         // Inflate the layout for this fragment
         View view = inflater.inflate(R.layout.fragment_home, container, false);
+
+        fab = view.findViewById(R.id.fab);
+        fab.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dialog = new StartChatDialogFragment();
+                dialog.setContext(getActivity());
+                dialog.show(getFragmentManager(), "ADD_ROOM");
+            }
+        });
+
         // Recycler View
         recycler = view.findViewById(R.id.chat_list_rv);
         LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
@@ -92,6 +108,7 @@ public class HomeFragment extends Fragment {
             throw new RuntimeException(context.toString()
                     + " must implement OnFragmentInteractionListener");
         }
+        mContext = context;
     }
 
     @Override
@@ -173,7 +190,6 @@ public class HomeFragment extends Fragment {
 
         @Override
         public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
-            Log.d(TAG, "onDataChange: user found 2");
             final String sender = (String) dataSnapshot.child("name").getValue();
             String idChatRoom = chatRoomSnapshot.getKey();
             Log.d(TAG, "onChildAdded: idChatRoom " + idChatRoom);
@@ -220,15 +236,20 @@ public class HomeFragment extends Fragment {
                     public void onDataChange(@NonNull DataSnapshot userSnapshot) {
                         Log.d(TAG, "onDataChange: users changed");
                         Log.d(TAG, "onDataChange: userSnapshot count " + userSnapshot.getChildrenCount());
-                        for (DataSnapshot ds : userSnapshot.getChildren()) {
-                            String instanceId = (String) ds.getValue();
-                            Log.d(TAG, "onDataChange: instance id " + instanceId);
-                            if (!instanceId.equals(PreferencesHelper.getToken(getActivity()))) {
-                                Log.d(TAG, "onDataChange: user found");
-                                Log.d(TAG, "onDataChange: instance id 2 " + instanceId);
-                                FirebaseDatabase.getInstance().getReference().child("user").orderByChild("key").limitToFirst(1)
-                                        .equalTo(instanceId).addChildEventListener(new UserChildListener(chatRoomSnapshot));
-                            }
+                        String instanceId1 = (String) userSnapshot.child("0").getValue();
+                        String instanceId2 = (String) userSnapshot.child("1").getValue();
+                        Log.d(TAG, "onDataChange: instance id " + instanceId1);
+                        Log.d(TAG, "onDataChange: instance id 2 " + instanceId2);
+
+                        if (instanceId1.equals(PreferencesHelper.getToken(mContext))) {
+                            Log.d(TAG, "onDataChange: user found");
+                            FirebaseDatabase.getInstance().getReference().child("user").orderByChild("key").limitToFirst(1)
+                                    .equalTo(instanceId2).addChildEventListener(new UserChildListener(chatRoomSnapshot));
+                        }
+                        if (instanceId2.equals(PreferencesHelper.getToken(mContext))) {
+                            Log.d(TAG, "onDataChange: user found 2");
+                            FirebaseDatabase.getInstance().getReference().child("user").orderByChild("key").limitToFirst(1)
+                                    .equalTo(instanceId1).addChildEventListener(new UserChildListener(chatRoomSnapshot));
                         }
                     }
 
diff --git a/android/app/src/main/java/com/chatman/fragment/ProfileFragment.java b/android/app/src/main/java/com/chatman/fragment/ProfileFragment.java
index c8a2aaf..eec055c 100644
--- a/android/app/src/main/java/com/chatman/fragment/ProfileFragment.java
+++ b/android/app/src/main/java/com/chatman/fragment/ProfileFragment.java
@@ -3,6 +3,7 @@ package com.chatman.fragment;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -18,6 +19,9 @@ import com.bumptech.glide.Glide;
 import com.chatman.activity.AuthActivity;
 import com.chatman.R;
 import com.chatman.helper.PreferencesHelper;
+import com.google.firebase.iid.FirebaseInstanceId;
+
+import java.io.IOException;
 
 
 /**
@@ -72,9 +76,10 @@ public class ProfileFragment extends Fragment {
             {
                 Intent intent;
                 intent = new Intent(getContext(), AuthActivity.class);
-                PreferencesHelper.setUserFirebaseId(getContext(), "");
                 PreferencesHelper.setUserName(getContext(),"");
                 PreferencesHelper.setHasLogin(getContext(), false);
+
+                new DeleteInstanceId().execute();
                 getActivity().finish();
                 startActivity(intent);
             }
@@ -129,4 +134,17 @@ public class ProfileFragment extends Fragment {
 
         return drawableResourceId;
     }
+
+    private class DeleteInstanceId extends AsyncTask<Void, Void, Void> {
+
+        @Override
+        protected Void doInBackground(Void... voids) {
+            try {
+                FirebaseInstanceId.getInstance().deleteInstanceId();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return null;
+        }
+    }
 }
diff --git a/android/app/src/main/java/com/chatman/fragment/StartChatDialogFragment.java b/android/app/src/main/java/com/chatman/fragment/StartChatDialogFragment.java
new file mode 100644
index 0000000..7df95c9
--- /dev/null
+++ b/android/app/src/main/java/com/chatman/fragment/StartChatDialogFragment.java
@@ -0,0 +1,133 @@
+package com.chatman.fragment;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.design.widget.Snackbar;
+import android.support.v4.app.DialogFragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.chatman.R;
+import com.chatman.helper.FirebaseHelper;
+import com.chatman.helper.PreferencesHelper;
+import com.chatman.model.User;
+import com.google.firebase.database.ChildEventListener;
+import com.google.firebase.database.DataSnapshot;
+import com.google.firebase.database.DatabaseError;
+import com.google.firebase.database.FirebaseDatabase;
+import com.google.firebase.database.ValueEventListener;
+
+public class StartChatDialogFragment extends DialogFragment {
+
+    private static final String TAG = StartChatDialogFragment.class.getSimpleName();
+
+    private EditText email;
+    private Context context;
+
+    public void setContext(Context context) {
+        this.context = context;
+    }
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        super.onCreateDialog(savedInstanceState);
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        LayoutInflater inflater = requireActivity().getLayoutInflater();
+        View view = inflater.inflate(R.layout.start_chat_dialog, null);
+        email = view.findViewById(R.id.email);
+
+        builder.setView(view)
+                .setPositiveButton(R.string.start_chat, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        if (!email.getText().toString().equals("")) {
+                            FirebaseHelper.dbUser.addListenerForSingleValueEvent(new ValueEventListener() {
+                                @Override
+                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
+                                    Boolean found = false;
+                                    for (DataSnapshot ds: dataSnapshot.getChildren()) {
+                                        User user = ds.getValue(User.class);
+                                        if (user.getEmail().equalsIgnoreCase(email.getText().toString())) {
+                                            found = true;
+                                            createRoom(user.getKey(), PreferencesHelper.getToken(context));
+                                        }
+                                    }
+                                    if (!found) {
+                                        showToast(context, "User not found");
+                                    }
+                                }
+
+                                @Override
+                                public void onCancelled(@NonNull DatabaseError databaseError) {
+
+                                }
+                            });
+                        }
+                        else {
+                            showToast(context, "Please insert a valid email");
+                        }
+                    }
+                })
+                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        StartChatDialogFragment.this.getDialog().cancel();
+                    }
+                });
+        return builder.create();
+
+    }
+
+    private void createRoom(final String userId1, final String userId2) {
+        FirebaseDatabase.getInstance().getReference("chatroom").addListenerForSingleValueEvent(new ValueEventListener() {
+            @Override
+            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
+                Boolean foundRoom = false;
+                for (DataSnapshot chatroom: dataSnapshot.getChildren()) {
+                    String idUser1 = (String) chatroom.child("users/0").getValue();
+                    String idUser2 = (String) chatroom.child("users/1").getValue();
+                    if ((idUser1.equals(userId1) && idUser2.equals(userId2)) ||
+                            (idUser1.equals(userId2) && idUser2.equals(userId1))) {
+                        foundRoom = true;
+                        break;
+                    }
+                }
+                if (foundRoom) {
+                    Log.d(TAG, "onDataChange: foundroom");
+                }
+                else {
+                    String idRoom = FirebaseDatabase.getInstance().getReference("chatroom").push().getKey();
+                    FirebaseDatabase.getInstance().getReference("chatroom/" + idRoom)
+                            .child("users/0").setValue(userId1);
+                    FirebaseDatabase.getInstance().getReference("chatroom/" + idRoom)
+                            .child("users/1").setValue(userId2);
+                }
+            }
+
+            @Override
+            public void onCancelled(@NonNull DatabaseError databaseError) {
+
+            }
+        });
+    }
+
+    public void showToast(Context context, String message) {
+        Toast.makeText(context, message, Toast.LENGTH_LONG).show();
+    }
+
+    public void showSnackBar(Activity activity, String message){
+        View rootView = activity.getWindow().getDecorView().findViewById(android.R.id.content);
+        Snackbar.make(rootView, message, Snackbar.LENGTH_SHORT).show();
+    }
+}
diff --git a/android/app/src/main/res/layout/fragment_home.xml b/android/app/src/main/res/layout/fragment_home.xml
index da79f04..980de67 100644
--- a/android/app/src/main/res/layout/fragment_home.xml
+++ b/android/app/src/main/res/layout/fragment_home.xml
@@ -19,8 +19,8 @@
         android:id="@+id/fab"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginEnd="32dp"
-        android:layout_marginBottom="32dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginBottom="16dp"
         android:src="@drawable/ic_add_grey"
         android:backgroundTint="@color/colorPrimary"
         app:layout_constraintBottom_toBottomOf="@+id/chat_list_rv"
diff --git a/android/app/src/main/res/layout/start_chat_dialog.xml b/android/app/src/main/res/layout/start_chat_dialog.xml
new file mode 100644
index 0000000..303bed7
--- /dev/null
+++ b/android/app/src/main/res/layout/start_chat_dialog.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+    <TextView
+        android:text="@string/insert_an_registered_email"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="center"
+        android:textSize="18sp"
+        android:textColor="@color/white"
+        android:padding="8dp"
+        android:background="@color/colorPrimary"
+        android:contentDescription="@string/app_name" />
+
+    <EditText
+        android:id="@+id/email"
+        android:inputType="textEmailAddress"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginLeft="4dp"
+        android:layout_marginRight="4dp"
+        android:layout_marginBottom="4dp"
+        android:hint="@string/email" />
+</LinearLayout>
\ No newline at end of file
diff --git a/android/app/src/main/res/values-v21/strings.xml b/android/app/src/main/res/values-v21/strings.xml
index 7710771..1ac9358 100644
--- a/android/app/src/main/res/values-v21/strings.xml
+++ b/android/app/src/main/res/values-v21/strings.xml
@@ -1,4 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <string name="notification_channel_description">Notifikasi dari chat</string>
+    <string name="insert_an_registered_email">Insert an registered email</string>
+    <string name="start_chat">Start Chat</string>
+    <string name="cancel">Cancel</string>
+    <string name="room_already_exists">Room is already exist</string>
 </resources>
\ No newline at end of file
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 0e30d9f..c66b99f 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -44,5 +44,9 @@
 
     <string name="send_message_button">Send message button</string>
     <string name="message">Message</string>
+    <string name="insert_an_registered_email">Insert an registered email</string>
+    <string name="start_chat">Start Chat</string>
+    <string name="cancel">Cancel</string>
+    <string name="room_already_exists">Room is already exist</string>
 </resources>
 
-- 
GitLab