1 package com.android.test.hierarchyviewer; 2 3 import java.nio.ByteBuffer; 4 import java.util.ArrayList; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Locale; 8 import java.util.Map; 9 10 public class ViewDumpParser { 11 private Map<String, Short> mIds; 12 private List<Map<Short,Object>> mViews; 13 parse(byte[] data)14 public void parse(byte[] data) { 15 Decoder d = new Decoder(ByteBuffer.wrap(data)); 16 17 mViews = new ArrayList<>(100); 18 19 boolean dataIncludesWindowPosition = (data[0] == 'S'); 20 Short windowLeftKey = null, windowTopKey = null; 21 Integer windowLeftValue = null, windowTopValue = null; 22 if (dataIncludesWindowPosition) { 23 windowLeftKey = (Short) d.readObject(); 24 windowLeftValue = (Integer) d.readObject(); 25 windowTopKey = (Short) d.readObject(); 26 windowTopValue = (Integer) d.readObject(); 27 } 28 29 while (d.hasRemaining()) { 30 Object o = d.readObject(); 31 if (o instanceof Map) { 32 //noinspection unchecked 33 mViews.add((Map<Short, Object>) o); 34 } 35 } 36 37 if (mViews.isEmpty()) { 38 return; 39 } 40 41 if (dataIncludesWindowPosition) { 42 mViews.get(0).put(windowLeftKey, windowLeftValue); 43 mViews.get(0).put(windowTopKey, windowTopValue); 44 } 45 46 // the last one is the property map 47 Map<Short,Object> idMap = mViews.remove(mViews.size() - 1); 48 mIds = reverse(idMap); 49 } 50 getFirstView()51 public String getFirstView() { 52 if (mViews.isEmpty()) { 53 return null; 54 } 55 56 Map<Short, Object> props = mViews.get(0); 57 Object name = getProperty(props, "__name__"); 58 Object hash = getProperty(props, "__hash__"); 59 60 if (name instanceof String && hash instanceof Integer) { 61 return String.format(Locale.US, "%s@%x", name, (Integer) hash); 62 } else { 63 return null; 64 } 65 } 66 getProperty(Map<Short, Object> props, String key)67 private Object getProperty(Map<Short, Object> props, String key) { 68 return props.get(mIds.get(key)); 69 } 70 reverse(Map<Short, Object> m)71 private static Map<String, Short> reverse(Map<Short, Object> m) { 72 Map<String, Short> r = new HashMap<String, Short>(m.size()); 73 74 for (Map.Entry<Short, Object> e : m.entrySet()) { 75 r.put((String)e.getValue(), e.getKey()); 76 } 77 78 return r; 79 } 80 getViews()81 public List<Map<Short, Object>> getViews() { 82 return mViews; 83 } 84 getIds()85 public Map<String, Short> getIds() { 86 return mIds; 87 } 88 89 } 90