package org.mercury_im.messenger.ui.chat; import android.os.Bundle; import android.util.Log; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.chat2.ChatManager; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.persistence.model.AccountModel; import org.mercury_im.messenger.persistence.model.ChatModel; import org.mercury_im.messenger.persistence.model.MessageModel; import org.mercury_im.messenger.persistence.repository.AccountRepository; import org.mercury_im.messenger.persistence.repository.ChatRepository; import org.mercury_im.messenger.persistence.repository.MessageRepository; import org.mercury_im.messenger.ui.BindingActivity; import java.util.List; import javax.inject.Inject; public class ChatActivity extends BindingActivity implements ChatInputFragment.OnChatInputActionListener { @Inject AccountRepository accountRepository; @Inject MessageRepository messageRepository; private EntityBareJid jid; private long accountId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); MercuryImApplication.getApplication().getAppComponent().inject(this); RecyclerView recyclerView = findViewById(R.id.recyclerView); ChatRecyclerViewAdapter adapter = new ChatRecyclerViewAdapter(); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); if (savedInstanceState == null) { savedInstanceState = getIntent().getExtras(); if (savedInstanceState == null) return; } String jidString = savedInstanceState.getString("JID"); if (jidString != null) { jid = JidCreate.entityBareFromOrThrowUnchecked(jidString); accountId = savedInstanceState.getLong("ACCOUNT"); LiveData accountModel = accountRepository.getAccount(accountId); ChatViewModel viewModel = ViewModelProviders.of(this).get(ChatViewModel.class); accountModel.observe(this, new Observer() { @Override public void onChanged(AccountModel accountModel) { viewModel.init(accountModel, jid); } }); LiveData> messages = messageRepository.getAllMessagesOfChat(accountId, jid); messages.observe(this, new Observer>() { @Override public void onChanged(List messageModels) { Log.d(MercuryImApplication.TAG, "Updating messages: " + messageModels.size()); adapter.updateMessages(messageModels); recyclerView.scrollToPosition(messageModels.size() - 1); } }); getSupportFragmentManager().beginTransaction().replace(R.id.fab, ChatInputFragment.newInstance()) .commitAllowingStateLoss(); } } @Override public void onButtonMediaClicked() { } @Override public void onComposingBodyChanged(String body) { } @Override public void onComposingBodySend(String body) { new Thread() { @Override public void run() { try { ChatManager.getInstanceFor(connectionService.getConnection(accountId).getConnection()) .chatWith(jid).send(body); } catch (SmackException.NotConnectedException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } }