package org.robobinding.viewattribute;
import android.os.Build;
import android.view.View;
/**
* @since 1.0
* @author Cheng Wei
*
*/
public class ViewTags<TagType> {
public static final int USED_KEY1 = 1;
public static final int USED_KEY2 = 2;
private static final int ROBOBINDING_TAG = 0x100000ee;
private final int key;
public ViewTags(int key) {
this.key = key;
}
public ViewTag<TagType> tagFor(View view) {
Object o = getTag(view);
if(o == null) {
ViewTagger viewTagger = new ViewTagger();
setTag(view, viewTagger);
return new ViewTag<TagType>(viewTagger, key);
} else if(isViewTagger(o)) {
return new ViewTag<TagType>((ViewTagger)o, key);
} else {
throw new RuntimeException("RoboBinding view tagging strategy cannot be applied, as view already has a tag");
}
}
static Object getTag(View view) {
if (shouldUseKeyedTag()) {
return view.getTag(ROBOBINDING_TAG);
} else {
return view.getTag();
}
}
private static boolean shouldUseKeyedTag() {
// ICS (v 14) fixes a leak when using setTag(int, Object)
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}
static void setTag(View view, Object viewTagger) {
if (shouldUseKeyedTag()) {
view.setTag(ROBOBINDING_TAG, viewTagger);
} else {
view.setTag(viewTagger);
}
}
private boolean isViewTagger(Object o) {
return o instanceof ViewTagger;
}
}