package net.dev123.yibo.service.adapter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.dev123.commons.util.ListUtil;
import net.dev123.commons.util.StringUtil;
import net.dev123.commons.util.TimeSpanUtil;
import net.dev123.mblog.entity.DirectMessage;
import net.dev123.mblog.entity.UnreadCount;
import net.dev123.mblog.entity.User;
import net.dev123.yibo.R;
import net.dev123.yibo.common.EmotionLoader;
import net.dev123.yibo.common.GlobalResource;
import net.dev123.yibo.common.GlobalVars;
import net.dev123.yibo.common.NotificationEntity;
import net.dev123.yibo.common.theme.ThemeUtil;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.db.LocalDirectMessage;
import net.dev123.yibo.service.cache.DirectMessageCache;
import net.dev123.yibo.service.cache.ReclaimLevel;
import net.dev123.yibo.service.cache.wrap.DirectMessageWrap;
import net.dev123.yibo.service.task.DirectMessageReadLocalTask;
import net.dev123.yibo.service.task.ImageLoad4HeadTask;
import net.dev123.yibo.service.task.InitAdapterTask;
import net.dev123.yibo.widget.Skeleton;
import android.app.Activity;
import android.content.Context;
import android.text.Spannable;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class DirectMessagesListAdapter extends CacheAdapter<DirectMessage> {
private DirectMessageCache cache = null;
private List<DirectMessage> newInboxList;
private List<DirectMessage> newOutboxList;
private int newCount = 0;
public DirectMessagesListAdapter(Context context, LocalAccount account) {
super(context, account);
cache = new DirectMessageCache(context, account);
newInboxList = new ArrayList<DirectMessage>();
newOutboxList = new ArrayList<DirectMessage>();
InitAdapterTask task = new InitAdapterTask(cache, this);
task.execute();
}
@Override
public int getCount() {
return cache.size();
}
@Override
public Object getItem(int position) {
if (position < 0 || position > getCount() - 1) {
return null;
}
Object obj = getItemWrap(position);
if (obj != null) {
obj = ((DirectMessageWrap)obj).getWrap();
}
return obj;
}
public Object getItemWrap(int position) {
if (position < 0) {
position = 0;
}
if (position > getCount() - 1) {
position = getCount() - 1;
}
return cache.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object obj = getItemWrap(position);
DirectMessageWrap messageWrap = (DirectMessageWrap)obj;
if (messageWrap == null) {
return convertView;
}
int itemViewType = getItemViewType(position);
if (itemViewType == ITEM_VIEW_TYPE_DATA) {
convertView = fillInView(convertView, messageWrap);
} else if (itemViewType == ITEM_VIEW_TYPE_REMOTE_DIVIDER) {
convertView = fillInRemoteDividerView(convertView, messageWrap, position);
} else {
convertView = fillInLocalDividerView(convertView, messageWrap, position);
}
return convertView;
}
private View fillInView(View convertView, DirectMessageWrap messageWrap) {
DirectMessageHolder holder;
if (convertView == null || !isDirectMessageView(convertView)) {
convertView = inflater.inflate(R.layout.list_item_direct_message, null);
holder = new DirectMessageHolder(convertView);
convertView.setTag(holder);
} else {
holder = (DirectMessageHolder)convertView.getTag();
holder.reset();
}
DirectMessage message = messageWrap.getWrap();
String myId = account.getUser().getId();
User targetUser = message.getSender();
if (myId.equals(message.getSenderId())) {
targetUser = message.getRecipient();
}
if (GlobalVars.IS_SHOW_HEAD) {
holder.ivProfilePicture.setVisibility(View.VISIBLE);
String profileUrl = targetUser.getProfileImageUrl();
if (StringUtil.isNotEmpty(profileUrl)) {
ImageLoad4HeadTask headTask = new ImageLoad4HeadTask(holder.ivProfilePicture, profileUrl, true);
holder.headTask = headTask;
headTask.execute();
}
}
holder.tvScreenName.setText(targetUser.getScreenName() + "(" + messageWrap.getCoversationCount() + ")");
holder.tvCreateAt.setText(TimeSpanUtil.toTimeSpanString(message.getCreatedAt()));
messageWrap.hit();
if (!messageWrap.isReaded()) {
holder.tvCreateAt.setTextColor(GlobalResource.getStatusTimelineUnreadColor(context));
if (messageWrap.getHit() > 2) {
messageWrap.setReaded(true);
}
}
Spannable textSpan = EmotionLoader.getEmotionSpannable(
message.getServiceProvider(), message.getText());
holder.tvMessageText.setText(textSpan);
return convertView;
}
private View fillInRemoteDividerView(View convertView, DirectMessageWrap wrap, final int position) {
if (wrap == null
|| !(wrap.getWrap() instanceof LocalDirectMessage)) {
return convertView;
}
final LocalDirectMessage divider = (LocalDirectMessage)wrap.getWrap();
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_gap, null);
ThemeUtil.setListViewGap(convertView);
}
View llLoadingState = convertView.findViewById(R.id.llLoadingState);
if (divider.isLoading()) {
llLoadingState.setVisibility(View.VISIBLE);
} else {
llLoadingState.setVisibility(View.GONE);
}
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setClickable(false);
v.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE);
// DirectMessage max = (DirectMessage)getItem(position - 1);
// DirectMessage since = (DirectMessage)getItem(position + 1);
// DirectMessagePageDownTask task;
// task = new DirectMessagePageDownTask(InboxListAdapter.this, divider);
// task.execute(max, since);
}
});
return convertView;
}
private View fillInLocalDividerView(View convertView, DirectMessageWrap wrap, final int position) {
if (wrap == null
|| !(wrap.getWrap() instanceof LocalDirectMessage)) {
return null;
}
final LocalDirectMessage divider = (LocalDirectMessage)wrap.getWrap();
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_more, null);
ThemeUtil.setListViewMore(convertView);
}
if (divider.isLoading()) {
convertView.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE);
convertView.findViewById(R.id.tvFooter).setVisibility(View.GONE);
} else {
convertView.findViewById(R.id.llLoadingState).setVisibility(View.GONE);
convertView.findViewById(R.id.tvFooter).setVisibility(View.VISIBLE);
}
if (paging.hasNext()) {
convertView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if (divider.isLoading()) {
return;
}
v.setClickable(false);
v.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE);
v.findViewById(R.id.tvFooter).setVisibility(View.GONE);
DirectMessage inboxMax = cache.getInboxMin();
DirectMessage outboxMax = cache.getOutboxMin();
DirectMessageReadLocalTask readLocalTask = new DirectMessageReadLocalTask(
DirectMessagesListAdapter.this, cache, divider
);
readLocalTask.execute(inboxMax, outboxMax);
}
});
} else {
((TextView)convertView.findViewById(R.id.tvFooter)).setText(R.string.label_no_more);
}
return convertView;
}
private boolean isDirectMessageView(View convertView) {
boolean isStatusView = false;
try {
View view = convertView.findViewById(R.id.ivProfilePicture);
if (view != null) {
isStatusView = true;
}
} catch(Exception e) {
}
return isStatusView;
}
public void clear() {
cache.clear();
this.notifyDataSetChanged();
}
@Override
public void reclaim(ReclaimLevel level) {
boolean isReclaim = cache.reclaim(level);
if (isReclaim) {
try {
this.notifyDataSetChanged();
} catch(Exception e) {
this.notifyDataSetInvalidated();
}
}
}
public void addNewInbox(List<DirectMessage> list) {
if (ListUtil.isEmpty(list)) {
return;
}
newInboxList.addAll(0, list);
}
public void addNewOutbox(List<DirectMessage> list) {
if (ListUtil.isEmpty(list)) {
return;
}
newOutboxList.addAll(0, list);
}
public NotificationEntity getNotificationEntity(UnreadCount unreadCount) {
if (unreadCount != null) {
newCount += unreadCount.getDireceMessageCount();
} else {
newCount = getNewInboxSize();
}
NotificationEntity entity = new NotificationEntity();
entity.setTickerText(context.getString(R.string.msg_direct_messages_ticker_text));
String accountName = account.getUser().getScreenName();
entity.setContentTitle(context.getString(
R.string.msg_direct_messages_content_title,
accountName, newCount));
entity.setContentText(account.getServiceProvider().getServiceProviderName() + ": "
+ getNewBlogsDesc(newCount));
entity.setContentType(Skeleton.TYPE_DIRECT_MESSAGE);
return entity;
}
public String getNewBlogsDesc(int newCount) {
StringBuffer desc = new StringBuffer();
if (ListUtil.isEmpty(newInboxList) || newCount <= 0) {
return desc.toString();
}
List<String> listScreenName = new ArrayList<String>();
String screenName = null;
int showScreenNameCount = 3;
if (showScreenNameCount > newCount) {
showScreenNameCount = newCount;
}
for (int i = 0; i < newInboxList.size() && listScreenName.size() < showScreenNameCount; i++) {
DirectMessage message = newInboxList.get(i);
if (message == null
|| message instanceof LocalDirectMessage) {
continue;
}
screenName = message.getSenderScreenName();
if (!listScreenName.contains(screenName)) {
listScreenName.add(screenName);
}
}
if (listScreenName.size() >= 3) {
desc.append(
context.getString(
R.string.msg_direct_messages_content_text_3, listScreenName.get(0),
listScreenName.get(1), listScreenName.get(2)
)
);
} else if (listScreenName.size() == 2) {
desc.append(
context.getString(
R.string.msg_direct_messages_content_text_2, listScreenName.get(0), listScreenName.get(1)
)
);
} else {
desc.append(context.getString(R.string.msg_direct_messages_content_text_1, listScreenName.get(0)));
}
return desc.toString();
}
public boolean refresh() {
if (ListUtil.isEmpty(newInboxList) && ListUtil.isEmpty(newOutboxList)) {
return false;
}
addCacheToFirst(newInboxList);
addCacheToFirst(newOutboxList);
int offset = newInboxList.size() + newOutboxList.size();
newInboxList.clear();
newOutboxList.clear();
newCount = 0;
ListView lvMicroBlog = (ListView)((Activity)context).findViewById(R.id.lvMicroBlog);
if (lvMicroBlog == null) {
return true;
}
Adapter adapter = lvMicroBlog.getAdapter();
if (adapter instanceof HeaderViewListAdapter) {
adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter();
}
if (lvMicroBlog != null
&& adapter == this) {
int position = lvMicroBlog.getFirstVisiblePosition();
View view = lvMicroBlog.getChildAt(0);
int y = 0;
if (view != null && position >= 1) {
y = view.getTop();
position += offset;
lvMicroBlog.setSelectionFromTop(position, y);
}
}
return true;
}
@Override
public boolean addCacheToFirst(List<DirectMessage> list) {
if (ListUtil.isEmpty(list)) {
return false;
}
List<DirectMessageWrap> listStatusWrap = new ArrayList<DirectMessageWrap>(list.size());
Date currentDate = new Date();
DirectMessageWrap wrap = null;
for (DirectMessage message : list) {
wrap = toWrap(message, currentDate);
listStatusWrap.add(wrap);
}
cache.addAll(0, listStatusWrap);
this.notifyDataSetChanged();
// FlushTask task = new FlushTask(cache);
// task.execute();
cache.write(list);
return true;
}
@Override
public boolean addCacheToDivider(DirectMessage value, List<DirectMessage> list) {
if (ListUtil.isEmpty(list)) {
return false;
}
int i = cache.indexOf(new DirectMessageWrap(value));
if (i == -1) {
return false;
}
cache.remove(i);
List<DirectMessageWrap> listWrap = new ArrayList<DirectMessageWrap>(list.size());
Date currentDate = new Date();
DirectMessageWrap wrap = null;
for (DirectMessage message : list) {
wrap = toWrap(message, currentDate);
listWrap.add(wrap);
}
cache.addAll(i, listWrap);
this.notifyDataSetChanged();
// FlushTask task = new FlushTask(cache);
// task.execute();
cache.write(list);
return true;
}
@Override
public boolean addCacheToLast(List<DirectMessage> list) {
if (ListUtil.isEmpty(list)) {
return false;
}
List<DirectMessageWrap> listStatusWrap = new ArrayList<DirectMessageWrap>(list.size());
Date currentDate = new Date();
DirectMessageWrap wrap = null;
for (DirectMessage message : list) {
wrap = toWrap(message, currentDate);
listStatusWrap.add(wrap);
}
cache.addAll(cache.size(), listStatusWrap);
this.notifyDataSetChanged();
// FlushTask task = new FlushTask(cache);
// task.execute();
cache.write(list);
return true;
}
private DirectMessageWrap toWrap(DirectMessage message, Date currentDate) {
if (message == null) {
return null;
}
DirectMessageWrap wrap = new DirectMessageWrap(message);
wrap.setReadedTime(currentDate);
return wrap;
}
//设计获得发件箱最大的,收件箱最大的
@Override
public DirectMessage getMax() {
DirectMessage max = null;
if (cache != null && cache.size() > 0) {
DirectMessageWrap wrap = cache.get(0);
max = wrap.getWrap();
}
if (ListUtil.isNotEmpty(newInboxList)) {
DirectMessage temp = newInboxList.get(0);
if (max != null && max.getCreatedAt() != null) {
max = max.getCreatedAt().before(temp.getCreatedAt()) ? temp : max;
} else {
max = temp;
}
}
return max;
}
public DirectMessage getInboxMax() {
DirectMessage max = cache.getInboxMax();
if (ListUtil.isEmpty(newInboxList)) {
return max;
}
DirectMessage message = null;
for (int i = 0; i < newInboxList.size(); i++) {
DirectMessage temp = newInboxList.get(i);
if (StringUtil.isEquals(temp.getRecipientId(), account.getUserId())) {
message = temp;
break;
}
}
if (max != null && max.getCreatedAt() != null && message != null) {
max = max.getCreatedAt().before(message.getCreatedAt()) ? message : max;
} else {
max = message;
}
return max;
}
public DirectMessage getOutboxMax() {
DirectMessage max = cache.getOutboxMax();
if (ListUtil.isEmpty(newOutboxList)) {
return max;
}
DirectMessage message = null;
for (int i = 0; i < newOutboxList.size(); i++) {
DirectMessage temp = newOutboxList.get(i);
if (StringUtil.isEquals(temp.getSenderId(), account.getUserId())) {
message = temp;
break;
}
}
if (max != null && max.getCreatedAt() != null && message != null) {
max = max.getCreatedAt().before(message.getCreatedAt()) ? message : max;
} else {
max = message;
}
return max;
}
@Override
public DirectMessage getMin() {
DirectMessage min = null;
if (cache != null && cache.size() > 0) {
DirectMessageWrap wrap = cache.get(cache.size() - 1);
min = wrap.getWrap();
}
return min;
}
public DirectMessage getInboxMin() {
return cache.getInboxMin();
}
public DirectMessage getOutboxMin() {
return cache.getOutboxMin();
}
@Override
public boolean remove(int position) {
if (position < 0 || position >= getCount()) {
return false;
}
cache.remove(position);
this.notifyDataSetChanged();
return true;
}
@Override
public boolean remove(DirectMessage message) {
if (message == null) {
return false;
}
cache.remove(new DirectMessageWrap(message));
this.notifyDataSetChanged();
return true;
}
public LocalAccount getAccount() {
return account;
}
public void setAccount(LocalAccount account) {
this.account = account;
}
public List<DirectMessage> getNewInboxList() {
return newInboxList;
}
public List<DirectMessage> getNewOutboxList() {
return newOutboxList;
}
public int getNewInboxSize() {
int size = newInboxList.size();
if (size > 0
&& newInboxList.get(size - 1) instanceof LocalDirectMessage) {
size--;
}
return size;
}
public int getNewOutboxSize() {
int size = newOutboxList.size();
if (size > 0
&& newOutboxList.get(size - 1) instanceof LocalDirectMessage) {
size--;
}
return size;
}
@Override
public int getItemViewType(int position) {
DirectMessage message = (DirectMessage)getItem(position);
if (message == null) {
return ITEM_VIEW_TYPE_REMOTE_DIVIDER;
}
if (!(message instanceof LocalDirectMessage)) {
return ITEM_VIEW_TYPE_DATA;
}
LocalDirectMessage localMessage = (LocalDirectMessage)message;
if (!localMessage.isDivider()) {
return ITEM_VIEW_TYPE_DATA;
}
if (localMessage.isLocalDivider()) {
return ITEM_VIEW_TYPE_LOCAL_DIVIDER;
}
return ITEM_VIEW_TYPE_REMOTE_DIVIDER;
}
@Override
public int getViewTypeCount() {
return 3;
}
}