package com.smartisanos.sidebar.util.anim; import com.smartisanos.sidebar.util.LOG; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.util.Pair; public class AnimStatusManager { private static final LOG log = LOG.getInstance(AnimStatusManager.class); static { log.close(); } public static final int ON_TOP_VIEW_CLICK = 0x1 << 0; public static final int ON_SIDE_VIEW_ADD_CLICK = 0x1 << 1; public static final int ON_RECENT_PHOTO_LIST_ANIM = 0x1 << 2; public static final int ON_FILE_LIST_ANIM = 0x1 << 3; public static final int ON_CLIPBOARD_LIST_ANIM = 0x1 << 4; public static final int ON_ADD_ITEM_VIEW_ANIM = 0x1 << 5; public static final int ON_ADD_ITEM_ANIM = 0x1 << 6; public static final int ON_TOP_VIEW_RESUME = 0x1 << 7; public static final int ON_TOP_VIEW_ENTER = 0x1 << 8; public static final int ON_TOP_VIEW_EXIT = 0x1 << 9; public static final int ON_SIDE_VIEW_ENTER = 0x1 << 10; public static final int ON_SIDE_VIEW_EXIT = 0x1 << 11; public static final int ON_ADD_RIG_ITEM_REMOVE = 0x1 << 12; public static final int ON_BOOKMARK_ANIM = 0x1 << 13; public static final int SIDEBAR_ITEM_DRAGGING = 0x1 << 14; public static final int STATUS_NUM = 15; public static final int [] STATUS_ARR = new int[] { ON_TOP_VIEW_CLICK, ON_SIDE_VIEW_ADD_CLICK, ON_RECENT_PHOTO_LIST_ANIM, ON_FILE_LIST_ANIM, ON_CLIPBOARD_LIST_ANIM, ON_ADD_ITEM_VIEW_ANIM, ON_ADD_ITEM_ANIM, ON_TOP_VIEW_RESUME, ON_TOP_VIEW_ENTER, ON_TOP_VIEW_EXIT, ON_SIDE_VIEW_ENTER, ON_SIDE_VIEW_EXIT, ON_ADD_RIG_ITEM_REMOVE, ON_BOOKMARK_ANIM }; public static final Map<Integer, String> statusNameMap = new HashMap<Integer, String>(); static { // Class clazz = AnimStatusManager.class; // Field[] fields = clazz.getFields(); // AnimStatusManager obj = new AnimStatusManager(); // for (Field f : fields) { // try { // String name = f.getName(); // String typeName = f.getType().getName(); // if (name != null // && typeName.equals("int") // && name.startsWith("ON_")) { // int value = f.getInt(obj); // log.info("AnimStatusManager key [" + name + "], value [" + value + "]"); // statusNameMap.put(value, name); // } // } catch (Exception e) { // e.printStackTrace(); // } // } statusNameMap.put(ON_TOP_VIEW_CLICK, "ON_TOP_VIEW_CLICK"); statusNameMap.put(ON_SIDE_VIEW_ADD_CLICK, "ON_SIDE_VIEW_ADD_CLICK"); statusNameMap.put(ON_RECENT_PHOTO_LIST_ANIM, "ON_RECENT_PHOTO_LIST_ANIM"); statusNameMap.put(ON_FILE_LIST_ANIM, "ON_FILE_LIST_ANIM"); statusNameMap.put(ON_CLIPBOARD_LIST_ANIM, "ON_CLIPBOARD_LIST_ANIM"); statusNameMap.put(ON_ADD_ITEM_VIEW_ANIM, "ON_ADD_ITEM_VIEW_ANIM"); statusNameMap.put(ON_ADD_ITEM_ANIM, "ON_ADD_ITEM_ANIM"); statusNameMap.put(ON_TOP_VIEW_RESUME, "ON_TOP_VIEW_RESUME"); statusNameMap.put(ON_TOP_VIEW_ENTER, "ON_TOP_VIEW_ENTER"); statusNameMap.put(ON_TOP_VIEW_EXIT, "ON_TOP_VIEW_EXIT"); statusNameMap.put(ON_SIDE_VIEW_ENTER, "ON_SIDE_VIEW_ENTER"); statusNameMap.put(ON_SIDE_VIEW_EXIT, "ON_SIDE_VIEW_EXIT"); statusNameMap.put(ON_ADD_RIG_ITEM_REMOVE, "ON_ADD_RIG_ITEM_REMOVE"); statusNameMap.put(ON_BOOKMARK_ANIM, "ON_BOOKMARK_ANIM"); statusNameMap.put(SIDEBAR_ITEM_DRAGGING, "SIDEBAR_ITEM_DRAGGING"); if (statusNameMap.size() != STATUS_NUM) { throw new IllegalArgumentException("statusNameMap.size() != STATUS_NUM"); } } public static AnimStatusManager mManager; private volatile int mStatus = 0; private List<Pair<AnimFlagStatusChangedListener, Integer>> mFlagListeners = new ArrayList<Pair<AnimFlagStatusChangedListener, Integer>>(); public static AnimStatusManager getInstance() { if (mManager == null) { mManager = new AnimStatusManager(); } return mManager; } public void dumpStatus() { if (!LOG.ENABLE_DEBUG) { return; } for (int i = 0; i < STATUS_ARR.length; i++) { int status = STATUS_ARR[i]; if (getStatus(status)) { String statusName = statusNameMap.get(status); log.error("status error, "+statusName+" is true"); } } } public void reset() { mStatus = 0; } public void addAnimFlagStatusChangedListener(int flag, AnimFlagStatusChangedListener listener) { if(flag == 0 || listener == null) { return ; } mFlagListeners.add(new Pair<AnimFlagStatusChangedListener, Integer>(listener, flag)); } public void removeAnimFlagStatusChangedListener(AnimFlagStatusChangedListener listener) { for (int i = 0; i < mFlagListeners.size(); ++i) { if (mFlagListeners.get(i).first == listener) { mFlagListeners.remove(i); } } } public void setStatus(int status, boolean value) { if (getStatus(status) == value) { return; } if (LOG.ENABLE_DEBUG) { String statusName = statusNameMap.get(status); log.info("setStatus status ["+statusName+"], value ["+value+"]"); } int oldValue = mStatus; if (value) { mStatus |= status; } else { mStatus &= ~status; } for (int i = 0; i < mFlagListeners.size(); ++i) { int careFlag = mFlagListeners.get(i).second; if ((oldValue & careFlag) != (mStatus & careFlag)) { mFlagListeners.get(i).first.onChanged(); } } } public int getStatus() { return mStatus; } public boolean getStatus(int status) { return (mStatus & status) == status; } public static final int SHOW_CONTENT_FLAG = ON_TOP_VIEW_CLICK | ON_SIDE_VIEW_ADD_CLICK | ON_RECENT_PHOTO_LIST_ANIM | ON_FILE_LIST_ANIM | ON_CLIPBOARD_LIST_ANIM | ON_ADD_ITEM_ANIM | ON_ADD_ITEM_VIEW_ANIM | ON_TOP_VIEW_RESUME | ON_TOP_VIEW_ENTER | ON_TOP_VIEW_EXIT | ON_SIDE_VIEW_ENTER | ON_SIDE_VIEW_EXIT | ON_ADD_RIG_ITEM_REMOVE | ON_BOOKMARK_ANIM; public boolean canShowContentView() { return (mStatus & SHOW_CONTENT_FLAG) == 0; } public static final int ENTER_ANIM_FLAG = ON_TOP_VIEW_ENTER | ON_SIDE_VIEW_ENTER; public static final int EXIT_ANIM_FLAG = ON_TOP_VIEW_EXIT | ON_SIDE_VIEW_EXIT; public boolean isEnterAnimOngoing() { return (mStatus & ENTER_ANIM_FLAG) != 0; } public boolean isExitAnimOngoing() { return (mStatus & EXIT_ANIM_FLAG) != 0; } public boolean canAddResoleInfoItem() { return (mStatus & ON_ADD_RIG_ITEM_REMOVE) == 0; } public boolean canUpdateSidebarList() { return (mStatus & SIDEBAR_ITEM_DRAGGING) == 0; } public interface AnimFlagStatusChangedListener { void onChanged(); } }