package com.xabber.android.ui.fragment;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.NavUtils;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.account.AccountItem;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.database.messagerealm.MessageItem;
import com.xabber.android.data.entity.BaseEntity;
import com.xabber.android.data.message.AbstractChat;
import com.xabber.android.data.message.MessageManager;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.data.roster.RosterManager;
import com.xabber.android.ui.adapter.ChatComparator;
import com.xabber.android.ui.adapter.contactlist.ChatListAdapter;
import com.xabber.android.ui.color.ColorManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class RecentChatFragment extends Fragment implements ChatListAdapter.Listener, Toolbar.OnMenuItemClickListener {
ChatListAdapter adapter;
@Nullable
private Listener listener;
public interface Listener {
void onChatSelected(BaseEntity entity);
void registerRecentChatFragment(RecentChatFragment recentChatFragment);
void unregisterRecentChatFragment();
}
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public RecentChatFragment() {
}
public static RecentChatFragment newInstance() {
return new RecentChatFragment();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (Listener) activity;
listener.registerRecentChatFragment(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_recent_chats, container, false);
RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recent_chats_recycler_view);
adapter = new ChatListAdapter(getActivity(), this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateChats();
Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar_default);
toolbar.setTitle(R.string.recent_chats);
toolbar.setNavigationIcon(R.drawable.ic_arrow_left_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(getActivity());
}
});
toolbar.inflateMenu(R.menu.toolbar_recent_chats);
toolbar.setOnMenuItemClickListener(this);
toolbar.setBackgroundColor(ColorManager.getInstance().getAccountPainter().getDefaultMainColor());
return rootView;
}
@Override
public void onDetach() {
if (listener != null) {
listener.unregisterRecentChatFragment();
listener = null;
}
super.onDetach();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_close_chats) {
MessageManager.closeActiveChats();
updateChats();
}
return false;
}
public void updateChats() {
Application.getInstance().runInBackgroundUserRequest(new Runnable() {
@Override
public void run() {
Collection<AbstractChat> chats = MessageManager.getInstance().getChats();
List<AbstractChat> recentChats = new ArrayList<>();
for (AbstractChat abstractChat : chats) {
MessageItem lastMessage = abstractChat.getLastMessage();
if (lastMessage != null && !TextUtils.isEmpty(lastMessage.getText())) {
AccountItem accountItem = AccountManager.getInstance().getAccount(abstractChat.getAccount());
if (accountItem != null && accountItem.isEnabled()) {
recentChats.add(abstractChat);
}
}
}
Collections.sort(recentChats, ChatComparator.CHAT_COMPARATOR);
final List<AbstractContact> newContacts = new ArrayList<>();
for (AbstractChat chat : recentChats) {
newContacts.add(RosterManager.getInstance()
.getBestContact(chat.getAccount(), chat.getUser()));
}
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.updateContacts(newContacts);
}
});
}
});
}
@Override
public void onRecentChatClick(AbstractContact contact) {
if (listener != null) {
listener.onChatSelected(contact);
}
}
}