@@ -10,9 +10,9 @@ import com.vk.music.common.MusicPlaybackLaunchContext;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
||||
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
|
||||
import static ru.vtosters.hooks.other.Preferences.isValidSignature;
|
||||
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
||||
|
||||
public class LibVKXClient {
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
|
||||
@@ -59,23 +59,27 @@ public class ArscBlamer {
|
||||
* Maps type chunk entries to blamed resources.
|
||||
*/
|
||||
private final Multimap<TypeChunk.Entry, ResourceEntry> typeEntryToBlame = HashMultimap.create();
|
||||
/**
|
||||
* This is the {@link ResourceTableChunk} inside of the resources.arsc file in the APK.
|
||||
*/
|
||||
private final ResourceTableChunk resourceTable;
|
||||
|
||||
/**
|
||||
* Maps resources to the type chunk entries they reference.
|
||||
*/
|
||||
private Multimap<ResourceEntry, TypeChunk.Entry> resourceEntries;
|
||||
|
||||
/**
|
||||
* Maps resources which have no base config to the type chunk entries they reference.
|
||||
*/
|
||||
private Multimap<ResourceEntry, TypeChunk.Entry> baselessKeys;
|
||||
|
||||
/**
|
||||
* Contains all of the type chunks in {@link #resourceTable}.
|
||||
*/
|
||||
private List<TypeChunk> typeChunks;
|
||||
|
||||
/**
|
||||
* This is the {@link ResourceTableChunk} inside of the resources.arsc file in the APK.
|
||||
*/
|
||||
private final ResourceTableChunk resourceTable;
|
||||
|
||||
/**
|
||||
* Creates a new {@link ArscBlamer}.
|
||||
*
|
||||
@@ -86,14 +90,6 @@ public class ArscBlamer {
|
||||
this.stringToBlame = createEntryListArray(resourceTable.getStringPool().getStringCount());
|
||||
}
|
||||
|
||||
private static List<ResourceEntry>[] createEntryListArray(int size) {
|
||||
ArrayListResourceEntry[] result = new ArrayListResourceEntry[size];
|
||||
for (int i = 0; i < size; ++i) {
|
||||
result[i] = new ArrayListResourceEntry();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates blame mappings.
|
||||
*/
|
||||
@@ -261,6 +257,14 @@ public class ArscBlamer {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static List<ResourceEntry>[] createEntryListArray(int size) {
|
||||
ArrayListResourceEntry[] result = new ArrayListResourceEntry[size];
|
||||
for (int i = 0; i < size; ++i) {
|
||||
result[i] = new ArrayListResourceEntry();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows creation of concrete parameterized type arr {@link ArscBlamer#createEntryListArray}.
|
||||
*/
|
||||
@@ -279,12 +283,6 @@ public class ArscBlamer {
|
||||
private final String typeName;
|
||||
private final String entryName;
|
||||
|
||||
private ResourceEntry(String packageName, String typeName, String entryName) {
|
||||
this.packageName = packageName;
|
||||
this.typeName = typeName;
|
||||
this.entryName = entryName;
|
||||
}
|
||||
|
||||
static ResourceEntry create(TypeChunk.Entry entry) {
|
||||
PackageChunk packageChunk = Preconditions.checkNotNull(entry.parent().getPackageChunk());
|
||||
String packageName = packageChunk.getPackageName();
|
||||
@@ -293,6 +291,12 @@ public class ArscBlamer {
|
||||
return new ResourceEntry(packageName, typeName, entryName);
|
||||
}
|
||||
|
||||
private ResourceEntry(String packageName, String typeName, String entryName) {
|
||||
this.packageName = packageName;
|
||||
this.typeName = typeName;
|
||||
this.entryName = entryName;
|
||||
}
|
||||
|
||||
public String packageName() {
|
||||
return packageName;
|
||||
}
|
||||
|
||||
+240
-221
@@ -31,148 +31,6 @@ import static java.nio.charset.StandardCharsets.US_ASCII;
|
||||
* Describes a particular resource configuration.
|
||||
*/
|
||||
public class BinaryResourceConfiguration implements SerializableResource {
|
||||
/**
|
||||
* The below constants are from android.content.res.Configuration.
|
||||
*/
|
||||
private static final int DENSITY_DPI_UNDEFINED = 0;
|
||||
private static final int DENSITY_DPI_LDPI = 120;
|
||||
private static final int DENSITY_DPI_MDPI = 160;
|
||||
private static final int DENSITY_DPI_TVDPI = 213;
|
||||
private static final int DENSITY_DPI_HDPI = 240;
|
||||
private static final int DENSITY_DPI_XHDPI = 320;
|
||||
private static final int DENSITY_DPI_XXHDPI = 480;
|
||||
private static final int DENSITY_DPI_XXXHDPI = 640;
|
||||
private static final int DENSITY_DPI_ANY = 0xFFFE;
|
||||
private static final int DENSITY_DPI_NONE = 0xFFFF;
|
||||
private static final Map<Integer, String> DENSITY_DPI_VALUES =
|
||||
ImmutableMap.<Integer, String>builder()
|
||||
.put(DENSITY_DPI_UNDEFINED, "")
|
||||
.put(DENSITY_DPI_LDPI, "ldpi")
|
||||
.put(DENSITY_DPI_MDPI, "mdpi")
|
||||
.put(DENSITY_DPI_TVDPI, "tvdpi")
|
||||
.put(DENSITY_DPI_HDPI, "hdpi")
|
||||
.put(DENSITY_DPI_XHDPI, "xhdpi")
|
||||
.put(DENSITY_DPI_XXHDPI, "xxhdpi")
|
||||
.put(DENSITY_DPI_XXXHDPI, "xxxhdpi")
|
||||
.put(DENSITY_DPI_ANY, "anydpi")
|
||||
.put(DENSITY_DPI_NONE, "nodpi")
|
||||
.build();
|
||||
private static final int KEYBOARD_NOKEYS = 1;
|
||||
private static final int KEYBOARD_QWERTY = 2;
|
||||
private static final int KEYBOARD_12KEY = 3;
|
||||
private static final Map<Integer, String> KEYBOARD_VALUES = ImmutableMap.of(
|
||||
KEYBOARD_NOKEYS, "nokeys",
|
||||
KEYBOARD_QWERTY, "qwerty",
|
||||
KEYBOARD_12KEY, "12key");
|
||||
private static final int KEYBOARDHIDDEN_MASK = 0x03;
|
||||
private static final int KEYBOARDHIDDEN_NO = 1;
|
||||
private static final int KEYBOARDHIDDEN_YES = 2;
|
||||
private static final int KEYBOARDHIDDEN_SOFT = 3;
|
||||
private static final Map<Integer, String> KEYBOARDHIDDEN_VALUES = ImmutableMap.of(
|
||||
KEYBOARDHIDDEN_NO, "keysexposed",
|
||||
KEYBOARDHIDDEN_YES, "keyshidden",
|
||||
KEYBOARDHIDDEN_SOFT, "keyssoft");
|
||||
private static final int NAVIGATION_NONAV = 1;
|
||||
private static final int NAVIGATION_DPAD = 2;
|
||||
private static final int NAVIGATION_TRACKBALL = 3;
|
||||
private static final int NAVIGATION_WHEEL = 4;
|
||||
private static final Map<Integer, String> NAVIGATION_VALUES = ImmutableMap.of(
|
||||
NAVIGATION_NONAV, "nonav",
|
||||
NAVIGATION_DPAD, "dpad",
|
||||
NAVIGATION_TRACKBALL, "trackball",
|
||||
NAVIGATION_WHEEL, "wheel");
|
||||
private static final int NAVIGATIONHIDDEN_MASK = 0x0C;
|
||||
private static final int NAVIGATIONHIDDEN_NO = 0x04;
|
||||
private static final int NAVIGATIONHIDDEN_YES = 0x08;
|
||||
private static final Map<Integer, String> NAVIGATIONHIDDEN_VALUES = ImmutableMap.of(
|
||||
NAVIGATIONHIDDEN_NO, "navexposed",
|
||||
NAVIGATIONHIDDEN_YES, "navhidden");
|
||||
private static final int ORIENTATION_PORTRAIT = 0x01;
|
||||
private static final int ORIENTATION_LANDSCAPE = 0x02;
|
||||
private static final Map<Integer, String> ORIENTATION_VALUES = ImmutableMap.of(
|
||||
ORIENTATION_PORTRAIT, "port",
|
||||
ORIENTATION_LANDSCAPE, "land");
|
||||
private static final int SCREENLAYOUT_LAYOUTDIR_MASK = 0xC0;
|
||||
private static final int SCREENLAYOUT_LAYOUTDIR_LTR = 0x40;
|
||||
private static final int SCREENLAYOUT_LAYOUTDIR_RTL = 0x80;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_LAYOUTDIR_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_LAYOUTDIR_LTR, "ldltr",
|
||||
SCREENLAYOUT_LAYOUTDIR_RTL, "ldrtl");
|
||||
private static final int SCREENLAYOUT_LONG_MASK = 0x30;
|
||||
private static final int SCREENLAYOUT_LONG_NO = 0x10;
|
||||
private static final int SCREENLAYOUT_LONG_YES = 0x20;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_LONG_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_LONG_NO, "notlong",
|
||||
SCREENLAYOUT_LONG_YES, "long");
|
||||
private static final int SCREENLAYOUT_ROUND_MASK = 0x03;
|
||||
private static final int SCREENLAYOUT_ROUND_NO = 0x01;
|
||||
private static final int SCREENLAYOUT_ROUND_YES = 0x02;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_ROUND_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_ROUND_NO, "notround",
|
||||
SCREENLAYOUT_ROUND_YES, "round");
|
||||
private static final int SCREENLAYOUT_SIZE_MASK = 0x0F;
|
||||
private static final int SCREENLAYOUT_SIZE_SMALL = 0x01;
|
||||
private static final int SCREENLAYOUT_SIZE_NORMAL = 0x02;
|
||||
private static final int SCREENLAYOUT_SIZE_LARGE = 0x03;
|
||||
private static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_SIZE_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_SIZE_SMALL, "small",
|
||||
SCREENLAYOUT_SIZE_NORMAL, "normal",
|
||||
SCREENLAYOUT_SIZE_LARGE, "large",
|
||||
SCREENLAYOUT_SIZE_XLARGE, "xlarge");
|
||||
private static final int TOUCHSCREEN_NOTOUCH = 1;
|
||||
private static final int TOUCHSCREEN_FINGER = 3;
|
||||
private static final Map<Integer, String> TOUCHSCREEN_VALUES = ImmutableMap.of(
|
||||
TOUCHSCREEN_NOTOUCH, "notouch",
|
||||
TOUCHSCREEN_FINGER, "finger");
|
||||
private static final int UI_MODE_NIGHT_MASK = 0x30;
|
||||
private static final int UI_MODE_NIGHT_NO = 0x10;
|
||||
private static final int UI_MODE_NIGHT_YES = 0x20;
|
||||
private static final Map<Integer, String> UI_MODE_NIGHT_VALUES = ImmutableMap.of(
|
||||
UI_MODE_NIGHT_NO, "notnight",
|
||||
UI_MODE_NIGHT_YES, "night");
|
||||
private static final int UI_MODE_TYPE_MASK = 0x0F;
|
||||
private static final int UI_MODE_TYPE_DESK = 0x02;
|
||||
private static final int UI_MODE_TYPE_CAR = 0x03;
|
||||
private static final int UI_MODE_TYPE_TELEVISION = 0x04;
|
||||
private static final int UI_MODE_TYPE_APPLIANCE = 0x05;
|
||||
private static final int UI_MODE_TYPE_WATCH = 0x06;
|
||||
private static final int UI_MODE_TYPE_VR_HEADSET = 0x07;
|
||||
// start - miui
|
||||
private static final int UI_MODE_TYPE_GODZILLAUI = 0x0b;
|
||||
private static final int UI_MODE_TYPE_SMALLUI = 0x0c;
|
||||
private static final int UI_MODE_TYPE_MEDIUMUI = 0x0d;
|
||||
private static final int UI_MODE_TYPE_LARGEUI = 0x0e;
|
||||
private static final int UI_MODE_TYPE_HUGEUI = 0x0f;
|
||||
private static final Map<Integer, String> UI_MODE_TYPE_VALUES =
|
||||
ImmutableMap.<Integer, String>builder()
|
||||
.put(UI_MODE_TYPE_DESK, "desk")
|
||||
.put(UI_MODE_TYPE_CAR, "car")
|
||||
.put(UI_MODE_TYPE_TELEVISION, "television")
|
||||
.put(UI_MODE_TYPE_APPLIANCE, "appliance")
|
||||
.put(UI_MODE_TYPE_WATCH, "watch")
|
||||
.put(UI_MODE_TYPE_VR_HEADSET, "vrheadset")
|
||||
.put(UI_MODE_TYPE_GODZILLAUI, "godzillaui")
|
||||
.put(UI_MODE_TYPE_SMALLUI, "smallui")
|
||||
.put(UI_MODE_TYPE_MEDIUMUI, "mediumui")
|
||||
.put(UI_MODE_TYPE_LARGEUI, "largeui")
|
||||
.put(UI_MODE_TYPE_HUGEUI, "hugeui").build();
|
||||
/**
|
||||
* The minimum size in bytes that this configuration must be to contain screen config info.
|
||||
*/
|
||||
private static final int SCREEN_CONFIG_MIN_SIZE = 32;
|
||||
/**
|
||||
* The minimum size in bytes that this configuration must be to contain screen dp info.
|
||||
*/
|
||||
private static final int SCREEN_DP_MIN_SIZE = 36;
|
||||
/**
|
||||
* The minimum size in bytes that this configuration must be to contain locale info.
|
||||
*/
|
||||
private static final int LOCALE_MIN_SIZE = 48;
|
||||
/**
|
||||
* The minimum size in bytes that this config must be to contain the screenConfig extension.
|
||||
*/
|
||||
private static final int SCREEN_CONFIG_EXTENSION_MIN_SIZE = 52;
|
||||
private final int size;
|
||||
private final int mcc;
|
||||
private final int mnc;
|
||||
@@ -195,60 +53,9 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
||||
private final int screenHeightDp;
|
||||
private final byte[] localeScript;
|
||||
private final byte[] localeVariant;
|
||||
// end - miui
|
||||
private final int screenLayout2;
|
||||
private final byte[] unknown;
|
||||
|
||||
private BinaryResourceConfiguration(int size,
|
||||
int mcc,
|
||||
int mnc,
|
||||
byte[] language,
|
||||
byte[] region,
|
||||
int orientation,
|
||||
int touchscreen,
|
||||
int density,
|
||||
int keyboard,
|
||||
int navigation,
|
||||
int inputFlags,
|
||||
int screenWidth,
|
||||
int screenHeight,
|
||||
int sdkVersion,
|
||||
int minorVersion,
|
||||
int screenLayout,
|
||||
int uiMode,
|
||||
int smallestScreenWidthDp,
|
||||
int screenWidthDp,
|
||||
int screenHeightDp,
|
||||
byte[] localeScript,
|
||||
byte[] localeVariant,
|
||||
int screenLayout2,
|
||||
byte[] unknown) {
|
||||
this.size = size;
|
||||
this.mcc = mcc;
|
||||
this.mnc = mnc;
|
||||
this.language = language;
|
||||
this.region = region;
|
||||
this.orientation = orientation;
|
||||
this.touchscreen = touchscreen;
|
||||
this.density = density;
|
||||
this.keyboard = keyboard;
|
||||
this.navigation = navigation;
|
||||
this.inputFlags = inputFlags;
|
||||
this.screenWidth = screenWidth;
|
||||
this.screenHeight = screenHeight;
|
||||
this.sdkVersion = sdkVersion;
|
||||
this.minorVersion = minorVersion;
|
||||
this.screenLayout = screenLayout;
|
||||
this.uiMode = uiMode;
|
||||
this.smallestScreenWidthDp = smallestScreenWidthDp;
|
||||
this.screenWidthDp = screenWidthDp;
|
||||
this.screenHeightDp = screenHeightDp;
|
||||
this.localeScript = localeScript;
|
||||
this.localeVariant = localeVariant;
|
||||
this.screenLayout2 = screenLayout2;
|
||||
this.unknown = unknown;
|
||||
}
|
||||
|
||||
static BinaryResourceConfiguration create(ByteBuffer buffer) {
|
||||
int startPosition = buffer.position(); // The starting buffer position to calculate bytes read.
|
||||
int size = buffer.getInt();
|
||||
@@ -314,6 +121,245 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
||||
screenHeightDp, localeScript, localeVariant, screenLayout2, unknown);
|
||||
}
|
||||
|
||||
private BinaryResourceConfiguration(int size,
|
||||
int mcc,
|
||||
int mnc,
|
||||
byte[] language,
|
||||
byte[] region,
|
||||
int orientation,
|
||||
int touchscreen,
|
||||
int density,
|
||||
int keyboard,
|
||||
int navigation,
|
||||
int inputFlags,
|
||||
int screenWidth,
|
||||
int screenHeight,
|
||||
int sdkVersion,
|
||||
int minorVersion,
|
||||
int screenLayout,
|
||||
int uiMode,
|
||||
int smallestScreenWidthDp,
|
||||
int screenWidthDp,
|
||||
int screenHeightDp,
|
||||
byte[] localeScript,
|
||||
byte[] localeVariant,
|
||||
int screenLayout2,
|
||||
byte[] unknown) {
|
||||
this.size = size;
|
||||
this.mcc = mcc;
|
||||
this.mnc = mnc;
|
||||
this.language = language;
|
||||
this.region = region;
|
||||
this.orientation = orientation;
|
||||
this.touchscreen = touchscreen;
|
||||
this.density = density;
|
||||
this.keyboard = keyboard;
|
||||
this.navigation = navigation;
|
||||
this.inputFlags = inputFlags;
|
||||
this.screenWidth = screenWidth;
|
||||
this.screenHeight = screenHeight;
|
||||
this.sdkVersion = sdkVersion;
|
||||
this.minorVersion = minorVersion;
|
||||
this.screenLayout = screenLayout;
|
||||
this.uiMode = uiMode;
|
||||
this.smallestScreenWidthDp = smallestScreenWidthDp;
|
||||
this.screenWidthDp = screenWidthDp;
|
||||
this.screenHeightDp = screenHeightDp;
|
||||
this.localeScript = localeScript;
|
||||
this.localeVariant = localeVariant;
|
||||
this.screenLayout2 = screenLayout2;
|
||||
this.unknown = unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* The different types of configs that can be present in a {@link BinaryResourceConfiguration}.
|
||||
*/
|
||||
public enum Type {
|
||||
MCC,
|
||||
MNC,
|
||||
LANGUAGE_STRING,
|
||||
REGION_STRING,
|
||||
SCREEN_LAYOUT_DIRECTION,
|
||||
SMALLEST_SCREEN_WIDTH_DP,
|
||||
SCREEN_WIDTH_DP,
|
||||
SCREEN_HEIGHT_DP,
|
||||
SCREEN_LAYOUT_SIZE,
|
||||
SCREEN_LAYOUT_LONG,
|
||||
SCREEN_LAYOUT_ROUND,
|
||||
ORIENTATION,
|
||||
UI_MODE_TYPE,
|
||||
UI_MODE_NIGHT,
|
||||
DENSITY_DPI,
|
||||
TOUCHSCREEN,
|
||||
KEYBOARD_HIDDEN,
|
||||
KEYBOARD,
|
||||
NAVIGATION_HIDDEN,
|
||||
NAVIGATION,
|
||||
SDK_VERSION
|
||||
}
|
||||
|
||||
/**
|
||||
* The below constants are from android.content.res.Configuration.
|
||||
*/
|
||||
private static final int DENSITY_DPI_UNDEFINED = 0;
|
||||
private static final int DENSITY_DPI_LDPI = 120;
|
||||
private static final int DENSITY_DPI_MDPI = 160;
|
||||
private static final int DENSITY_DPI_TVDPI = 213;
|
||||
private static final int DENSITY_DPI_HDPI = 240;
|
||||
private static final int DENSITY_DPI_XHDPI = 320;
|
||||
private static final int DENSITY_DPI_XXHDPI = 480;
|
||||
private static final int DENSITY_DPI_XXXHDPI = 640;
|
||||
private static final int DENSITY_DPI_ANY = 0xFFFE;
|
||||
private static final int DENSITY_DPI_NONE = 0xFFFF;
|
||||
private static final Map<Integer, String> DENSITY_DPI_VALUES =
|
||||
ImmutableMap.<Integer, String>builder()
|
||||
.put(DENSITY_DPI_UNDEFINED, "")
|
||||
.put(DENSITY_DPI_LDPI, "ldpi")
|
||||
.put(DENSITY_DPI_MDPI, "mdpi")
|
||||
.put(DENSITY_DPI_TVDPI, "tvdpi")
|
||||
.put(DENSITY_DPI_HDPI, "hdpi")
|
||||
.put(DENSITY_DPI_XHDPI, "xhdpi")
|
||||
.put(DENSITY_DPI_XXHDPI, "xxhdpi")
|
||||
.put(DENSITY_DPI_XXXHDPI, "xxxhdpi")
|
||||
.put(DENSITY_DPI_ANY, "anydpi")
|
||||
.put(DENSITY_DPI_NONE, "nodpi")
|
||||
.build();
|
||||
|
||||
private static final int KEYBOARD_NOKEYS = 1;
|
||||
private static final int KEYBOARD_QWERTY = 2;
|
||||
private static final int KEYBOARD_12KEY = 3;
|
||||
private static final Map<Integer, String> KEYBOARD_VALUES = ImmutableMap.of(
|
||||
KEYBOARD_NOKEYS, "nokeys",
|
||||
KEYBOARD_QWERTY, "qwerty",
|
||||
KEYBOARD_12KEY, "12key");
|
||||
|
||||
private static final int KEYBOARDHIDDEN_MASK = 0x03;
|
||||
private static final int KEYBOARDHIDDEN_NO = 1;
|
||||
private static final int KEYBOARDHIDDEN_YES = 2;
|
||||
private static final int KEYBOARDHIDDEN_SOFT = 3;
|
||||
private static final Map<Integer, String> KEYBOARDHIDDEN_VALUES = ImmutableMap.of(
|
||||
KEYBOARDHIDDEN_NO, "keysexposed",
|
||||
KEYBOARDHIDDEN_YES, "keyshidden",
|
||||
KEYBOARDHIDDEN_SOFT, "keyssoft");
|
||||
|
||||
private static final int NAVIGATION_NONAV = 1;
|
||||
private static final int NAVIGATION_DPAD = 2;
|
||||
private static final int NAVIGATION_TRACKBALL = 3;
|
||||
private static final int NAVIGATION_WHEEL = 4;
|
||||
private static final Map<Integer, String> NAVIGATION_VALUES = ImmutableMap.of(
|
||||
NAVIGATION_NONAV, "nonav",
|
||||
NAVIGATION_DPAD, "dpad",
|
||||
NAVIGATION_TRACKBALL, "trackball",
|
||||
NAVIGATION_WHEEL, "wheel");
|
||||
|
||||
private static final int NAVIGATIONHIDDEN_MASK = 0x0C;
|
||||
private static final int NAVIGATIONHIDDEN_NO = 0x04;
|
||||
private static final int NAVIGATIONHIDDEN_YES = 0x08;
|
||||
private static final Map<Integer, String> NAVIGATIONHIDDEN_VALUES = ImmutableMap.of(
|
||||
NAVIGATIONHIDDEN_NO, "navexposed",
|
||||
NAVIGATIONHIDDEN_YES, "navhidden");
|
||||
|
||||
private static final int ORIENTATION_PORTRAIT = 0x01;
|
||||
private static final int ORIENTATION_LANDSCAPE = 0x02;
|
||||
private static final Map<Integer, String> ORIENTATION_VALUES = ImmutableMap.of(
|
||||
ORIENTATION_PORTRAIT, "port",
|
||||
ORIENTATION_LANDSCAPE, "land");
|
||||
|
||||
private static final int SCREENLAYOUT_LAYOUTDIR_MASK = 0xC0;
|
||||
private static final int SCREENLAYOUT_LAYOUTDIR_LTR = 0x40;
|
||||
private static final int SCREENLAYOUT_LAYOUTDIR_RTL = 0x80;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_LAYOUTDIR_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_LAYOUTDIR_LTR, "ldltr",
|
||||
SCREENLAYOUT_LAYOUTDIR_RTL, "ldrtl");
|
||||
|
||||
private static final int SCREENLAYOUT_LONG_MASK = 0x30;
|
||||
private static final int SCREENLAYOUT_LONG_NO = 0x10;
|
||||
private static final int SCREENLAYOUT_LONG_YES = 0x20;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_LONG_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_LONG_NO, "notlong",
|
||||
SCREENLAYOUT_LONG_YES, "long");
|
||||
|
||||
private static final int SCREENLAYOUT_ROUND_MASK = 0x03;
|
||||
private static final int SCREENLAYOUT_ROUND_NO = 0x01;
|
||||
private static final int SCREENLAYOUT_ROUND_YES = 0x02;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_ROUND_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_ROUND_NO, "notround",
|
||||
SCREENLAYOUT_ROUND_YES, "round");
|
||||
|
||||
private static final int SCREENLAYOUT_SIZE_MASK = 0x0F;
|
||||
private static final int SCREENLAYOUT_SIZE_SMALL = 0x01;
|
||||
private static final int SCREENLAYOUT_SIZE_NORMAL = 0x02;
|
||||
private static final int SCREENLAYOUT_SIZE_LARGE = 0x03;
|
||||
private static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;
|
||||
private static final Map<Integer, String> SCREENLAYOUT_SIZE_VALUES = ImmutableMap.of(
|
||||
SCREENLAYOUT_SIZE_SMALL, "small",
|
||||
SCREENLAYOUT_SIZE_NORMAL, "normal",
|
||||
SCREENLAYOUT_SIZE_LARGE, "large",
|
||||
SCREENLAYOUT_SIZE_XLARGE, "xlarge");
|
||||
|
||||
private static final int TOUCHSCREEN_NOTOUCH = 1;
|
||||
private static final int TOUCHSCREEN_FINGER = 3;
|
||||
private static final Map<Integer, String> TOUCHSCREEN_VALUES = ImmutableMap.of(
|
||||
TOUCHSCREEN_NOTOUCH, "notouch",
|
||||
TOUCHSCREEN_FINGER, "finger");
|
||||
|
||||
private static final int UI_MODE_NIGHT_MASK = 0x30;
|
||||
private static final int UI_MODE_NIGHT_NO = 0x10;
|
||||
private static final int UI_MODE_NIGHT_YES = 0x20;
|
||||
private static final Map<Integer, String> UI_MODE_NIGHT_VALUES = ImmutableMap.of(
|
||||
UI_MODE_NIGHT_NO, "notnight",
|
||||
UI_MODE_NIGHT_YES, "night");
|
||||
|
||||
private static final int UI_MODE_TYPE_MASK = 0x0F;
|
||||
private static final int UI_MODE_TYPE_DESK = 0x02;
|
||||
private static final int UI_MODE_TYPE_CAR = 0x03;
|
||||
private static final int UI_MODE_TYPE_TELEVISION = 0x04;
|
||||
private static final int UI_MODE_TYPE_APPLIANCE = 0x05;
|
||||
private static final int UI_MODE_TYPE_WATCH = 0x06;
|
||||
private static final int UI_MODE_TYPE_VR_HEADSET = 0x07;
|
||||
|
||||
// start - miui
|
||||
private static final int UI_MODE_TYPE_GODZILLAUI = 0x0b;
|
||||
private static final int UI_MODE_TYPE_SMALLUI = 0x0c;
|
||||
private static final int UI_MODE_TYPE_MEDIUMUI = 0x0d;
|
||||
private static final int UI_MODE_TYPE_LARGEUI = 0x0e;
|
||||
private static final int UI_MODE_TYPE_HUGEUI = 0x0f;
|
||||
// end - miui
|
||||
|
||||
private static final Map<Integer, String> UI_MODE_TYPE_VALUES =
|
||||
ImmutableMap.<Integer, String>builder()
|
||||
.put(UI_MODE_TYPE_DESK, "desk")
|
||||
.put(UI_MODE_TYPE_CAR, "car")
|
||||
.put(UI_MODE_TYPE_TELEVISION, "television")
|
||||
.put(UI_MODE_TYPE_APPLIANCE, "appliance")
|
||||
.put(UI_MODE_TYPE_WATCH, "watch")
|
||||
.put(UI_MODE_TYPE_VR_HEADSET, "vrheadset")
|
||||
.put(UI_MODE_TYPE_GODZILLAUI, "godzillaui")
|
||||
.put(UI_MODE_TYPE_SMALLUI, "smallui")
|
||||
.put(UI_MODE_TYPE_MEDIUMUI, "mediumui")
|
||||
.put(UI_MODE_TYPE_LARGEUI, "largeui")
|
||||
.put(UI_MODE_TYPE_HUGEUI, "hugeui").build();
|
||||
|
||||
/**
|
||||
* The minimum size in bytes that this configuration must be to contain screen config info.
|
||||
*/
|
||||
private static final int SCREEN_CONFIG_MIN_SIZE = 32;
|
||||
|
||||
/**
|
||||
* The minimum size in bytes that this configuration must be to contain screen dp info.
|
||||
*/
|
||||
private static final int SCREEN_DP_MIN_SIZE = 36;
|
||||
|
||||
/**
|
||||
* The minimum size in bytes that this configuration must be to contain locale info.
|
||||
*/
|
||||
private static final int LOCALE_MIN_SIZE = 48;
|
||||
|
||||
/**
|
||||
* The minimum size in bytes that this config must be to contain the screenConfig extension.
|
||||
*/
|
||||
private static final int SCREEN_CONFIG_EXTENSION_MIN_SIZE = 52;
|
||||
|
||||
/**
|
||||
* The number of bytes that this resource configuration takes up.
|
||||
*/
|
||||
@@ -662,7 +708,7 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
||||
Map<Type, String> result = new LinkedHashMap<>(); // Preserve order for #toString().
|
||||
result.put(Type.MCC, mcc() != 0 ? "mcc" + mcc() : "");
|
||||
result.put(Type.MNC, mnc() != 0 ? "mnc" + mnc() : "");
|
||||
result.put(Type.LANGUAGE_STRING, !languageString().isEmpty() ? languageString() : "");
|
||||
result.put(Type.LANGUAGE_STRING, !languageString().isEmpty() ? "" + languageString() : "");
|
||||
result.put(Type.REGION_STRING, !regionString().isEmpty() ? "r" + regionString() : "");
|
||||
result.put(Type.SCREEN_LAYOUT_DIRECTION,
|
||||
getOrDefault(SCREENLAYOUT_LAYOUTDIR_VALUES, screenLayoutDirection(), ""));
|
||||
@@ -696,31 +742,4 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
||||
V value = map.get(key);
|
||||
return value != null ? value : defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* The different types of configs that can be present in a {@link BinaryResourceConfiguration}.
|
||||
*/
|
||||
public enum Type {
|
||||
MCC,
|
||||
MNC,
|
||||
LANGUAGE_STRING,
|
||||
REGION_STRING,
|
||||
SCREEN_LAYOUT_DIRECTION,
|
||||
SMALLEST_SCREEN_WIDTH_DP,
|
||||
SCREEN_WIDTH_DP,
|
||||
SCREEN_HEIGHT_DP,
|
||||
SCREEN_LAYOUT_SIZE,
|
||||
SCREEN_LAYOUT_LONG,
|
||||
SCREEN_LAYOUT_ROUND,
|
||||
ORIENTATION,
|
||||
UI_MODE_TYPE,
|
||||
UI_MODE_NIGHT,
|
||||
DENSITY_DPI,
|
||||
TOUCHSCREEN,
|
||||
KEYBOARD_HIDDEN,
|
||||
KEYBOARD,
|
||||
NAVIGATION_HIDDEN,
|
||||
NAVIGATION,
|
||||
SDK_VERSION
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -49,12 +49,6 @@ public class BinaryResourceIdentifier {
|
||||
private final int typeId;
|
||||
private final int entryId;
|
||||
|
||||
private BinaryResourceIdentifier(int packageId, int typeId, int entryId) {
|
||||
this.packageId = packageId;
|
||||
this.typeId = typeId;
|
||||
this.entryId = entryId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link BinaryResourceIdentifier} from a {@code resourceId} of the form 0xpptteeee.
|
||||
*/
|
||||
@@ -75,6 +69,12 @@ public class BinaryResourceIdentifier {
|
||||
return new BinaryResourceIdentifier(packageId, typeId, entryId);
|
||||
}
|
||||
|
||||
private BinaryResourceIdentifier(int packageId, int typeId, int entryId) {
|
||||
this.packageId = packageId;
|
||||
this.typeId = typeId;
|
||||
this.entryId = entryId;
|
||||
}
|
||||
|
||||
/**
|
||||
* The (1-based) id of the {@link PackageChunk} containing this resource.
|
||||
*/
|
||||
|
||||
+18
-18
@@ -31,6 +31,24 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
*/
|
||||
public final class BinaryResourceString {
|
||||
|
||||
/**
|
||||
* Type of {@link BinaryResourceString} to encode / decode.
|
||||
*/
|
||||
public enum Type {
|
||||
UTF8(UTF_8),
|
||||
UTF16(UTF_16LE);
|
||||
|
||||
private final Charset charset;
|
||||
|
||||
Type(Charset charset) {
|
||||
this.charset = charset;
|
||||
}
|
||||
|
||||
public Charset charset() {
|
||||
return charset;
|
||||
}
|
||||
}
|
||||
|
||||
private BinaryResourceString() {
|
||||
} // Private constructor
|
||||
|
||||
@@ -148,22 +166,4 @@ public final class BinaryResourceString {
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type of {@link BinaryResourceString} to encode / decode.
|
||||
*/
|
||||
public enum Type {
|
||||
UTF8(UTF_8),
|
||||
UTF16(UTF_16LE);
|
||||
|
||||
private final Charset charset;
|
||||
|
||||
Type(Charset charset) {
|
||||
this.charset = charset;
|
||||
}
|
||||
|
||||
public Charset charset() {
|
||||
return charset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+80
-78
@@ -31,78 +31,6 @@ import java.util.Objects;
|
||||
*/
|
||||
public class BinaryResourceValue implements SerializableResource {
|
||||
|
||||
/**
|
||||
* The serialized size in bytes of a {@link BinaryResourceValue}.
|
||||
*/
|
||||
public static final int SIZE = 8;
|
||||
public int size;
|
||||
public Type type;
|
||||
public int data;
|
||||
public BinaryResourceValue(int size, Type type, int data) {
|
||||
this.size = size;
|
||||
this.type = type;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public static BinaryResourceValue create(ByteBuffer buffer) {
|
||||
int size = (buffer.getShort() & 0xFFFF);
|
||||
buffer.get(); // Unused
|
||||
Type type = Type.fromCode(buffer.get());
|
||||
int data = buffer.getInt();
|
||||
return new BinaryResourceValue(size, type, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* The length in bytes of this value.
|
||||
*/
|
||||
public int size() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* The raw data type of this value.
|
||||
*/
|
||||
public Type type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual 4-byte value; interpretation of the value depends on {@code dataType}.
|
||||
*/
|
||||
public int data() {
|
||||
return data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toByteArray() {
|
||||
return toByteArray(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toByteArray(boolean shrink) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN);
|
||||
buffer.putShort((short) size());
|
||||
buffer.put((byte) 0); // Unused
|
||||
buffer.put(type().code());
|
||||
buffer.putInt(data());
|
||||
return buffer.array();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
BinaryResourceValue that = (BinaryResourceValue) o;
|
||||
return size == that.size &&
|
||||
data == that.data &&
|
||||
type == that.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(size, type, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resource type codes.
|
||||
*/
|
||||
@@ -172,6 +100,8 @@ public class BinaryResourceValue implements SerializableResource {
|
||||
*/
|
||||
INT_COLOR_RGB4(0x1f);
|
||||
|
||||
private final byte code;
|
||||
|
||||
private static final Map<Byte, Type> FROM_BYTE;
|
||||
|
||||
static {
|
||||
@@ -182,18 +112,90 @@ public class BinaryResourceValue implements SerializableResource {
|
||||
FROM_BYTE = builder.build();
|
||||
}
|
||||
|
||||
private final byte code;
|
||||
|
||||
Type(int code) {
|
||||
this.code = UnsignedBytes.checkedCast(code);
|
||||
}
|
||||
|
||||
public static Type fromCode(byte code) {
|
||||
return Preconditions.checkNotNull(FROM_BYTE.get(code), "Unknown resource type: %s", code);
|
||||
}
|
||||
|
||||
public byte code() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public static Type fromCode(byte code) {
|
||||
return Preconditions.checkNotNull(FROM_BYTE.get(code), "Unknown resource type: %s", code);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The serialized size in bytes of a {@link BinaryResourceValue}.
|
||||
*/
|
||||
public static final int SIZE = 8;
|
||||
|
||||
public int size;
|
||||
public Type type;
|
||||
public int data;
|
||||
|
||||
public static BinaryResourceValue create(ByteBuffer buffer) {
|
||||
int size = (buffer.getShort() & 0xFFFF);
|
||||
buffer.get(); // Unused
|
||||
Type type = Type.fromCode(buffer.get());
|
||||
int data = buffer.getInt();
|
||||
return new BinaryResourceValue(size, type, data);
|
||||
}
|
||||
|
||||
public BinaryResourceValue(int size, Type type, int data) {
|
||||
this.size = size;
|
||||
this.type = type;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
/**
|
||||
* The length in bytes of this value.
|
||||
*/
|
||||
public int size() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* The raw data type of this value.
|
||||
*/
|
||||
public Type type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual 4-byte value; interpretation of the value depends on {@code dataType}.
|
||||
*/
|
||||
public int data() {
|
||||
return data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toByteArray() {
|
||||
return toByteArray(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toByteArray(boolean shrink) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN);
|
||||
buffer.putShort((short) size());
|
||||
buffer.put((byte) 0); // Unused
|
||||
buffer.put(type().code());
|
||||
buffer.putInt(data());
|
||||
return buffer.array();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
BinaryResourceValue that = (BinaryResourceValue) o;
|
||||
return size == that.size &&
|
||||
data == that.data &&
|
||||
type == that.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(size, type, data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,36 +35,86 @@ import java.util.Map;
|
||||
*/
|
||||
public abstract class Chunk implements SerializableResource {
|
||||
|
||||
/**
|
||||
* Types of chunks that can exist.
|
||||
*/
|
||||
public enum Type {
|
||||
NULL(0x0000),
|
||||
STRING_POOL(0x0001),
|
||||
TABLE(0x0002),
|
||||
XML(0x0003),
|
||||
XML_START_NAMESPACE(0x0100),
|
||||
XML_END_NAMESPACE(0x0101),
|
||||
XML_START_ELEMENT(0x0102),
|
||||
XML_END_ELEMENT(0x0103),
|
||||
XML_CDATA(0x0104),
|
||||
XML_RESOURCE_MAP(0x0180),
|
||||
TABLE_PACKAGE(0x0200),
|
||||
TABLE_TYPE(0x0201),
|
||||
TABLE_TYPE_SPEC(0x0202),
|
||||
TABLE_LIBRARY(0x0203);
|
||||
|
||||
private final short code;
|
||||
|
||||
private static final Map<Short, Type> FROM_SHORT;
|
||||
|
||||
static {
|
||||
Builder<Short, Type> builder = ImmutableMap.builder();
|
||||
for (Type type : values()) {
|
||||
builder.put(type.code(), type);
|
||||
}
|
||||
FROM_SHORT = builder.build();
|
||||
}
|
||||
|
||||
Type(int code) {
|
||||
this.code = Shorts.checkedCast(code);
|
||||
}
|
||||
|
||||
public short code() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public static Type fromCode(short code) {
|
||||
return Preconditions.checkNotNull(FROM_SHORT.get(code), "Unknown chunk type: %s", code);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The byte boundary to pad chunks on.
|
||||
*/
|
||||
public static final int PAD_BOUNDARY = 4;
|
||||
|
||||
/**
|
||||
* The number of bytes in every chunk that describes chunk type, header size, and chunk size.
|
||||
*/
|
||||
public static final int METADATA_SIZE = 8;
|
||||
|
||||
/**
|
||||
* The offset in bytes, from the start of the chunk, where the chunk size can be found.
|
||||
*/
|
||||
private static final int CHUNK_SIZE_OFFSET = 4;
|
||||
/**
|
||||
* Size of the chunk header in bytes.
|
||||
*/
|
||||
protected final int headerSize;
|
||||
/**
|
||||
* headerSize + dataSize. The total size of this chunk.
|
||||
*/
|
||||
protected final int chunkSize;
|
||||
/**
|
||||
* Offset of this chunk from the start of the file.
|
||||
*/
|
||||
protected final int offset;
|
||||
|
||||
/**
|
||||
* The parent to this chunk, if any.
|
||||
*/
|
||||
@Nullable
|
||||
private final Chunk parent;
|
||||
|
||||
/**
|
||||
* Size of the chunk header in bytes.
|
||||
*/
|
||||
protected final int headerSize;
|
||||
|
||||
/**
|
||||
* headerSize + dataSize. The total size of this chunk.
|
||||
*/
|
||||
protected final int chunkSize;
|
||||
|
||||
/**
|
||||
* Offset of this chunk from the start of the file.
|
||||
*/
|
||||
protected final int offset;
|
||||
|
||||
protected Chunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
this.parent = parent;
|
||||
offset = buffer.position() - 2;
|
||||
@@ -72,74 +122,6 @@ public abstract class Chunk implements SerializableResource {
|
||||
chunkSize = buffer.getInt();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
||||
*
|
||||
* @param buffer A buffer positioned at the start of a chunk.
|
||||
* @return new chunk
|
||||
*/
|
||||
public static Chunk newInstance(ByteBuffer buffer) {
|
||||
return newInstance(buffer, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
||||
*
|
||||
* @param buffer A buffer positioned at the start of a chunk.
|
||||
* @param parent The parent to this chunk (or null if there's no parent).
|
||||
* @return new chunk
|
||||
*/
|
||||
public static Chunk newInstance(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
Chunk result;
|
||||
Type type = Type.fromCode(buffer.getShort());
|
||||
switch (type) {
|
||||
case STRING_POOL:
|
||||
result = new StringPoolChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE:
|
||||
result = new ResourceTableChunk(buffer, parent);
|
||||
break;
|
||||
case XML:
|
||||
result = new XmlChunk(buffer, parent);
|
||||
break;
|
||||
case XML_START_NAMESPACE:
|
||||
result = new XmlNamespaceStartChunk(buffer, parent);
|
||||
break;
|
||||
case XML_END_NAMESPACE:
|
||||
result = new XmlNamespaceEndChunk(buffer, parent);
|
||||
break;
|
||||
case XML_START_ELEMENT:
|
||||
result = new XmlStartElementChunk(buffer, parent);
|
||||
break;
|
||||
case XML_END_ELEMENT:
|
||||
result = new XmlEndElementChunk(buffer, parent);
|
||||
break;
|
||||
case XML_CDATA:
|
||||
result = new XmlCdataChunk(buffer, parent);
|
||||
break;
|
||||
case XML_RESOURCE_MAP:
|
||||
result = new XmlResourceMapChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_PACKAGE:
|
||||
result = new PackageChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_TYPE:
|
||||
result = new TypeChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_TYPE_SPEC:
|
||||
result = new TypeSpecChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_LIBRARY:
|
||||
result = new LibraryChunk(buffer, parent);
|
||||
break;
|
||||
default:
|
||||
result = new UnknownChunk(buffer, parent);
|
||||
}
|
||||
result.init(buffer);
|
||||
result.seekToEndOfChunk(buffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finishes initialization of a chunk. This should be called immediately after the constructor.
|
||||
* This is separate from the constructor so that the header of a chunk can be fully initialized
|
||||
@@ -274,46 +256,70 @@ public abstract class Chunk implements SerializableResource {
|
||||
}
|
||||
|
||||
/**
|
||||
* Types of chunks that can exist.
|
||||
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
||||
*
|
||||
* @param buffer A buffer positioned at the start of a chunk.
|
||||
* @return new chunk
|
||||
*/
|
||||
public enum Type {
|
||||
NULL(0x0000),
|
||||
STRING_POOL(0x0001),
|
||||
TABLE(0x0002),
|
||||
XML(0x0003),
|
||||
XML_START_NAMESPACE(0x0100),
|
||||
XML_END_NAMESPACE(0x0101),
|
||||
XML_START_ELEMENT(0x0102),
|
||||
XML_END_ELEMENT(0x0103),
|
||||
XML_CDATA(0x0104),
|
||||
XML_RESOURCE_MAP(0x0180),
|
||||
TABLE_PACKAGE(0x0200),
|
||||
TABLE_TYPE(0x0201),
|
||||
TABLE_TYPE_SPEC(0x0202),
|
||||
TABLE_LIBRARY(0x0203);
|
||||
public static Chunk newInstance(ByteBuffer buffer) {
|
||||
return newInstance(buffer, null);
|
||||
}
|
||||
|
||||
private static final Map<Short, Type> FROM_SHORT;
|
||||
|
||||
static {
|
||||
Builder<Short, Type> builder = ImmutableMap.builder();
|
||||
for (Type type : values()) {
|
||||
builder.put(type.code(), type);
|
||||
}
|
||||
FROM_SHORT = builder.build();
|
||||
}
|
||||
|
||||
private final short code;
|
||||
|
||||
Type(int code) {
|
||||
this.code = Shorts.checkedCast(code);
|
||||
}
|
||||
|
||||
public static Type fromCode(short code) {
|
||||
return Preconditions.checkNotNull(FROM_SHORT.get(code), "Unknown chunk type: %s", code);
|
||||
}
|
||||
|
||||
public short code() {
|
||||
return code;
|
||||
/**
|
||||
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
||||
*
|
||||
* @param buffer A buffer positioned at the start of a chunk.
|
||||
* @param parent The parent to this chunk (or null if there's no parent).
|
||||
* @return new chunk
|
||||
*/
|
||||
public static Chunk newInstance(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
Chunk result;
|
||||
Type type = Type.fromCode(buffer.getShort());
|
||||
switch (type) {
|
||||
case STRING_POOL:
|
||||
result = new StringPoolChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE:
|
||||
result = new ResourceTableChunk(buffer, parent);
|
||||
break;
|
||||
case XML:
|
||||
result = new XmlChunk(buffer, parent);
|
||||
break;
|
||||
case XML_START_NAMESPACE:
|
||||
result = new XmlNamespaceStartChunk(buffer, parent);
|
||||
break;
|
||||
case XML_END_NAMESPACE:
|
||||
result = new XmlNamespaceEndChunk(buffer, parent);
|
||||
break;
|
||||
case XML_START_ELEMENT:
|
||||
result = new XmlStartElementChunk(buffer, parent);
|
||||
break;
|
||||
case XML_END_ELEMENT:
|
||||
result = new XmlEndElementChunk(buffer, parent);
|
||||
break;
|
||||
case XML_CDATA:
|
||||
result = new XmlCdataChunk(buffer, parent);
|
||||
break;
|
||||
case XML_RESOURCE_MAP:
|
||||
result = new XmlResourceMapChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_PACKAGE:
|
||||
result = new PackageChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_TYPE:
|
||||
result = new TypeChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_TYPE_SPEC:
|
||||
result = new TypeSpecChunk(buffer, parent);
|
||||
break;
|
||||
case TABLE_LIBRARY:
|
||||
result = new LibraryChunk(buffer, parent);
|
||||
break;
|
||||
default:
|
||||
result = new UnknownChunk(buffer, parent);
|
||||
}
|
||||
result.init(buffer);
|
||||
result.seekToEndOfChunk(buffer);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public final class LibraryChunk extends Chunk {
|
||||
*/
|
||||
private final List<Entry> entries = new ArrayList<>();
|
||||
|
||||
LibraryChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected LibraryChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
entryCount = buffer.getInt();
|
||||
}
|
||||
@@ -98,17 +98,17 @@ public final class LibraryChunk extends Chunk {
|
||||
private final int packageId;
|
||||
private final String packageName;
|
||||
|
||||
private Entry(int packageId, String packageName) {
|
||||
this.packageId = packageId;
|
||||
this.packageName = packageName;
|
||||
}
|
||||
|
||||
static Entry create(ByteBuffer buffer, int offset) {
|
||||
int packageId = buffer.getInt(offset);
|
||||
String packageName = PackageUtils.readPackageName(buffer, offset + 4);
|
||||
return new Entry(packageId, packageName);
|
||||
}
|
||||
|
||||
private Entry(int packageId, String packageName) {
|
||||
this.packageId = packageId;
|
||||
this.packageName = packageName;
|
||||
}
|
||||
|
||||
/**
|
||||
* The id assigned to the shared library at build time.
|
||||
*/
|
||||
|
||||
@@ -43,48 +43,58 @@ public final class PackageChunk extends ChunkWithChunks {
|
||||
* Offset in bytes, from the start of the chunk, where {@code keyStringsOffset} can be found.
|
||||
*/
|
||||
private static final int KEY_OFFSET_OFFSET = 276;
|
||||
/**
|
||||
* The offset (from {@code offset}) in the original buffer where type strings start.
|
||||
*/
|
||||
private final int typeStringsOffset;
|
||||
/**
|
||||
* The index into the type string pool of the last public type.
|
||||
*/
|
||||
private final int lastPublicType;
|
||||
/**
|
||||
* An offset to the string pool that contains the key strings for this package.
|
||||
*/
|
||||
private final int keyStringsOffset;
|
||||
/**
|
||||
* The index into the key string pool of the last public key.
|
||||
*/
|
||||
private final int lastPublicKey;
|
||||
/**
|
||||
* An offset to the type ID(s). This is undocumented in the original code.
|
||||
*/
|
||||
private final int typeIdOffset;
|
||||
/**
|
||||
* Contains a mapping of a type index to its {@link TypeSpecChunk}.
|
||||
*/
|
||||
private final Map<Integer, TypeSpecChunk> typeSpecs = new HashMap<>();
|
||||
/**
|
||||
* Contains a mapping of a type index to all of the {@link TypeChunk} with that index.
|
||||
*/
|
||||
private final Multimap<Integer, TypeChunk> types = ArrayListMultimap.create();
|
||||
|
||||
/**
|
||||
* The package id if this is a base package, or 0 if not a base package.
|
||||
*/
|
||||
private int id;
|
||||
|
||||
/**
|
||||
* The name of the package.
|
||||
*/
|
||||
private String packageName;
|
||||
|
||||
/**
|
||||
* The offset (from {@code offset}) in the original buffer where type strings start.
|
||||
*/
|
||||
private final int typeStringsOffset;
|
||||
|
||||
/**
|
||||
* The index into the type string pool of the last public type.
|
||||
*/
|
||||
private final int lastPublicType;
|
||||
|
||||
/**
|
||||
* An offset to the string pool that contains the key strings for this package.
|
||||
*/
|
||||
private final int keyStringsOffset;
|
||||
|
||||
/**
|
||||
* The index into the key string pool of the last public key.
|
||||
*/
|
||||
private final int lastPublicKey;
|
||||
|
||||
/**
|
||||
* An offset to the type ID(s). This is undocumented in the original code.
|
||||
*/
|
||||
private final int typeIdOffset;
|
||||
|
||||
/**
|
||||
* Contains a mapping of a type index to its {@link TypeSpecChunk}.
|
||||
*/
|
||||
private final Map<Integer, TypeSpecChunk> typeSpecs = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Contains a mapping of a type index to all of the {@link TypeChunk} with that index.
|
||||
*/
|
||||
private final Multimap<Integer, TypeChunk> types = ArrayListMultimap.create();
|
||||
|
||||
/**
|
||||
* May contain a library chunk for mapping dynamic references to resolved references.
|
||||
*/
|
||||
private Optional<LibraryChunk> libraryChunk = Optional.empty();
|
||||
|
||||
PackageChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected PackageChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
id = buffer.getInt();
|
||||
packageName = PackageUtils.readPackageName(buffer, buffer.position());
|
||||
|
||||
@@ -36,16 +36,17 @@ import java.util.Map;
|
||||
*/
|
||||
public final class ResourceTableChunk extends ChunkWithChunks {
|
||||
|
||||
/**
|
||||
* The packages contained in this resource table.
|
||||
*/
|
||||
private final Map<String, PackageChunk> packages = new HashMap<>();
|
||||
/**
|
||||
* A string pool containing all string resource values in the entire resource table.
|
||||
*/
|
||||
private StringPoolChunk stringPool;
|
||||
|
||||
ResourceTableChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
/**
|
||||
* The packages contained in this resource table.
|
||||
*/
|
||||
private final Map<String, PackageChunk> packages = new HashMap<>();
|
||||
|
||||
protected ResourceTableChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
// packageCount. We ignore this, because we already know how many chunks we have.
|
||||
Preconditions.checkState(buffer.getInt() >= 1, "ResourceTableChunk package count was < 1.");
|
||||
|
||||
@@ -89,7 +89,7 @@ public final class StringPoolChunk extends Chunk {
|
||||
*/
|
||||
private boolean isOriginalDeduped = false;
|
||||
|
||||
StringPoolChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected StringPoolChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
stringCount = buffer.getInt();
|
||||
styleCount = buffer.getInt();
|
||||
@@ -310,10 +310,6 @@ public final class StringPoolChunk extends Chunk {
|
||||
static final int RES_STRING_POOL_SPAN_END = 0xFFFFFFFF;
|
||||
private final List<StringPoolSpan> spans;
|
||||
|
||||
private StringPoolStyle(List<StringPoolSpan> spans) {
|
||||
this.spans = spans;
|
||||
}
|
||||
|
||||
static StringPoolStyle create(ByteBuffer buffer, int offset, StringPoolChunk parent) {
|
||||
Builder<StringPoolSpan> spans = ImmutableList.builder();
|
||||
int nameIndex = buffer.getInt(offset);
|
||||
@@ -325,6 +321,10 @@ public final class StringPoolChunk extends Chunk {
|
||||
return new StringPoolStyle(spans.build());
|
||||
}
|
||||
|
||||
private StringPoolStyle(List<StringPoolSpan> spans) {
|
||||
this.spans = spans;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toByteArray() throws IOException {
|
||||
return toByteArray(false);
|
||||
@@ -384,13 +384,6 @@ public final class StringPoolChunk extends Chunk {
|
||||
private final int stop;
|
||||
private final StringPoolChunk parent;
|
||||
|
||||
private StringPoolSpan(int nameIndex, int start, int stop, StringPoolChunk parent) {
|
||||
this.nameIndex = nameIndex;
|
||||
this.start = start;
|
||||
this.stop = stop;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
static StringPoolSpan create(ByteBuffer buffer, int offset, StringPoolChunk parent) {
|
||||
int nameIndex = buffer.getInt(offset);
|
||||
int start = buffer.getInt(offset + 4);
|
||||
@@ -398,6 +391,13 @@ public final class StringPoolChunk extends Chunk {
|
||||
return new StringPoolSpan(nameIndex, start, stop, parent);
|
||||
}
|
||||
|
||||
private StringPoolSpan(int nameIndex, int start, int stop, StringPoolChunk parent) {
|
||||
this.nameIndex = nameIndex;
|
||||
this.start = start;
|
||||
this.stop = stop;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final byte[] toByteArray() {
|
||||
return toByteArray(false);
|
||||
|
||||
@@ -52,16 +52,18 @@ public final class TypeChunk extends Chunk {
|
||||
* The offset (from {@code offset}) in the original buffer where {@code entries} start.
|
||||
*/
|
||||
private final int entriesStart;
|
||||
/**
|
||||
* A sparse list of resource entries defined by this chunk.
|
||||
*/
|
||||
private final Map<Integer, Entry> entries = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* The resource configuration that these resource entries correspond to.
|
||||
*/
|
||||
private BinaryResourceConfiguration configuration;
|
||||
|
||||
TypeChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
/**
|
||||
* A sparse list of resource entries defined by this chunk.
|
||||
*/
|
||||
private final Map<Integer, Entry> entries = new TreeMap<>();
|
||||
|
||||
protected TypeChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
id = UnsignedBytes.toInt(buffer.get());
|
||||
buffer.position(buffer.position() + 3); // Skip 3 bytes for packing
|
||||
@@ -174,13 +176,13 @@ public final class TypeChunk extends Chunk {
|
||||
}
|
||||
}
|
||||
|
||||
private String getString(int index) {
|
||||
protected String getString(int index) {
|
||||
ResourceTableChunk resourceTable = getResourceTableChunk();
|
||||
Preconditions.checkNotNull(resourceTable, "%s has no resource table.", getClass());
|
||||
return resourceTable.getStringPool().getString(index);
|
||||
}
|
||||
|
||||
private String getKeyName(int index) {
|
||||
protected String getKeyName(int index) {
|
||||
PackageChunk packageChunk = getPackageChunk();
|
||||
Preconditions.checkNotNull(packageChunk, "%s has no parent package.", getClass());
|
||||
StringPoolChunk keyPool = packageChunk.getKeyStringPool();
|
||||
@@ -188,7 +190,7 @@ public final class TypeChunk extends Chunk {
|
||||
return keyPool.getString(index);
|
||||
}
|
||||
|
||||
private void updateKey(int index, String value) {
|
||||
protected void updateKey(int index, String value) {
|
||||
PackageChunk packageChunk = getPackageChunk();
|
||||
Preconditions.checkNotNull(packageChunk, "%s has no parent package.", getClass());
|
||||
StringPoolChunk keyPool = packageChunk.getKeyStringPool();
|
||||
@@ -291,10 +293,10 @@ public final class TypeChunk extends Chunk {
|
||||
private final int headerSize;
|
||||
private final int flags;
|
||||
private final int keyIndex;
|
||||
private BinaryResourceValue value;
|
||||
private Map<Integer, BinaryResourceValue> values;
|
||||
private final int parentEntry;
|
||||
private final TypeChunk parent;
|
||||
private BinaryResourceValue value;
|
||||
private final Map<Integer, BinaryResourceValue> values;
|
||||
|
||||
private Entry(int headerSize,
|
||||
int flags,
|
||||
@@ -312,52 +314,6 @@ public final class TypeChunk extends Chunk {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link Entry} whose contents start at the 0-based position in
|
||||
* {@code buffer} given by a 4-byte value read from {@code buffer} and then added to
|
||||
* {@code baseOffset}. If the value read from {@code buffer} is equal to {@link #NO_ENTRY}, then
|
||||
* null is returned as there is no resource at that position.
|
||||
*
|
||||
* <p>Otherwise, this position is parsed and returned as an {@link Entry}.
|
||||
*
|
||||
* @param buffer A buffer positioned at an offset to an {@link Entry}.
|
||||
* @param baseOffset Offset that must be added to the value at {@code buffer}'s position.
|
||||
* @param parent The {@link TypeChunk} that this resource entry belongs to.
|
||||
* @return New {@link Entry} or null if there is no resource at this location.
|
||||
*/
|
||||
@Nullable
|
||||
public static Entry create(ByteBuffer buffer, int baseOffset, TypeChunk parent) {
|
||||
int offset = buffer.getInt();
|
||||
if (offset == NO_ENTRY) {
|
||||
return null;
|
||||
}
|
||||
int position = buffer.position();
|
||||
buffer.position(baseOffset + offset); // Set buffer position to resource entry start
|
||||
Entry result = newInstance(buffer, parent);
|
||||
buffer.position(position); // Restore buffer position
|
||||
return result;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Entry newInstance(ByteBuffer buffer, TypeChunk parent) {
|
||||
int headerSize = buffer.getShort() & 0xFFFF;
|
||||
int flags = buffer.getShort() & 0xFFFF;
|
||||
int keyIndex = buffer.getInt();
|
||||
BinaryResourceValue value = null;
|
||||
Map<Integer, BinaryResourceValue> values = new LinkedHashMap<>();
|
||||
int parentEntry = 0;
|
||||
if ((flags & FLAG_COMPLEX) != 0) {
|
||||
parentEntry = buffer.getInt();
|
||||
int valueCount = buffer.getInt();
|
||||
for (int i = 0; i < valueCount; ++i) {
|
||||
values.put(buffer.getInt(), BinaryResourceValue.create(buffer));
|
||||
}
|
||||
} else {
|
||||
value = BinaryResourceValue.create(buffer);
|
||||
}
|
||||
return new Entry(headerSize, flags, keyIndex, value, values, parentEntry, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of bytes in the header of the {@link Entry}.
|
||||
*/
|
||||
@@ -466,6 +422,52 @@ public final class TypeChunk extends Chunk {
|
||||
return (flags() & FLAG_COMPLEX) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link Entry} whose contents start at the 0-based position in
|
||||
* {@code buffer} given by a 4-byte value read from {@code buffer} and then added to
|
||||
* {@code baseOffset}. If the value read from {@code buffer} is equal to {@link #NO_ENTRY}, then
|
||||
* null is returned as there is no resource at that position.
|
||||
*
|
||||
* <p>Otherwise, this position is parsed and returned as an {@link Entry}.
|
||||
*
|
||||
* @param buffer A buffer positioned at an offset to an {@link Entry}.
|
||||
* @param baseOffset Offset that must be added to the value at {@code buffer}'s position.
|
||||
* @param parent The {@link TypeChunk} that this resource entry belongs to.
|
||||
* @return New {@link Entry} or null if there is no resource at this location.
|
||||
*/
|
||||
@Nullable
|
||||
public static Entry create(ByteBuffer buffer, int baseOffset, TypeChunk parent) {
|
||||
int offset = buffer.getInt();
|
||||
if (offset == NO_ENTRY) {
|
||||
return null;
|
||||
}
|
||||
int position = buffer.position();
|
||||
buffer.position(baseOffset + offset); // Set buffer position to resource entry start
|
||||
Entry result = newInstance(buffer, parent);
|
||||
buffer.position(position); // Restore buffer position
|
||||
return result;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Entry newInstance(ByteBuffer buffer, TypeChunk parent) {
|
||||
int headerSize = buffer.getShort() & 0xFFFF;
|
||||
int flags = buffer.getShort() & 0xFFFF;
|
||||
int keyIndex = buffer.getInt();
|
||||
BinaryResourceValue value = null;
|
||||
Map<Integer, BinaryResourceValue> values = new LinkedHashMap<>();
|
||||
int parentEntry = 0;
|
||||
if ((flags & FLAG_COMPLEX) != 0) {
|
||||
parentEntry = buffer.getInt();
|
||||
int valueCount = buffer.getInt();
|
||||
for (int i = 0; i < valueCount; ++i) {
|
||||
values.put(buffer.getInt(), BinaryResourceValue.create(buffer));
|
||||
}
|
||||
} else {
|
||||
value = BinaryResourceValue.create(buffer);
|
||||
}
|
||||
return new Entry(headerSize, flags, keyIndex, value, values, parentEntry, parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final byte[] toByteArray() {
|
||||
return toByteArray(false);
|
||||
|
||||
@@ -39,7 +39,7 @@ public final class TypeSpecChunk extends Chunk {
|
||||
*/
|
||||
private final int[] resources;
|
||||
|
||||
TypeSpecChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected TypeSpecChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
id = UnsignedBytes.toInt(buffer.get());
|
||||
buffer.position(buffer.position() + 3); // Skip 3 bytes for packing
|
||||
|
||||
@@ -34,7 +34,7 @@ public final class UnknownChunk extends Chunk {
|
||||
|
||||
private final byte[] payload;
|
||||
|
||||
UnknownChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected UnknownChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
|
||||
type = Type.fromCode(buffer.getShort(offset));
|
||||
|
||||
@@ -36,18 +36,6 @@ public class XmlAttribute implements SerializableResource {
|
||||
private final BinaryResourceValue typedValue;
|
||||
private final XmlNodeChunk parent;
|
||||
|
||||
private XmlAttribute(int namespaceIndex,
|
||||
int nameIndex,
|
||||
int rawValueIndex,
|
||||
BinaryResourceValue typedValue,
|
||||
XmlNodeChunk parent) {
|
||||
this.namespaceIndex = namespaceIndex;
|
||||
this.nameIndex = nameIndex;
|
||||
this.rawValueIndex = rawValueIndex;
|
||||
this.typedValue = typedValue;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link XmlAttribute} based on the bytes at the current {@code buffer} position.
|
||||
*
|
||||
@@ -62,6 +50,18 @@ public class XmlAttribute implements SerializableResource {
|
||||
return new XmlAttribute(namespace, name, rawValue, typedValue, parent);
|
||||
}
|
||||
|
||||
private XmlAttribute(int namespaceIndex,
|
||||
int nameIndex,
|
||||
int rawValueIndex,
|
||||
BinaryResourceValue typedValue,
|
||||
XmlNodeChunk parent) {
|
||||
this.namespaceIndex = namespaceIndex;
|
||||
this.nameIndex = nameIndex;
|
||||
this.rawValueIndex = rawValueIndex;
|
||||
this.typedValue = typedValue;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* A string reference to the namespace URI, or -1 if not present.
|
||||
*/
|
||||
|
||||
@@ -37,7 +37,7 @@ public final class XmlCdataChunk extends XmlNodeChunk {
|
||||
*/
|
||||
private final BinaryResourceValue binaryResourceValue;
|
||||
|
||||
XmlCdataChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected XmlCdataChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
rawValue = buffer.getInt();
|
||||
binaryResourceValue = BinaryResourceValue.create(buffer);
|
||||
|
||||
@@ -28,7 +28,7 @@ import java.nio.ByteBuffer;
|
||||
*/
|
||||
public final class XmlChunk extends ChunkWithChunks {
|
||||
|
||||
XmlChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected XmlChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ public final class XmlEndElementChunk extends XmlNodeChunk {
|
||||
*/
|
||||
private final int name;
|
||||
|
||||
XmlEndElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected XmlEndElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
namespace = buffer.getInt();
|
||||
name = buffer.getInt();
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ import java.nio.ByteBuffer;
|
||||
*/
|
||||
public final class XmlNamespaceEndChunk extends XmlNamespaceChunk {
|
||||
|
||||
XmlNamespaceEndChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected XmlNamespaceEndChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ import java.nio.ByteBuffer;
|
||||
*/
|
||||
public final class XmlNamespaceStartChunk extends XmlNamespaceChunk {
|
||||
|
||||
XmlNamespaceStartChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected XmlNamespaceStartChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ public final class XmlStartElementChunk extends XmlNodeChunk {
|
||||
*/
|
||||
private final List<XmlAttribute> attributes = new ArrayList<>();
|
||||
|
||||
XmlStartElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
protected XmlStartElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||
super(buffer, parent);
|
||||
namespace = buffer.getInt();
|
||||
name = buffer.getInt();
|
||||
|
||||
@@ -6,9 +6,9 @@ import com.vk.api.base.ApiRequest;
|
||||
import com.vk.dto.music.MusicTrack;
|
||||
import com.vk.log.L;
|
||||
import org.json.JSONObject;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.lite.music.Genius;
|
||||
import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
@@ -7,6 +7,16 @@ import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class GiftGetByStickerId extends ApiRequest<GiftGetByStickerId.a> {
|
||||
public static class a {
|
||||
public final int a;
|
||||
public final CatalogedGift b;
|
||||
|
||||
public a(int i, CatalogedGift catalogedGift) {
|
||||
this.a = i;
|
||||
this.b = catalogedGift;
|
||||
}
|
||||
}
|
||||
|
||||
public GiftGetByStickerId(Context context, int i) {
|
||||
super("execute.getGiftByStickerId");
|
||||
b("sticker_id", i);
|
||||
@@ -20,14 +30,4 @@ public class GiftGetByStickerId extends ApiRequest<GiftGetByStickerId.a> {
|
||||
return new a(jSONObject2.optInt("balance"),
|
||||
new CatalogedGift(jSONObject2.getJSONObject("gift")));
|
||||
}
|
||||
|
||||
public static class a {
|
||||
public final int a;
|
||||
public final CatalogedGift b;
|
||||
|
||||
public a(int i, CatalogedGift catalogedGift) {
|
||||
this.a = i;
|
||||
this.b = catalogedGift;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,15 +27,6 @@ public class RecoloredDrawable extends Drawable implements Drawable.Callback {
|
||||
onStateChange(new int[0]);
|
||||
}
|
||||
|
||||
public RecoloredDrawable(Drawable drawable, int i) {
|
||||
this(drawable, new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
||||
}
|
||||
|
||||
public RecoloredDrawable() {
|
||||
this.c = 255;
|
||||
this.d = 255;
|
||||
}
|
||||
|
||||
public void a(int i) {
|
||||
a(new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
||||
}
|
||||
@@ -129,4 +120,13 @@ public class RecoloredDrawable extends Drawable implements Drawable.Callback {
|
||||
public Drawable a() {
|
||||
return this.drawable;
|
||||
}
|
||||
|
||||
public RecoloredDrawable(Drawable drawable, int i) {
|
||||
this(drawable, new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
||||
}
|
||||
|
||||
public RecoloredDrawable() {
|
||||
this.c = 255;
|
||||
this.d = 255;
|
||||
}
|
||||
}
|
||||
@@ -21,13 +21,6 @@ public final class VerifyInfoHelper {
|
||||
public static final VerifyInfoHelper h;
|
||||
public static int devIcon = R.drawable.ic_favorite_16;
|
||||
|
||||
static {
|
||||
h = new VerifyInfoHelper();
|
||||
}
|
||||
|
||||
private VerifyInfoHelper() {
|
||||
}
|
||||
|
||||
public static Integer enumSwitchMapping(VerifyInfoHelper.ColorTheme color) {
|
||||
return switch (color) {
|
||||
case normal -> 1;
|
||||
@@ -37,47 +30,18 @@ public final class VerifyInfoHelper {
|
||||
};
|
||||
}
|
||||
|
||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 8) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
return verifyInfoHelper.b(z, z2, dev, context, colorTheme);
|
||||
public enum ColorTheme {
|
||||
white,
|
||||
normal,
|
||||
light,
|
||||
ultraLight
|
||||
}
|
||||
|
||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
return b(verifyInfoHelper, verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme, i, obj);
|
||||
static {
|
||||
h = new VerifyInfoHelper();
|
||||
}
|
||||
|
||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
return b(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
||||
}
|
||||
|
||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 4) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
return verifyInfoHelper.b(verifyInfo, context, colorTheme);
|
||||
}
|
||||
|
||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 8) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
return verifyInfoHelper.a(z, z2, dev, context, colorTheme);
|
||||
}
|
||||
|
||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
return a(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
||||
}
|
||||
|
||||
public static void a(VerifyInfoHelper verifyInfoHelper, TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 4) != 0) {
|
||||
z = false;
|
||||
}
|
||||
if ((i & 8) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
verifyInfoHelper.a(textView, verifyInfo, z, colorTheme);
|
||||
private VerifyInfoHelper() {
|
||||
}
|
||||
|
||||
private int a() {
|
||||
@@ -125,6 +89,7 @@ public final class VerifyInfoHelper {
|
||||
return b(this, z, z2, false, context, null, 8, null);
|
||||
}
|
||||
|
||||
|
||||
public int b(ColorTheme colorTheme) {
|
||||
return a(colorTheme);
|
||||
}
|
||||
@@ -139,6 +104,7 @@ public final class VerifyInfoHelper {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public Drawable b(Context context, VerifyInfo verifyInfo) {
|
||||
if (verifyInfo.dev()) {
|
||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, devIcon), c(ColorTheme.normal));
|
||||
@@ -157,6 +123,21 @@ public final class VerifyInfoHelper {
|
||||
return b(verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme);
|
||||
}
|
||||
|
||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 8) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
return verifyInfoHelper.b(z, z2, dev, context, colorTheme);
|
||||
}
|
||||
|
||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
return b(verifyInfoHelper, verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme, i, obj);
|
||||
}
|
||||
|
||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
return b(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
||||
}
|
||||
|
||||
public Drawable a(Context context, VerifyInfo verifyInfo) {
|
||||
if (verifyInfo.dev()) {
|
||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, devIcon), c(ColorTheme.normal));
|
||||
@@ -200,10 +181,28 @@ public final class VerifyInfoHelper {
|
||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, i), c2);
|
||||
}
|
||||
|
||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 4) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
return verifyInfoHelper.b(verifyInfo, context, colorTheme);
|
||||
}
|
||||
|
||||
public Drawable a(VerifyInfo verifyInfo, Context context, ColorTheme colorTheme) {
|
||||
return a(verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme);
|
||||
}
|
||||
|
||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 8) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
return verifyInfoHelper.a(z, z2, dev, context, colorTheme);
|
||||
}
|
||||
|
||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||
return a(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
||||
}
|
||||
|
||||
public Drawable a(boolean z, boolean z2, Context context, ColorTheme colorTheme) {
|
||||
return a(z, z2, false, context, colorTheme);
|
||||
}
|
||||
@@ -231,6 +230,16 @@ public final class VerifyInfoHelper {
|
||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, i), c2);
|
||||
}
|
||||
|
||||
public static void a(VerifyInfoHelper verifyInfoHelper, TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme, int i, Object obj) {
|
||||
if ((i & 4) != 0) {
|
||||
z = false;
|
||||
}
|
||||
if ((i & 8) != 0) {
|
||||
colorTheme = ColorTheme.normal;
|
||||
}
|
||||
verifyInfoHelper.a(textView, verifyInfo, z, colorTheme);
|
||||
}
|
||||
|
||||
public void a(TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme) {
|
||||
Drawable drawable;
|
||||
Context context = textView.getContext();
|
||||
@@ -258,11 +267,4 @@ public final class VerifyInfoHelper {
|
||||
}
|
||||
ViewExtKt.p(imageView);
|
||||
}
|
||||
|
||||
public enum ColorTheme {
|
||||
white,
|
||||
normal,
|
||||
light,
|
||||
ultraLight
|
||||
}
|
||||
}
|
||||
+25
-25
@@ -31,6 +31,30 @@ public final class DialogGetMentionSuggestionCmd extends BaseImEngineCmd<Suggest
|
||||
private final boolean e;
|
||||
private final Object f;
|
||||
|
||||
public static final class a<T> implements Comparator<Member> {
|
||||
List a;
|
||||
|
||||
a(List list) {
|
||||
this.a = list;
|
||||
}
|
||||
|
||||
@Override // java.util.Comparator
|
||||
/* renamed from: a */
|
||||
public int compare(Member member, Member member2) {
|
||||
int indexOf = this.a.indexOf(member);
|
||||
int indexOf2 = this.a.indexOf(member2);
|
||||
int i = indexOf;
|
||||
if (indexOf < 0) {
|
||||
i = Integer.MAX_VALUE;
|
||||
}
|
||||
int i2 = indexOf2;
|
||||
if (indexOf2 < 0) {
|
||||
i2 = Integer.MAX_VALUE;
|
||||
}
|
||||
return Intrinsics.a(i, i2);
|
||||
}
|
||||
}
|
||||
|
||||
public DialogGetMentionSuggestionCmd(int i, String str, Source source, boolean z, Object obj) {
|
||||
this.f2365b = i;
|
||||
this.c = str;
|
||||
@@ -126,7 +150,7 @@ public final class DialogGetMentionSuggestionCmd extends BaseImEngineCmd<Suggest
|
||||
Collection<Member> a2;
|
||||
Source source;
|
||||
if (ImDialogsUtils.d(this.f2365b) != PeerType.CHAT) {
|
||||
return new Suggestion(null, null);
|
||||
return new Suggestion((EntityValue) null, (ProfilesInfo) null);
|
||||
}
|
||||
Member Z = imEnvironment.Z();
|
||||
int d = imEnvironment.a0().n().d();
|
||||
@@ -211,28 +235,4 @@ public final class DialogGetMentionSuggestionCmd extends BaseImEngineCmd<Suggest
|
||||
public String toString() {
|
||||
return "DialogGetMentionSuggestionCmd(dialogId=" + this.f2365b + ", query=" + this.c + ", source=" + this.d + ", isAwaitNetwork=" + this.e + ", changerTag=" + this.f + ")";
|
||||
}
|
||||
|
||||
public static final class a<T> implements Comparator<Member> {
|
||||
List a;
|
||||
|
||||
a(List list) {
|
||||
this.a = list;
|
||||
}
|
||||
|
||||
@Override // java.util.Comparator
|
||||
/* renamed from: a */
|
||||
public int compare(Member member, Member member2) {
|
||||
int indexOf = this.a.indexOf(member);
|
||||
int indexOf2 = this.a.indexOf(member2);
|
||||
int i = indexOf;
|
||||
if (indexOf < 0) {
|
||||
i = Integer.MAX_VALUE;
|
||||
}
|
||||
int i2 = indexOf2;
|
||||
if (indexOf2 < 0) {
|
||||
i2 = Integer.MAX_VALUE;
|
||||
}
|
||||
return Intrinsics.a(i, i2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@ import java.util.List;
|
||||
public final class DialogActionsHelper {
|
||||
public static final DialogActionsHelper a = new DialogActionsHelper();
|
||||
|
||||
public List<DialogAction> a(ImConfig imConfig, Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
||||
public final List<DialogAction> a(ImConfig imConfig, Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
||||
if (dialog != null && profilesSimpleInfo != null) {
|
||||
long b2 = TimeProvider.f.b();
|
||||
ChatSettings z1 = dialog.z1();
|
||||
@@ -84,7 +84,7 @@ public final class DialogActionsHelper {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public List<DialogAction> a(Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
||||
public final List<DialogAction> a(Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
||||
long b2 = TimeProvider.f.b();
|
||||
Profile profile = profilesSimpleInfo.get(dialog.getId());
|
||||
|
||||
@@ -138,7 +138,7 @@ public final class DialogActionsHelper {
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
public boolean a(Dialog dialog) {
|
||||
public final boolean a(Dialog dialog) {
|
||||
if (dialog.V1() || !dialog.y1()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ import java.util.List;
|
||||
public final class MsgActionHelper {
|
||||
public static final MsgActionHelper a = new MsgActionHelper();
|
||||
|
||||
public List<MsgAction> a(ImEngine imEngine, Dialog dialog, Collection<? extends Msg> collection) {
|
||||
public final List<MsgAction> a(ImEngine imEngine, Dialog dialog, Collection<? extends Msg> collection) {
|
||||
return a(imEngine != null ? imEngine.g() : null, dialog, collection);
|
||||
}
|
||||
|
||||
public List<MsgAction> a(ImConfig imConfig, Dialog dialog, Collection<? extends Msg> collection) {
|
||||
public final List<MsgAction> a(ImConfig imConfig, Dialog dialog, Collection<? extends Msg> collection) {
|
||||
if (imConfig != null && dialog != null && collection != null) {
|
||||
MsgPermissionHelper.a aVar = new MsgPermissionHelper.a(imConfig, dialog, collection);
|
||||
ArrayList<MsgAction> arrayList = new ArrayList<>();
|
||||
|
||||
+137
-29
@@ -74,7 +74,11 @@ public class VhBindArgs {
|
||||
|
||||
private boolean L() {
|
||||
boolean var1;
|
||||
var1 = this.K() > this.m || TimeProvider.f.c();
|
||||
if (this.K() <= this.m && !TimeProvider.f.c()) {
|
||||
var1 = false;
|
||||
} else {
|
||||
var1 = true;
|
||||
}
|
||||
|
||||
return var1;
|
||||
}
|
||||
@@ -105,7 +109,11 @@ public class VhBindArgs {
|
||||
public boolean B() {
|
||||
AdapterEntry var1 = this.a;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.c();
|
||||
if (var1 != null && var1.c()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -113,7 +121,11 @@ public class VhBindArgs {
|
||||
public boolean C() {
|
||||
AdapterEntry var1 = this.a;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.c() && this.a.c.getLocalId() == this.b.c.getLocalId();
|
||||
if (var1 != null && var1.c() && this.a.c.getLocalId() == this.b.c.getLocalId()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -121,7 +133,11 @@ public class VhBindArgs {
|
||||
public boolean D() {
|
||||
AdapterEntry var1 = this.a;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.a == 83;
|
||||
if (var1 != null && var1.a == 83) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -129,7 +145,11 @@ public class VhBindArgs {
|
||||
public boolean E() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).i2();
|
||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).i2()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -137,7 +157,11 @@ public class VhBindArgs {
|
||||
public boolean F() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).F0();
|
||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).F0()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -145,7 +169,11 @@ public class VhBindArgs {
|
||||
public boolean G() {
|
||||
AdapterEntry var1 = this.b;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.a == 51;
|
||||
if (var1 != null && var1.a == 51) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -158,7 +186,11 @@ public class VhBindArgs {
|
||||
long var1 = this.K();
|
||||
long var3 = this.m;
|
||||
boolean var5;
|
||||
var5 = var1 > var3 && var1 < var3 * 2L;
|
||||
if (var1 > var3 && var1 < var3 * 2L) {
|
||||
var5 = true;
|
||||
} else {
|
||||
var5 = false;
|
||||
}
|
||||
|
||||
return var5;
|
||||
}
|
||||
@@ -174,10 +206,18 @@ public class VhBindArgs {
|
||||
MsgFromUser var7 = (MsgFromUser) var1;
|
||||
Msg var3 = this.a.c;
|
||||
boolean var4;
|
||||
var4 = var3 != null && var3.d() == MsgSyncState.DONE;
|
||||
if (var3 != null && var3.d() == MsgSyncState.DONE) {
|
||||
var4 = true;
|
||||
} else {
|
||||
var4 = false;
|
||||
}
|
||||
|
||||
boolean var5;
|
||||
var5 = this.o == ImBgSyncState.CONNECTED;
|
||||
if (this.o == ImBgSyncState.CONNECTED) {
|
||||
var5 = true;
|
||||
} else {
|
||||
var5 = false;
|
||||
}
|
||||
|
||||
boolean var6 = var2;
|
||||
if (!var7.H0()) {
|
||||
@@ -202,7 +242,7 @@ public class VhBindArgs {
|
||||
byte var2 = 0;
|
||||
int var3 = var2;
|
||||
if (var1) {
|
||||
AttachAudioMsg var4 = ((MsgFromUser) this.b.c).c(AttachAudioMsg.class, false);
|
||||
AttachAudioMsg var4 = (AttachAudioMsg) ((MsgFromUser) this.b.c).c(AttachAudioMsg.class, false);
|
||||
var3 = var2;
|
||||
if (var4 != null) {
|
||||
var3 = var4.f();
|
||||
@@ -227,7 +267,11 @@ public class VhBindArgs {
|
||||
public boolean c() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).I0();
|
||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).I0()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -235,14 +279,22 @@ public class VhBindArgs {
|
||||
public boolean d() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof WithUserContent && ((WithUserContent) var1).D0() != null;
|
||||
if (var1 instanceof WithUserContent && ((WithUserContent) var1).D0() != null) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
|
||||
public boolean e() {
|
||||
boolean var1;
|
||||
var1 = this.b.i > 0;
|
||||
if (this.b.i > 0) {
|
||||
var1 = true;
|
||||
} else {
|
||||
var1 = false;
|
||||
}
|
||||
|
||||
return var1;
|
||||
}
|
||||
@@ -265,7 +317,11 @@ public class VhBindArgs {
|
||||
public boolean g() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).G0();
|
||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).G0()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -273,21 +329,33 @@ public class VhBindArgs {
|
||||
public boolean h() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).Z1();
|
||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).Z1()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
|
||||
public boolean i() {
|
||||
boolean var1;
|
||||
var1 = this.j && !this.u() && !this.l();
|
||||
if (this.j && !this.u() && !this.l()) {
|
||||
var1 = true;
|
||||
} else {
|
||||
var1 = false;
|
||||
}
|
||||
|
||||
return var1;
|
||||
}
|
||||
|
||||
public boolean j() {
|
||||
boolean var1;
|
||||
var1 = this.j && !this.u() && (!this.B() || !this.A() || this.a.c.H1());
|
||||
if (!this.j || this.u() || this.B() && this.A() && !this.a.c.H1()) {
|
||||
var1 = false;
|
||||
} else {
|
||||
var1 = true;
|
||||
}
|
||||
|
||||
return var1;
|
||||
}
|
||||
@@ -295,7 +363,11 @@ public class VhBindArgs {
|
||||
public boolean k() {
|
||||
Dialog var1 = this.e;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.U1();
|
||||
if (var1 != null && var1.U1()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -303,7 +375,11 @@ public class VhBindArgs {
|
||||
public boolean l() {
|
||||
Dialog var1 = this.e;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.V1();
|
||||
if (var1 != null && var1.V1()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -311,7 +387,11 @@ public class VhBindArgs {
|
||||
public boolean m() {
|
||||
Dialog var1 = this.e;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.W1();
|
||||
if (var1 != null && var1.W1()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -324,7 +404,11 @@ public class VhBindArgs {
|
||||
public boolean o() {
|
||||
AdapterEntry var1 = this.b;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.a == 101;
|
||||
if (var1 != null && var1.a == 101) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -332,7 +416,11 @@ public class VhBindArgs {
|
||||
public boolean p() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.G1();
|
||||
if (var1 != null && var1.G1()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -355,7 +443,11 @@ public class VhBindArgs {
|
||||
public boolean r() {
|
||||
Msg var1 = this.b.c;
|
||||
boolean var2;
|
||||
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).e2();
|
||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).e2()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -396,19 +488,27 @@ public class VhBindArgs {
|
||||
public boolean v() {
|
||||
IntSet var1 = this.r;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.a(this.b.c.getLocalId());
|
||||
if (var1 != null && var1.a(this.b.c.getLocalId())) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
|
||||
public boolean w() {
|
||||
return !this.z();
|
||||
return this.z() ^ true;
|
||||
}
|
||||
|
||||
public boolean x() {
|
||||
AdapterEntry var1 = this.c;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.a == 100;
|
||||
if (var1 != null && var1.a == 100) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -416,7 +516,11 @@ public class VhBindArgs {
|
||||
public boolean y() {
|
||||
AdapterEntry var1 = this.c;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.a == 96;
|
||||
if (var1 != null && var1.a == 96) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -424,7 +528,11 @@ public class VhBindArgs {
|
||||
public boolean z() {
|
||||
AdapterEntry var1 = this.c;
|
||||
boolean var2;
|
||||
var2 = var1 != null && var1.c() && this.c.c.getLocalId() == this.b.c.getLocalId();
|
||||
if (var1 != null && var1.c() && this.c.c.getLocalId() == this.b.c.getLocalId()) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
|
||||
+3
-3
@@ -46,7 +46,7 @@ public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
|
||||
this.G = new StringBuilder();
|
||||
}
|
||||
|
||||
private void a(Msg var1) {
|
||||
private final void a(Msg var1) {
|
||||
this.G.setLength(0);
|
||||
MsgTimeFormatter var2 = this.F;
|
||||
Context var3 = this.C;
|
||||
@@ -55,7 +55,7 @@ public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
|
||||
this.H.setTimeText(this.G);
|
||||
}
|
||||
|
||||
private void a(boolean var1) {
|
||||
private final void a(boolean var1) {
|
||||
MsgPartIconTwoRowView var2 = this.H;
|
||||
int var3;
|
||||
if (var1) {
|
||||
@@ -67,7 +67,7 @@ public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
|
||||
var2.setIcon(var3);
|
||||
}
|
||||
|
||||
private void a(boolean var1, AttachCall var2) {
|
||||
private final void a(boolean var1, AttachCall var2) {
|
||||
boolean var3 = !var1;
|
||||
if (var2.h() == CallState.ERROR) {
|
||||
this.H.setSubtitleText(m.vkim_msg_list_call_error);
|
||||
|
||||
+120
-74
@@ -56,6 +56,46 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
private static final int[][] j0;
|
||||
private static final int[][] k0;
|
||||
private static final int[][] l0;
|
||||
private final MsgPartHolderBase B;
|
||||
private final MsgPartHolderBindArgs C = new MsgPartHolderBindArgs();
|
||||
private final Rect D = new Rect();
|
||||
private final Rect E = new Rect();
|
||||
private final Rect F = new Rect();
|
||||
private final Rect G = new Rect();
|
||||
private ColorDrawable H;
|
||||
private final int I;
|
||||
private final int J;
|
||||
private final int K;
|
||||
private final int L;
|
||||
private final int M;
|
||||
private Drawable N;
|
||||
private Drawable O;
|
||||
private BombView P;
|
||||
private BombView.d Q;
|
||||
private int R;
|
||||
private int S;
|
||||
private final DisplayNameFormatter T = new DisplayNameFormatter();
|
||||
private final StringBuilder U = new StringBuilder();
|
||||
private final StringBuilder V = new StringBuilder();
|
||||
private final String W;
|
||||
private final String X;
|
||||
private final String Y;
|
||||
private boolean Z;
|
||||
private BubbleColors a0;
|
||||
private final FluidHorizontalLayout b;
|
||||
@ColorInt
|
||||
private int b0;
|
||||
private final AvatarView c;
|
||||
private MsgListAdapterCallback c0;
|
||||
private final Space d;
|
||||
private Msg d0;
|
||||
private final MsgBubbleView e;
|
||||
private Dialog e0;
|
||||
private final MsgStatusView f;
|
||||
private int f0;
|
||||
private final ImageView g;
|
||||
private h g0 = new h();
|
||||
private final Space h;
|
||||
|
||||
static {
|
||||
int[] var0 = new int[]{0, 0, 0, 0};
|
||||
@@ -79,59 +119,18 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
l0 = new int[][]{var0, {4, 4, 0, 0, 0, 2, 8, 0}, var1, var2, {4, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 0, 0, 2, 8, 0}, {4, 4, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 0, 0, 0, 0, 0}};
|
||||
}
|
||||
|
||||
private final MsgPartHolderBase B;
|
||||
private final MsgPartHolderBindArgs C = new MsgPartHolderBindArgs();
|
||||
private final Rect D = new Rect();
|
||||
private final Rect E = new Rect();
|
||||
private final Rect F = new Rect();
|
||||
private final Rect G = new Rect();
|
||||
private final int I;
|
||||
private final int J;
|
||||
private final int K;
|
||||
private final int L;
|
||||
private final int M;
|
||||
private final DisplayNameFormatter T = new DisplayNameFormatter();
|
||||
private final StringBuilder U = new StringBuilder();
|
||||
private final StringBuilder V = new StringBuilder();
|
||||
private final String W;
|
||||
private final String X;
|
||||
private final String Y;
|
||||
private final FluidHorizontalLayout b;
|
||||
private final AvatarView c;
|
||||
private final Space d;
|
||||
private final MsgBubbleView e;
|
||||
private final MsgStatusView f;
|
||||
private final ImageView g;
|
||||
private final Space h;
|
||||
private final ColorDrawable H;
|
||||
private Drawable N;
|
||||
private Drawable O;
|
||||
private final BombView P;
|
||||
private final BombView.d Q;
|
||||
private final int R;
|
||||
private final int S;
|
||||
private boolean Z;
|
||||
private BubbleColors a0;
|
||||
@ColorInt
|
||||
private int b0;
|
||||
private MsgListAdapterCallback c0;
|
||||
private Msg d0;
|
||||
private Dialog e0;
|
||||
private int f0;
|
||||
private final h g0 = new h();
|
||||
|
||||
public VhMsg(View itemView, MsgPartHolderBase vhBase) {
|
||||
super(itemView);
|
||||
Context context = itemView.getContext();
|
||||
LayoutInflater var4 = LayoutInflater.from(context);
|
||||
this.b = (FluidHorizontalLayout) itemView;
|
||||
this.c = itemView.findViewById(com.vk.im.ui.h.avatar);
|
||||
this.d = itemView.findViewById(com.vk.im.ui.h.avatar_space);
|
||||
this.e = itemView.findViewById(com.vk.im.ui.h.bubble);
|
||||
this.f = itemView.findViewById(com.vk.im.ui.h.status);
|
||||
this.g = itemView.findViewById(com.vk.im.ui.h.vkim_channel_share);
|
||||
this.h = itemView.findViewById(com.vk.im.ui.h.status_space);
|
||||
this.P = itemView.findViewById(com.vk.im.ui.h.bomb);
|
||||
this.c = (AvatarView) itemView.findViewById(com.vk.im.ui.h.avatar);
|
||||
this.d = (Space) itemView.findViewById(com.vk.im.ui.h.avatar_space);
|
||||
this.e = (MsgBubbleView) itemView.findViewById(com.vk.im.ui.h.bubble);
|
||||
this.f = (MsgStatusView) itemView.findViewById(com.vk.im.ui.h.status);
|
||||
this.g = (ImageView) itemView.findViewById(com.vk.im.ui.h.vkim_channel_share);
|
||||
this.h = (Space) itemView.findViewById(com.vk.im.ui.h.status_space);
|
||||
this.P = (BombView) itemView.findViewById(com.vk.im.ui.h.bomb);
|
||||
this.B = vhBase;
|
||||
this.H = new ColorDrawable(context.getResources().getColor(com.vk.im.ui.d.msg_search_selection));
|
||||
this.I = ContextExtKt.b(context, com.vk.im.ui.e.msg_bubble_max_width);
|
||||
@@ -204,10 +203,6 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
};
|
||||
}
|
||||
|
||||
public static VhMsg a(LayoutInflater var0, ViewGroup var1, MsgPartHolderBase var2) {
|
||||
return new VhMsg(var0.inflate(j.vkim_msg_list_item_msg_from_user, var1, false), var2);
|
||||
}
|
||||
|
||||
private int a(Style var1, Style var2, boolean var3) {
|
||||
int var4;
|
||||
if (var3) {
|
||||
@@ -288,15 +283,20 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
case 103:
|
||||
return VhMsg.Style.EMPTY;
|
||||
default:
|
||||
String var3 = "Unknown viewType: " +
|
||||
var1;
|
||||
throw new IllegalArgumentException(var3);
|
||||
StringBuilder var3 = new StringBuilder();
|
||||
var3.append("Unknown viewType: ");
|
||||
var3.append(var1);
|
||||
throw new IllegalArgumentException(var3.toString());
|
||||
}
|
||||
}
|
||||
|
||||
return VhMsg.Style.TWO_LINE;
|
||||
}
|
||||
|
||||
public static VhMsg a(LayoutInflater var0, ViewGroup var1, MsgPartHolderBase var2) {
|
||||
return new VhMsg(var0.inflate(j.vkim_msg_list_item_msg_from_user, var1, false), var2);
|
||||
}
|
||||
|
||||
private void a(VhBindArgs args, Rect rect) {
|
||||
Style var3 = this.a(args.b);
|
||||
boolean var4 = args.b.f();
|
||||
@@ -411,7 +411,11 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
Msg var10 = var5.c;
|
||||
var9 = var6;
|
||||
if (var10 != null) {
|
||||
var9 = var10.v1() == args.g.t1();
|
||||
if (var10.v1() == args.g.t1()) {
|
||||
var9 = true;
|
||||
} else {
|
||||
var9 = false;
|
||||
}
|
||||
|
||||
if (var10.O1()) {
|
||||
int var12 = var10.d().ordinal();
|
||||
@@ -429,7 +433,11 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
b = args.I();
|
||||
}
|
||||
} else {
|
||||
var6 = var10.C1() <= args.i;
|
||||
if (var10.C1() <= args.i) {
|
||||
var6 = true;
|
||||
} else {
|
||||
var6 = false;
|
||||
}
|
||||
|
||||
if (!var6 && !var9) {
|
||||
var11 = MsgStatus.UNREAD;
|
||||
@@ -567,14 +575,18 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
partArgs.o = args.n;
|
||||
partArgs.s = args.v();
|
||||
partArgs.t = args.q;
|
||||
partArgs.u = !var4.b();
|
||||
partArgs.u = var4.b() ^ true;
|
||||
boolean var5;
|
||||
var5 = var3.i > 0;
|
||||
if (var3.i > 0) {
|
||||
var5 = true;
|
||||
} else {
|
||||
var5 = false;
|
||||
}
|
||||
|
||||
partArgs.v = var5;
|
||||
partArgs.w = args.k;
|
||||
partArgs.x = args.l;
|
||||
partArgs.y = !this.Z;
|
||||
partArgs.y = this.Z ^ true;
|
||||
partArgs.z = args.s;
|
||||
partArgs.A = args.t;
|
||||
partArgs.l = this.b0;
|
||||
@@ -659,7 +671,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
private void f(VhBindArgs args) {
|
||||
Msg var2 = args.b.c;
|
||||
if (var2 != null) {
|
||||
this.P.setStateListener(null);
|
||||
this.P.setStateListener((BombView.d) null);
|
||||
if (var2.M1() && !var2.E1()) {
|
||||
this.P.setVisibility(View.GONE);
|
||||
} else {
|
||||
@@ -798,12 +810,24 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
this.e.setFwdPadding(this.D);
|
||||
this.e.setContentPadding(this.E);
|
||||
boolean var7;
|
||||
var7 = args.b.a == 83;
|
||||
if (args.b.a == 83) {
|
||||
var7 = true;
|
||||
} else {
|
||||
var7 = false;
|
||||
}
|
||||
|
||||
boolean var5;
|
||||
var5 = args.a.a == 83;
|
||||
if (args.a.a == 83) {
|
||||
var5 = true;
|
||||
} else {
|
||||
var5 = false;
|
||||
}
|
||||
|
||||
var5 = !args.F() || !var7 && !var5;
|
||||
if (!args.F() || !var7 && !var5) {
|
||||
var5 = true;
|
||||
} else {
|
||||
var5 = false;
|
||||
}
|
||||
|
||||
MsgBubbleView var8 = this.e;
|
||||
boolean var6 = var4;
|
||||
@@ -880,10 +904,18 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
return false;
|
||||
} else {
|
||||
boolean var5;
|
||||
var5 = var2.a == 50;
|
||||
if (var2.a == 50) {
|
||||
var5 = true;
|
||||
} else {
|
||||
var5 = false;
|
||||
}
|
||||
|
||||
boolean var6;
|
||||
var6 = !args.z() && var2.i == 0;
|
||||
if (!args.z() && var2.i == 0) {
|
||||
var6 = true;
|
||||
} else {
|
||||
var6 = false;
|
||||
}
|
||||
|
||||
if (var5 || var6 || args.y() || args.x()) {
|
||||
var4 = true;
|
||||
@@ -902,7 +934,11 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
|
||||
private boolean u(int var1) {
|
||||
boolean var2;
|
||||
var2 = var1 == 2 || var1 == 3;
|
||||
if (var1 != 2 && var1 != 3) {
|
||||
var2 = false;
|
||||
} else {
|
||||
var2 = true;
|
||||
}
|
||||
|
||||
return var2;
|
||||
}
|
||||
@@ -924,7 +960,9 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
Msg var1 = this.d0;
|
||||
if (var1 != null) {
|
||||
Dialog var2 = this.e0;
|
||||
return var2 != null && MsgPermissionHelper.b.a(var2, var1);
|
||||
if (var2 != null && MsgPermissionHelper.b.a(var2, var1)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -959,7 +997,11 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
|
||||
public void a(VhBindArgs args) {
|
||||
boolean var2;
|
||||
var2 = VKThemeHelper.l() == VKTheme.VKAPP_LIGHT;
|
||||
if (VKThemeHelper.l() == VKTheme.VKAPP_LIGHT) {
|
||||
var2 = true;
|
||||
} else {
|
||||
var2 = false;
|
||||
}
|
||||
|
||||
this.Z = var2;
|
||||
AdapterEntry var3 = args.b;
|
||||
@@ -1020,7 +1062,11 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
|
||||
public boolean f0() {
|
||||
boolean var1;
|
||||
var1 = this.f0 == 100;
|
||||
if (this.f0 == 100) {
|
||||
var1 = true;
|
||||
} else {
|
||||
var1 = false;
|
||||
}
|
||||
|
||||
return var1;
|
||||
}
|
||||
@@ -1037,7 +1083,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
this.B.c(var1);
|
||||
}
|
||||
|
||||
private enum Style {
|
||||
private static enum Style {
|
||||
BUTTON(6),
|
||||
EMPTY(7),
|
||||
FWD_SENDER(4),
|
||||
@@ -1049,14 +1095,14 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
||||
|
||||
public final int index;
|
||||
|
||||
Style(int var3) {
|
||||
private Style(int var3) {
|
||||
this.index = var3;
|
||||
}
|
||||
}
|
||||
|
||||
private class h implements Functions<Unit> {
|
||||
private final int a;
|
||||
private final Runnable b;
|
||||
private int a;
|
||||
private Runnable b;
|
||||
|
||||
private h() {
|
||||
this.a = Screen.a(12);
|
||||
|
||||
@@ -26,23 +26,30 @@ import com.vtosters.lite.R;
|
||||
|
||||
public final class MentionsController {
|
||||
private final RichEditText a;
|
||||
private final ImEngine mImEngine;
|
||||
private final View j;
|
||||
private final b k;
|
||||
|
||||
private boolean state;
|
||||
private CoordinatorLayout mCoordinatorLayout;
|
||||
private VkBottomSheetBehavior<RecyclerView> mBottomSheetBehavior;
|
||||
private boolean e;
|
||||
private final DialogMentionComponent mDialogMentionComponent;
|
||||
private final MentionsManager mMentionsManager;
|
||||
private final int i;
|
||||
private DialogMentionComponent mDialogMentionComponent;
|
||||
private MentionsManager mMentionsManager;
|
||||
private final ImEngine mImEngine;
|
||||
private int i;
|
||||
private final View j;
|
||||
private final b k;
|
||||
|
||||
public interface b {
|
||||
boolean c();
|
||||
|
||||
boolean d();
|
||||
}
|
||||
|
||||
public MentionsController(ImEngine imEngine, int i, View view, b bVar) {
|
||||
this.mImEngine = imEngine;
|
||||
this.i = i;
|
||||
this.j = view;
|
||||
this.k = bVar;
|
||||
this.a = this.j.findViewById(R.id.writebar_edit);
|
||||
this.a = (RichEditText) this.j.findViewById(R.id.writebar_edit);
|
||||
this.mMentionsManager = new MentionsManager(this.a, new MentionSuggestionsSupplier() {
|
||||
|
||||
@Override
|
||||
@@ -64,7 +71,7 @@ public final class MentionsController {
|
||||
|
||||
@Override
|
||||
public void b() {
|
||||
MentionsController.this.mDialogMentionComponent.a(0, null);
|
||||
MentionsController.this.mDialogMentionComponent.a(0, (String) null);
|
||||
MentionsController.this.g();
|
||||
}
|
||||
});
|
||||
@@ -85,18 +92,18 @@ public final class MentionsController {
|
||||
});
|
||||
}
|
||||
|
||||
public void g() {
|
||||
public final void g() {
|
||||
this.e = false;
|
||||
j();
|
||||
}
|
||||
|
||||
private void h() {
|
||||
private final void h() {
|
||||
if (this.state) {
|
||||
return;
|
||||
}
|
||||
View inflate = ((ViewStub) this.j.findViewById(R.id.mentions_container_stub)).inflate();
|
||||
ViewGroup viewGroup = inflate.findViewById(R.id.mentions_container);
|
||||
viewGroup.addView(this.mDialogMentionComponent.a(viewGroup, null));
|
||||
ViewGroup viewGroup = (ViewGroup) inflate.findViewById(R.id.mentions_container);
|
||||
viewGroup.addView(this.mDialogMentionComponent.a(viewGroup, (Bundle) null));
|
||||
this.mCoordinatorLayout = inflate.findViewById(R.id.mentions_cl);
|
||||
this.mBottomSheetBehavior = (VkBottomSheetBehavior<RecyclerView>) ((CoordinatorLayout.LayoutParams) viewGroup.getLayoutParams()).getBehavior();
|
||||
this.mBottomSheetBehavior.a(new VkBottomSheetBehavior.b() {
|
||||
@@ -113,12 +120,12 @@ public final class MentionsController {
|
||||
this.state = true;
|
||||
}
|
||||
|
||||
public void i() {
|
||||
public final void i() {
|
||||
this.e = true;
|
||||
j();
|
||||
}
|
||||
|
||||
public void j() {
|
||||
public final void j() {
|
||||
if (this.k.d()) {
|
||||
Context context = this.j.getContext();
|
||||
Activity f = ContextExtKt.f(context);
|
||||
@@ -132,33 +139,27 @@ public final class MentionsController {
|
||||
}
|
||||
}
|
||||
|
||||
public void a() {
|
||||
public final void a() {
|
||||
this.mDialogMentionComponent.g();
|
||||
}
|
||||
|
||||
public void b() {
|
||||
public final void b() {
|
||||
this.mDialogMentionComponent.h();
|
||||
}
|
||||
|
||||
public b c() {
|
||||
public final b c() {
|
||||
return this.k;
|
||||
}
|
||||
|
||||
public int d() {
|
||||
public final int d() {
|
||||
return this.i;
|
||||
}
|
||||
|
||||
public void e() {
|
||||
public final void e() {
|
||||
this.mDialogMentionComponent.q();
|
||||
}
|
||||
|
||||
public void f() {
|
||||
public final void f() {
|
||||
this.mDialogMentionComponent.r();
|
||||
}
|
||||
|
||||
public interface b {
|
||||
boolean c();
|
||||
|
||||
boolean d();
|
||||
}
|
||||
}
|
||||
@@ -12,15 +12,15 @@ import android.view.ViewGroup;
|
||||
import com.vk.im.ui.o;
|
||||
|
||||
public class StoryBorderView extends View {
|
||||
private final Paint a;
|
||||
private final int g;
|
||||
private final int h;
|
||||
private boolean B;
|
||||
private final Paint a;
|
||||
private LinearGradient f15747b;
|
||||
private int f15748c;
|
||||
private int f15749d;
|
||||
private int f15750e;
|
||||
private int f15751f;
|
||||
private final int g;
|
||||
private final int h;
|
||||
|
||||
public StoryBorderView(Context context) {
|
||||
this(context, null, 0, 6);
|
||||
@@ -34,32 +34,10 @@ public class StoryBorderView extends View {
|
||||
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
|
||||
}
|
||||
|
||||
public StoryBorderView(Context context, AttributeSet attributeSet, int i) {
|
||||
super(context, attributeSet, i);
|
||||
Paint paint = new Paint();
|
||||
paint.setAntiAlias(true);
|
||||
paint.setStyle(Paint.Style.STROKE);
|
||||
this.a = paint;
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, o.StoryBorderView);
|
||||
setBorderColor(obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderColor, 0));
|
||||
this.g = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientStartColor, 0);
|
||||
this.h = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientEndColor, 0);
|
||||
setBorderWidth(obtainStyledAttributes.getDimensionPixelSize(o.StoryBorderView_vkim_borderWidth, 0));
|
||||
obtainStyledAttributes.recycle();
|
||||
}
|
||||
|
||||
public int getBorderColor() {
|
||||
return this.f15749d;
|
||||
}
|
||||
|
||||
public void setBorderColor(int i) {
|
||||
if (this.f15749d != i) {
|
||||
this.f15749d = i;
|
||||
this.a.setColor(i);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public int getBorderGradientEndColor() {
|
||||
return this.h;
|
||||
}
|
||||
@@ -72,33 +50,14 @@ public class StoryBorderView extends View {
|
||||
return this.f15750e;
|
||||
}
|
||||
|
||||
public void setBorderWidth(int i) {
|
||||
if (this.f15750e != i) {
|
||||
this.f15750e = i;
|
||||
this.a.setStrokeWidth(i);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public int getPadding() {
|
||||
return this.f15751f;
|
||||
}
|
||||
|
||||
public void setPadding(int i) {
|
||||
if (this.f15751f != i) {
|
||||
this.f15751f = i;
|
||||
setPadding(i, i, i, i);
|
||||
}
|
||||
}
|
||||
|
||||
public int getViewSize() {
|
||||
return this.f15748c;
|
||||
}
|
||||
|
||||
public void setViewSize(int i) {
|
||||
this.f15748c = i;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
canvas.drawOval(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom(), this.a);
|
||||
@@ -110,6 +69,22 @@ public class StoryBorderView extends View {
|
||||
setMeasuredDimension(i3, i3);
|
||||
}
|
||||
|
||||
public void setBorderColor(int i) {
|
||||
if (this.f15749d != i) {
|
||||
this.f15749d = i;
|
||||
this.a.setColor(i);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public void setBorderWidth(int i) {
|
||||
if (this.f15750e != i) {
|
||||
this.f15750e = i;
|
||||
this.a.setStrokeWidth(i);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
|
||||
super.setLayoutParams(layoutParams);
|
||||
@@ -133,4 +108,29 @@ public class StoryBorderView extends View {
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public void setPadding(int i) {
|
||||
if (this.f15751f != i) {
|
||||
this.f15751f = i;
|
||||
setPadding(i, i, i, i);
|
||||
}
|
||||
}
|
||||
|
||||
public void setViewSize(int i) {
|
||||
this.f15748c = i;
|
||||
}
|
||||
|
||||
public StoryBorderView(Context context, AttributeSet attributeSet, int i) {
|
||||
super(context, attributeSet, i);
|
||||
Paint paint = new Paint();
|
||||
paint.setAntiAlias(true);
|
||||
paint.setStyle(Paint.Style.STROKE);
|
||||
this.a = paint;
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, o.StoryBorderView);
|
||||
setBorderColor(obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderColor, 0));
|
||||
this.g = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientStartColor, 0);
|
||||
this.h = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientEndColor, 0);
|
||||
setBorderWidth(obtainStyledAttributes.getDimensionPixelSize(o.StoryBorderView_vkim_borderWidth, 0));
|
||||
obtainStyledAttributes.recycle();
|
||||
}
|
||||
}
|
||||
@@ -23,8 +23,8 @@ import com.vtosters.lite.R;
|
||||
import com.vtosters.lite.ViewUtils;
|
||||
import com.vtosters.lite.ui.MusicErrorViewHelper;
|
||||
import com.vtosters.lite.ui.holder.RecyclerHolder;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.lite.music.Genius;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@@ -36,37 +36,37 @@ public final class CommunityBorderedImageView extends BorderedCircleImageView im
|
||||
|
||||
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i) {
|
||||
super(context, attributeSet, i);
|
||||
this.g0 = VKThemeHelper.d(R.attr.accent);
|
||||
this.h0 = ContextExtKt.a(context, R.color.gray_200);
|
||||
this.g0 = VKThemeHelper.d((int) R.attr.accent);
|
||||
this.h0 = ContextExtKt.a(context, (int) R.color.gray_200);
|
||||
this.i0 = new PorterDuffColorFilter(this.g0, PorterDuff.Mode.SRC_IN);
|
||||
this.j0 = new PorterDuffColorFilter(this.h0, PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
|
||||
public void c(int unread, int read) { // get unread and read resid
|
||||
public final void c(int unread, int read) { // get unread and read resid
|
||||
this.unread = unread;
|
||||
this.read = read;
|
||||
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
|
||||
}
|
||||
|
||||
public int getPrimaryColor() {
|
||||
public final int getPrimaryColor() {
|
||||
return this.g0;
|
||||
}
|
||||
|
||||
public void setPrimaryColor(int i) {
|
||||
public final void setPrimaryColor(int i) {
|
||||
this.g0 = i;
|
||||
this.i0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
|
||||
public int getWasViewedColor() {
|
||||
public final int getWasViewedColor() {
|
||||
return this.h0;
|
||||
}
|
||||
|
||||
public void setWasViewedColor(int i) {
|
||||
public final void setWasViewedColor(int i) {
|
||||
this.h0 = i;
|
||||
this.j0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
|
||||
public void o() {
|
||||
public final void o() {
|
||||
this.f0 = false;
|
||||
l();
|
||||
}
|
||||
@@ -79,7 +79,7 @@ public final class CommunityBorderedImageView extends BorderedCircleImageView im
|
||||
}
|
||||
}
|
||||
|
||||
public void setStoryContainer(StoriesContainer storiesContainer) {
|
||||
public final void setStoryContainer(StoriesContainer storiesContainer) {
|
||||
if (storiesContainer.L1()) {
|
||||
this.f0 = true;
|
||||
m();
|
||||
|
||||
@@ -30,14 +30,14 @@ public class TargetImageView extends VKMultiImageView {
|
||||
private static final int I = Screen.a(2);
|
||||
private final int B;
|
||||
private final int C;
|
||||
private final RectF f21629d;
|
||||
private final Paint f21630e;
|
||||
private final RectF g;
|
||||
private final Paint h;
|
||||
private Drawable D;
|
||||
private String[] F;
|
||||
private int G;
|
||||
private final RectF f21629d;
|
||||
private final Paint f21630e;
|
||||
private Canvas f21631f;
|
||||
private final RectF g;
|
||||
private final Paint h;
|
||||
|
||||
public TargetImageView(Context context, Drawable d) {
|
||||
this(context, null, 0, 6);
|
||||
@@ -51,43 +51,6 @@ public class TargetImageView extends VKMultiImageView {
|
||||
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
|
||||
}
|
||||
|
||||
public TargetImageView(Context context, AttributeSet attributeSet, int i) {
|
||||
super(context, attributeSet, i);
|
||||
this.f21629d = new RectF();
|
||||
Paint paint = new Paint();
|
||||
paint.setAntiAlias(true);
|
||||
paint.setDither(true);
|
||||
paint.setFilterBitmap(true);
|
||||
this.f21630e = paint;
|
||||
this.g = new RectF();
|
||||
Paint paint2 = new Paint();
|
||||
paint2.setAntiAlias(true);
|
||||
paint2.setStrokeWidth(I);
|
||||
paint2.setStyle(Paint.Style.STROKE);
|
||||
this.h = paint2;
|
||||
this.B = getAccentColor();
|
||||
this.C = this.B;
|
||||
Drawable c2 = ContextExtKt.c(context, R.drawable.ic_check_circle_composite_24_full);
|
||||
if (c2 != null) {
|
||||
this.D = c2;
|
||||
this.F = new String[4];
|
||||
int i2 = I * 2;
|
||||
setPadding(i2, i2, i2, i2);
|
||||
if (attributeSet != null) {
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, a0.TargetImageView);
|
||||
setSelected(obtainStyledAttributes.getBoolean(0, false));
|
||||
obtainStyledAttributes.recycle();
|
||||
}
|
||||
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.user_placeholder);
|
||||
for (int i3 = 0; i3 <= 3; i3++) {
|
||||
a();
|
||||
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(i3);
|
||||
a3.b().e(drawable);
|
||||
}
|
||||
setScaleType(ScalingUtils.b.o);
|
||||
}
|
||||
}
|
||||
|
||||
private void e() {
|
||||
int i = this.G;
|
||||
for (int i2 = 0; i2 < i; i2++) {
|
||||
@@ -288,4 +251,41 @@ public class TargetImageView extends VKMultiImageView {
|
||||
drawable.setBounds(i - drawable.getIntrinsicWidth(), i2 - this.D.getIntrinsicHeight(), i, i2);
|
||||
f();
|
||||
}
|
||||
|
||||
public TargetImageView(Context context, AttributeSet attributeSet, int i) {
|
||||
super(context, attributeSet, i);
|
||||
this.f21629d = new RectF();
|
||||
Paint paint = new Paint();
|
||||
paint.setAntiAlias(true);
|
||||
paint.setDither(true);
|
||||
paint.setFilterBitmap(true);
|
||||
this.f21630e = paint;
|
||||
this.g = new RectF();
|
||||
Paint paint2 = new Paint();
|
||||
paint2.setAntiAlias(true);
|
||||
paint2.setStrokeWidth(I);
|
||||
paint2.setStyle(Paint.Style.STROKE);
|
||||
this.h = paint2;
|
||||
this.B = getAccentColor();
|
||||
this.C = this.B;
|
||||
Drawable c2 = ContextExtKt.c(context, R.drawable.ic_check_circle_composite_24_full);
|
||||
if (c2 != null) {
|
||||
this.D = c2;
|
||||
this.F = new String[4];
|
||||
int i2 = I * 2;
|
||||
setPadding(i2, i2, i2, i2);
|
||||
if (attributeSet != null) {
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, a0.TargetImageView);
|
||||
setSelected(obtainStyledAttributes.getBoolean(0, false));
|
||||
obtainStyledAttributes.recycle();
|
||||
}
|
||||
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.user_placeholder);
|
||||
for (int i3 = 0; i3 <= 3; i3++) {
|
||||
a();
|
||||
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(i3);
|
||||
a3.b().e(drawable);
|
||||
}
|
||||
setScaleType(ScalingUtils.b.o);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -104,25 +104,6 @@ public final class StickerDetailsAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
}
|
||||
}
|
||||
|
||||
private static final class d extends RecyclerView.ViewHolder {
|
||||
private final VKStickerImageView mImage;
|
||||
|
||||
public d(ViewGroup viewGroup) {
|
||||
super(new VKStickerImageView(viewGroup.getContext()));
|
||||
this.mImage = (VKStickerImageView) itemView;
|
||||
this.mImage.setAspectRatio(1.0f);
|
||||
this.mImage.setClickable(true);
|
||||
this.mImage.getHierarchy().a().setVisible(true, true);
|
||||
this.mImage.getHierarchy().a(0);
|
||||
this.mImage.setContentDescription(this.mImage.getContext().getString(R.string.stickers_accessibility_sticker));
|
||||
}
|
||||
|
||||
public void a(StickerItem stickerItem) {
|
||||
this.mImage.a(stickerItem.h(Screen.a(80)));
|
||||
this.mImage.setTag(R.id.id, stickerItem.getId());
|
||||
}
|
||||
}
|
||||
|
||||
private final class c extends RecyclerView.ViewHolder {
|
||||
private final VKImageView mImageBg;
|
||||
private final VKImageView mPackImage;
|
||||
@@ -168,4 +149,23 @@ public final class StickerDetailsAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
this.mDescription.setText(stickerStockItem.C1());
|
||||
}
|
||||
}
|
||||
|
||||
private static final class d extends RecyclerView.ViewHolder {
|
||||
private final VKStickerImageView mImage;
|
||||
|
||||
public d(ViewGroup viewGroup) {
|
||||
super(new VKStickerImageView(viewGroup.getContext()));
|
||||
this.mImage = (VKStickerImageView) itemView;
|
||||
this.mImage.setAspectRatio(1.0f);
|
||||
this.mImage.setClickable(true);
|
||||
this.mImage.getHierarchy().a().setVisible(true, true);
|
||||
this.mImage.getHierarchy().a(0);
|
||||
this.mImage.setContentDescription(this.mImage.getContext().getString(R.string.stickers_accessibility_sticker));
|
||||
}
|
||||
|
||||
public void a(StickerItem stickerItem) {
|
||||
this.mImage.a(stickerItem.h(Screen.a(80)));
|
||||
this.mImage.setTag(R.id.id, stickerItem.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -382,7 +382,7 @@ public class StoryCircleImageView extends BorderedCircleImageView implements The
|
||||
return;
|
||||
}
|
||||
|
||||
pipelineDraweeControllerBuilder.a(() -> StoryCircleImageView.this.a(list));
|
||||
pipelineDraweeControllerBuilder.a((Supplier<DataSource<CloseableReference<CloseableImage>>>) () -> StoryCircleImageView.this.a(list));
|
||||
return;
|
||||
}
|
||||
pipelineDraweeControllerBuilder.b(null);
|
||||
|
||||
+8
-8
@@ -35,16 +35,16 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
|
||||
private final View mCounterContainer;
|
||||
private final TextView mCounter;
|
||||
private final View mDot;
|
||||
private final int mMargin;
|
||||
private final float mSmallScale;
|
||||
private final ImageView mIcon;
|
||||
private final ImageView mActionIcon;
|
||||
private int mItemPos;
|
||||
private MenuItemImpl mItemData;
|
||||
private ColorStateList mColorStateList;
|
||||
private final int mMargin;
|
||||
private final float mSmallScale;
|
||||
private boolean mShiftingModeEnabled;
|
||||
private boolean mIconsModeEnabled;
|
||||
private boolean mStaticModeEnabled;
|
||||
private final ImageView mIcon;
|
||||
private final ImageView mActionIcon;
|
||||
|
||||
public BottomNavigationItemView(@NonNull Context context) {
|
||||
this(context, null);
|
||||
@@ -101,10 +101,6 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
|
||||
return this.mItemPos;
|
||||
}
|
||||
|
||||
public void setItemPosition(int pos) {
|
||||
this.mItemPos = pos;
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
public void initialize(MenuItemImpl impl, int i) {
|
||||
this.mItemData = impl;
|
||||
@@ -314,6 +310,10 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
|
||||
ViewCompat.setBackground(this, resId != 0 ? ContextCompat.getDrawable(this.getContext(), resId) : null);
|
||||
}
|
||||
|
||||
public void setItemPosition(int pos) {
|
||||
this.mItemPos = pos;
|
||||
}
|
||||
|
||||
public void setShiftingMode(boolean var1) {
|
||||
this.mShiftingModeEnabled = var1;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ public class GcmHook {
|
||||
private static final String agent = String.format("Android-GCM/1.5 (%s %s)", Build.MODEL, Build.MODEL);
|
||||
private static KeyPair pair;
|
||||
private static int rid = 0;
|
||||
|
||||
|
||||
static {
|
||||
genNewKey();
|
||||
}
|
||||
|
||||
@@ -6,9 +6,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.vk.core.preference.Preference;
|
||||
import com.vk.discover.DiscoverItemDecorator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
import static java.lang.Long.MAX_VALUE;
|
||||
import static ru.vtosters.hooks.other.Preferences.*;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package ru.vtosters.hooks;
|
||||
|
||||
import androidx.core.util.Pair;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import ru.vtosters.lite.utils.RenameTool;
|
||||
|
||||
public class RenameHook {
|
||||
public static void injectIntoJson(JSONObject obj) throws JSONException {
|
||||
|
||||
@@ -16,10 +16,12 @@ import android.webkit.WebView;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import com.vk.articles.preload.WebCachePreloader;
|
||||
import com.vk.core.drawable.RecoloredDrawable;
|
||||
import com.vk.core.preference.Preference;
|
||||
import com.vk.core.ui.themes.MilkshakeHelper;
|
||||
import com.vk.core.ui.themes.VKTheme;
|
||||
import com.vk.core.ui.themes.VKThemeHelper;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package ru.vtosters.hooks.ssfs;
|
||||
|
||||
import com.vk.core.dialogs.alert.VkAlertDialog;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.lite.ssfs.ImBanner;
|
||||
|
||||
@@ -4,8 +4,8 @@ import android.text.TextUtils;
|
||||
|
||||
public class TransportStream {
|
||||
|
||||
private final String mMediaSegmentUri;
|
||||
private String mKeyUri;
|
||||
private final String mMediaSegmentUri;
|
||||
private String mMediaSegmentName;
|
||||
|
||||
public TransportStream(String baseURI, String mediaSegmentName) {
|
||||
|
||||
@@ -15,9 +15,10 @@ public class VKM3UParser {
|
||||
//Playlist types
|
||||
static public int PLAYLIST_TYPE_VOD = 0;
|
||||
static public int PLAYLIST_TYPE_EVENT = 1;
|
||||
private final String mData;
|
||||
|
||||
//region Extended M3U global extensions
|
||||
public List<TransportStream> mTransportStreams = new ArrayList<>();
|
||||
private final String mData;
|
||||
/**
|
||||
* @see <a href="https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.1.2">EXT-X-VERSION</a>
|
||||
**/
|
||||
|
||||
@@ -19,8 +19,8 @@ import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import java.io.IOException;
|
||||
|
||||
import static ru.vtosters.hooks.DateHook.getLocale;
|
||||
import static ru.vtosters.hooks.GroupsCatalogInjector.injectIntoCatalog;
|
||||
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
|
||||
import static ru.vtosters.hooks.GroupsCatalogInjector.injectIntoCatalog;
|
||||
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.*;
|
||||
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
|
||||
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
|
||||
|
||||
@@ -1,25 +1,29 @@
|
||||
package ru.vtosters.lite.themes.utils;
|
||||
|
||||
import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;
|
||||
import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceValue;
|
||||
import com.google.devrel.gmscore.tools.apk.arsc.ResourceTableChunk;
|
||||
import com.google.devrel.gmscore.tools.apk.arsc.*;
|
||||
|
||||
public class ArscEditor {
|
||||
|
||||
public static void changeColors(BinaryResourceFile arsc, int[] colorIds, int color) {
|
||||
for (var chunk : arsc.getChunks()) {
|
||||
final var resTableChunk = (ResourceTableChunk) chunk;
|
||||
for (var packageChunk : resTableChunk.getPackages()) {
|
||||
for (var typeChunk : packageChunk.getTypeChunks("color")) {
|
||||
for (var entry : typeChunk.getEntries().entrySet()) {
|
||||
final var value = entry.getValue();
|
||||
if (value.isComplex()) continue;
|
||||
final var binValue = value.value();
|
||||
if (!isColorResourceValue(binValue)) continue;
|
||||
final var resId = packageChunk.getId() << 24 | typeChunk.getId() << 16 | entry.getKey();
|
||||
for (var colodId : colorIds) {
|
||||
if (resId == colodId) {
|
||||
binValue.data = color;
|
||||
public static void changeColors(BinaryResourceFile arsc,int[] colorIds,int color) {
|
||||
for(var chunk:arsc.getChunks())
|
||||
{
|
||||
final var resTableChunk=(ResourceTableChunk)chunk;
|
||||
for(var packageChunk:resTableChunk.getPackages())
|
||||
{
|
||||
for(var typeChunk:packageChunk.getTypeChunks("color"))
|
||||
{
|
||||
for(var entry:typeChunk.getEntries().entrySet())
|
||||
{
|
||||
final var value=entry.getValue();
|
||||
if(value.isComplex())continue;
|
||||
final var binValue=value.value();
|
||||
if(!isColorResourceValue(binValue))continue;
|
||||
final var resId=packageChunk.getId()<<24|typeChunk.getId()<<16|entry.getKey();
|
||||
for(var colodId:colorIds)
|
||||
{
|
||||
if(resId==colodId)
|
||||
{
|
||||
binValue.data=color;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -29,10 +33,11 @@ public class ArscEditor {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isColorResourceValue(BinaryResourceValue value) {
|
||||
return value.type == BinaryResourceValue.Type.INT_COLOR_ARGB8
|
||||
|| value.type == BinaryResourceValue.Type.INT_COLOR_RGB8
|
||||
|| value.type == BinaryResourceValue.Type.INT_COLOR_ARGB4
|
||||
|| value.type == BinaryResourceValue.Type.INT_COLOR_RGB4;
|
||||
private static boolean isColorResourceValue(BinaryResourceValue value)
|
||||
{
|
||||
return value.type==BinaryResourceValue.Type.INT_COLOR_ARGB8
|
||||
||value.type==BinaryResourceValue.Type.INT_COLOR_RGB8
|
||||
||value.type==BinaryResourceValue.Type.INT_COLOR_ARGB4
|
||||
||value.type==BinaryResourceValue.Type.INT_COLOR_RGB4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class CategorizedAdapter<T> extends RecyclerView.Adapter<CategorizedAdapt
|
||||
private final List<T> mSelectedItems;
|
||||
private final List<T> mDisabledItems;
|
||||
private final List<T> mUnmovedItems;
|
||||
final private List<T> mExceptions = new ArrayList<>();
|
||||
final private List< T > mExceptions=new ArrayList<>();
|
||||
private final IViewHolderBinder mBinder;
|
||||
|
||||
// Min and max counts
|
||||
@@ -50,7 +50,8 @@ public class CategorizedAdapter<T> extends RecyclerView.Adapter<CategorizedAdapt
|
||||
this.mBinder = binder;
|
||||
}
|
||||
|
||||
public void setExceptions(T... exceptions) {
|
||||
public void setExceptions(T... exceptions)
|
||||
{
|
||||
mExceptions.clear();
|
||||
mExceptions.addAll(Arrays.asList(exceptions));
|
||||
}
|
||||
@@ -182,18 +183,21 @@ public class CategorizedAdapter<T> extends RecyclerView.Adapter<CategorizedAdapt
|
||||
return false;
|
||||
switch (getTabType(fromPosition)) {
|
||||
case SELECTED_STATE -> {
|
||||
if ((getTabType(toPosition) == DISABLED_STATE
|
||||
if((getTabType(toPosition) == DISABLED_STATE
|
||||
&& mSelectedItems.size() == mMinSelectedItems))
|
||||
return false;
|
||||
if (getItemViewType(toPosition) == CATEGORY_TITLE) {
|
||||
if (mExceptions.size() > 0) {
|
||||
int q = 0;
|
||||
for (var ex : mExceptions)
|
||||
if (mSelectedItems.contains(ex)) ++q;
|
||||
if (q == 1) return false;
|
||||
if (getItemViewType(toPosition) == CATEGORY_TITLE)
|
||||
{
|
||||
if(mExceptions.size()>0)
|
||||
{
|
||||
int q=0;
|
||||
for(var ex:mExceptions)
|
||||
if(mSelectedItems.contains(ex))++q;
|
||||
if(q==1)return false;
|
||||
}
|
||||
mDisabledItems.add(0, mSelectedItems.remove(fromPosition - 1));
|
||||
} else Collections.swap(mSelectedItems, fromPosition - 1, toPosition - 1);
|
||||
mDisabledItems.add(0,mSelectedItems.remove(fromPosition-1));
|
||||
}
|
||||
else Collections.swap(mSelectedItems, fromPosition - 1, toPosition - 1);
|
||||
}
|
||||
case DISABLED_STATE -> {
|
||||
if (getTabType(toPosition) == SELECTED_STATE
|
||||
|
||||
@@ -59,6 +59,70 @@ public class DockBarEditorManager {
|
||||
: sInstance;
|
||||
}
|
||||
|
||||
private void init() {
|
||||
if (vkme()) {
|
||||
mSelectedTabs.add(getTabByTag("tab_settings"));
|
||||
if (vkme_notifs()) {
|
||||
if (milkshake()) {
|
||||
mSelectedTabs.add(getTabByTag("tab_feedback"));
|
||||
} else {
|
||||
mSelectedTabs.add(getTabByTag("tab_friends"));
|
||||
}
|
||||
}
|
||||
mSelectedTabs.add(getTabByTag("tab_messages"));
|
||||
mSelectedTabs.add(getTabByTag("tab_profile"));
|
||||
return;
|
||||
}
|
||||
|
||||
checkOldConfig();
|
||||
|
||||
var selectedTabsTags = getPreferences()
|
||||
.getString("dockbar_tabs",
|
||||
"tab_news,tab_superapps,tab_messages,tab_friends,tab_profile")
|
||||
.split(",");
|
||||
parseSelectedTabs(selectedTabsTags);
|
||||
}
|
||||
|
||||
private void checkOldConfig() {
|
||||
File config = new File(getGlobalContext().getFilesDir(), "dockbar.json");
|
||||
if (config.exists()) config.deleteOnExit();
|
||||
}
|
||||
|
||||
private void parseSelectedTabs(String[] selectedTabsTags) {
|
||||
var allTags = new ArrayList<>(ALL_TAGS);
|
||||
|
||||
for (String tag : selectedTabsTags) {
|
||||
mSelectedTabs.add(getTabByTag(tag));
|
||||
allTags.remove(tag);
|
||||
}
|
||||
|
||||
for (String tag : allTags) {
|
||||
mDisabledTabs.add(getTabByTag(tag));
|
||||
}
|
||||
}
|
||||
|
||||
public void save() {
|
||||
var sb = new StringBuilder();
|
||||
for (DockBarTab tab : mSelectedTabs)
|
||||
sb.append(tab.tag).append(",");
|
||||
getPreferences().edit().putString("dockbar_tabs", sb.toString()).commit();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
Preferences.getPreferences()
|
||||
.edit()
|
||||
.putString("dockbar_tabs", "tab_news,tab_superapps,tab_messages,tab_friends,tab_profile")
|
||||
.commit();
|
||||
}
|
||||
|
||||
public List<DockBarTab> getSelectedTabs() {
|
||||
return mSelectedTabs;
|
||||
}
|
||||
|
||||
public List<DockBarTab> getDisabledTabs() {
|
||||
return mDisabledTabs;
|
||||
}
|
||||
|
||||
public static DockBarTab getTabByTag(String tag) {
|
||||
return switch (tag) {
|
||||
case "tab_news" -> DockBarTab.valuesOf(
|
||||
@@ -171,68 +235,4 @@ public class DockBarEditorManager {
|
||||
useNewSettings());
|
||||
};
|
||||
}
|
||||
|
||||
private void init() {
|
||||
if (vkme()) {
|
||||
mSelectedTabs.add(getTabByTag("tab_settings"));
|
||||
if (vkme_notifs()) {
|
||||
if (milkshake()) {
|
||||
mSelectedTabs.add(getTabByTag("tab_feedback"));
|
||||
} else {
|
||||
mSelectedTabs.add(getTabByTag("tab_friends"));
|
||||
}
|
||||
}
|
||||
mSelectedTabs.add(getTabByTag("tab_messages"));
|
||||
mSelectedTabs.add(getTabByTag("tab_profile"));
|
||||
return;
|
||||
}
|
||||
|
||||
checkOldConfig();
|
||||
|
||||
var selectedTabsTags = getPreferences()
|
||||
.getString("dockbar_tabs",
|
||||
"tab_news,tab_superapps,tab_messages,tab_friends,tab_profile")
|
||||
.split(",");
|
||||
parseSelectedTabs(selectedTabsTags);
|
||||
}
|
||||
|
||||
private void checkOldConfig() {
|
||||
File config = new File(getGlobalContext().getFilesDir(), "dockbar.json");
|
||||
if (config.exists()) config.deleteOnExit();
|
||||
}
|
||||
|
||||
private void parseSelectedTabs(String[] selectedTabsTags) {
|
||||
var allTags = new ArrayList<>(ALL_TAGS);
|
||||
|
||||
for (String tag : selectedTabsTags) {
|
||||
mSelectedTabs.add(getTabByTag(tag));
|
||||
allTags.remove(tag);
|
||||
}
|
||||
|
||||
for (String tag : allTags) {
|
||||
mDisabledTabs.add(getTabByTag(tag));
|
||||
}
|
||||
}
|
||||
|
||||
public void save() {
|
||||
var sb = new StringBuilder();
|
||||
for (DockBarTab tab : mSelectedTabs)
|
||||
sb.append(tab.tag).append(",");
|
||||
getPreferences().edit().putString("dockbar_tabs", sb.toString()).commit();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
Preferences.getPreferences()
|
||||
.edit()
|
||||
.putString("dockbar_tabs", "tab_news,tab_superapps,tab_messages,tab_friends,tab_profile")
|
||||
.commit();
|
||||
}
|
||||
|
||||
public List<DockBarTab> getSelectedTabs() {
|
||||
return mSelectedTabs;
|
||||
}
|
||||
|
||||
public List<DockBarTab> getDisabledTabs() {
|
||||
return mDisabledTabs;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,18 +168,12 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme
|
||||
|
||||
var pref = Preferences.getPreferences().getString("autoclearcache", "Default");
|
||||
switch (pref) {
|
||||
case "Default" ->
|
||||
findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_disabled));
|
||||
case "100mb" ->
|
||||
findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_100mb));
|
||||
case "500mb" ->
|
||||
findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_500mb));
|
||||
case "1gb" ->
|
||||
findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_1gb));
|
||||
case "2gb" ->
|
||||
findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_2gb));
|
||||
case "5gb" ->
|
||||
findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_5gb));
|
||||
case "Default" -> findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_disabled));
|
||||
case "100mb" -> findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_100mb));
|
||||
case "500mb" -> findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_500mb));
|
||||
case "1gb" -> findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_1gb));
|
||||
case "2gb" -> findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_2gb));
|
||||
case "5gb" -> findPreference("autoclearcache_btn").setSummary(requireContext().getString(com.vtosters.lite.R.string.cache_5gb));
|
||||
}
|
||||
|
||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("accounts"));
|
||||
|
||||
@@ -1,16 +1,35 @@
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.*;
|
||||
import android.os.Bundle;
|
||||
import android.util.TypedValue;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.Toast;
|
||||
import androidx.appcompat.view.ContextThemeWrapper;
|
||||
import b.h.g.m.FileUtils;
|
||||
import com.vk.auth.api.VKAccount;
|
||||
import com.vk.core.dialogs.alert.VkAlertDialog;
|
||||
import com.vk.core.util.ToastUtils;
|
||||
import com.vk.im.engine.ImEngine1;
|
||||
import com.vk.im.engine.ImEngineExt;
|
||||
import com.vk.im.ui.providers.audiomsg.ImAudioMsgPlayerProvider;
|
||||
import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
|
||||
import com.vk.imageloader.VKImageLoader;
|
||||
import com.vk.media.player.cache.AutoPlayCacheHolder;
|
||||
import com.vk.mediastore.MediaStorage;
|
||||
import com.vk.pushes.PushSubscriber;
|
||||
import com.vk.stickers.Stickers;
|
||||
import com.vtosters.lite.R;
|
||||
import com.vtosters.lite.auth.VKAccountManager;
|
||||
import com.vtosters.lite.im.ImEngineProvider;
|
||||
import ru.vtosters.hooks.GmsHook;
|
||||
import ru.vtosters.hooks.SwitchHook;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.hooks.other.ThemesUtils;
|
||||
import ru.vtosters.lite.deviceinfo.DeviceInfoCollector;
|
||||
import ru.vtosters.lite.ssfs.UsersList;
|
||||
import ru.vtosters.lite.ui.activities.VKAdminTokenActivity;
|
||||
@@ -129,6 +148,7 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void copyText(String src) {
|
||||
var manager = (ClipboardManager) requireContext().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
manager.setPrimaryClip(ClipData.newPlainText("MBH-ST", src));
|
||||
|
||||
@@ -2,7 +2,8 @@ package ru.vtosters.lite.ui.items;
|
||||
|
||||
import com.vk.core.fragments.FragmentImpl;
|
||||
|
||||
public class DockBarTab {
|
||||
public class DockBarTab
|
||||
{
|
||||
|
||||
public String tag;
|
||||
public int iconID;
|
||||
@@ -33,7 +34,8 @@ public class DockBarTab {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object arg) {
|
||||
return this.id == ((DockBarTab) arg).id;
|
||||
public boolean equals(Object arg)
|
||||
{
|
||||
return this.id==((DockBarTab)arg).id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package ru.vtosters.lite.ui.items;
|
||||
|
||||
public class SuperAppItem {
|
||||
import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
|
||||
|
||||
public class SuperAppItem
|
||||
{
|
||||
|
||||
public String type;
|
||||
public String title;
|
||||
@@ -15,8 +18,9 @@ public class SuperAppItem {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object arg) {
|
||||
var item = (SuperAppItem) arg;
|
||||
return this.type.equals(item.type) && this.title.equals(item.title);
|
||||
public boolean equals(Object arg)
|
||||
{
|
||||
var item=(SuperAppItem)arg;
|
||||
return this.type.equals(item.type)&&this.title.equals(item.title);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.lite.foaf.FoafBase;
|
||||
import ru.vtosters.lite.utils.AccountManagerUtils;
|
||||
import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.lite.utils.RenameTool;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
@@ -5,8 +5,12 @@ import android.graphics.BitmapFactory;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import com.vk.im.engine.h;
|
||||
import com.vtosters.lite.R;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.hooks.other.ThemesUtils;
|
||||
import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import vigo.sdk.Log;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user