package com.android.test.hierarchyviewer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class ViewDumpParser { private Map<String, Short> mIds; private List<Map<Short,Object>> mViews; public void parse(byte[] data) { Decoder d = new Decoder(ByteBuffer.wrap(data)); mViews = new ArrayList<>(100); while (d.hasRemaining()) { Object o = d.readObject(); if (o instanceof Map) { //noinspection unchecked mViews.add((Map<Short, Object>) o); } } if (mViews.isEmpty()) { return; } // the last one is the property map Map<Short,Object> idMap = mViews.remove(mViews.size() - 1); mIds = reverse(idMap); } public String getFirstView() { if (mViews.isEmpty()) { return null; } Map<Short, Object> props = mViews.get(0); Object name = getProperty(props, "__name__"); Object hash = getProperty(props, "__hash__"); if (name instanceof String && hash instanceof Integer) { return String.format(Locale.US, "%s@%x", name, hash); } else { return null; } } private Object getProperty(Map<Short, Object> props, String key) { return props.get(mIds.get(key)); } private static Map<String, Short> reverse(Map<Short, Object> m) { Map<String, Short> r = new HashMap<String, Short>(m.size()); for (Map.Entry<Short, Object> e : m.entrySet()) { r.put((String)e.getValue(), e.getKey()); } return r; } public List<Map<Short, Object>> getViews() { return mViews; } public Map<String, Short> getIds() { return mIds; } }