package pro.dbro.ble.ui.adapter;
import android.content.Context;
import android.database.Cursor;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.text.ParseException;
import java.util.UUID;
import im.delight.android.identicons.SymmetricIdenticon;
import pro.dbro.ble.R;
import pro.dbro.ble.data.DataStore;
import pro.dbro.ble.data.model.DataUtil;
import pro.dbro.ble.data.model.MessageTable;
import pro.dbro.ble.data.model.Peer;
/**
* Created by davidbrodsky on 10/19/14.
*/
public class MessageAdapter extends RecyclerViewCursorAdapter<MessageAdapter.ViewHolder> {
public static final String TAG = "MessageAdapter";
public interface MessageSelectedListener {
void onMessageSelected(View identiconView, View usernameView, int messageId, int peerId);
}
private DataStore mDataStore;
private RecyclerView mHost;
private MessageSelectedListener mListener;
public static class ViewHolder extends RecyclerView.ViewHolder {
public View container;
public TextView senderView;
public TextView messageView;
public TextView authoredView;
public SymmetricIdenticon identicon;
public Peer peer;
public ViewHolder(View v) {
super(v);
container = v;
senderView = (TextView) v.findViewById(R.id.sender);
messageView = (TextView) v.findViewById(R.id.messageBody);
authoredView = (TextView) v.findViewById(R.id.authoredDate);
identicon = (SymmetricIdenticon) v.findViewById(R.id.identicon);
}
}
/**
* Recommended constructor.
*
* @param context The context
* @param dataStore The data backend
* @param fromPeer A Peer to show messages from, or null to show all messages
* @param flags Flags used to determine the behavior of the adapter;
* Currently it accept {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
*/
public MessageAdapter(@NonNull Context context,
@Nullable Peer fromPeer,
@NonNull DataStore dataStore,
@Nullable MessageSelectedListener listener,
int flags) {
super(context,
fromPeer == null ? dataStore.getRecentMessages().getCursor() :
dataStore.getRecentMessagesByPeer(fromPeer).getCursor(), flags);
mDataStore = dataStore;
mListener = listener;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
mHost = recyclerView;
}
@Override
public void onBindViewHolder(ViewHolder holder, Cursor cursor) {
holder.container.setTag(R.id.view_tag_msg_id, cursor.getInt(cursor.getColumnIndex(MessageTable.id)));
if (holder.peer == null) // TODO : Should do this lookup on a background thread
holder.peer = mDataStore.getPeerById(cursor.getInt(cursor.getColumnIndex(MessageTable.peerId)));
if (holder.peer != null) {
holder.container.setTag(R.id.view_tag_peer_id, holder.peer.getId());
holder.senderView.setText(holder.peer.getAlias());
holder.identicon.show(new String(holder.peer.getPublicKey()));
} else {
holder.senderView.setText("?");
holder.identicon.show(UUID.randomUUID());
}
holder.messageView.setText(cursor.getString(cursor.getColumnIndex(MessageTable.body)));
try {
holder.authoredView.setText(DateUtils.getRelativeTimeSpanString(
DataUtil.storedDateFormatter.parse(cursor.getString(cursor.getColumnIndex(MessageTable.authoredDate))).getTime()));
} catch (ParseException e) {
holder.authoredView.setText("");
e.printStackTrace();
}
}
@Override
protected void onContentChanged() {
Log.i(TAG, "onContentChanged");
changeCursor(mDataStore.getRecentMessages().getCursor());
mHost.smoothScrollToPosition(0);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.message_item, parent, false);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null)
mListener.onMessageSelected(v.findViewById(R.id.identicon),
v.findViewById(R.id.sender),
(Integer) v.getTag(R.id.view_tag_msg_id),
(Integer) v.getTag(R.id.view_tag_peer_id));
}
});
// set the view's size, margins, paddings and layout parameters
return new ViewHolder(v);
}
}