Search in sources :

Example 1 with ChatMessageAdapter

use of com.xabber.android.ui.adapter.ChatMessageAdapter in project xabber-android by redsolution.

the class ChatViewerFragment method onCreateView.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.chat_viewer_fragment, container, false);
    contactTitleView = view.findViewById(R.id.contact_title);
    abstractContact = RosterManager.getInstance().getBestContact(account, user);
    contactTitleView.findViewById(R.id.avatar).setOnClickListener(this);
    toolbar = (Toolbar) view.findViewById(R.id.toolbar_default);
    toolbar.inflateMenu(R.menu.chat);
    toolbar.setOnMenuItemClickListener(this);
    toolbar.setNavigationIcon(R.drawable.ic_arrow_left_white_24dp);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            NavUtils.navigateUpFromSameTask(getActivity());
        }
    });
    setHasOptionsMenu(true);
    sendButton = (ImageButton) view.findViewById(R.id.button_send_message);
    sendButton.setColorFilter(ColorManager.getInstance().getAccountPainter().getGreyMain());
    AbstractChat abstractChat = MessageManager.getInstance().getChat(account, user);
    securityButton = (ImageButton) view.findViewById(R.id.button_security);
    if (abstractChat instanceof RegularChat) {
        securityButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                showSecurityMenu();
            }
        });
    } else {
        securityButton.setVisibility(View.GONE);
    }
    chatMessageAdapter = new ChatMessageAdapter(getActivity(), account, user, this, this);
    recyclerView = (RecyclerView) view.findViewById(R.id.chat_messages_recycler_view);
    recyclerView.setAdapter(chatMessageAdapter);
    layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(layoutManager);
    // to avoid strange bug on some 4.x androids
    view.findViewById(R.id.input_layout).setBackgroundColor(ColorManager.getInstance().getChatInputBackgroundColor());
    inputView = (EditText) view.findViewById(R.id.chat_input);
    view.findViewById(R.id.button_send_message).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            sendMessage();
        }
    });
    inputView.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {
            if (SettingsManager.chatsSendByEnter() && event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
                sendMessage();
                return true;
            }
            return false;
        }
    });
    inputView.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (!skipOnTextChanges && stopTypingTimer != null) {
                stopTypingTimer.cancel();
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable text) {
            setUpInputViewButtons();
            if (skipOnTextChanges) {
                return;
            }
            ChatStateManager.getInstance().onComposing(account, user, text);
            stopTypingTimer = new Timer();
            stopTypingTimer.schedule(new TimerTask() {

                @Override
                public void run() {
                    Application.getInstance().runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            ChatStateManager.getInstance().onPaused(account, user);
                        }
                    });
                }
            }, STOP_TYPING_DELAY);
        }
    });
    final ImageButton emojiButton = (ImageButton) view.findViewById(R.id.button_emoticon);
    final View rootView = view.findViewById(R.id.root_view);
    // Give the topmost view of your activity layout hierarchy. This will be used to measure soft keyboard height
    final EmojiconsPopup popup = new EmojiconsPopup(rootView, getActivity());
    //Will automatically set size according to the soft keyboard size
    popup.setSizeForSoftKeyboard();
    //If the emoji popup is dismissed, change emojiButton to smiley icon
    popup.setOnDismissListener(new PopupWindow.OnDismissListener() {

        @Override
        public void onDismiss() {
            changeEmojiKeyboardIcon(emojiButton, R.drawable.ic_mood_black_24dp);
        }
    });
    //If the text keyboard closes, also dismiss the emoji popup
    popup.setOnSoftKeyboardOpenCloseListener(new EmojiconsPopup.OnSoftKeyboardOpenCloseListener() {

        @Override
        public void onKeyboardOpen(int keyBoardHeight) {
        }

        @Override
        public void onKeyboardClose() {
            if (popup.isShowing())
                popup.dismiss();
        }
    });
    //On emoji clicked, add it to edittext
    popup.setOnEmojiconClickedListener(new EmojiconGridView.OnEmojiconClickedListener() {

        @Override
        public void onEmojiconClicked(Emojicon emojicon) {
            if (inputView == null || emojicon == null) {
                return;
            }
            int start = inputView.getSelectionStart();
            int end = inputView.getSelectionEnd();
            if (start < 0) {
                inputView.append(emojicon.getEmoji());
            } else {
                inputView.getText().replace(Math.min(start, end), Math.max(start, end), emojicon.getEmoji(), 0, emojicon.getEmoji().length());
            }
        }
    });
    //On backspace clicked, emulate the KEYCODE_DEL key event
    popup.setOnEmojiconBackspaceClickedListener(new EmojiconsPopup.OnEmojiconBackspaceClickedListener() {

        @Override
        public void onEmojiconBackspaceClicked(View v) {
            KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL);
            inputView.dispatchKeyEvent(event);
        }
    });
    // To toggle between text keyboard and emoji keyboard keyboard(Popup)
    emojiButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //If popup is not showing => emoji keyboard is not visible, we need to show it
            if (!popup.isShowing()) {
                //If keyboard is visible, simply show the emoji popup
                if (popup.isKeyBoardOpen()) {
                    popup.showAtBottom();
                    changeEmojiKeyboardIcon(emojiButton, R.drawable.ic_keyboard_black_24dp);
                } else //else, open the text keyboard first and immediately after that show the emoji popup
                {
                    inputView.setFocusableInTouchMode(true);
                    inputView.requestFocus();
                    popup.showAtBottomPending();
                    final InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.showSoftInput(inputView, InputMethodManager.SHOW_IMPLICIT);
                    changeEmojiKeyboardIcon(emojiButton, R.drawable.ic_keyboard_black_24dp);
                }
            } else //If popup is showing, simply dismiss it to show the undelying text keyboard
            {
                popup.dismiss();
            }
        }
    });
    attachButton = (ImageButton) view.findViewById(R.id.button_attach);
    attachButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            onAttachButtonPressed();
        }
    });
    return view;
}
Also used : EmojiconGridView(github.ankushsachdeva.emojicon.EmojiconGridView) PopupWindow(android.widget.PopupWindow) ChatMessageAdapter(com.xabber.android.ui.adapter.ChatMessageAdapter) InputMethodManager(android.view.inputmethod.InputMethodManager) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) RegularChat(com.xabber.android.data.message.RegularChat) KeyEvent(android.view.KeyEvent) ImageButton(android.widget.ImageButton) TimerTask(java.util.TimerTask) TextWatcher(android.text.TextWatcher) Editable(android.text.Editable) EmojiconsPopup(github.ankushsachdeva.emojicon.EmojiconsPopup) AbstractChat(com.xabber.android.data.message.AbstractChat) ImageView(android.widget.ImageView) View(android.view.View) EmojiconGridView(github.ankushsachdeva.emojicon.EmojiconGridView) RecyclerView(android.support.v7.widget.RecyclerView) Timer(java.util.Timer) Emojicon(github.ankushsachdeva.emojicon.emoji.Emojicon)

Aggregations

LinearLayoutManager (android.support.v7.widget.LinearLayoutManager)1 RecyclerView (android.support.v7.widget.RecyclerView)1 Editable (android.text.Editable)1 TextWatcher (android.text.TextWatcher)1 KeyEvent (android.view.KeyEvent)1 View (android.view.View)1 InputMethodManager (android.view.inputmethod.InputMethodManager)1 ImageButton (android.widget.ImageButton)1 ImageView (android.widget.ImageView)1 PopupWindow (android.widget.PopupWindow)1 AbstractChat (com.xabber.android.data.message.AbstractChat)1 RegularChat (com.xabber.android.data.message.RegularChat)1 ChatMessageAdapter (com.xabber.android.ui.adapter.ChatMessageAdapter)1 EmojiconGridView (github.ankushsachdeva.emojicon.EmojiconGridView)1 EmojiconsPopup (github.ankushsachdeva.emojicon.EmojiconsPopup)1 Emojicon (github.ankushsachdeva.emojicon.emoji.Emojicon)1 Timer (java.util.Timer)1 TimerTask (java.util.TimerTask)1