package es.npatarino.android.gotchallenge.chat.ui; import android.os.Bundle; 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.text.Spannable; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.Toast; import com.pedrogomez.renderers.RVRendererAdapter; import es.npatarino.android.gotchallenge.GotChallengeApplication; import es.npatarino.android.gotchallenge.R; import es.npatarino.android.gotchallenge.base.ui.imageloader.ImageLoader; import es.npatarino.android.gotchallenge.base.ui.messages.ErrorManager; import es.npatarino.android.gotchallenge.chat.conversation.model.Conversation; import es.npatarino.android.gotchallenge.chat.di.ChatFragmentModule; import es.npatarino.android.gotchallenge.chat.message.model.Message; import es.npatarino.android.gotchallenge.chat.message.model.Payload; import es.npatarino.android.gotchallenge.chat.message.presenter.MessagePresenter; import es.npatarino.android.gotchallenge.chat.message.ui.MessageRenderBuilder; import es.npatarino.android.gotchallenge.chat.message.ui.SortedMessageCollection; import es.npatarino.android.gotchallenge.chat.message.viewmodel.StickerPayLoad; import es.npatarino.android.gotchallenge.chat.message.viewmodel.TextPayLoad; import net.mobindustry.emojilib.EmojiPanel; import javax.inject.Inject; import java.util.Collections; import java.util.List; public class ChatFragment extends Fragment implements MessagePresenter.View, OnBackListener { @Inject ErrorManager errorManager; @Inject MessagePresenter messagePresenter; @Inject ImageLoader imageLoader; private RecyclerView messageRecyclerView; private RVRendererAdapter<Message> adapter; private View rootView; //emoji section private EmojiPanel emojiPanel; private FrameLayout rootEmojiKeyBoard; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { initDagger(); View rootView = inflater.inflate(R.layout.chat_fragment, container, false); initFragment(rootView); return rootView; } private void initDagger() { GotChallengeApplication.get(getContext()) .getMessageComponent() .plus(new ChatFragmentModule()) .inject(this); } private void initFragment(View rootView) { this.rootView = rootView; messageRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); initEmojiPanel(rootView); String id = getArguments().getString(ChatActivity.CONVER_ID_KEY); messagePresenter.setView(this); messagePresenter.init(new Conversation(id, "", Collections.emptyList(), null, null)); } private void initEmojiPanel(View rootView) { rootEmojiKeyBoard = (FrameLayout) rootView.findViewById(R.id.root_frame_layout); emojiPanel = new EmojiPanel(getActivity(), rootEmojiKeyBoard, new EmojiPanel.EmojiClickCallback() { @Override public void sendClicked(Spannable span) { if (span.length() != 0) { sendMessage(new TextPayLoad(span)); } } @Override public void stickerClicked(String path) { sendMessage(new StickerPayLoad(path)); } }); emojiPanel.iconsInit(); emojiPanel.init(); initOnBackPressed(rootView); } private void sendMessage(Payload payload) { long timestamp = System.currentTimeMillis(); messagePresenter.send(new Message("" + timestamp, null, timestamp, true, payload)); scrollToBottom(); } private void initOnBackPressed(View rootView) { rootView.setOnKeyListener((v, keyCode, event) -> { if (keyCode == KeyEvent.KEYCODE_BACK) { if (emojiPanel.isEmojiAttached()) { emojiPanel.dissmissEmojiPopup(); return true; } else { return false; } } return false; }); } private void initRecyclerView(RVRendererAdapter chatAdapter) { messageRecyclerView.setAdapter(chatAdapter); LinearLayoutManager recyclerViewManager = new LinearLayoutManager(getActivity()); recyclerViewManager.setStackFromEnd(true); messageRecyclerView.setLayoutManager(recyclerViewManager); messageRecyclerView.setHasFixedSize(true); } private void scrollToBottom() { messageRecyclerView.scrollToPosition(adapter.getItemCount() - 1); } @Override public void onPause() { super.onPause(); emojiPanel.dissmissEmojiPopup(); } @Override public void showMessage(Message message) { adapter.add(message); scrollToBottom(); } @Override public void showMessages(List<Message> messages) { adapter.addAll(messages); scrollToBottom(); } @Override public void errorOnShowMessage() { errorManager.showError(rootView, "Error on show a message"); } @Override public void errorOnShowMessages() { errorManager.showError(rootView, "Error on show a message list"); } @Override public void initUi() { adapter = new RVRendererAdapter<Message>(new MessageRenderBuilder(imageLoader)); SortedMessageCollection sortedMessageCollection = new SortedMessageCollection(adapter); adapter.setCollection(sortedMessageCollection); initRecyclerView(adapter); hideKeyboard(); } private void hideKeyboard() { getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } @Override public void error() { Toast.makeText(getContext(), "Some error", Toast.LENGTH_LONG).show(); } @Override public boolean onBackListener() { if (emojiPanel.isEmojiAttached()) { emojiPanel.dissmissEmojiPopup(); return true; } return false; } }