package com.pinthecloud.athere.fragment;
import java.util.ArrayList;
import java.util.List;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import com.pinthecloud.athere.R;
import com.pinthecloud.athere.adapter.ChatListAdapter;
import com.pinthecloud.athere.exception.AhException;
import com.pinthecloud.athere.interfaces.AhEntityCallback;
import com.pinthecloud.athere.model.AhMessage;
import com.pinthecloud.athere.model.AhUser;
import com.pinthecloud.athere.model.Square;
public class ChatFragment extends AhFragment{
private RecyclerView chatListView;
private ChatListAdapter chatListAdapter;
private RecyclerView.LayoutManager chatListLayoutManager;
private List<AhMessage> chatList;
private EditText messageEditText;
private ImageButton sendButton;
private Square square;
public ChatFragment() {
super();
}
public ChatFragment(Square square) {
super();
this.square = square;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_chat, container, false);
findComponent(view);
setEditText();
setButtonEvent();
setChatList();
setMessageHandler();
return view;
}
@Override
public void onStart() {
super.onStart();
NotificationManager mNotificationManager = (NotificationManager) activity
.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(1);
if(messageDBHelper.isEmpty(AhMessage.TYPE.ENTER_SQUARE, AhMessage.TYPE.TALK, AhMessage.TYPE.ADMIN_MESSAGE)) {
showWelcomeChat();
}
updateChatList();
}
@Override
public void onSaveInstanceState(Bundle outState) {
//first saving my state, so the bundle wont be empty.
outState.putString("VIEWPAGER_BUG_FIX", "VIEWPAGER_BUG_FIX");
super.onSaveInstanceState(outState);
}
@Override
public void handleException(AhException ex) {
if(ex.getMethodName().equals("sendMessageAsync")){
AhMessage exMessage = (AhMessage)ex.getParameter();
exMessage.setStatus(AhMessage.STATUS.FAIL);
messageDBHelper.updateMessages(exMessage);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
chatListAdapter.notifyDataSetChanged();
}
});
}else{
super.handleException(ex);
}
}
private void findComponent(View view){
chatListView = (RecyclerView) view.findViewById(R.id.chat_frag_list);
messageEditText = (EditText) view.findViewById(R.id.chat_frag_message_text);
sendButton = (ImageButton) view.findViewById(R.id.chat_frag_send_button);
}
private void setEditText(){
messageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String message = s.toString().trim();
if(message.length() < 1){
sendButton.setEnabled(false);
}else{
sendButton.setEnabled(true);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
private void setChatList(){
chatListView.setHasFixedSize(true);
chatListLayoutManager = new LinearLayoutManager(context);
chatListView.setLayoutManager(chatListLayoutManager);
chatList = new ArrayList<AhMessage>();
chatListAdapter = new ChatListAdapter(context, thisFragment, chatList);
chatListView.setAdapter(chatListAdapter);
// messageListView.setOnScrollListener(new OnScrollListener() {
// public void onScroll(AbsListView view, int firstVisibleItem,
// int visibleItemCount, int totalItemCount) {
// if (firstVisibleItem == 1) {
// // TODO : Insert messageListView.add(0, messages);
// offset++;
// final List<AhMessage> talks = messageDBHelper.getAllMessagesByFifties(offset, AhMessage.TYPE.ENTER_SQUARE, AhMessage.TYPE.EXIT_SQUARE, AhMessage.TYPE.TALK);
// messageList.clear();
// messageList.addAll(0, talks);
// messageListAdapter.notifyDataSetChanged();
// messageListView.setSelection(messageListView.getCount() - 1);
// }
// }
// public void onScrollStateChanged(AbsListView view, int scrollState) {
// }
// });
}
private void setButtonEvent(){
sendButton.setEnabled(false);
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AhUser myUser = userHelper.getMyUserInfo();
AhMessage.Builder messageBuilder = new AhMessage.Builder();
messageBuilder.setContent(messageEditText.getText().toString())
.setSender(myUser.getNickName())
.setSenderId(myUser.getId())
.setReceiverId(square.getId())
.setType(AhMessage.TYPE.TALK);
AhMessage sendChat = messageBuilder.build();
sendChat(sendChat);
}
});
}
private void setMessageHandler(){
messageHelper.setMessageHandler(this, new AhEntityCallback<AhMessage>() {
@Override
public void onCompleted(final AhMessage message) {
// Chupa & Exit Square Message can't go through here
if (message.getType().equals(AhMessage.TYPE.CHUPA.toString())
|| message.getType().equals(AhMessage.TYPE.EXIT_SQUARE.toString())){
return;
}
if(message.getType().equals((AhMessage.TYPE.UPDATE_USER_INFO.toString()))){
updateChatList();
return;
}
chatList.add(message);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
insertChat(message);
}
});
}
});
}
private void showWelcomeChat(){
AhUser myUser = userHelper.getMyUserInfo();
String nickName = myUser.getNickName();
String enterMessage = getResources().getString(R.string.enter_square_message);
String greetingMessage = getResources().getString(R.string.greeting_sentence);
AhMessage enterChat = new AhMessage.Builder()
.setContent(" " + enterMessage + "\n" + greetingMessage)
.setSender(nickName)
.setSenderId(myUser.getId())
.setReceiverId(squareHelper.getMySquareInfo().getId())
.setType(AhMessage.TYPE.ENTER_SQUARE)
.setStatus(AhMessage.STATUS.SENT)
.setTimeStamp().build();
messageDBHelper.addMessage(enterChat);
}
private void updateChatList(){
chatList.clear();
chatList.addAll(messageDBHelper.getAllMessages(AhMessage.TYPE.ENTER_SQUARE, AhMessage.TYPE.TALK, AhMessage.TYPE.ADMIN_MESSAGE));
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
chatListAdapter.notifyDataSetChanged();
chatListView.scrollToPosition(chatList.size()-1);
}
});
}
public void sendChat(final AhMessage chat){
chat.setStatus(AhMessage.STATUS.SENDING);
chatList.add(chat);
int id = messageDBHelper.addMessage(chat);
chat.setId(String.valueOf(id));
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
messageEditText.setText("");
insertChat(chat);
}
});
messageHelper.sendMessageAsync(thisFragment, chat, new AhEntityCallback<AhMessage>() {
@Override
public void onCompleted(AhMessage entity) {
gaHelper.sendEventGA(
thisFragment.getClass().getSimpleName(),
"SendChat",
"Chat");
chat.setStatus(AhMessage.STATUS.SENT);
chat.setTimeStamp();
messageDBHelper.updateMessages(chat);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
chatListAdapter.notifyDataSetChanged();
}
});
}
});
}
private void insertChat(AhMessage chat){
chatListAdapter.notifyItemInserted(chatList.indexOf(chat));
chatListView.scrollToPosition(chatList.size()-1);
}
}