mirror of
https://github.com/revanced/Apktool.git
synced 2024-06-10 15:18:02 +02:00
264 lines
11 KiB
Java
264 lines
11 KiB
Java
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* 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
|
|
*
|
|
* http://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 android.util;
|
|
|
|
/**
|
|
* Container for a dynamically typed data value. Primarily used with
|
|
* {@link android.content.res.Resources} for holding resource values.
|
|
*/
|
|
public class TypedValue {
|
|
/** The value contains no data. */
|
|
public static final int TYPE_NULL = 0x00;
|
|
|
|
/** The <var>data</var> field holds a resource identifier. */
|
|
public static final int TYPE_REFERENCE = 0x01;
|
|
/** The <var>data</var> field holds an attribute resource
|
|
* identifier (referencing an attribute in the current theme
|
|
* style, not a resource entry). */
|
|
public static final int TYPE_ATTRIBUTE = 0x02;
|
|
/** The <var>string</var> field holds string data. In addition, if
|
|
* <var>data</var> is non-zero then it is the string block
|
|
* index of the string and <var>assetCookie</var> is the set of
|
|
* assets the string came from. */
|
|
public static final int TYPE_STRING = 0x03;
|
|
/** The <var>data</var> field holds an IEEE 754 floating point number. */
|
|
public static final int TYPE_FLOAT = 0x04;
|
|
/** The <var>data</var> field holds a complex number encoding a
|
|
* dimension value. */
|
|
public static final int TYPE_DIMENSION = 0x05;
|
|
/** The <var>data</var> field holds a complex number encoding a fraction
|
|
* of a container. */
|
|
public static final int TYPE_FRACTION = 0x06;
|
|
|
|
/** Identifies the start of plain integer values. Any type value
|
|
* from this to {@link #TYPE_LAST_INT} means the
|
|
* <var>data</var> field holds a generic integer value. */
|
|
public static final int TYPE_FIRST_INT = 0x10;
|
|
|
|
/** The <var>data</var> field holds a number that was
|
|
* originally specified in decimal. */
|
|
public static final int TYPE_INT_DEC = 0x10;
|
|
/** The <var>data</var> field holds a number that was
|
|
* originally specified in hexadecimal (0xn). */
|
|
public static final int TYPE_INT_HEX = 0x11;
|
|
/** The <var>data</var> field holds 0 or 1 that was originally
|
|
* specified as "false" or "true". */
|
|
public static final int TYPE_INT_BOOLEAN = 0x12;
|
|
|
|
/** Identifies the start of integer values that were specified as
|
|
* color constants (starting with '#'). */
|
|
public static final int TYPE_FIRST_COLOR_INT = 0x1c;
|
|
|
|
/** The <var>data</var> field holds a color that was originally
|
|
* specified as #aarrggbb. */
|
|
public static final int TYPE_INT_COLOR_ARGB8 = 0x1c;
|
|
/** The <var>data</var> field holds a color that was originally
|
|
* specified as #rrggbb. */
|
|
public static final int TYPE_INT_COLOR_RGB8 = 0x1d;
|
|
/** The <var>data</var> field holds a color that was originally
|
|
* specified as #argb. */
|
|
public static final int TYPE_INT_COLOR_ARGB4 = 0x1e;
|
|
/** The <var>data</var> field holds a color that was originally
|
|
* specified as #rgb. */
|
|
public static final int TYPE_INT_COLOR_RGB4 = 0x1f;
|
|
|
|
/** Identifies the end of integer values that were specified as color
|
|
* constants. */
|
|
public static final int TYPE_LAST_COLOR_INT = 0x1f;
|
|
|
|
/** Identifies the end of plain integer values. */
|
|
public static final int TYPE_LAST_INT = 0x1f;
|
|
|
|
/* ------------------------------------------------------------ */
|
|
|
|
/** Complex data: bit location of unit information. */
|
|
public static final int COMPLEX_UNIT_SHIFT = 0;
|
|
/** Complex data: mask to extract unit information (after shifting by
|
|
* {@link #COMPLEX_UNIT_SHIFT}). This gives us 16 possible types, as
|
|
* defined below. */
|
|
public static final int COMPLEX_UNIT_MASK = 0xf;
|
|
|
|
/** {@link #TYPE_DIMENSION} complex unit: Value is raw pixels. */
|
|
public static final int COMPLEX_UNIT_PX = 0;
|
|
/** {@link #TYPE_DIMENSION} complex unit: Value is Device Independent
|
|
* Pixels. */
|
|
public static final int COMPLEX_UNIT_DIP = 1;
|
|
/** {@link #TYPE_DIMENSION} complex unit: Value is a scaled pixel. */
|
|
public static final int COMPLEX_UNIT_SP = 2;
|
|
/** {@link #TYPE_DIMENSION} complex unit: Value is in points. */
|
|
public static final int COMPLEX_UNIT_PT = 3;
|
|
/** {@link #TYPE_DIMENSION} complex unit: Value is in inches. */
|
|
public static final int COMPLEX_UNIT_IN = 4;
|
|
/** {@link #TYPE_DIMENSION} complex unit: Value is in millimeters. */
|
|
public static final int COMPLEX_UNIT_MM = 5;
|
|
|
|
/** {@link #TYPE_FRACTION} complex unit: A basic fraction of the overall
|
|
* size. */
|
|
public static final int COMPLEX_UNIT_FRACTION = 0;
|
|
/** {@link #TYPE_FRACTION} complex unit: A fraction of the parent size. */
|
|
public static final int COMPLEX_UNIT_FRACTION_PARENT = 1;
|
|
|
|
/** Complex data: where the radix information is, telling where the decimal
|
|
* place appears in the mantissa. */
|
|
public static final int COMPLEX_RADIX_SHIFT = 4;
|
|
/** Complex data: mask to extract radix information (after shifting by
|
|
* {@link #COMPLEX_RADIX_SHIFT}). This give us 4 possible fixed point
|
|
* representations as defined below. */
|
|
public static final int COMPLEX_RADIX_MASK = 0x3;
|
|
|
|
/** Complex data: the mantissa is an integral number -- i.e., 0xnnnnnn.0 */
|
|
public static final int COMPLEX_RADIX_23p0 = 0;
|
|
/** Complex data: the mantissa magnitude is 16 bits -- i.e, 0xnnnn.nn */
|
|
public static final int COMPLEX_RADIX_16p7 = 1;
|
|
/** Complex data: the mantissa magnitude is 8 bits -- i.e, 0xnn.nnnn */
|
|
public static final int COMPLEX_RADIX_8p15 = 2;
|
|
/** Complex data: the mantissa magnitude is 0 bits -- i.e, 0x0.nnnnnn */
|
|
public static final int COMPLEX_RADIX_0p23 = 3;
|
|
|
|
/** Complex data: bit location of mantissa information. */
|
|
public static final int COMPLEX_MANTISSA_SHIFT = 8;
|
|
/** Complex data: mask to extract mantissa information (after shifting by
|
|
* {@link #COMPLEX_MANTISSA_SHIFT}). This gives us 23 bits of precision;
|
|
* the top bit is the sign. */
|
|
public static final int COMPLEX_MANTISSA_MASK = 0xffffff;
|
|
|
|
/* ------------------------------------------------------------ */
|
|
|
|
/**
|
|
* If {@link #density} is equal to this value, then the density should be
|
|
* treated as the system's default density value: {@link DisplayMetrics#DENSITY_DEFAULT}.
|
|
*/
|
|
public static final int DENSITY_DEFAULT = 0;
|
|
|
|
/**
|
|
* If {@link #density} is equal to this value, then there is no density
|
|
* associated with the resource and it should not be scaled.
|
|
*/
|
|
public static final int DENSITY_NONE = 0xffff;
|
|
|
|
/* ------------------------------------------------------------ */
|
|
|
|
/** The type held by this value, as defined by the constants here.
|
|
* This tells you how to interpret the other fields in the object. */
|
|
public int type;
|
|
|
|
private static final float MANTISSA_MULT =
|
|
1.0f / (1<<TypedValue.COMPLEX_MANTISSA_SHIFT);
|
|
private static final float[] RADIX_MULTS = new float[] {
|
|
1.0f*MANTISSA_MULT, 1.0f/(1<<7)*MANTISSA_MULT,
|
|
1.0f/(1<<15)*MANTISSA_MULT, 1.0f/(1<<23)*MANTISSA_MULT
|
|
};
|
|
|
|
/**
|
|
* Retrieve the base value from a complex data integer. This uses the
|
|
* {@link #COMPLEX_MANTISSA_MASK} and {@link #COMPLEX_RADIX_MASK} fields of
|
|
* the data to compute a floating point representation of the number they
|
|
* describe. The units are ignored.
|
|
*
|
|
* @param complex A complex data value.
|
|
*
|
|
* @return A floating point value corresponding to the complex data.
|
|
*/
|
|
public static float complexToFloat(int complex)
|
|
{
|
|
return (complex&(TypedValue.COMPLEX_MANTISSA_MASK
|
|
<<TypedValue.COMPLEX_MANTISSA_SHIFT))
|
|
* RADIX_MULTS[(complex>>TypedValue.COMPLEX_RADIX_SHIFT)
|
|
& TypedValue.COMPLEX_RADIX_MASK];
|
|
}
|
|
|
|
private static final String[] DIMENSION_UNIT_STRS = new String[] {
|
|
"px", "dip", "sp", "pt", "in", "mm"
|
|
};
|
|
private static final String[] FRACTION_UNIT_STRS = new String[] {
|
|
"%", "%p"
|
|
};
|
|
|
|
/**
|
|
* Perform type conversion as per {@link #coerceToString()} on an
|
|
* explicitly supplied type and data.
|
|
*
|
|
* @param type The data type identifier.
|
|
* @param data The data value.
|
|
*
|
|
* @return String The coerced string value. If the value is
|
|
* null or the type is not known, null is returned.
|
|
*/
|
|
public static final String coerceToString(int type, int data)
|
|
{
|
|
switch (type) {
|
|
case TYPE_NULL:
|
|
return null;
|
|
case TYPE_REFERENCE:
|
|
return "@" + data;
|
|
case TYPE_ATTRIBUTE:
|
|
return "?" + data;
|
|
case TYPE_FLOAT:
|
|
return Float.toString(Float.intBitsToFloat(data));
|
|
case TYPE_DIMENSION:
|
|
return Float.toString(complexToFloat(data)) + DIMENSION_UNIT_STRS[
|
|
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK];
|
|
case TYPE_FRACTION:
|
|
return Float.toString(complexToFloat(data)*100) + FRACTION_UNIT_STRS[
|
|
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK];
|
|
case TYPE_INT_HEX:
|
|
return "0x" + Integer.toHexString(data);
|
|
case TYPE_INT_BOOLEAN:
|
|
return data != 0 ? "true" : "false";
|
|
}
|
|
|
|
if (type >= TYPE_FIRST_COLOR_INT && type <= TYPE_LAST_COLOR_INT) {
|
|
String res =String.format("%08x", data);
|
|
char[] vals = res.toCharArray();
|
|
switch (type) {
|
|
default:
|
|
case TYPE_INT_COLOR_ARGB8://#AaRrGgBb
|
|
break;
|
|
case TYPE_INT_COLOR_RGB8://#FFRrGgBb->#RrGgBb
|
|
res = res.substring(2);
|
|
break;
|
|
case TYPE_INT_COLOR_ARGB4://#AARRGGBB->#ARGB
|
|
res = new StringBuffer().append(vals[0]).append(vals[2]).append(vals[4]).append(vals[6]).toString();
|
|
break;
|
|
case TYPE_INT_COLOR_RGB4://#FFRRGGBB->#RGB
|
|
res = new StringBuffer().append(vals[2]).append(vals[4]).append(vals[6]).toString();
|
|
break;
|
|
}
|
|
return "#" + res;
|
|
} else if (type >= TYPE_FIRST_INT && type <= TYPE_LAST_INT) {
|
|
String res;
|
|
switch (type) {
|
|
default:
|
|
case TYPE_INT_DEC:
|
|
res = Integer.toString(data);
|
|
break;
|
|
//defined before
|
|
/*case TYPE_INT_HEX:
|
|
res = "0x" + Integer.toHexString(data);
|
|
break;
|
|
case TYPE_INT_BOOLEAN:
|
|
res = (data != 0) ? "true":"false";
|
|
break;*/
|
|
}
|
|
return res;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
};
|