package com.arialyy.frame.module;
import android.util.SparseIntArray;
import com.arialyy.frame.util.ObjUtil;
import com.arialyy.frame.util.show.L;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by lyy on 2016/7/7.
*/
public class ModuleFactory {
private Map<Set<Integer>, AbsModule.OnCallback> mPool = new HashMap<>();
private SparseIntArray mKeyIndex = new SparseIntArray();
private static final String TAG = "ModuleFactory";
public ModuleFactory() {
}
public void addCallback(int key, AbsModule.OnCallback callback) {
if (checkKey(key, callback)) {
L.e(TAG, "key 已经和 callback对应");
return;
}
if (mPool.containsValue(callback)) {
Set<Integer> oldKeys = ObjUtil.getKeyByValue(mPool, callback);
if (oldKeys != null) {
if (!oldKeys.contains(key)) {
oldKeys.add(key);
mKeyIndex.put(key, callback.hashCode());
}
} else {
oldKeys = new HashSet<>();
oldKeys.add(key);
mPool.put(oldKeys, callback);
mKeyIndex.put(key, callback.hashCode());
}
} else {
Set<Integer> newKeys = new HashSet<>();
newKeys.add(key);
mPool.put(newKeys, callback);
mKeyIndex.put(key, callback.hashCode());
}
}
/**
* 检查key和callback的对应关系
*
* @param key
* @param callback
* @return true : key已经和value对应,false : key没有和value对应
*/
private boolean checkKey(int key, AbsModule.OnCallback callback) {
return mKeyIndex.indexOfKey(key) != -1 || mKeyIndex.indexOfValue(callback.hashCode()) != -1
&& mKeyIndex.valueAt(callback.hashCode()) == key;
}
}