174 lines
5.9 KiB
Java
174 lines
5.9 KiB
Java
/*
|
|
* Copyright (C) 2010 Ryszard Wiśniewski <brut.alll@gmail.com>
|
|
* Copyright (C) 2010 Connor Tumbleson <connor.tumbleson@gmail.com>
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package brut.androlib.res.data.value;
|
|
|
|
import brut.androlib.AndrolibException;
|
|
import brut.androlib.res.data.ResPackage;
|
|
import brut.androlib.res.data.ResResource;
|
|
import brut.androlib.res.xml.ResValuesXmlSerializable;
|
|
import brut.util.Duo;
|
|
import org.xmlpull.v1.XmlSerializer;
|
|
|
|
import java.io.IOException;
|
|
|
|
public class ResAttr extends ResBagValue implements ResValuesXmlSerializable {
|
|
ResAttr(ResReferenceValue parentVal, int type, Integer min, Integer max,
|
|
Boolean l10n) {
|
|
super(parentVal);
|
|
mType = type;
|
|
mMin = min;
|
|
mMax = max;
|
|
mL10n = l10n;
|
|
}
|
|
|
|
public String convertToResXmlFormat(ResScalarValue value)
|
|
throws AndrolibException {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void serializeToResValuesXml(XmlSerializer serializer,
|
|
ResResource res) throws IOException, AndrolibException {
|
|
String type = getTypeAsString();
|
|
|
|
serializer.startTag(null, "attr");
|
|
serializer.attribute(null, "name", res.getResSpec().getName());
|
|
if (type != null) {
|
|
serializer.attribute(null, "format", type);
|
|
}
|
|
if (mMin != null) {
|
|
serializer.attribute(null, "min", mMin.toString());
|
|
}
|
|
if (mMax != null) {
|
|
serializer.attribute(null, "max", mMax.toString());
|
|
}
|
|
if (mL10n != null && mL10n) {
|
|
serializer.attribute(null, "localization", "suggested");
|
|
}
|
|
serializeBody(serializer, res);
|
|
serializer.endTag(null, "attr");
|
|
}
|
|
|
|
public static ResAttr factory(ResReferenceValue parent,
|
|
Duo<Integer, ResScalarValue>[] items, ResValueFactory factory,
|
|
ResPackage pkg) throws AndrolibException {
|
|
|
|
int type = ((ResIntValue) items[0].m2).getValue();
|
|
int scalarType = type & 0xffff;
|
|
Integer min = null, max = null;
|
|
Boolean l10n = null;
|
|
int i;
|
|
for (i = 1; i < items.length; i++) {
|
|
switch (items[i].m1) {
|
|
case BAG_KEY_ATTR_MIN:
|
|
min = ((ResIntValue) items[i].m2).getValue();
|
|
continue;
|
|
case BAG_KEY_ATTR_MAX:
|
|
max = ((ResIntValue) items[i].m2).getValue();
|
|
continue;
|
|
case BAG_KEY_ATTR_L10N:
|
|
l10n = ((ResIntValue) items[i].m2).getValue() != 0;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (i == items.length) {
|
|
return new ResAttr(parent, scalarType, min, max, l10n);
|
|
}
|
|
Duo<ResReferenceValue, ResIntValue>[] attrItems = new Duo[items.length
|
|
- i];
|
|
int j = 0;
|
|
for (; i < items.length; i++) {
|
|
int resId = items[i].m1;
|
|
pkg.addSynthesizedRes(resId);
|
|
attrItems[j++] = new Duo<>(
|
|
factory.newReference(resId, null),
|
|
(ResIntValue) items[i].m2);
|
|
}
|
|
switch (type & 0xff0000) {
|
|
case TYPE_ENUM:
|
|
return new ResEnumAttr(parent, scalarType, min, max, l10n,
|
|
attrItems);
|
|
case TYPE_FLAGS:
|
|
return new ResFlagsAttr(parent, scalarType, min, max, l10n,
|
|
attrItems);
|
|
}
|
|
|
|
throw new AndrolibException("Could not decode attr value");
|
|
}
|
|
|
|
protected void serializeBody(XmlSerializer serializer, ResResource res)
|
|
throws AndrolibException, IOException {
|
|
}
|
|
|
|
protected String getTypeAsString() {
|
|
String s = "";
|
|
if ((mType & TYPE_REFERENCE) != 0) {
|
|
s += "|reference";
|
|
}
|
|
if ((mType & TYPE_STRING) != 0) {
|
|
s += "|string";
|
|
}
|
|
if ((mType & TYPE_INT) != 0) {
|
|
s += "|integer";
|
|
}
|
|
if ((mType & TYPE_BOOL) != 0) {
|
|
s += "|boolean";
|
|
}
|
|
if ((mType & TYPE_COLOR) != 0) {
|
|
s += "|color";
|
|
}
|
|
if ((mType & TYPE_FLOAT) != 0) {
|
|
s += "|float";
|
|
}
|
|
if ((mType & TYPE_DIMEN) != 0) {
|
|
s += "|dimension";
|
|
}
|
|
if ((mType & TYPE_FRACTION) != 0) {
|
|
s += "|fraction";
|
|
}
|
|
if (s.isEmpty()) {
|
|
return null;
|
|
}
|
|
return s.substring(1);
|
|
}
|
|
|
|
private final int mType;
|
|
private final Integer mMin;
|
|
private final Integer mMax;
|
|
private final Boolean mL10n;
|
|
|
|
public static final int BAG_KEY_ATTR_TYPE = 0x01000000;
|
|
private static final int BAG_KEY_ATTR_MIN = 0x01000001;
|
|
private static final int BAG_KEY_ATTR_MAX = 0x01000002;
|
|
private static final int BAG_KEY_ATTR_L10N = 0x01000003;
|
|
|
|
private final static int TYPE_REFERENCE = 0x01;
|
|
private final static int TYPE_STRING = 0x02;
|
|
private final static int TYPE_INT = 0x04;
|
|
private final static int TYPE_BOOL = 0x08;
|
|
private final static int TYPE_COLOR = 0x10;
|
|
private final static int TYPE_FLOAT = 0x20;
|
|
private final static int TYPE_DIMEN = 0x40;
|
|
private final static int TYPE_FRACTION = 0x80;
|
|
private final static int TYPE_ANY_STRING = 0xee;
|
|
|
|
private static final int TYPE_ENUM = 0x00010000;
|
|
private static final int TYPE_FLAGS = 0x00020000;
|
|
}
|