package org.aisen.weibo.sina.ui.fragment.menu; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import org.aisen.android.common.md.MDHelper; import org.aisen.android.network.task.TaskException; import org.aisen.android.network.task.WorkTask; import org.aisen.android.support.inject.ViewInject; import org.aisen.android.ui.fragment.ABaseFragment; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.base.AppContext; import org.aisen.weibo.sina.service.UnreadService; import org.aisen.weibo.sina.service.publisher.PublishManager; import org.aisen.weibo.sina.sinasdk.bean.UnreadCount; import org.aisen.weibo.sina.support.sqlit.PublishDB; import org.aisen.weibo.sina.support.utils.AisenUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * 维护左侧抽屉 * * Created by wangdan on 15/4/23. */ public class MenuFragment extends ABaseFragment { public static final int MENU_MAIN = 1; public static final int MENU_MENTION = 2; public static final int MENU_CMT = 3; public static final int MENU_FRIENDSHIP = 4; public static final int MENU_MD = 10; public static final int MENU_HOT_STATUS = 11; public static final int MENU_DRAT = 6; public static final int MENU_SETTINGS = 5; public static final int MENU_PROFIL = 0; public static final int MENU_NOTIFICATION = 12; public static final int MENU_JOKE = 13; public static final int MENU_WALLPAPER = 14; public static MenuFragment newInstance(int menuId) { MenuFragment fragment = new MenuFragment(); Bundle args = new Bundle(); if (menuId > 0) { args.putInt("menuId", menuId); } fragment.setArguments(args); return fragment; } private OnMenuCallback onMenuCallback; private int selectedId; @ViewInject(id = R.id.layMenuItems) LinearLayout layMenuItems; private MenuHeaderView menuHeaderView; @Override public int inflateContentView() { return R.layout.ui_menu; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getActivity() instanceof OnMenuCallback) { onMenuCallback = (OnMenuCallback) getActivity(); } } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); setupMenuItems(savedInstanceSate); // 如果是私信,还要默认打开首页,否则是空的页面 if (selectedId == MenuFragment.MENU_MD) { triggerMenuClick(MenuFragment.MENU_MAIN); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); menuHeaderView = new MenuHeaderView(this); menuHeaderView.setupHeaderView((FrameLayout) findViewById(R.id.layHeaderContainer)); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("selectedId", selectedId); } /** * 点击某个菜单 * * @param menuId */ public void triggerMenuClick(int menuId) { View itemView = layMenuItems.findViewById(menuId); if (itemView != null) { itemView.performClick(); } } /** * 切换用户 * */ public void changeAccount() { menuHeaderView.setupHeaderView((FrameLayout) findViewById(R.id.layHeaderContainer)); int menuId = MENU_MAIN; View viewItem = layMenuItems.findViewById(menuId); NavMenuItem menuItem = (NavMenuItem) viewItem.getTag(); boolean selected = false; if (onMenuCallback != null) { onMenuCallback.onMenuClicked(menuItem, false); selected = onMenuCallback.onMenuSelected(menuItem); } // 只记录选中项ID if (selected) { setSelectedMenuItem(menuItem.id); selectedId = menuItem.id; } } private void setupMenuItems(Bundle savedInstanceSate) { List<NavMenuItem> items = generateMenuItems(); selectedId = savedInstanceSate == null ? getArguments().getInt("menuId", items.get(0).id) : savedInstanceSate.getInt("selectedId", selectedId); for (int i = 0; i < items.size(); i++) { final NavMenuItem item = items.get(i); // 分隔符 if (item instanceof NavMenuSeparator) { View.inflate(getActivity(), R.layout.lay_navmenu_separator, layMenuItems); } // 抽屉菜单 else { View viewItem = View.inflate(getActivity(), R.layout.lay_navmenu_item, null); viewItem.setId(item.id); viewItem.setTag(item); viewItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { NavMenuItem menuItem = (NavMenuItem) v.getTag(); // 选择相同项时处理 if (selectedId == menuItem.id) { if (onMenuCallback != null) { onMenuCallback.onMenuSameClicked(menuItem); } return; } boolean selected = false; if (onMenuCallback != null) { onMenuCallback.onMenuClicked(menuItem, true); selected = onMenuCallback.onMenuSelected(menuItem); } // 只记录选中项ID if (selected) { setSelectedMenuItem(menuItem.id); selectedId = menuItem.id; } } }); ImageView imgIcon = (ImageView) viewItem.findViewById(R.id.icon); if (item.iconRes == -1) { imgIcon.setVisibility(View.GONE); } else { imgIcon.setImageResource(item.iconRes); } TextView txtTitle = (TextView) viewItem.findViewById(R.id.title); txtTitle.setText(item.titleRes); layMenuItems.addView(viewItem, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } } if (onMenuCallback != null) { View viewItem = layMenuItems.findViewById(selectedId); NavMenuItem item = (NavMenuItem) viewItem.getTag(); if (savedInstanceSate == null) { onMenuCallback.onMenuClicked(item, true); } boolean selected = onMenuCallback.onMenuSelected(item); if (selected) { setSelectedMenuItem(selectedId); } } } public void setSelectedMenuItem(int itemId) { int selectedColor = MDHelper.resolveColor(getActivity(), R.attr.colorPrimary, getResources().getColor(R.color.menu_color)); int defColor = getResources().getColor(R.color.menu_color); if (selectedId != itemId) { setNavMenuItemState(selectedId, false, selectedColor, defColor); } setNavMenuItemState(itemId, true, selectedColor, defColor); } private void setNavMenuItemState(int itemId, boolean selected, int selectedColor, int defColor) { View viewItem = layMenuItems.findViewById(itemId); NavMenuItem item = (NavMenuItem) viewItem.getTag(); viewItem.setSelected(selected); ImageView imgIcon = (ImageView) viewItem.findViewById(R.id.icon); int iconRes = item.iconRes > 0 ? item.iconRes : R.drawable.a_icon_b; Drawable drawableIcon = DrawableCompat.wrap(ContextCompat.getDrawable(getActivity(), iconRes)); ColorStateList mIconTints = new ColorStateList( new int[][]{ { android.R.attr.state_selected }, { } }, new int[]{ selectedColor, defColor }); if (mIconTints != null) { DrawableCompat.setTintList(drawableIcon, mIconTints); } if (item.iconRes > 0) { imgIcon.setImageDrawable(drawableIcon); } TextView txtTitle = (TextView) viewItem.findViewById(R.id.title); txtTitle.setTextColor(mIconTints); } private void setNavMenuUnread(int itemId, int count) { View viewItem = layMenuItems.findViewById(itemId); TextView txtCounter = (TextView) viewItem.findViewById(R.id.txtCounter); if (count > 0) { txtCounter.setVisibility(View.VISIBLE); txtCounter.setText(AisenUtils.getCounter(count)); } else { txtCounter.setVisibility(View.GONE); } } public List<NavMenuItem> generateMenuItems() { List<NavMenuItem> items = new ArrayList<>(); items.add(new NavMenuItem(MENU_MAIN, R.drawable.ic_weibo_grey, R.string.menu_sinaweibo)); // items.add(new NavMenuItem(MENU_MENTION, R.drawable.ic_drawer_at, R.string.draw_message, R.string.mention_title)); // items.add(new NavMenuItem(MENU_CMT, R.drawable.ic_question_answer_grey600_24dp, R.string.draw_comment)); items.add(new NavMenuItem(MENU_NOTIFICATION, R.drawable.ic_notification_gray_24, R.string.draw_private_notification)); items.add(new NavMenuItem(MENU_MD, R.drawable.ic_email_grey600_24dp, R.string.draw_private_msg)); items.add(new NavMenuSeparator()); items.add(new NavMenuItem(MENU_JOKE, -1, R.string.draw_joke)); items.add(new NavMenuItem(MENU_WALLPAPER, -1, R.string.draw_wallpaper)); items.add(new NavMenuSeparator()); items.add(new NavMenuItem(MENU_HOT_STATUS, -1, R.string.draw_hot_statuses)); items.add(new NavMenuItem(MENU_DRAT, -1, R.string.draw_draft)); items.add(new NavMenuItem(MENU_SETTINGS, -1, R.string.draw_settings)); return items; } @Override public void onResume() { super.onResume(); menuHeaderView.setUnreadFollowers(); menuHeaderView.setAccounts(); // 刷新草稿 new RefreshDraftTask().execute(); // 刷新通知 setUnreadNotification(); IntentFilter filter = new IntentFilter(); filter.addAction(UnreadService.ACTION_UNREAD_CHANGED); filter.addAction(PublishManager.ACTION_PUBLISH_CHANNGED); getActivity().registerReceiver(receiver, filter); } private void setUnreadNotification() { // 通知 UnreadCount unreadCount = AppContext.getAccount().getUnreadCount(); int count = 0; if (unreadCount != null) { count = unreadCount.getCmt() + unreadCount.getMention_cmt() + unreadCount.getMention_status(); } setNavMenuUnread(MENU_NOTIFICATION, count); // 私信 count = 0; if (unreadCount != null) { count = unreadCount.getDm(); } setNavMenuUnread(MENU_MD, count); } @Override public void onPause() { super.onPause(); getActivity().unregisterReceiver(receiver); } public boolean backToMain() { if (selectedId != MENU_MAIN) { setSelectedMenuItem(MENU_MAIN); return true; } return false; } 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())) { // 粉丝 menuHeaderView.setUnreadFollowers(); // 通知 setUnreadNotification(); } else if (PublishManager.ACTION_PUBLISH_CHANNGED.equals(intent.getAction())) { new RefreshDraftTask().execute(); } } } }; class RefreshDraftTask extends WorkTask<Void, Void, Integer> { @Override public Integer workInBackground(Void... params) throws TaskException { return PublishDB.getPublishList(AppContext.getAccount().getUser()).size(); } @Override protected void onSuccess(Integer result) { super.onSuccess(result); // 刷新草稿的显示 refreshDraftMenu(result); } } private void refreshDraftMenu(int count) { View viewItem = layMenuItems.findViewById(Integer.parseInt("6")); TextView txtCounter = (TextView) viewItem.findViewById(R.id.txtCounter); txtCounter.setVisibility(count == 0 ? View.GONE : View.VISIBLE); txtCounter.setText(String.valueOf(count)); } public int getSelectedId() { return selectedId; } public static class NavMenuItem implements Serializable { private static final long serialVersionUID = -5100620719172179926L; public int titleRes; public int toolbarRes; public int iconRes; public int id; public NavMenuItem() { } public NavMenuItem(int id, int iconRes, int titleRes) { this(id, iconRes, titleRes, titleRes); } public NavMenuItem(int id, int iconRes, int titleRes, int toolbarRes) { this.id = id; this.iconRes = iconRes; this.titleRes = titleRes; this.toolbarRes = toolbarRes; } } public static class NavMenuSeparator extends NavMenuItem { private static final long serialVersionUID = -4260703722925344923L; } public interface OnMenuCallback { /** * * @param item * @return 是否可以选中 */ void onMenuClicked(NavMenuItem item, boolean closeDrawer); boolean onMenuSelected(NavMenuItem item); boolean onMenuSameClicked(NavMenuItem item); } }