package net.dev123.yibo.service.listener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import net.dev123.mblog.entity.Comment;
import net.dev123.mblog.entity.DirectMessage;
import net.dev123.mblog.entity.Status;
import net.dev123.yibo.AutoUpdateService;
import net.dev123.yibo.R;
import net.dev123.yibo.YiBoApplication;
import net.dev123.yibo.common.CacheManager;
import net.dev123.yibo.common.theme.Theme;
import net.dev123.yibo.common.theme.ThemeUtil;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.service.adapter.CacheAdapter;
import net.dev123.yibo.service.adapter.CommentsListAdapter;
import net.dev123.yibo.service.adapter.DirectMessagesListAdapter;
import net.dev123.yibo.service.adapter.MentionsListAdapter;
import net.dev123.yibo.service.cache.AdapterCollectionCache;
import net.dev123.yibo.service.cache.Cache;
import net.dev123.yibo.widget.PullToRefreshListView;
import net.dev123.yibo.widget.Skeleton;
import net.dev123.yibo.widget.ValueSetEvent;
import net.dev123.yibo.widget.ViewChangeEvent;
import android.app.Activity;
import android.content.Context;
import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class MessagesChangeListener implements PropertyChangeListener {
private Activity context;
private YiBoApplication yibo;
private View contentView; //mention and comment
private View directMessageView;
private HomePageRefreshListener refreshListener;
private MicroBlogItemClickListener statusItemClickListener;
private StatusRecyclerListener statusRecyclerListener;
private MicroBlogContextMenuListener contextMenuListener;
private CommentsItemClickListener commentItemClickListener;
private CommentRecyclerListener commentRecyclerListener;
private DirectMessagesItemClickListener directMessageItemClickListener;
private DirectMessageRecyclerListener directMessageRecyclerListener;
private int currentType;
private LocalAccount currentAccount;
private ViewGroup currentContainer;
private Button btnMention;
private Button btnComment;
private Button btnDirectMessage;
public MessagesChangeListener(Context context) {
this.context = (Activity)context;
this.yibo = (YiBoApplication)context.getApplicationContext();
refreshListener = new HomePageRefreshListener();
statusItemClickListener = new MicroBlogItemClickListener(context);
statusRecyclerListener = new StatusRecyclerListener();
commentItemClickListener = new CommentsItemClickListener(context);
commentRecyclerListener = new CommentRecyclerListener();
directMessageItemClickListener = new DirectMessagesItemClickListener(context);
directMessageRecyclerListener = new DirectMessageRecyclerListener();
currentType = Skeleton.TYPE_MENTION;
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event instanceof ViewChangeEvent) {
int type = (Integer)event.getNewValue();
if (type != Skeleton.TYPE_MESSAGE
&& type != Skeleton.TYPE_MENTION
&& type != Skeleton.TYPE_COMMENT
&& type != Skeleton.TYPE_DIRECT_MESSAGE) {
return;
}
ViewChangeEvent changeEvent = (ViewChangeEvent)event;
LocalAccount account = changeEvent.getAccount();
ViewGroup container = (ViewGroup)changeEvent.getView();
viewChange(account, type, container);
} else if (event instanceof ValueSetEvent) {
valueSet(event);
}
}
private void viewChange(LocalAccount account, int type, ViewGroup container) {
if (account == null || container == null) {
return;
}
if (type != Skeleton.TYPE_MESSAGE) {
currentType = type;
}
currentAccount = account;
currentContainer = container;
View view = null;
switch (currentType) {
case Skeleton.TYPE_MENTION:
view = getMentionContentView(account);
break;
case Skeleton.TYPE_COMMENT:
view = getCommentContentView(account);
break;
case Skeleton.TYPE_DIRECT_MESSAGE:
view = getDirectMessageContentView(account);
break;
}
container.removeAllViews();
container.addView(view);
View llHeaderBase = context.findViewById(R.id.llHeaderBase);
llHeaderBase.setVisibility(View.GONE);
View llHeaderMessage = context.findViewById(R.id.llHeaderMessage);
llHeaderMessage.setVisibility(View.VISIBLE);
btnMention = (Button)context.findViewById(R.id.btnMention);
btnComment = (Button)context.findViewById(R.id.btnComment);
btnDirectMessage = (Button)context.findViewById(R.id.btnDirectMessage);
btnMention.setOnClickListener(tabClickListener);
btnComment.setOnClickListener(tabClickListener);
btnDirectMessage.setOnClickListener(tabClickListener);
btnMention.setEnabled(true);
btnComment.setEnabled(true);
btnDirectMessage.setEnabled(true);
switch (currentType) {
case Skeleton.TYPE_MENTION:
btnMention.setEnabled(false);
break;
case Skeleton.TYPE_COMMENT:
btnComment.setEnabled(false);
break;
case Skeleton.TYPE_DIRECT_MESSAGE:
btnDirectMessage.setEnabled(false);
break;
}
}
private void valueSet(PropertyChangeEvent event) {
ValueSetEvent setEvent = (ValueSetEvent)event;
LocalAccount account = setEvent.getAccount();
switch (setEvent.getAction()) {
case ACTION_INIT_ADAPTER:
initMentionAdapter(account);
initCommentAdapter(account);
initDirectMessageAdapter(account);
break;
case ACTION_RECLAIM_MEMORY:
contentView = null;
directMessageView = null;
break;
default:
break;
}
}
private View getMentionContentView(LocalAccount account) {
ListView lvMicroBlog = null;
if (account == null) {
return lvMicroBlog;
}
if (contentView != null) {
lvMicroBlog = (ListView)contentView.findViewById(R.id.lvMicroBlog);
} else {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
contentView = inflater.inflate(R.layout.home_page_content_message, null);
lvMicroBlog = (ListView)contentView.findViewById(R.id.lvMicroBlog);
if (lvMicroBlog instanceof PullToRefreshListView) {
((PullToRefreshListView)lvMicroBlog).setOnRefreshListener(refreshListener);
}
lvMicroBlog.setOnScrollListener(new AutoLoadMoreListener());
View emptyView = contentView.findViewById(R.id.llLoadingView);
lvMicroBlog.setEmptyView(emptyView);
ThemeUtil.setContentBackground(contentView);
ThemeUtil.setListViewStyle(lvMicroBlog);
ThemeUtil.setListViewLoading(emptyView);
}
lvMicroBlog.setOnItemClickListener(statusItemClickListener);
CacheAdapter<Status> adapter = initMentionAdapter(account);
lvMicroBlog.setAdapter(adapter);
if (contextMenuListener == null) {
contextMenuListener = new MicroBlogContextMenuListener(lvMicroBlog);
}
lvMicroBlog.setOnCreateContextMenuListener(contextMenuListener);
lvMicroBlog.setRecyclerListener(statusRecyclerListener);
lvMicroBlog.setFastScrollEnabled(yibo.isSliderEnabled());
View llDirectMessageHeader = contentView.findViewById(R.id.llDirectMessageHeader);
llDirectMessageHeader.setVisibility(View.GONE);
return contentView;
}
private CacheAdapter<Status> initMentionAdapter(LocalAccount account) {
Cache cache = CacheManager.getInstance().getCache(account);
AdapterCollectionCache adapterCache = (AdapterCollectionCache)cache;
if (adapterCache == null) {
adapterCache = new AdapterCollectionCache(account);
CacheManager.getInstance().putCache(account, adapterCache);
}
MentionsListAdapter adapter = adapterCache.getMentionsListAdapter();
if (adapter == null) {
adapter = new MentionsListAdapter(context, account);
adapterCache.setMentionsListAdapter(adapter);
AutoUpdateService.registerUpdateAccount(account);
}
return adapter;
}
private View getCommentContentView(LocalAccount account) {
ListView lvComment = null;
if (account == null) {
return lvComment;
}
if (contentView != null) {
lvComment = (ListView)contentView.findViewById(R.id.lvMicroBlog);
} else {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
contentView = inflater.inflate(R.layout.home_page_content_message, null);
lvComment = (ListView)contentView.findViewById(R.id.lvMicroBlog);
if (lvComment instanceof PullToRefreshListView) {
((PullToRefreshListView)lvComment).setOnRefreshListener(refreshListener);
}
lvComment.setOnScrollListener(new AutoLoadMoreListener());
View emptyView = contentView.findViewById(R.id.llLoadingView);
lvComment.setEmptyView(emptyView);
ThemeUtil.setContentBackground(contentView);
ThemeUtil.setListViewStyle(lvComment);
ThemeUtil.setListViewLoading(emptyView);
}
lvComment.setOnItemClickListener(commentItemClickListener);
lvComment.setOnCreateContextMenuListener(null);
CacheAdapter<Comment> adapter = initCommentAdapter(account);
lvComment.setAdapter(adapter);
lvComment.setRecyclerListener(commentRecyclerListener);
lvComment.setFastScrollEnabled(yibo.isSliderEnabled());
View llDirectMessageHeader = contentView.findViewById(R.id.llDirectMessageHeader);
llDirectMessageHeader.setVisibility(View.GONE);
return contentView;
}
private CacheAdapter<Comment> initCommentAdapter(LocalAccount account) {
Cache cache = CacheManager.getInstance().getCache(account);
AdapterCollectionCache adapterCache = (AdapterCollectionCache)cache;
if (adapterCache == null) {
adapterCache = new AdapterCollectionCache(account);
CacheManager.getInstance().putCache(account, adapterCache);
}
CommentsListAdapter adapter = adapterCache.getCommentsListAdapter();
if (adapter == null) {
adapter = new CommentsListAdapter(context, account);
adapterCache.setCommentsListAdapter(adapter);
AutoUpdateService.registerUpdateAccount(account);
}
return adapter;
}
public View getDirectMessageContentView(LocalAccount account) {
CacheAdapter<DirectMessage> adapter = initDirectMessageAdapter(account);
ListView lvDirectMessage;
if (directMessageView != null) {
lvDirectMessage = (ListView)directMessageView.findViewById(R.id.lvMicroBlog);
} else {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
directMessageView = inflater.inflate(R.layout.home_page_content_message, null);
ThemeUtil.setContentBackground(directMessageView);
lvDirectMessage = (ListView)directMessageView.findViewById(R.id.lvMicroBlog);
if (lvDirectMessage instanceof PullToRefreshListView) {
((PullToRefreshListView)lvDirectMessage).setOnRefreshListener(refreshListener);
}
ThemeUtil.setListViewStyle(lvDirectMessage);
lvDirectMessage.setOnScrollListener(new AutoLoadMoreListener());
View emptyView = directMessageView.findViewById(R.id.llLoadingView);
ThemeUtil.setListViewLoading(emptyView);
lvDirectMessage.setOnItemClickListener(directMessageItemClickListener);
lvDirectMessage.setEmptyView(emptyView);
View llDirectMessageHeader = directMessageView.findViewById(R.id.llDirectMessageHeader);
ThemeUtil.setHeaderCornerTab(llDirectMessageHeader);
//edit direct message
HomePageEditMessageClickListener editMessageClickListener = new HomePageEditMessageClickListener(context);
EditText etDirectMessage = (EditText)directMessageView.findViewById(R.id.etDirectMessage);
etDirectMessage.setOnClickListener(editMessageClickListener);
etDirectMessage.setInputType(InputType.TYPE_NULL);
Button btnDirectMessage = (Button)directMessageView.findViewById(R.id.btnDirectMessage);
btnDirectMessage.setOnClickListener(editMessageClickListener);
Theme theme = ThemeUtil.createTheme(context);
btnDirectMessage.setBackgroundDrawable(theme.getDrawable("selector_btn_message_edit"));
etDirectMessage.setBackgroundDrawable(theme.getDrawable("bg_input_frame_left_half"));
}
lvDirectMessage.setAdapter(adapter);
lvDirectMessage.setFastScrollEnabled(yibo.isSliderEnabled());
lvDirectMessage.setRecyclerListener(directMessageRecyclerListener);
View llDirectMessageHeader = directMessageView.findViewById(R.id.llDirectMessageHeader);
llDirectMessageHeader.setVisibility(View.VISIBLE);
EditText etDirectMessage = (EditText)directMessageView.findViewById(R.id.etDirectMessage);
etDirectMessage.clearFocus();
return directMessageView;
}
private DirectMessagesListAdapter initDirectMessageAdapter(LocalAccount account) {
Cache cache = CacheManager.getInstance().getCache(account);
AdapterCollectionCache adapterCache = (AdapterCollectionCache)cache;
if (adapterCache == null) {
adapterCache = new AdapterCollectionCache(account);
CacheManager.getInstance().putCache(account, adapterCache);
}
DirectMessagesListAdapter adapter = adapterCache.getDirectMessagesListAdapter();
if (adapter == null) {
adapter = new DirectMessagesListAdapter(context, account);
adapterCache.setDirectMessagesListAdapter(adapter);
AutoUpdateService.registerUpdateAccount(account);
}
return adapter;
}
private View.OnClickListener tabClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.getId() == R.id.btnMention) {
viewChange(currentAccount, Skeleton.TYPE_MENTION, currentContainer);
} else if (v.getId() == R.id.btnComment) {
viewChange(currentAccount, Skeleton.TYPE_COMMENT, currentContainer);
} else if (v.getId() == R.id.btnDirectMessage) {
viewChange(currentAccount, Skeleton.TYPE_DIRECT_MESSAGE, currentContainer);
}
}
};
}