package org.aisen.weibo.sina.ui.fragment.menu;
import java.util.ArrayList;
import java.util.List;
import org.aisen.weibo.sina.R;
import org.aisen.weibo.sina.support.bean.AccountBean;
import org.aisen.weibo.sina.support.bean.MenuBean;
import org.aisen.weibo.sina.support.db.AccountDB;
import org.aisen.weibo.sina.support.publish.PublishDB;
import org.aisen.weibo.sina.support.publish.PublishManager;
import org.aisen.weibo.sina.support.utils.AisenUtil;
import org.aisen.weibo.sina.support.utils.AppContext;
import org.aisen.weibo.sina.support.utils.AppSettings;
import org.aisen.weibo.sina.support.utils.ImageConfigUtils;
import org.aisen.weibo.sina.sys.service.UnreadService;
import org.aisen.weibo.sina.ui.activity.main.MainActivity;
import org.aisen.weibo.sina.ui.activity.search.SearchActivity;
import org.aisen.weibo.sina.ui.fragment.account.AccountFragment;
import org.android.loader.BitmapLoader;
import org.sina.android.bean.WeiBoUser;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.m.common.utils.ActivityHelper;
import com.m.common.utils.Logger;
import com.m.support.Inject.ViewInject;
import com.m.support.adapter.ABaseAdapter.AbstractItemView;
import com.m.support.task.TaskException;
import com.m.support.task.WorkTask;
import com.m.ui.activity.BaseActivity;
import com.m.ui.fragment.AListFragment;
import com.m.ui.utils.ViewUtils;
/**
* 抽屉菜单
*
* @author wangdan
*
*/
public class MenuFragment_v2 extends AListFragment<MenuBean, ArrayList<MenuBean>> implements OnItemClickListener {
public static MenuFragment_v2 newInstance(String type) {
MenuFragment_v2 fragment = new MenuFragment_v2();
if (!TextUtils.isEmpty(type)) {
Bundle args = new Bundle();
args.putString("type", type);
fragment.setArguments(args);
}
return fragment;
}
private MenuCallback menuCallback;
private MenuBean lastSelectedMenu;
private int draftSize;
private View menusHeader;
private View profileHeader;
TextView txtMainTitle;
TextView txtMainCounter;
TextView txtMentionTitle;
TextView txtMentionCounter;
TextView txtCmtTitle;
TextView txtCmtCounter;
TextView txtFriendsTitle;
TextView txtFriendsCounter;
View btnAccounts;
@Override
protected int inflateContentView() {
return R.layout.ui_menu;
}
@Override
protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
super.layoutInit(inflater, savedInstanceSate);
getListView().setOnItemClickListener(this);
setItems(generateMenus());
if (savedInstanceSate == null) {
int index = getListView().getHeaderViewsCount();
lastSelectedMenu = newMenu("1");
if (getArguments() != null) {
String type = getArguments().getString("type");
lastSelectedMenu = newMenu(type);
for (int i = 0; i < getAdapterItems().size(); i++) {
MenuBean bean = getAdapterItems().get(i);
if (bean.getType().equals(type)) {
lastSelectedMenu = bean;
index = i + getListView().getHeaderViewsCount();
break;
}
}
}
if (index <= getListView().getHeaderViewsCount()) {
onMenuClicked(lastSelectedMenu);
}
else {
onItemClick(getListView(), null, index, index);
}
}
else {
lastSelectedMenu = (MenuBean) savedInstanceSate.getSerializable("lastSelectedMenu");
setItemTextColor(lastSelectedMenu);
}
BaseActivity baseActivity = (BaseActivity) getActivity();
org.aisen.weibo.sina.ui.fragment.base.ActivityHelper activityHelper = (org.aisen.weibo.sina.ui.fragment.base.ActivityHelper) baseActivity.getActivityHelper();
getRefreshView().setPadding(getRefreshView().getPaddingLeft(),
getRefreshView().getPaddingTop(),
getRefreshView().getPaddingRight(),
activityHelper.wallpaper.systemBarConfig.getPixelInsetBottom());
}
@Override
public void addHeadView(ListView listView) {
super.addHeadView(listView);
profileHeader = View.inflate(getActivity(), R.layout.lay_menu_profile, null);
btnAccounts = profileHeader.findViewById(R.id.btnAccounts);
btnAccounts.setOnClickListener(accountSwitchOnClickListener);
setAccountItem();
listView.addHeaderView(profileHeader);
menusHeader = View.inflate(getActivity(), R.layout.lay_menu_header, null);
MenuBean menu = newMenu("1");
View layMain = menusHeader.findViewById(R.id.layMain);
layMain.setOnClickListener(onMenuClickListener);
layMain.setTag(menu);
txtMainTitle = (TextView) layMain.findViewById(R.id.txtTitle);
txtMainTitle.setText(getString(menu.getTitleRes()));
txtMainCounter = (TextView) layMain.findViewById(R.id.txtCounter);
menu = newMenu("2");
View layMenthion = menusHeader.findViewById(R.id.layMenthion);
layMenthion.setOnClickListener(onMenuClickListener);
layMenthion.setTag(menu);
txtMentionTitle = (TextView) layMenthion.findViewById(R.id.txtTitle);
txtMentionTitle.setText(getString(menu.getMenuTitleRes()));
txtMentionCounter = (TextView) layMenthion.findViewById(R.id.txtCounter);
menu = newMenu("3");
View layCmt = menusHeader.findViewById(R.id.layCmt);
layCmt.setOnClickListener(onMenuClickListener);
layCmt.setTag(menu);
txtCmtTitle = (TextView) layCmt.findViewById(R.id.txtTitle);
txtCmtTitle.setText(getString(menu.getTitleRes()));
txtCmtCounter = (TextView) layCmt.findViewById(R.id.txtCounter);
menu = newMenu("4");
View layFriend = menusHeader.findViewById(R.id.layFriend);
layFriend.setOnClickListener(onMenuClickListener);
layFriend.setTag(menu);
txtFriendsTitle = (TextView) layFriend.findViewById(R.id.txtTitle);
txtFriendsTitle.setText(getString(menu.getTitleRes()));
txtFriendsCounter = (TextView) layFriend.findViewById(R.id.txtCounter);
listView.addHeaderView(menusHeader);
}
private OnClickListener onMenuClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
MenuBean menu = (MenuBean) v.getTag();
onMenuClicked(menu);
((MainActivity) getActivity()).closeDrawer();
}
};
public View addHeadView() {
View header = View.inflate(getActivity(), R.layout.lay_menu_search, null);
header.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SearchActivity.launch(getActivity());
}
});
return header;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
MenuBean entity = null;
if (position == 0) {
entity = newMenu("0");
}
else {
entity = getAdapterItems().get(position - getListView().getHeaderViewsCount());
}
if ("0".equals(entity.getType()))
Logger.d("查看用户信息");
else
Logger.d(getString(entity.getTitleRes()));
if (onMenuClicked(entity))
return;
((MainActivity) getActivity()).closeDrawer();
}
private boolean onMenuClicked(MenuBean menu) {
if (menuCallback != null && menuCallback.onMenuSelected(menu, false)) {
return true;
}
setItemTextColor(menu);
return false;
}
public void setAccountItem() {
WeiBoUser user = AppContext.getUser();
ViewUtils.setTextViewValue(profileHeader, R.id.txtName, user.getScreen_name());
ImageView imgPhoto = (ImageView) profileHeader.findViewById(R.id.imgPhoto);
BitmapLoader.getInstance().display(MenuFragment_v2.this,
user.getAvatar_large(), imgPhoto, ImageConfigUtils.getLargePhotoConfig());
ImageView imgCover = (ImageView) profileHeader.findViewById(R.id.imgCover);
BitmapLoader.getInstance().display(MenuFragment_v2.this,
user.getCover_image(), imgCover, ImageConfigUtils.getPhotoCoverConfig());
}
public void setItemTextColor(MenuBean menu) {
lastSelectedMenu = menu;
if (menu.getType().equals("1")) {
txtMainTitle.setTextColor(Color.parseColor(AppSettings.getThemeColor()));
txtMainTitle.getPaint().setFakeBoldText(true);
}
else {
txtMainTitle.setTextColor(Color.parseColor("#ff333333"));
txtMainTitle.getPaint().setFakeBoldText(false);
}
if (menu.getType().equals("2")) {
txtMentionTitle.setTextColor(Color.parseColor(AppSettings.getThemeColor()));
txtMentionTitle.getPaint().setFakeBoldText(true);
}
else {
txtMentionTitle.setTextColor(Color.parseColor("#ff333333"));
txtMentionTitle.getPaint().setFakeBoldText(false);
}
if (menu.getType().equals("3")) {
txtCmtTitle.setTextColor(Color.parseColor(AppSettings.getThemeColor()));
txtCmtTitle.getPaint().setFakeBoldText(true);
}
else {
txtCmtTitle.setTextColor(Color.parseColor("#ff333333"));
txtCmtTitle.getPaint().setFakeBoldText(false);
}
if (menu.getType().equals("4")) {
txtFriendsTitle.setTextColor(Color.parseColor(AppSettings.getThemeColor()));
txtFriendsTitle.getPaint().setFakeBoldText(true);
}
else {
txtFriendsTitle.setTextColor(Color.parseColor("#ff333333"));
txtFriendsTitle.getPaint().setFakeBoldText(false);
}
getAdapter().notifyDataSetChanged();
updateHeaderCounter();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("lastSelectedMenu", lastSelectedMenu);
}
@Override
protected AbstractItemView<MenuBean> newItemView() {
return new MenuItemView();
}
@Override
protected void requestData(RefreshMode mode) {
}
private void updateHeaderCounter() {
int count = 0;
// 朋友圈
if (AppContext.getUnreadCount().getFollower() > 0) {
txtFriendsCounter.setText(String.valueOf(AppContext.getUnreadCount().getFollower()));
txtFriendsCounter.setVisibility(View.VISIBLE);
}
else {
txtFriendsCounter.setVisibility(View.GONE);
}
// 提及
if (AppSettings.isNotifyStatusMention())
count += AppContext.getUnreadCount().getMention_status();
if (AppSettings.isNotifyCommentMention())
count += AppContext.getUnreadCount().getMention_cmt();
if (count > 0) {
txtMentionCounter.setText(String.valueOf(count));
txtMentionCounter.setVisibility(View.VISIBLE);
}
else {
txtMentionCounter.setVisibility(View.GONE);
}
// 评论
if (AppContext.getUnreadCount().getCmt() > 0) {
txtCmtCounter.setText(String.valueOf(AppContext.getUnreadCount().getCmt()));
txtCmtCounter.setVisibility(View.VISIBLE);
}
else {
txtCmtCounter.setVisibility(View.GONE);
}
}
private void updateCounter(TextView view, MenuBean menu) {
view.setVisibility(View.GONE);
if (AppContext.getUnreadCount() == null) {
Logger.w("UnradCount is null");
return;
}
int count = 0;
switch (Integer.parseInt(menu.getType())) {
// 草稿
case 6:
if (draftSize > 0)
count = draftSize;
break;
// 设置
case 5:
count = ActivityHelper.getInstance().getBooleanShareData("newVersion", false) ? 1 : 0;
break;
default:
break;
}
if (count > 0) {
if (count > 100)
view.setText("100+");
else
view.setText(String.valueOf(count));
view.setVisibility(View.VISIBLE);
}
}
private ArrayList<MenuBean> generateMenus() {
ArrayList<MenuBean> menuList = new ArrayList<MenuBean>();
// 收藏
menuList.add(newMenu("7"));
// 草稿
menuList.add(newMenu("6"));
// 搜索
menuList.add(newMenu("8"));
// 设置
menuList.add(newMenu("5"));
return menuList;
}
public static MenuBean newMenu(String type) {
MenuBean menuBean = null;
switch (Integer.parseInt(type)) {
// 个人信息
case 0:
menuBean = new MenuBean(-1, R.string.draw_profile, R.string.draw_profile, "0");
break;
// 微博首页
case 1:
menuBean = new MenuBean(R.drawable.ic_left_home, R.string.draw_timeline, R.string.draw_timeline, "1");
break;
// 消息
case 2:
menuBean = new MenuBean(R.drawable.ic_left_messages, R.string.draw_message, R.string.mention_title, "2");
break;
// 评论
case 3:
menuBean = new MenuBean(R.drawable.ic_left_news, R.string.draw_comment, R.string.draw_comment, "3");
break;
// 朋友关系
case 4:
menuBean = new MenuBean(R.drawable.ic_left_groups, R.string.draw_friendship, R.string.draw_friendship, "4");
break;
// 设置
case 5:
menuBean = new MenuBean(R.drawable.ic_left_settings, R.string.draw_settings, R.string.draw_settings, "5");
break;
// 草稿
case 6:
menuBean = new MenuBean(R.drawable.ic_left_draft, R.string.draw_draft, R.string.draw_draft, "6");
break;
// 收藏
case 7:
menuBean = new MenuBean(R.drawable.ic_left_fave, R.string.draw_fav, R.string.draw_fav_title, "7");
break;
// 搜索
case 8:
menuBean = new MenuBean(R.drawable.ic_left_fave, R.string.draw_search_v2, R.string.draw_search_title, "8");
break;
}
return menuBean;
}
OnClickListener accountSwitchOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
final List<AccountBean> accountList = AccountDB.query();
for (AccountBean bean : accountList) {
if (bean.getUser().getIdstr().equals(AppContext.getUser().getIdstr())) {
accountList.remove(bean);
break;
}
}
final String[] items = new String[accountList.size() + 1];
for (int i = 0; i < accountList.size(); i++)
items[i] = accountList.get(i).getUser().getScreen_name();
items[items.length - 1] = getString(R.string.draw_accounts);
AisenUtil.showMenuDialog(MenuFragment_v2.this, v, items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == items.length - 1) {
// 账号管理
AccountFragment.launch(getActivity());
}
else {
// 切换用户
AccountFragment.login(accountList.get(which), true);
}
}
});
}
};
@Override
public void onResume() {
super.onResume();
updateHeaderCounter();
getAdapter().notifyDataSetChanged();
// 将菜单置顶
final ListView listView = ((ListView) getRefreshView());
listView.postDelayed(new Runnable() {
@Override
public void run() {
listView.setSelectionFromTop(0, 0);
}
}, 100);
if (AppContext.isLogedin())
new RefreshDraftTask().execute();
if (lastSelectedMenu != null)
setItemTextColor(lastSelectedMenu);
IntentFilter filter = new IntentFilter();
filter.addAction(UnreadService.ACTION_UNREAD_CHANGED);
filter.addAction(PublishManager.ACTION_PUBLISH_CHANNGED);
getActivity().registerReceiver(receiver, filter);
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(receiver);
}
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && !TextUtils.isEmpty(intent.getAction())) {
if (UnreadService.ACTION_UNREAD_CHANGED.equals(intent.getAction())) {
getAdapter().notifyDataSetChanged();
updateHeaderCounter();
}
else if (PublishManager.ACTION_PUBLISH_CHANNGED.equals(intent.getAction())) {
new RefreshDraftTask().execute();
}
}
}
};
class MenuItemView extends AbstractItemView<MenuBean> {
@ViewInject(id = R.id.txtTitle)
TextView txtTitle;
@ViewInject(id = R.id.txtCounter)
TextView txtCounter;
@Override
public int inflateViewId() {
return R.layout.item_menu_v2;
}
@Override
public void bindingData(View convertView, MenuBean data) {
// 2014-09-01 解决注销账号时崩溃的BUG
if (!AppContext.isLogedin())
return;
txtTitle.setText(data.getMenuTitleRes());
}
@Override
public void updateConvertView(MenuBean data, View convertView, int selectedPosition) {
super.updateConvertView(data, convertView, selectedPosition);
updateCounter(txtCounter, data);
if (lastSelectedMenu.getType().equals(data.getType())) {
txtTitle.setTextColor(Color.parseColor(AppSettings.getThemeColor()));
txtTitle.getPaint().setFakeBoldText(true);
}
else {
txtTitle.setTextColor(Color.parseColor("#ff676767"));
txtTitle.getPaint().setFakeBoldText(false);
}
}
}
class RefreshDraftTask extends WorkTask<Void, Void, Boolean> {
@Override
public Boolean workInBackground(Void... params) throws TaskException {
draftSize = PublishDB.getPublishList(AppContext.getUser()).size();
return true;
}
@Override
protected void onSuccess(Boolean result) {
super.onSuccess(result);
getAdapter().notifyDataSetChanged();
}
}
@Override
public boolean onAcUnusedDoubleClicked() {
return false;
}
public void setMenuCallback(MenuCallback menuCallback) {
this.menuCallback = menuCallback;
}
public interface MenuCallback {
public boolean onMenuSelected(MenuBean menu, boolean replace);
}
}