package com.novoda.bonfire.chat.view;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.novoda.bonfire.R;
import com.novoda.bonfire.chat.data.model.Chat;
import com.novoda.bonfire.chat.displayer.ChatDisplayer;
import com.novoda.bonfire.user.data.model.User;
import com.novoda.notils.caster.Views;
public class ChatView extends LinearLayout implements ChatDisplayer {
private final ChatAdapter chatAdapter;
private TextView messageView;
private ImageView submitButton;
private RecyclerView recyclerView;
private Toolbar toolbar;
private ChatActionListener actionListener;
public ChatView(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(VERTICAL);
chatAdapter = new ChatAdapter(LayoutInflater.from(context));
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View.inflate(getContext(), R.layout.merge_chat_view, this);
messageView = Views.findById(this, R.id.message_edit);
submitButton = Views.findById(this, R.id.submit_button);
recyclerView = Views.findById(this, R.id.messages_recycler_view);
recyclerView.addItemDecoration(new ChatItemDecoration());
toolbar = Views.findById(this, R.id.toolbar);
toolbar.inflateMenu(R.menu.chat_menu);
toolbar.setNavigationIcon(R.drawable.ic_arrow_back);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(chatAdapter);
}
@Override
public void attach(final ChatActionListener actionListener) {
this.actionListener = actionListener;
messageView.addTextChangedListener(textWatcher);
submitButton.setOnClickListener(submitClickListener);
toolbar.setNavigationOnClickListener(navigationClickListener);
toolbar.setOnMenuItemClickListener(menuItemClickListener);
}
@Override
public void detach(ChatActionListener actionListener) {
submitButton.setOnClickListener(null);
messageView.removeTextChangedListener(textWatcher);
toolbar.setOnMenuItemClickListener(null);
this.actionListener = null;
}
@Override
public void setTitle(String title) {
toolbar.setTitle(title);
}
@Override
public void showAddMembersButton() {
toolbar.getMenu().findItem(R.id.manageOwners).setVisible(true);
}
@Override
public void display(Chat chat, User user) {
chatAdapter.update(chat, user);
int lastMessagePosition = chatAdapter.getItemCount() == 0 ? 0 : chatAdapter.getItemCount() - 1;
recyclerView.smoothScrollToPosition(lastMessagePosition);
}
@Override
public void enableInteraction() {
submitButton.setEnabled(true);
submitButton.setColorFilter(null);
}
@Override
public void disableInteraction() {
submitButton.setEnabled(false);
submitButton.setColorFilter(getResources().getColor(R.color.disabled_grey), PorterDuff.Mode.SRC_ATOP);
}
private final TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
actionListener.onMessageLengthChanged(s.toString().trim().length());
}
};
private final OnClickListener submitClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
actionListener.onSubmitMessage(messageView.getText().toString().trim());
messageView.setText("");
}
};
private final OnClickListener navigationClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
actionListener.onUpPressed();
}
};
private Toolbar.OnMenuItemClickListener menuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.manageOwners) {
actionListener.onManageOwnersClicked();
return true;
}
return false;
}
};
private class ChatItemDecoration extends RecyclerView.ItemDecoration {
private final int horizontalMargin = getResources().getDimensionPixelOffset(R.dimen.chat_item_horizontal_margin);
private final int verticalMargin = getResources().getDimensionPixelOffset(R.dimen.chat_item_vertical_margin);
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.left = horizontalMargin;
outRect.right = horizontalMargin;
outRect.top = verticalMargin;
outRect.bottom = verticalMargin;
}
}
}