From 05e3e041430eb5b06a161d238e52e8c1ae954838 Mon Sep 17 00:00:00 2001
From: Ilham Firdausi Putra <ilhamfputra31@gmail.com>
Date: Sat, 23 Feb 2019 19:13:02 +0700
Subject: [PATCH] finish bot chat room section

---
 .../main/java/com/chatman/BotFragment.java    |  57 +++++-
 .../java/com/chatman/adapter/ChatAdapter.java | 166 ++++++++++++++++++
 .../src/main/java/com/chatman/model/Chat.java |   3 +
 .../main/java/com/chatman/model/ChatList.java |   2 +
 .../main/java/com/chatman/model/ChatRoom.java |   3 +
 5 files changed, 230 insertions(+), 1 deletion(-)
 create mode 100644 android/app/src/main/java/com/chatman/adapter/ChatAdapter.java

diff --git a/android/app/src/main/java/com/chatman/BotFragment.java b/android/app/src/main/java/com/chatman/BotFragment.java
index bb02667..aca7bb9 100644
--- a/android/app/src/main/java/com/chatman/BotFragment.java
+++ b/android/app/src/main/java/com/chatman/BotFragment.java
@@ -3,7 +3,11 @@ package com.chatman;
 import android.content.Context;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -12,12 +16,19 @@ import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.Toast;
 
+import com.chatman.adapter.ChatAdapter;
+import com.chatman.adapter.ChatListAdapter;
 import com.chatman.helper.FirebaseHelper;
 import com.chatman.helper.PreferencesHelper;
 import com.chatman.model.Chat;
 import com.chatman.model.User;
+import com.google.firebase.database.DataSnapshot;
+import com.google.firebase.database.DatabaseError;
+import com.google.firebase.database.ValueEventListener;
 
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.List;
 
 
 /**
@@ -34,6 +45,9 @@ public class BotFragment extends Fragment {
     private ImageButton sentButton;
     private EditText message;
     private Context context;
+    private RecyclerView recycler;
+    private ChatAdapter adapter;
+    private List<Chat> chatList;
     private static final String BOT_KEY = "BOT_KEY";
 
     public BotFragment() {
@@ -69,15 +83,56 @@ public class BotFragment extends Fragment {
                     Chat sendMessage = new Chat(PreferencesHelper.getUserFirebaseKey(context), PreferencesHelper.getUserName(context), BOT_KEY, Calendar.getInstance().getTime(), message.getText().toString());
                     String key = FirebaseHelper.dbMessage.push().getKey();
                     FirebaseHelper.dbMessage.child(key).setValue(sendMessage);
+
+                    // BALASAN DARI BOT
+                    Chat botMessage = new Chat(BOT_KEY, "ChatMan Bot", PreferencesHelper.getUserFirebaseKey(context), Calendar.getInstance().getTime(), "Halo! Selamat datang di ChatMan");
+                    String botKey = FirebaseHelper.dbMessage.push().getKey();
+                    FirebaseHelper.dbMessage.child(botKey).setValue(botMessage);
+
                 }
             }
         });
-
         // Inflate the layout for this fragment
         return view;
     }
 
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+
+        // Recycler View
+        recycler = view.findViewById(R.id.chat_bot_room_rv);
+        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
+        linearLayoutManager.setReverseLayout(false);
+        linearLayoutManager.setStackFromEnd(false);
+        recycler.setLayoutManager(linearLayoutManager);
+        adapter = new ChatAdapter(chatList);
+        recycler.setAdapter(adapter);
+
+
+        FirebaseHelper.dbMessage.addValueEventListener(new ValueEventListener() {
+            @Override
+            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
+                getAllChat(dataSnapshot);
+                adapter.notifyDataSetChanged();
+            }
+
+            @Override
+            public void onCancelled(@NonNull DatabaseError databaseError) {
 
+            }
+        });
+    }
+
+    private void getAllChat(DataSnapshot dataSnapshot) {
+        chatList = new ArrayList<>();
+        for (DataSnapshot ds : dataSnapshot.getChildren()) {
+            if (ds.getValue(Chat.class).getIdSender().equals(PreferencesHelper.getUserFirebaseKey(context)) || ds.getValue(Chat.class).getIdReceiver().equals(PreferencesHelper.getUserFirebaseKey(context))) {
+                chatList.add(ds.getValue(Chat.class));
+            }
+        }
+        adapter = new ChatAdapter(chatList);
+        recycler.setAdapter(adapter);
+    }
 
     public void onButtonPressed(Uri uri) {
         if (mListener != null) {
diff --git a/android/app/src/main/java/com/chatman/adapter/ChatAdapter.java b/android/app/src/main/java/com/chatman/adapter/ChatAdapter.java
new file mode 100644
index 0000000..478b325
--- /dev/null
+++ b/android/app/src/main/java/com/chatman/adapter/ChatAdapter.java
@@ -0,0 +1,166 @@
+package com.chatman.adapter;
+
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+
+import com.bumptech.glide.Glide;
+import com.chatman.R;
+import com.chatman.helper.PreferencesHelper;
+import com.chatman.model.Chat;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class ChatAdapter extends RecyclerView.Adapter {
+
+    private static final int VIEW_TYPE_MESSAGE_SENT = 1;
+    private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
+
+    private List<Chat> items = new ArrayList<>();
+    private int itemLayoutSent = R.layout.item_message_sent;
+    private int itemLayoutReceived = R.layout.item_message_received;
+    private Context context;
+    private String currentUser;
+
+    public ChatAdapter(List<Chat> items) {
+        this.items = items;
+    }
+
+//    @Override
+//    public SentMessageHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+//        return new SentMessageHolder(LayoutInflater.from(parent.getContext()).inflate(itemLayoutSent, parent, false));
+//    }
+
+//    @Override
+//    public void onBindViewHolder(SentMessageHolder holder, int position) {
+//        holder.bind(items.get(position));
+//    }
+
+    public void addItems(List<Chat> items) {
+        this.items.addAll(items);
+        notifyDataSetChanged();
+    }
+
+    @Override
+    public int getItemCount() {
+        if (items == null) {
+            return 0;
+        }
+        return items.size();
+    }
+
+    // Determines the appropriate ViewType according to the sender of the message.
+    @Override
+    public int getItemViewType(int position) {
+        Chat message = (Chat) items.get(position);
+
+        if (message.getIdSender().equals(currentUser)) {
+            // If the current user is the sender of the message
+            return VIEW_TYPE_MESSAGE_SENT;
+        } else {
+            // If some other user sent the message
+            return VIEW_TYPE_MESSAGE_RECEIVED;
+        }
+    }
+
+    // Inflates the appropriate layout according to the ViewType.
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        context = parent.getContext();
+        currentUser = PreferencesHelper.getUserFirebaseKey(context);
+        View view;
+
+        if (viewType == VIEW_TYPE_MESSAGE_SENT) {
+            view = LayoutInflater.from(parent.getContext())
+                    .inflate(R.layout.item_message_sent, parent, false);
+            return new SentMessageHolder(view);
+        } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
+            view = LayoutInflater.from(parent.getContext())
+                    .inflate(R.layout.item_message_received, parent, false);
+            return new ReceivedMessageHolder(view);
+        }
+
+        return null;
+    }
+
+    // Passes the message object to a ViewHolder so that the contents can be bound to UI.
+    @Override
+    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        Chat message = (Chat) items.get(position);
+
+        switch (holder.getItemViewType()) {
+            case VIEW_TYPE_MESSAGE_SENT:
+                ((SentMessageHolder) holder).bind(message);
+                break;
+            case VIEW_TYPE_MESSAGE_RECEIVED:
+                ((ReceivedMessageHolder) holder).bind(message);
+        }
+    }
+
+    private class SentMessageHolder extends RecyclerView.ViewHolder {
+        private TextView messageText;
+        private TextView timeText;
+
+        SentMessageHolder(View itemView) {
+            super(itemView);
+            messageText = (TextView) itemView.findViewById(R.id.sent_text_message_body);
+            timeText = (TextView) itemView.findViewById(R.id.sent_text_message_time);
+        }
+
+        void bind(Chat message) {
+            messageText.setText(message.getMessage());
+
+            // Format the stored timestamp into a readable String using method.
+            DateFormat dateFormat = new SimpleDateFormat("HH:mm");
+            String strDate = dateFormat.format(message.getDate());
+            timeText.setText(strDate);
+        }
+    }
+
+    private class ReceivedMessageHolder extends RecyclerView.ViewHolder {
+        private TextView messageText, timeText, nameText;
+        private ImageView profileImage;
+
+        ReceivedMessageHolder(View itemView) {
+            super(itemView);
+
+            messageText = (TextView) itemView.findViewById(R.id.received_text_message_body);
+            timeText = (TextView) itemView.findViewById(R.id.received_text_message_time);
+            nameText = (TextView) itemView.findViewById(R.id.received_text_message_name);
+            profileImage = (ImageView) itemView.findViewById(R.id.received_image_message_profile);
+        }
+
+        void bind(Chat message) {
+            messageText.setText(message.getMessage());
+
+            // Format the stored timestamp into a readable String using method.
+            DateFormat dateFormat = new SimpleDateFormat("HH:mm");
+            String strDate = dateFormat.format(message.getDate());
+            timeText.setText(strDate);
+
+            nameText.setText(message.getNameSender());
+
+            // Insert the profile image from the URL into the ImageView.
+            Glide.with(itemView).load(R.drawable.robotic).into(profileImage);
+        }
+
+    }
+
+//    public int getImage(String imageName) {
+//
+//        int drawableResourceId = context.getResources().getIdentifier(imageName, "drawable", context.getPackageName());
+//
+//        return drawableResourceId;
+//    }
+}
\ No newline at end of file
diff --git a/android/app/src/main/java/com/chatman/model/Chat.java b/android/app/src/main/java/com/chatman/model/Chat.java
index 4c3f882..d01bc26 100644
--- a/android/app/src/main/java/com/chatman/model/Chat.java
+++ b/android/app/src/main/java/com/chatman/model/Chat.java
@@ -9,6 +9,9 @@ public class Chat {
     private Date date;
     private String message;
 
+    public Chat() {
+    }
+
     public Chat(String idSender, String nameSender, String idReceiver, Date date, String message) {
         this.idSender = idSender;
         this.nameSender = nameSender;
diff --git a/android/app/src/main/java/com/chatman/model/ChatList.java b/android/app/src/main/java/com/chatman/model/ChatList.java
index 49536ab..4d9e40a 100644
--- a/android/app/src/main/java/com/chatman/model/ChatList.java
+++ b/android/app/src/main/java/com/chatman/model/ChatList.java
@@ -6,6 +6,8 @@ public class ChatList {
     private String lastMessage;
     // Todo : tambahin atribut KEY atau apalah supaya ntar waktu ditekan, ke fragmentnya bisa dipass KEY itu terus data di dalam fragmentnya diambil berdasarkan KEY tersebut
 
+    public ChatList() {
+    }
 
     public ChatList(int avatarResource, String name, String lastMessage) {
         this.avatarResource = avatarResource;
diff --git a/android/app/src/main/java/com/chatman/model/ChatRoom.java b/android/app/src/main/java/com/chatman/model/ChatRoom.java
index fb68f03..8bc5985 100644
--- a/android/app/src/main/java/com/chatman/model/ChatRoom.java
+++ b/android/app/src/main/java/com/chatman/model/ChatRoom.java
@@ -6,6 +6,9 @@ public class ChatRoom {
     private String idSender;
     private List<Chat> messages;
 
+    public ChatRoom() {
+    }
+
     public ChatRoom(String idSender, List<Chat> messages) {
         this.idSender = idSender;
         this.messages = messages;
-- 
GitLab