package org.jorge.cmp.ui.adapter;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import com.github.theholywaffle.lolchatapi.wrapper.Friend;
import org.jorge.cmp.R;
import org.jorge.cmp.anim.ExpandableViewHoldersUtil;
import org.jorge.cmp.chat.ChatHistoryManager;
import org.jorge.cmp.chat.ChatNotificationManager;
import org.jorge.cmp.chat.FriendManager;
import org.jorge.cmp.datamodel.ChatMessageWrapper;
import org.jorge.cmp.io.prefs.PreferenceAssistant;
import org.jorge.cmp.util.PicassoUtils;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {
private final View mEmptyView;
private final Set<Friend> mData = new LinkedHashSet<>();
private final Context mContext;
private final String mTag;
private final String BASE_PROFILE_ICON_URL;
private final String DEFAULT_PROFILE_IMG_URL;
private final ExpandableViewHoldersUtil.KeepOneH<ViewHolder> keepOne = new
ExpandableViewHoldersUtil
.KeepOneH<>();
public ChatAdapter(Context context, View emptyView, String tag) {
mEmptyView = emptyView;
mContext = context;
mTag = tag;
BASE_PROFILE_ICON_URL = mContext.getString(R.string
.profile_icon_url_pattern);
DEFAULT_PROFILE_IMG_URL =
String.format(Locale.ENGLISH,
BASE_PROFILE_ICON_URL, PreferenceAssistant.readSharedString(mContext,
PreferenceAssistant.PREF_LAST_PROFILE_ICON_VERSION, "null"),
"0");
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View v = LayoutInflater.from(parent.getContext()).inflate(R.layout
.list_item_chat_friend, parent, Boolean.FALSE);
return new ViewHolder(mContext, v);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
keepOne.bind(viewHolder, i);
viewHolder.profileImageView.setImageDrawable(null);
Friend item = getItem(i);
if (item != null) {
if (viewHolder.profileImageView.getDrawable() == null) {
final String imgUrl = String.format(Locale.ENGLISH,
BASE_PROFILE_ICON_URL, PreferenceAssistant.readSharedString(mContext,
PreferenceAssistant.PREF_LAST_PROFILE_ICON_VERSION, "null"),
item.getStatus().getProfileIconId());
PicassoUtils.loadInto(mContext, imgUrl, DEFAULT_PROFILE_IMG_URL,
viewHolder.profileImageView, mTag);
viewHolder.profileImageView.setContentDescription(item.getName());
}
viewHolder.userNameView.setText(item.getName());
viewHolder.statusView.setText(item.getStatus().getStatusMessage());
viewHolder.setupChatRoomAdapter();
}
}
@Nullable
private synchronized Friend getItem(Integer i) {
for (Iterator<Friend> it = mData.iterator(); it.hasNext(); ) {
if (i == 0) {
return it.next();
}
i--;
it.next();
}
return null;
}
public void notifyFriendSetChanged() {
//Workaround for RecyclerView bug (https://code.google.com/p/android/issues/detail?id=77232)
mEmptyView.postDelayed(new Runnable() {
@Override
public void run() {
mData.clear();
mData.addAll(FriendManager.getInstance().getOnlineFriends());
ChatAdapter.super.notifyDataSetChanged();
updateEmptyViewVisibility();
}
}, 200);
}
private void updateEmptyViewVisibility() {
if (mData.isEmpty()) {
mEmptyView.setVisibility(View.VISIBLE);
} else
mEmptyView.setVisibility(View.GONE);
}
@Override
public int getItemCount() {
return mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View
.OnClickListener, ExpandableViewHoldersUtil.Expandable {
private final TextView userNameView, statusView;
private final ImageView profileImageView;
private final ViewGroup mChatArea;
private final EditText mInputArea;
private final Context mContext;
private final RecyclerView mMessageRecyclerView;
private ChatRoomAdapter mChatRoomAdapter;
public ViewHolder(Context context, View itemView) {
super(itemView);
itemView.setOnClickListener(this);
userNameView = (TextView) itemView.findViewById(R.id.user_name);
statusView = (TextView) itemView.findViewById(R.id.user_status);
profileImageView = (ImageView) itemView.findViewById(R.id.user_image);
mChatArea = (ViewGroup) itemView.findViewById(R.id.chat_expand_area);
mInputArea = (EditText) itemView.findViewById(android.R.id.inputArea);
mContext = context;
mMessageRecyclerView = (RecyclerView) mChatArea.findViewById(R.id
.chat_room_message_recycler_view);
mMessageRecyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER);
final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
layoutManager.setStackFromEnd(Boolean.TRUE);
mMessageRecyclerView.setLayoutManager(layoutManager);
mMessageRecyclerView.setHasFixedSize(Boolean.FALSE);
mMessageRecyclerView.setItemAnimator(new DefaultItemAnimator());
mInputArea.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event
.isShiftPressed() && (event
.getAction() == KeyEvent
.ACTION_DOWN &&
event.getKeyCode() == KeyEvent.KEYCODE_ENTER))) {
final String messageText, friendName;
if (!TextUtils.isEmpty(messageText = mInputArea.getText().toString())) {
FriendManager.getInstance().requestSendMessage(messageText,
friendName = userNameView.getText().toString());
ChatHistoryManager.addMessageToFriendChat(new ChatMessageWrapper
(messageText,
System.currentTimeMillis()), FriendManager.getInstance()
.findFriendByName(friendName));
mInputArea.setText("");
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
});
}
private void setupChatRoomAdapter() { //Must be called here because before it is unknown
// who the friend is
final String friendName = userNameView.getText().toString();
mChatRoomAdapter = ChatHistoryManager.getChatRoomByFriend(FriendManager.getInstance()
.findFriendByName(friendName), mMessageRecyclerView);
ChatNotificationManager.dismissNotificationsForFriend(mContext, friendName);
mMessageRecyclerView.setAdapter(mChatRoomAdapter);
}
@Override
public void onClick(final View view) {
final InputMethodManager imm = (InputMethodManager) mContext.getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mInputArea.getWindowToken(), 0);
keepOne.toggle(this);
notifyItemChanged(getPosition());
mInputArea.clearFocus();
}
@Override
public View getExpandView() {
return mChatArea;
}
}
}