package net.dev123.yibo.service.listener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.dev123.commons.Constants;
import net.dev123.mblog.entity.Group;
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.ThemeUtil;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.service.adapter.AdapterUtil;
import net.dev123.yibo.service.adapter.GroupStatusesListAdapter;
import net.dev123.yibo.service.adapter.MyHomeListAdapter;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
public class MyHomeChangeListener implements PropertyChangeListener {
private Activity context;
private YiBoApplication yibo;
private Map<LocalAccount, View> viewMap;
private HomePageEditStatusClickListener editStatusClickListner;
private HomePageRefreshListener refreshListener;
private MicroBlogItemClickListener itemClickListener;
private StatusRecyclerListener recyclerListener;
public MyHomeChangeListener(Context context) {
this.context = (Activity)context;
this.yibo = (YiBoApplication)context.getApplicationContext();
viewMap = new HashMap<LocalAccount, View>();
editStatusClickListner = new HomePageEditStatusClickListener(context);
refreshListener = new HomePageRefreshListener();
itemClickListener = new MicroBlogItemClickListener(context);
recyclerListener = new StatusRecyclerListener();
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event instanceof ViewChangeEvent) {
viewChange(event);
} else if (event instanceof ValueSetEvent) {
valueSet(event);
}
}
private void viewChange(PropertyChangeEvent event) {
if (!((event instanceof ViewChangeEvent)
&& event.getNewValue().equals(Skeleton.TYPE_MY_HOME))) {
return;
}
ViewChangeEvent changeEvent = (ViewChangeEvent)event;
ViewGroup viewGroup = (ViewGroup)changeEvent.getView();
viewGroup.removeAllViews();
View view = getContentView(changeEvent.getAccount());
if (view != null) {
viewGroup.addView(view);
}
updateHeader(changeEvent);
}
private void updateHeader(ViewChangeEvent changeEvent) {
TextView tvTitle = (TextView)context.findViewById(R.id.tvTitle);
LocalAccount account = changeEvent.getAccount();
ListView lvMicroBlog = (ListView)context.findViewById(R.id.lvMicroBlog);
if (lvMicroBlog == null) {
return;
}
BaseAdapter adapter = AdapterUtil.getAdapter(lvMicroBlog.getAdapter());
String title = "";
if (adapter instanceof MyHomeListAdapter) {
if (account.getUser() != null) {
title += account.getUser().getScreenName() + "@";
}
title += account.getServiceProvider().getServiceProviderName();
} else if (adapter instanceof GroupStatusesListAdapter) {
GroupStatusesListAdapter statusesListAdapter = (GroupStatusesListAdapter)adapter;
Group group = statusesListAdapter.getGroup();
title = group.getName();
}
tvTitle.setText(title);
View llHeaderBase = ((Activity)context).findViewById(R.id.llHeaderBase);
llHeaderBase.setVisibility(View.VISIBLE);
View llHeaderMessage = ((Activity)context).findViewById(R.id.llHeaderMessage);
llHeaderMessage.setVisibility(View.GONE);
ImageButton ibProfileImage = (ImageButton) context.findViewById(R.id.ibProfileImage);
ibProfileImage.setVisibility(View.VISIBLE);
ImageButton ibGroup = (ImageButton) context.findViewById(R.id.ibGroup);
ibGroup.setVisibility(View.VISIBLE);
ImageButton ibEdit = (ImageButton) context.findViewById(R.id.ibEdit);
ibEdit.setVisibility(View.VISIBLE);
ibEdit.setOnClickListener(editStatusClickListner);
}
private void valueSet(PropertyChangeEvent event) {
ValueSetEvent setEvent = (ValueSetEvent)event;
LocalAccount account = setEvent.getAccount();
switch(setEvent.getAction()) {
case ACTION_INIT_ADAPTER:
initAdapter(account);
break;
case ACTION_RECLAIM_MEMORY:
//reclaimView(yibo.getCurrentAccount());
break;
default:
break;
}
}
private View getContentView(LocalAccount account) {
ListView lvMicroBlog = null;
if (account == null) {
return lvMicroBlog;
}
View contentView = viewMap.get(account);
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_list, null);
lvMicroBlog = (ListView)contentView.findViewById(R.id.lvMicroBlog);
if (lvMicroBlog instanceof PullToRefreshListView) {
((PullToRefreshListView)lvMicroBlog).setOnRefreshListener(refreshListener);
}
View emptyView = contentView.findViewById(R.id.llLoadingView);
ThemeUtil.setContentBackground(contentView);
ThemeUtil.setListViewStyle(lvMicroBlog);
ThemeUtil.setListViewLoading(emptyView);
lvMicroBlog.setOnItemClickListener(itemClickListener);
MyHomeListAdapter adapter = initAdapter(account);
lvMicroBlog.setAdapter(adapter);
lvMicroBlog.setEmptyView(emptyView);
MicroBlogContextMenuListener contextMenuListener =
new MicroBlogContextMenuListener(lvMicroBlog);
lvMicroBlog.setOnCreateContextMenuListener(contextMenuListener);
lvMicroBlog.setRecyclerListener(recyclerListener);
lvMicroBlog.setOnScrollListener(new AutoLoadMoreListener());
viewMap.put(account, contentView);
//首页进入更新
if (yibo.isRefreshOnFirstEnter() && adapter.getCount() > 0) {
PullToRefreshListView prListView = (PullToRefreshListView)lvMicroBlog;
prListView.setSelection(0);
prListView.prepareForRefresh();
prListView.onRefresh();
}
}
lvMicroBlog.setFastScrollEnabled(yibo.isSliderEnabled());
return contentView;
}
private MyHomeListAdapter initAdapter(LocalAccount account) {
Cache cache = CacheManager.getInstance().getCache(account);
AdapterCollectionCache adapterCache = (AdapterCollectionCache)cache;
if (adapterCache == null) {
adapterCache = new AdapterCollectionCache(account);
CacheManager.getInstance().putCache(account, adapterCache);
}
MyHomeListAdapter adapter = adapterCache.getMyHomeListAdapter();
if (adapter == null) {
adapter = new MyHomeListAdapter(context, account);
adapterCache.setMyHomeListAdapter(adapter);
AutoUpdateService.registerUpdateAccount(account);
}
return adapter;
}
private void reclaimView(LocalAccount account) {
if (account == null) {
return;
}
List<View> viewList = new ArrayList<View>();
for (LocalAccount temp : viewMap.keySet()) {
if (account.getAccountId() == temp.getAccountId()) {
continue;
}
View contentView = viewMap.get(account);
if (contentView != null) {
ListView lvMicroBlog = (ListView)contentView.findViewById(R.id.lvMicroBlog);
if (lvMicroBlog != null) {
lvMicroBlog.reclaimViews(viewList);
}
}
if (Constants.DEBUG) Log.v("MyHomeChangeListener", "reclaimViews: " + viewList.size());
viewList.clear();
}
}
}