package com.github.nukc.plugin.axml; import com.github.nukc.plugin.axml.decode.AXMLDoc; import com.github.nukc.plugin.axml.decode.BTagNode; import com.github.nukc.plugin.axml.decode.BTagNode.Attribute; import com.github.nukc.plugin.axml.decode.BXMLNode; import com.github.nukc.plugin.axml.decode.StringBlock; import com.github.nukc.plugin.axml.utils.TypedValue; import java.util.List; public class ChannelEditor { private final String NAME_SPACE = "http://schemas.android.com/apk/res/android"; private final String META_DATA = "meta-data"; private final String NAME = "name"; private final String VALUE = "value"; private final String UMENG_CHANNEL = "UMENG_CHANNEL"; private String mChannelValue = "channel"; private int namespace; private int meta_data; private int attr_name; private int attr_value; private int channel_name; private int channel_value = -1; private AXMLDoc mDoc; public ChannelEditor(AXMLDoc doc) { this.mDoc = doc; } public void setChannel(String channel) { mChannelValue = channel; } //First add resource and get mapping ids private void registStringBlock(StringBlock sb) { namespace = sb.putString(NAME_SPACE); meta_data = sb.putString(META_DATA); attr_name = sb.putString(NAME); attr_value = sb.putString(VALUE); channel_name = sb.putString(UMENG_CHANNEL); if (channel_value == -1) { channel_value = sb.addString(mChannelValue);//now we have a seat in StringBlock } } //put string to the seat private void replaceValue(StringBlock sb) { sb.setString(channel_value, mChannelValue); } //Second find&change meta-data's value or add a new one private void editNode(AXMLDoc doc) { BXMLNode application = doc.getApplicationNode(); //manifest node List<BXMLNode> children = application.getChildren(); BTagNode umeng_meta = null; end: for (BXMLNode node : children) { BTagNode m = (BTagNode) node; //it's a risk that the value for "android:name" maybe not String if ((meta_data == m.getName()) && (m.getAttrStringForKey(attr_name) == channel_name)) { umeng_meta = m; break end; } } if (umeng_meta != null) { umeng_meta.setAttrStringForKey(attr_value, channel_value); } else { Attribute name_attr = new Attribute(namespace, attr_name, TypedValue.TYPE_STRING); name_attr.setString(channel_name); Attribute value_attr = new Attribute(namespace, attr_value, TypedValue.TYPE_STRING); value_attr.setString(channel_value); umeng_meta = new BTagNode(-1, meta_data); umeng_meta.setAttribute(name_attr); umeng_meta.setAttribute(value_attr); children.add(umeng_meta); } } public void commit() { registStringBlock(mDoc.getStringBlock()); editNode(mDoc); replaceValue(mDoc.getStringBlock()); } }