1 package com.android.test.hierarchyviewer; 2 3 import android.test.ActivityInstrumentationTestCase2; 4 import android.view.View; 5 6 import java.io.ByteArrayOutputStream; 7 import java.lang.reflect.Constructor; 8 import java.lang.reflect.InvocationTargetException; 9 import java.lang.reflect.Method; 10 import java.util.List; 11 import java.util.Map; 12 13 public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { 14 private MainActivity mActivity; 15 private View mTextView; 16 17 MainActivityTest()18 public MainActivityTest() { 19 super(MainActivity.class); 20 } 21 22 @Override setUp()23 protected void setUp() throws Exception { 24 super.setUp(); 25 26 mActivity = getActivity(); 27 mTextView = mActivity.findViewById(R.id.textView); 28 } 29 encode(View view)30 private byte[] encode(View view) throws ClassNotFoundException, NoSuchMethodException, 31 IllegalAccessException, InstantiationException, InvocationTargetException { 32 ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 1024); 33 34 Object encoder = createEncoder(baos); 35 invokeMethod(View.class, view, "encode", encoder); 36 invokeMethod(encoder.getClass(), encoder, "endStream"); 37 38 return baos.toByteArray(); 39 } 40 invokeMethod(Class targetClass, Object target, String methodName, Object... params)41 private Object invokeMethod(Class targetClass, Object target, String methodName, Object... params) 42 throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 43 Class[] paramClasses = new Class[params.length]; 44 for (int i = 0; i < params.length; i++) { 45 paramClasses[i] = params[i].getClass(); 46 } 47 Method method = targetClass.getDeclaredMethod(methodName, paramClasses); 48 method.setAccessible(true); 49 return method.invoke(target, params); 50 } 51 createEncoder(ByteArrayOutputStream baos)52 private Object createEncoder(ByteArrayOutputStream baos) throws ClassNotFoundException, 53 NoSuchMethodException, IllegalAccessException, InvocationTargetException, 54 InstantiationException { 55 Class clazz = Class.forName("android.view.ViewHierarchyEncoder"); 56 Constructor constructor = clazz.getConstructor(ByteArrayOutputStream.class); 57 return constructor.newInstance(baos); 58 } 59 testTextView()60 public void testTextView() throws Exception { 61 byte[] data = encode(mTextView); 62 assertNotNull(data); 63 assertTrue(data.length > 0); 64 65 ViewDumpParser parser = new ViewDumpParser(); 66 parser.parse(data); 67 68 List<Map<Short, Object>> views = parser.getViews(); 69 Map<String, Short> propertyNameTable = parser.getIds(); 70 71 assertEquals(1, views.size()); 72 assertNotNull(propertyNameTable); 73 74 Map<Short, Object> textViewProperties = views.get(0); 75 assertEquals("android.widget.TextView", 76 textViewProperties.get(propertyNameTable.get("meta:__name__"))); 77 78 assertEquals(mActivity.getString(R.string.test), 79 textViewProperties.get(propertyNameTable.get("text:text"))); 80 } 81 } 82