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         while (d.hasRemaining()) {
19             Object o = d.readObject();
20             if (o instanceof Map) {
21                 //noinspection unchecked
22                 mViews.add((Map<Short, Object>) o);
23             }
24         }
25 
26         if (mViews.isEmpty()) {
27             return;
28         }
29 
30         // the last one is the property map
31         Map<Short,Object> idMap = mViews.remove(mViews.size() - 1);
32         mIds = reverse(idMap);
33     }
34 
getFirstView()35     public String getFirstView() {
36         if (mViews.isEmpty()) {
37             return null;
38         }
39 
40         Map<Short, Object> props = mViews.get(0);
41         Object name = getProperty(props, "__name__");
42         Object hash = getProperty(props, "__hash__");
43 
44         if (name instanceof String && hash instanceof Integer) {
45             return String.format(Locale.US, "%s@%x", name, hash);
46         } else {
47             return null;
48         }
49     }
50 
getProperty(Map<Short, Object> props, String key)51     private Object getProperty(Map<Short, Object> props, String key) {
52         return props.get(mIds.get(key));
53     }
54 
reverse(Map<Short, Object> m)55     private static Map<String, Short> reverse(Map<Short, Object> m) {
56         Map<String, Short> r = new HashMap<String, Short>(m.size());
57 
58         for (Map.Entry<Short, Object> e : m.entrySet()) {
59             r.put((String)e.getValue(), e.getKey());
60         }
61 
62         return r;
63     }
64 
getViews()65     public List<Map<Short, Object>> getViews() {
66         return mViews;
67     }
68 
getIds()69     public Map<String, Short> getIds() {
70         return mIds;
71     }
72 
73 }
74