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