Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
217 changes: 115 additions & 102 deletions src/net/tsz/afinal/FinalActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,112 +23,125 @@
import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;

public abstract class FinalActivity extends Activity {

public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
initInjectedView(this);
}

public void setContentView(View view, LayoutParams params) {
super.setContentView(view, params);
initInjectedView(this);
}

public void setContentView(View view) {
super.setContentView(view);
initInjectedView(this);
}

public static void initInjectedView(Activity activity) {
initInjectedView(activity, activity.getWindow().getDecorView());
}

public static void initInjectedView(Object injectedSource, View sourceView) {
initInjectedWithBaseView(injectedSource, sourceView, injectedSource.getClass());
}

public static void initInjectedWithBaseView(Object injectedSource, View sourceView, Class<?> clazz) {
Class<?> superClass = clazz.getSuperclass();
if (shouldInject(superClass))
initInjectedWithBaseView(injectedSource, sourceView, superClass);
inject(injectedSource, sourceView, clazz);
}

private static boolean shouldInject(Class<?> clazz) {
String packageName = clazz.getPackage().getName();
return !(packageName.startsWith("java") || packageName.startsWith("android") || packageName.startsWith("com.android") || packageName
.startsWith("com.google"));
}

private static void inject(Object injectedSource, View sourceView, Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
try {
field.setAccessible(true);
ViewInject viewInject = field.getAnnotation(ViewInject.class);
View valueView = null;
Object valueObject = null;
if (viewInject != null) {
int viewId = viewInject.id();
valueView = sourceView.findViewById(viewId);
valueObject = field.get(injectedSource);
if (valueObject != null && valueObject == valueView)
continue;
field.set(injectedSource, valueView);

setListener(injectedSource, field, viewInject.click(), Method.Click);
setListener(injectedSource, field, viewInject.longClick(), Method.LongClick);
setListener(injectedSource, field, viewInject.itemClick(), Method.ItemClick);
setListener(injectedSource, field, viewInject.itemLongClick(), Method.itemLongClick);

Select select = viewInject.select();
if (!TextUtils.isEmpty(select.selected())) {
setViewSelectListener(injectedSource, field, select.selected(), select.noSelected());
}

}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

private static void setViewSelectListener(Object injectedSource, Field field, String select, String noSelect) throws Exception {
Object obj = field.get(injectedSource);
if (obj instanceof View) {
((AbsListView) obj).setOnItemSelectedListener(new EventListener(injectedSource).select(select).noSelect(noSelect));
}
}

private static void setListener(Object injectedSource, Field field, String methodName, Method method) throws Exception {
if (methodName == null || methodName.trim().length() == 0)
return;

Object obj = field.get(injectedSource);

switch (method) {
case Click:
if (obj instanceof View) {
OnClickListener l = new EventListener(injectedSource).click(methodName);
((View) obj).setOnClickListener(l);
}
break;
case ItemClick:
if (obj instanceof AbsListView) {
((AbsListView) obj).setOnItemClickListener(new EventListener(injectedSource).itemClick(methodName));
}
break;
case LongClick:
if (obj instanceof View) {
((View) obj).setOnLongClickListener(new EventListener(injectedSource).longClick(methodName));
}
break;
case itemLongClick:
if (obj instanceof AbsListView) {
((AbsListView) obj).setOnItemLongClickListener(new EventListener(injectedSource).itemLongClick(methodName));
}
break;
default:
break;
}
}

public enum Method {
Click, LongClick, ItemClick, itemLongClick
}

public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
initInjectedView(this);
}


public void setContentView(View view, LayoutParams params) {
super.setContentView(view, params);
initInjectedView(this);
}


public void setContentView(View view) {
super.setContentView(view);
initInjectedView(this);
}


public static void initInjectedView(Activity activity){
initInjectedView(activity, activity.getWindow().getDecorView());
}


public static void initInjectedView(Object injectedSource,View sourceView){
Field[] fields = injectedSource.getClass().getDeclaredFields();
if(fields!=null && fields.length>0){
for(Field field : fields){
try {
field.setAccessible(true);

if(field.get(injectedSource)!= null )
continue;

ViewInject viewInject = field.getAnnotation(ViewInject.class);
if(viewInject!=null){

int viewId = viewInject.id();
field.set(injectedSource,sourceView.findViewById(viewId));

setListener(injectedSource,field,viewInject.click(),Method.Click);
setListener(injectedSource,field,viewInject.longClick(),Method.LongClick);
setListener(injectedSource,field,viewInject.itemClick(),Method.ItemClick);
setListener(injectedSource,field,viewInject.itemLongClick(),Method.itemLongClick);

Select select = viewInject.select();
if(!TextUtils.isEmpty(select.selected())){
setViewSelectListener(injectedSource,field,select.selected(),select.noSelected());
}

}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}


private static void setViewSelectListener(Object injectedSource,Field field,String select,String noSelect)throws Exception{
Object obj = field.get(injectedSource);
if(obj instanceof View){
((AbsListView)obj).setOnItemSelectedListener(new EventListener(injectedSource).select(select).noSelect(noSelect));
}
}


private static void setListener(Object injectedSource,Field field,String methodName,Method method)throws Exception{
if(methodName == null || methodName.trim().length() == 0)
return;

Object obj = field.get(injectedSource);

switch (method) {
case Click:
if(obj instanceof View){
((View)obj).setOnClickListener(new EventListener(injectedSource).click(methodName));
}
break;
case ItemClick:
if(obj instanceof AbsListView){
((AbsListView)obj).setOnItemClickListener(new EventListener(injectedSource).itemClick(methodName));
}
break;
case LongClick:
if(obj instanceof View){
((View)obj).setOnLongClickListener(new EventListener(injectedSource).longClick(methodName));
}
break;
case itemLongClick:
if(obj instanceof AbsListView){
((AbsListView)obj).setOnItemLongClickListener(new EventListener(injectedSource).itemLongClick(methodName));
}
break;
default:
break;
}
}

public enum Method{
Click,LongClick,ItemClick,itemLongClick
}

}