package org.aisen.android.support.inject; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.AdapterView.OnItemSelectedListener; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class EventListener implements OnClickListener, OnLongClickListener, OnItemClickListener, OnItemSelectedListener, OnItemLongClickListener { private Object handler; private String clickMethod; private String longClickMethod; private String itemClickMethod; private String itemSelectMethod; private String nothingSelectedMethod; private String itemLongClickMehtod; public EventListener(Object handler) { this.handler = handler; } public EventListener click(String method) { this.clickMethod = method; return this; } public EventListener longClick(String method) { this.longClickMethod = method; return this; } public EventListener itemLongClick(String method) { this.itemLongClickMehtod = method; return this; } public EventListener itemClick(String method) { this.itemClickMethod = method; return this; } public EventListener select(String method) { this.itemSelectMethod = method; return this; } public EventListener noSelect(String method) { this.nothingSelectedMethod = method; return this; } public boolean onLongClick(View v) { return invokeLongClickMethod(handler, longClickMethod, v); } public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { return invokeItemLongClickMethod(handler, itemLongClickMehtod, arg0, arg1, arg2, arg3); } public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { invokeItemSelectMethod(handler, itemSelectMethod, arg0, arg1, arg2, arg3); } public void onNothingSelected(AdapterView<?> arg0) { invokeNoSelectMethod(handler, nothingSelectedMethod, arg0); } public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { invokeItemClickMethod(handler, itemClickMethod, arg0, arg1, arg2, arg3); } public void onClick(View v) { invokeClickMethod(handler, clickMethod, v); } public static Object invokeClickMethod(Object handler, String methodName, Object... params) { if (handler == null) return null; Method method = null; Class<?> clazz = handler.getClass(); for (; clazz != Object.class; clazz = clazz.getSuperclass()) { /*try { method = clazz.getDeclaredMethod(methodName, View.class); method.setAccessible(true); // method = clazz.getMethod(methodName, View.class); if (method != null) return method.invoke(handler, params); } catch (Exception e) { e.printStackTrace(); }*/ Method ms[] = clazz.getDeclaredMethods(); boolean breakFlag = false; for (Method m : ms) { if (m.getName().equals(methodName)) { method = m; breakFlag = true; break; } } if (breakFlag) break; } if (method != null) { try { method.setAccessible(true); return method.invoke(handler, params); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return null; } public static boolean invokeLongClickMethod(Object handler, String methodName, Object... params) { if (handler == null) return false; Method method = null; try { // public boolean onLongClick(View v) method = handler.getClass().getDeclaredMethod(methodName, View.class); method.setAccessible(true); if (method != null) { Object obj = method.invoke(handler, params); return obj == null ? false : Boolean.valueOf(obj.toString()); } else throw new RuntimeException("no such method:" + methodName); } catch (Exception e) { // e.printStackTrace(); } return false; } public static Object invokeItemClickMethod(Object handler, String methodName, Object... params) { if (handler == null) return null; Method method = null; try { // /onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) method = handler.getClass().getDeclaredMethod(methodName, AdapterView.class, View.class, int.class, long.class); if (method != null) return method.invoke(handler, params); else throw new RuntimeException("no such method:" + methodName); } catch (Exception e) { // e.printStackTrace(); } return null; } public static boolean invokeItemLongClickMethod(Object handler, String methodName, Object... params) { if (handler == null) throw new RuntimeException("invokeItemLongClickMethod: handler is null :"); Method method = null; try { // /onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,long // arg3) method = handler.getClass().getDeclaredMethod(methodName, AdapterView.class, View.class, int.class, long.class); if (method != null) { Object obj = method.invoke(handler, params); return Boolean.valueOf(obj == null ? false : Boolean.valueOf(obj.toString())); } else throw new RuntimeException("no such method:" + methodName); } catch (Exception e) { // e.printStackTrace(); } return false; } public static Object invokeItemSelectMethod(Object handler, String methodName, Object... params) { if (handler == null) return null; Method method = null; try { // /onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long // arg3) method = handler.getClass().getDeclaredMethod(methodName, AdapterView.class, View.class, int.class, long.class); if (method != null) return method.invoke(handler, params); else throw new RuntimeException("no such method:" + methodName); } catch (Exception e) { // e.printStackTrace(); } return null; } public static Object invokeNoSelectMethod(Object handler, String methodName, Object... params) { if (handler == null) return null; Method method = null; try { // onNothingSelected(AdapterView<?> arg0) method = handler.getClass().getDeclaredMethod(methodName, AdapterView.class); if (method != null) return method.invoke(handler, params); else throw new RuntimeException("no such method:" + methodName); } catch (Exception e) { // e.printStackTrace(); } return null; } }