Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
281a0e8499 | ||
|
|
220c61afe1 | ||
|
|
7a632d5224 | ||
|
|
3218c1a46b | ||
|
|
b2028d86ba | ||
|
|
45ed5879e6 | ||
|
|
48479dd064 | ||
|
|
3b556b81a1 | ||
|
|
526c9a607a | ||
|
|
81752895ab | ||
|
|
ad970d097a | ||
|
|
bc2010b49d | ||
|
|
ff4a4094ff | ||
|
|
3629e71098 | ||
|
|
b955ac355f | ||
|
|
409279eca0 | ||
|
|
ea0a0f1d93 | ||
|
|
3cc81dfddc | ||
|
|
86041e6031 | ||
|
|
e140ce2661 | ||
|
|
f6f15132a2 | ||
|
|
e73751ecf3 | ||
|
|
3c0516b4cd | ||
|
|
38d9f4a818 | ||
|
|
207fa4f2e7 | ||
|
|
f9f778b8f4 | ||
|
|
962dcdec67 | ||
|
|
486026b8aa | ||
|
|
e78d08fb94 | ||
|
|
a5e81dbd87 | ||
|
|
49051dae9a | ||
|
|
94236c87e3 | ||
|
|
449ba8c768 | ||
|
|
0da81c01e9 | ||
|
|
b4a0b7e1ea | ||
|
|
f2209eca49 | ||
|
|
4a004971c6 | ||
|
|
e400b8761c | ||
|
|
ff8e7b7f41 | ||
|
|
2c501606be | ||
|
|
73420fe1c4 | ||
|
|
337f81346c | ||
|
|
06f9a4545b | ||
|
|
fa99df93c4 | ||
|
|
adcd2472d5 | ||
|
|
7527b9a07e | ||
|
|
800c223baa | ||
|
|
d1123d3ccf | ||
|
|
f61fc99d9c | ||
|
|
60653cc739 | ||
|
|
d25bba10b0 | ||
|
|
3b67ecaa5e | ||
|
|
6600f32392 | ||
|
|
64303b1709 | ||
|
|
5c7e50d61e | ||
|
|
f68ad105a6 | ||
|
|
164479da1d | ||
|
|
d93bf41d28 | ||
|
|
38a2b3f2b2 | ||
|
|
342534676c | ||
|
|
56a6a6de03 | ||
|
|
d1445c2801 |
@@ -21,10 +21,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Set up JDK 14
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '14'
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
import java.util.zip.ZipEntry
|
||||
import java.util.zip.ZipFile
|
||||
import java.util.zip.ZipInputStream
|
||||
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
@@ -21,6 +19,10 @@ cargo {
|
||||
|
||||
def smaliFolder = projectDir.toPath().resolve("../smali").normalize()
|
||||
def scriptsFolder = projectDir.toPath().resolve("../scripts").normalize()
|
||||
//you can add own folders with decompiled smali code
|
||||
def dexes=smaliFolder.toFile()
|
||||
.listFiles( { f -> f.isDirectory() && f.name.startsWith("smali") } as FileFilter)
|
||||
.size()
|
||||
|
||||
versionFile {
|
||||
file = projectDir.toPath().resolve("src/main/assets/version.properties").toFile()
|
||||
@@ -50,19 +52,24 @@ android {
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled true
|
||||
buildConfigField 'String', 'APPCENTER_KEY', '""'
|
||||
proguardFile 'proguard-rules.pro'
|
||||
}
|
||||
rc {
|
||||
minifyEnabled true
|
||||
buildConfigField 'String', 'APPCENTER_KEY', '""'
|
||||
proguardFile 'proguard-rules.pro'
|
||||
}
|
||||
dev {
|
||||
initWith release
|
||||
minifyEnabled false
|
||||
buildConfigField 'String', 'APPCENTER_KEY', '""'
|
||||
}
|
||||
beta {
|
||||
initWith release
|
||||
minifyEnabled false
|
||||
buildConfigField 'String', 'APPCENTER_KEY', '""'
|
||||
}
|
||||
release {
|
||||
buildConfigField 'String', 'APPCENTER_KEY', '""'
|
||||
minifyEnabled true
|
||||
proguardFile 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@@ -72,6 +79,9 @@ android {
|
||||
}
|
||||
namespace 'ru.vtosters.lite'
|
||||
ndkVersion '25.2.9519653'
|
||||
buildFeatures {
|
||||
aidl true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -79,70 +89,44 @@ dependencies {
|
||||
implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.1'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
||||
implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4'
|
||||
implementation 'com.google.guava:guava:23.3-android'
|
||||
|
||||
implementation fileTree(dir: 'libs', include: ['*.aar'])
|
||||
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation 'com.google.guava:guava:23.3-android'
|
||||
}
|
||||
|
||||
task generateBuildTasks() {
|
||||
android.applicationVariants.all { variant ->
|
||||
variant.outputs.each { output ->
|
||||
def buildType = output.name.toString().capitalize()
|
||||
def lowerBuildType = buildType.toLowerCase()
|
||||
if(buildType=="Base")return
|
||||
task "exportDex$buildType"() {
|
||||
dependsOn('assemble' + buildType)
|
||||
doLast {
|
||||
try {
|
||||
var z = ""
|
||||
if (lowerBuildType != "debug") {
|
||||
z = "-unsigned"
|
||||
}
|
||||
|
||||
File moduleDir = projectDir
|
||||
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(moduleDir.getAbsolutePath() + "/build/outputs/apk/$lowerBuildType/app-$lowerBuildType${z}.apk"))
|
||||
ZipFile file = new ZipFile(moduleDir.getAbsolutePath() + "/build/outputs/apk/$lowerBuildType/app-$lowerBuildType${z}.apk");
|
||||
ZipEntry entry
|
||||
while ((entry = inputStream.nextEntry) != null) {
|
||||
if (entry.getName().equals("classes.dex")) {
|
||||
print('classes.dex found!')
|
||||
|
||||
FileOutputStream outputStream = new FileOutputStream(new File(moduleDir.getAbsoluteFile(), "classes6.dex"))
|
||||
|
||||
byte[] buffer = new byte[1024]
|
||||
int len = 0
|
||||
while ((len = inputStream.read(buffer)) > 0) {
|
||||
outputStream.write(buffer, 0, len)
|
||||
}
|
||||
outputStream.close()
|
||||
}
|
||||
if (entry.getName().equals("classes2.dex")) {
|
||||
print('\nclasses2.dex found!')
|
||||
|
||||
FileOutputStream outputStream = new FileOutputStream(new File(moduleDir.getAbsoluteFile(), "classes7.dex"))
|
||||
|
||||
byte[] buffer = new byte[1024]
|
||||
int len = 0
|
||||
while ((len = inputStream.read(buffer)) > 0) {
|
||||
outputStream.write(buffer, 0, len)
|
||||
}
|
||||
outputStream.close()
|
||||
}
|
||||
}
|
||||
|
||||
for (ZipEntry e : Collections.list(file.entries())) {
|
||||
if (e.getName().endsWith("assets/version.properties")) {
|
||||
var is = file.getInputStream(e)
|
||||
FileOutputStream outputStream = new FileOutputStream(new File(moduleDir.getAbsoluteFile(), "version.properties"))
|
||||
|
||||
byte[] buffer = new byte[1024]
|
||||
int len = 0
|
||||
while ((len = is.read(buffer)) > 0) {
|
||||
outputStream.write(buffer, 0, len)
|
||||
}
|
||||
outputStream.close()
|
||||
|
||||
print('\nversion.properties found!')
|
||||
}
|
||||
def suffix=buildType.toLowerCase()
|
||||
String apkPath=projectDir.getAbsolutePath()+"/build/outputs/apk/$suffix/app-$suffix"
|
||||
def apk=new File(apkPath+"-unsigned.apk")
|
||||
if(!apk.exists())apk=new File(apkPath+".apk")
|
||||
def zip=new ZipFile(apk)
|
||||
def entries=zip.entries()
|
||||
def dexCounter=dexes
|
||||
while(entries.hasMoreElements())
|
||||
{
|
||||
def entry=entries.nextElement()
|
||||
String filename
|
||||
if(entry.name.matches("^classes(?:(?=\\d)2|)\\.dex\$"))filename="classes${++dexCounter}.dex"
|
||||
else if(entry.name=="assets/version.properties")filename="version.properties"
|
||||
else continue
|
||||
println("Exporting "+entry.name)
|
||||
def tmpFile=new File(projectDir,filename)
|
||||
def is=zip.getInputStream(entry)
|
||||
def fos=new FileOutputStream(tmpFile)
|
||||
def buff=new byte[0x800]
|
||||
int len
|
||||
while((len=is.read(buff))>0)fos.write(buff,0,len)
|
||||
is.close()
|
||||
fos.close()
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace()
|
||||
@@ -152,17 +136,16 @@ task generateBuildTasks() {
|
||||
task "prepareDexForMerge$buildType"(type: Copy) {
|
||||
dependsOn('exportDex' + buildType)
|
||||
// Remove comment for native lib build
|
||||
dependsOn('cargoBuild')
|
||||
//dependsOn('cargoBuild')
|
||||
into smaliFolder.toString()
|
||||
from(projectDir) {
|
||||
include 'classes6.dex'
|
||||
include 'classes7.dex'
|
||||
into '../smali'
|
||||
include "classes*.dex"
|
||||
}
|
||||
from(projectDir) {
|
||||
include 'version.properties'
|
||||
into 'assets'
|
||||
}
|
||||
// Remove comment for native lib build
|
||||
from('../native-effects/target/aarch64-linux-android/release'){
|
||||
include 'libnative_effects.so'
|
||||
into 'lib/arm64-v8a'
|
||||
@@ -171,15 +154,16 @@ task generateBuildTasks() {
|
||||
include 'libnative_effects.so'
|
||||
into 'lib/armeabi-v7a'
|
||||
}
|
||||
doLast {
|
||||
new File(projectDir, "classes6.dex").delete()
|
||||
new File(projectDir, "classes7.dex").delete()
|
||||
new File(projectDir, "version.properties").delete()
|
||||
}
|
||||
}
|
||||
task "cleanTemporaryFiles$buildType"(type:Delete)
|
||||
{
|
||||
delete fileTree(dir:projectDir,include:["*.dex","version.properties"])
|
||||
delete fileTree(dir:smaliFolder,include:['*.dex',"assets/version.properties"])
|
||||
}
|
||||
task "buildVTL$buildType"(type: Exec) {
|
||||
dependsOn('prepareDexForMerge' + buildType)
|
||||
workingDir(projectDir.parentFile)
|
||||
finalizedBy "cleanTemporaryFiles$buildType"
|
||||
if (Os.isFamily("unix") || Os.isFamily("mac")) {
|
||||
commandLine 'bash', '-c', './scripts/build.sh'
|
||||
} else {
|
||||
@@ -207,7 +191,6 @@ task generateBuildTasks() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
task generateRjava(type: Exec) {
|
||||
workingDir(projectDir.parentFile)
|
||||
if (Os.isFamily("unix") || Os.isFamily("mac"))
|
||||
|
||||
@@ -130,9 +130,9 @@ public class BinaryResourceValue implements SerializableResource {
|
||||
*/
|
||||
public static final int SIZE = 8;
|
||||
|
||||
private final int size;
|
||||
private final Type type;
|
||||
private final int data;
|
||||
public int size;
|
||||
public Type type;
|
||||
public int data;
|
||||
|
||||
public static BinaryResourceValue create(ByteBuffer buffer) {
|
||||
int size = (buffer.getShort() & 0xFFFF);
|
||||
|
||||
@@ -0,0 +1,502 @@
|
||||
package com.vk.medianative;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Color;
|
||||
import android.os.Process;
|
||||
import android.os.*;
|
||||
import android.util.Log;
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Scanner;
|
||||
|
||||
public final class MediaNative {
|
||||
private static final String a = NativeMediaEncoder.class.getSimpleName();
|
||||
private static final Object f17443d = new Object();
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
@Keep
|
||||
public static volatile Context context;
|
||||
private static boolean isMediaLoaded = false;
|
||||
private static boolean isMediaMasksLoaded = false;
|
||||
|
||||
public static int HSLToIntRGB(float f2, float f3, float f4) {
|
||||
int[] iArr = new int[3];
|
||||
waitForContext();
|
||||
nativeHSLToRGB(f2, f3, f4, iArr);
|
||||
return Color.argb(255, iArr[0], iArr[1], iArr[2]);
|
||||
}
|
||||
|
||||
public static void HSLToRGB(float f2, float f3, float f4, int[] iArr) {
|
||||
waitForContext();
|
||||
nativeHSLToRGB(f2, f3, f4, iArr);
|
||||
}
|
||||
|
||||
public static int HSVToIntRGB(float f2, float f3, float f4) {
|
||||
int[] iArr = new int[3];
|
||||
waitForContext();
|
||||
nativeHSVToRGB(f2, f3, f4, iArr);
|
||||
return Color.argb(255, iArr[0], iArr[1], iArr[2]);
|
||||
}
|
||||
|
||||
public static void HSVToRGB(float f2, float f3, float f4, int[] iArr) {
|
||||
waitForContext();
|
||||
nativeHSVToRGB(f2, f3, f4, iArr);
|
||||
}
|
||||
|
||||
public static int LabToIntRGB(float f2, float f3, float f4) {
|
||||
int[] iArr = new int[3];
|
||||
waitForContext();
|
||||
nativeLabToRGB(f2, f3, f4, iArr);
|
||||
return Color.argb(255, iArr[0], iArr[1], iArr[2]);
|
||||
}
|
||||
|
||||
public static void LabToRGB(float f2, float f3, float f4, int[] iArr) {
|
||||
waitForContext();
|
||||
nativeLabToRGB(f2, f3, f4, iArr);
|
||||
}
|
||||
|
||||
public static void RGBToHSL(int i, int i2, int i3, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeRGBToHSL(i, i2, i3, fArr);
|
||||
}
|
||||
|
||||
public static void RGBToHSV(int i, int i2, int i3, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeRGBToHSV(i, i2, i3, fArr);
|
||||
}
|
||||
|
||||
public static void RGBToLab(int i, int i2, int i3, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeRGBToLab(i, i2, i3, fArr);
|
||||
}
|
||||
|
||||
public static long animationPlayerCreate(String str, int i, int i2, boolean z) {
|
||||
waitForContext();
|
||||
return nativeAnimationPlayerCreate(str, i, i2, z);
|
||||
}
|
||||
|
||||
public static int animationPlayerDecode(long j, Bitmap bitmap) {
|
||||
waitForContext();
|
||||
return nativeAnimationPlayerDecode(j, bitmap);
|
||||
}
|
||||
|
||||
public static int animationPlayerGetSize(long j) {
|
||||
waitForContext();
|
||||
return nativeAnimationPlayerGetSize(j);
|
||||
}
|
||||
|
||||
public static void animationPlayerRelease(long j) {
|
||||
waitForContext();
|
||||
nativeAnimationPlayerRelease(j);
|
||||
}
|
||||
|
||||
public static boolean animationPlayerSeek(long j, int i) {
|
||||
waitForContext();
|
||||
return nativeAnimationPlayerSeek(j, i);
|
||||
}
|
||||
|
||||
public static void applyCurveAndSaturationBitmap(Bitmap bitmap, int[] iArr, float f2) {
|
||||
waitForContext();
|
||||
nativeCurveSaturation(bitmap, iArr, f2, Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
public static long audioGetTotalPcmDuration() {
|
||||
waitForContext();
|
||||
return nativeAudioGetTotalPcmDuration();
|
||||
}
|
||||
|
||||
public static byte[] audioGetWaveform(short[] sArr, int i) {
|
||||
waitForContext();
|
||||
return nativeAudioGetWaveform(sArr, i);
|
||||
}
|
||||
|
||||
public static int audioIsOpusFile(String str) {
|
||||
waitForContext();
|
||||
return nativeAudioIsOpusFile(str);
|
||||
}
|
||||
|
||||
public static void audioReadOpusFile(ByteBuffer byteBuffer, int i, int[] iArr) {
|
||||
waitForContext();
|
||||
nativeAudioReadOpusFile(byteBuffer, i, iArr);
|
||||
}
|
||||
|
||||
public static int audioSeekOpusFile(float f2) {
|
||||
waitForContext();
|
||||
return nativeAudioSeekOpusFile(f2);
|
||||
}
|
||||
|
||||
public static int audioStartRecord(String str) { // need to hack
|
||||
waitForContext();
|
||||
return nativeAudioStartRecord(str);
|
||||
}
|
||||
|
||||
public static void audioStopRecord() { // need to hack
|
||||
waitForContext();
|
||||
nativeAudioStopRecord();
|
||||
}
|
||||
|
||||
public static int audioWriteFrame(ByteBuffer byteBuffer, int i) { // need to hack
|
||||
waitForContext();
|
||||
return nativeAudioWriteFrame(byteBuffer, i);
|
||||
}
|
||||
|
||||
private static void waitForContext() {
|
||||
synchronized (f17443d) {
|
||||
if (context == null) {
|
||||
try {
|
||||
f17443d.wait();
|
||||
} catch (InterruptedException e2) {
|
||||
Log.e(a, "Interrupted while waiting for context", e2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void blurBitmap(Bitmap bitmap, int i) {
|
||||
waitForContext();
|
||||
nativeBlur(bitmap, i);
|
||||
}
|
||||
|
||||
private static String c() {
|
||||
return getProcMaps(String.valueOf(Process.myPid()));
|
||||
}
|
||||
|
||||
public static void cameraProcessorCreate() {
|
||||
waitForContext();
|
||||
nativeProcessorCreate();
|
||||
}
|
||||
|
||||
public static boolean cameraProcessorDo(byte[] bArr, long[] jArr) {
|
||||
waitForContext();
|
||||
return nativeProcessorDo(bArr, jArr);
|
||||
}
|
||||
|
||||
public static int cameraProcessorGetVersion() {
|
||||
waitForContext();
|
||||
return nativeProcessorGetVersion();
|
||||
}
|
||||
|
||||
public static boolean cameraProcessorInit(String str, int i, int i2) {
|
||||
waitForContext();
|
||||
return nativeProcessorInit(str, i, i2);
|
||||
}
|
||||
|
||||
public static boolean cameraProcessorLoad(String str, boolean z) {
|
||||
waitForContext();
|
||||
return nativeProcessorLoad(str, z);
|
||||
}
|
||||
|
||||
public static void cameraProcessorMouseTap(int i, float f2, float f3) {
|
||||
waitForContext();
|
||||
nativeProcessorMouseTap(i, f2, f3);
|
||||
}
|
||||
|
||||
public static void cameraProcessorRelease() {
|
||||
waitForContext();
|
||||
nativeProcessorRelease();
|
||||
}
|
||||
|
||||
public static void colorCorrectionBitmap(Bitmap bitmap, Bitmap bitmap2, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeColorCorrection(bitmap, bitmap2, fArr, fArr.length, Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
public static byte[] compressBitmapJpeg(Bitmap bitmap, int i) {
|
||||
waitForContext();
|
||||
return nativeJpegTurboCompress(bitmap, i);
|
||||
}
|
||||
|
||||
public static String createAllInOneShader() {
|
||||
waitForContext();
|
||||
return nativeAllInOneShader();
|
||||
}
|
||||
|
||||
public static void createCurve(int[] iArr, int[] iArr2, int[] iArr3, int[] iArr4, int[] iArr5, float f2, float f3, float f4, float f5, float f6) {
|
||||
waitForContext();
|
||||
nativeCreateCurve(iArr, iArr2, iArr3, iArr4, iArr5, f2, f3, f4, f5, f6);
|
||||
}
|
||||
|
||||
public static String createOneInAllShader() {
|
||||
waitForContext();
|
||||
return nativeOneInAllShader();
|
||||
}
|
||||
|
||||
private static String d() {
|
||||
return getProcMaps("self");
|
||||
}
|
||||
|
||||
public static String dump() {
|
||||
return "LD_LIBRARY_PATH:\n" + SoLoader.makeLdLibraryPath() + "\nSELF_MAPS:\n" + d() + "\nPID_MAPS:\n" + c() + "\n";
|
||||
}
|
||||
|
||||
private static void e() {
|
||||
isMediaMasksLoaded = NativeLibLoader.loadLibrary("vkmediamasks");
|
||||
}
|
||||
|
||||
public static void enhanceBitmap(Bitmap bitmap, float f2) {
|
||||
waitForContext();
|
||||
nativeEnhance(bitmap, f2, Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
private static void loadVKMediaLibs() {
|
||||
if (isMediaLoaded) {
|
||||
return;
|
||||
}
|
||||
NativeLibLoader.loadLibrary("ffmpeg");
|
||||
isMediaLoaded = NativeLibLoader.loadLibrary("vkmedia");
|
||||
isMediaLoaded = NativeLibLoader.loadLibrary("vkmediaencoder");
|
||||
}
|
||||
|
||||
public static void flipHorizontallyBitmap(Bitmap bitmap) {
|
||||
waitForContext();
|
||||
nativeFlipHorizontally(bitmap);
|
||||
}
|
||||
|
||||
public static void flipVerticallyBitmap(Bitmap bitmap) {
|
||||
waitForContext();
|
||||
nativeFlipVertically(bitmap);
|
||||
}
|
||||
|
||||
public static void generateHistogram(Bitmap bitmap, int[] iArr, int[] iArr2, int[] iArr3, int[] iArr4) {
|
||||
waitForContext();
|
||||
nativeHistogram(bitmap, iArr, iArr2, iArr3, iArr4);
|
||||
}
|
||||
|
||||
public static void init(Context context2) {
|
||||
synchronized (f17443d) {
|
||||
context = context2;
|
||||
SoLoader.init(context2, false);
|
||||
NativeLibLoader.loadLibrary("gnustl_shared");
|
||||
NativeLibLoader.loadLibrary("vkchronicle");
|
||||
loadVKMediaLibs();
|
||||
f17443d.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public static void intRGBToHSL(int i, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeRGBToHSL(Color.red(i), Color.green(i), Color.blue(i), fArr);
|
||||
}
|
||||
|
||||
public static void intRGBToHSV(int i, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeRGBToHSV(Color.red(i), Color.green(i), Color.blue(i), fArr);
|
||||
}
|
||||
|
||||
public static void intRGBToLab(int i, float[] fArr) {
|
||||
waitForContext();
|
||||
nativeRGBToLab(Color.red(i), Color.green(i), Color.blue(i), fArr);
|
||||
}
|
||||
|
||||
public static boolean isAsus() {
|
||||
return "asus".equalsIgnoreCase(Build.MANUFACTURER);
|
||||
}
|
||||
|
||||
public static boolean isMediaSupported() {
|
||||
if (!isMediaMasksLoaded) {
|
||||
e();
|
||||
}
|
||||
return isMediaMasksLoaded;
|
||||
}
|
||||
|
||||
public static boolean isX86() {
|
||||
try {
|
||||
String str = Build.SUPPORTED_ABIS[0];
|
||||
if (str != null) {
|
||||
return str.startsWith("x86");
|
||||
}
|
||||
return false;
|
||||
} catch (Throwable unused) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void lookupBitmap(Bitmap bitmap, Bitmap bitmap2) {
|
||||
waitForContext();
|
||||
nativeLookup(bitmap, bitmap2, Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
public static long mediaEncoderCreate(MediaEncoderSettings mediaEncoderSettings) {
|
||||
waitForContext();
|
||||
return nativeCreateEncoder(mediaEncoderSettings);
|
||||
}
|
||||
|
||||
public static int mediaEncoderDoEncode(long j) {
|
||||
waitForContext();
|
||||
return nativeDoEncode(j);
|
||||
}
|
||||
|
||||
public static void mediaEncoderDoRelease(long j) {
|
||||
waitForContext();
|
||||
nativeReleaseEncoder(j);
|
||||
}
|
||||
|
||||
private static native String nativeAllInOneShader();
|
||||
|
||||
private static native long nativeAnimationPlayerCreate(String str, int i, int i2, boolean z);
|
||||
|
||||
private static native int nativeAnimationPlayerDecode(long j, Bitmap bitmap);
|
||||
|
||||
private static native int nativeAnimationPlayerGetSize(long j);
|
||||
|
||||
private static native void nativeAnimationPlayerRelease(long j);
|
||||
|
||||
private static native boolean nativeAnimationPlayerSeek(long j, int i);
|
||||
|
||||
private static native long nativeAudioGetTotalPcmDuration();
|
||||
|
||||
private static native byte[] nativeAudioGetWaveform(short[] sArr, int i);
|
||||
|
||||
private static native int nativeAudioIsOpusFile(String str);
|
||||
|
||||
private static native int nativeAudioOpenOpusFile(String str);
|
||||
|
||||
private static native void nativeAudioReadOpusFile(ByteBuffer byteBuffer, int i, int[] iArr);
|
||||
|
||||
private static native int nativeAudioSeekOpusFile(float f2);
|
||||
|
||||
private static native int nativeAudioStartRecord(String str);
|
||||
|
||||
private static native void nativeAudioStopRecord();
|
||||
|
||||
private static native int nativeAudioWriteFrame(ByteBuffer byteBuffer, int i);
|
||||
|
||||
private static native void nativeBlur(Bitmap bitmap, int i);
|
||||
|
||||
private static native void nativeColorCorrection(Bitmap bitmap, Bitmap bitmap2, float[] fArr, int i, int i2);
|
||||
|
||||
private static native String nativeCreateColorCorrectionShader(float[] fArr, int i, int i2);
|
||||
|
||||
private static native void nativeCreateCurve(int[] iArr, int[] iArr2, int[] iArr3, int[] iArr4, int[] iArr5, float f2, float f3, float f4, float f5, float f6);
|
||||
|
||||
private static native long nativeCreateEncoder(MediaEncoderSettings mediaEncoderSettings);
|
||||
|
||||
private static native void nativeCurveSaturation(Bitmap bitmap, int[] iArr, double d2, int i);
|
||||
|
||||
private static native int nativeDoEncode(long j);
|
||||
|
||||
private static native void nativeEnhance(Bitmap bitmap, double d2, int i);
|
||||
|
||||
private static native void nativeFlipHorizontally(Bitmap bitmap);
|
||||
|
||||
private static native void nativeFlipVertically(Bitmap bitmap);
|
||||
|
||||
private static native void nativeHSLToRGB(float f2, float f3, float f4, int[] iArr);
|
||||
|
||||
private static native void nativeHSVToRGB(float f2, float f3, float f4, int[] iArr);
|
||||
|
||||
private static native void nativeHistogram(Bitmap bitmap, int[] iArr, int[] iArr2, int[] iArr3, int[] iArr4);
|
||||
|
||||
private static native byte[] nativeJpegTurboCompress(Bitmap bitmap, int i);
|
||||
|
||||
private static native void nativeLabToRGB(float f2, float f3, float f4, int[] iArr);
|
||||
|
||||
private static native void nativeLookup(Bitmap bitmap, Bitmap bitmap2, int i);
|
||||
|
||||
private static native String nativeOneInAllShader();
|
||||
|
||||
private static native void nativePinBitmap(Bitmap bitmap);
|
||||
|
||||
private static native void nativeProcessorCreate();
|
||||
|
||||
private static native boolean nativeProcessorDo(byte[] bArr, long[] jArr);
|
||||
|
||||
private static native int nativeProcessorGetVersion();
|
||||
|
||||
private static native boolean nativeProcessorInit(String str, int i, int i2);
|
||||
|
||||
private static native boolean nativeProcessorLoad(String str, boolean z);
|
||||
|
||||
private static native void nativeProcessorMouseTap(int i, float f2, float f3);
|
||||
|
||||
private static native void nativeProcessorRelease();
|
||||
|
||||
private static native void nativeRGBToHSL(int i, int i2, int i3, float[] fArr);
|
||||
|
||||
private static native void nativeRGBToHSV(int i, int i2, int i3, float[] fArr);
|
||||
|
||||
private static native void nativeRGBToLab(int i, int i2, int i3, float[] fArr);
|
||||
|
||||
private static native void nativeReleaseEncoder(long j);
|
||||
|
||||
private static native void nativeResize(Bitmap bitmap, Bitmap bitmap2, int i);
|
||||
|
||||
public static int openOpusFile(String str) {
|
||||
waitForContext();
|
||||
return nativeAudioOpenOpusFile(str);
|
||||
}
|
||||
|
||||
public static void pinBitmap(Bitmap bitmap) {
|
||||
waitForContext();
|
||||
nativePinBitmap(bitmap);
|
||||
}
|
||||
|
||||
public static void resizeBitmap(Bitmap bitmap, Bitmap bitmap2) {
|
||||
waitForContext();
|
||||
nativeResize(bitmap, bitmap2, Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
private static String getProcMaps(String str) {
|
||||
try (InputStream inputStream = Runtime.getRuntime().exec("cat /proc/" + str + "/maps").getInputStream()) {
|
||||
return new Scanner(inputStream).useDelimiter("\\A").next();
|
||||
} catch (Exception e) {
|
||||
return "empty";
|
||||
}
|
||||
}
|
||||
|
||||
public static class EncoderHandler extends Handler {
|
||||
private Callback a;
|
||||
|
||||
public EncoderHandler(Looper looper) {
|
||||
super(looper);
|
||||
}
|
||||
|
||||
@Keep
|
||||
public static Object postEventFromNative(Object obj, int i, int i2, int i3) {
|
||||
EncoderHandler encoderHandler;
|
||||
if (obj != null && (encoderHandler = (EncoderHandler) ((WeakReference<?>) obj).get()) != null) {
|
||||
if (i == 2) {
|
||||
return encoderHandler.a.getLayerBitmap(i2, i3);
|
||||
}
|
||||
encoderHandler.sendMessage(encoderHandler.obtainMessage(i, i2, i3, null));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override // android.os.Handler
|
||||
public void handleMessage(Message message) {
|
||||
Callback callback = this.a;
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
int i = message.what;
|
||||
if (i == 0) {
|
||||
callback.onBytes(message.arg1);
|
||||
} else if (i != 1) {
|
||||
String str = MediaNative.a;
|
||||
Log.e(str, "Unknown message type " + message.what);
|
||||
} else {
|
||||
callback.onProgress(message.arg1);
|
||||
}
|
||||
}
|
||||
|
||||
public void setCallback(Callback callback) {
|
||||
this.a = callback;
|
||||
}
|
||||
|
||||
public interface Callback {
|
||||
@Nullable
|
||||
Bitmap getLayerBitmap(int i, int i2);
|
||||
|
||||
void onBytes(int i);
|
||||
|
||||
void onProgress(int i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4976,30 +4976,29 @@ public final class R {
|
||||
public static final int ic_deepl_logo_icon = 0x7f080bcb; // 2131233739
|
||||
public static final int ic_google_translate_logo = 0x7f080bcc; // 2131233740
|
||||
public static final int ic_yandex_translate_icon = 0x7f080bd1; // 2131233745
|
||||
public static final int microsoft = 0x7f080bd2; // 2131233746
|
||||
public static final int $splash__0 = 0x7f080bd2; // 2131233746
|
||||
public static final int roundmsg = 0x7f080bd3; // 2131233747
|
||||
public static final int tgs_entry_background = 0x7f080bd4; // 2131233748
|
||||
public static final int yandex = 0x7f080bd7; // 2131233751
|
||||
public static final int $splash__0 = 0x7f080bd8; // 2131233752
|
||||
public static final int $splash__1 = 0x7f080bd9; // 2131233753
|
||||
public static final int $splash__10 = 0x7f080bda; // 2131233754
|
||||
public static final int $splash__11 = 0x7f080bdb; // 2131233755
|
||||
public static final int $splash__12 = 0x7f080bdc; // 2131233756
|
||||
public static final int $splash__13 = 0x7f080bdd; // 2131233757
|
||||
public static final int $splash__14 = 0x7f080bde; // 2131233758
|
||||
public static final int $splash__15 = 0x7f080bdf; // 2131233759
|
||||
public static final int $splash__2 = 0x7f080be0; // 2131233760
|
||||
public static final int $splash__3 = 0x7f080be1; // 2131233761
|
||||
public static final int $splash__4 = 0x7f080be2; // 2131233762
|
||||
public static final int $splash__5 = 0x7f080be3; // 2131233763
|
||||
public static final int $splash__6 = 0x7f080be4; // 2131233764
|
||||
public static final int $splash__7 = 0x7f080be5; // 2131233765
|
||||
public static final int $splash__8 = 0x7f080be6; // 2131233766
|
||||
public static final int $splash__9 = 0x7f080be7; // 2131233767
|
||||
public static final int $splash__1 = 0x7f080bd8; // 2131233752
|
||||
public static final int $splash__10 = 0x7f080bd9; // 2131233753
|
||||
public static final int $splash__11 = 0x7f080bda; // 2131233754
|
||||
public static final int $splash__12 = 0x7f080bdb; // 2131233755
|
||||
public static final int $splash__13 = 0x7f080bdc; // 2131233756
|
||||
public static final int $splash__14 = 0x7f080bdd; // 2131233757
|
||||
public static final int $splash__15 = 0x7f080bde; // 2131233758
|
||||
public static final int $splash__2 = 0x7f080bdf; // 2131233759
|
||||
public static final int $splash__3 = 0x7f080be0; // 2131233760
|
||||
public static final int $splash__4 = 0x7f080be1; // 2131233761
|
||||
public static final int $splash__5 = 0x7f080be2; // 2131233762
|
||||
public static final int $splash__6 = 0x7f080be3; // 2131233763
|
||||
public static final int $splash__7 = 0x7f080be4; // 2131233764
|
||||
public static final int $splash__8 = 0x7f080be5; // 2131233765
|
||||
public static final int $splash__9 = 0x7f080be6; // 2131233766
|
||||
public static final int checker_background = 0x7f080be8; // 2131233768
|
||||
public static final int custom_thumb_selector = 0x7f080be9; // 2131233769
|
||||
public static final int custom_track_selector = 0x7f080bea; // 2131233770
|
||||
public static final int splash = 0x7f080beb; // 2131233771
|
||||
public static final int splash = 0x7f080bec; // 2131233772
|
||||
public static final int abc_control_background_material = 0x7f080032; // 2131230770
|
||||
public static final int ic_action_close = 0x7f080322; // 2131231522
|
||||
public static final int ic_camera_outline_28_new = 0x7f0803a0; // 2131231648
|
||||
@@ -6797,6 +6796,9 @@ public final class R {
|
||||
public static final int ic_telegram_24 = 0x7f080bcf; // 2131233743
|
||||
public static final int ic_telegram_outline_28 = 0x7f080bd0; // 2131233744
|
||||
public static final int vtlogo = 0x7f080bd6; // 2131233750
|
||||
public static final int bing = 0x7f080be7; // 2131233767
|
||||
public static final int sauceNAO = 0x7f080beb; // 2131233771
|
||||
public static final int tracemoe = 0x7f080bed; // 2131233773
|
||||
public static final int bg_music_play_button_white = 0x7f08015e; // 2131231070
|
||||
public static final int bg_poll_bg_thumb = 0x7f080181; // 2131231105
|
||||
public static final int bg_stickers_suggestions_left = 0x7f0801ad; // 2131231149
|
||||
@@ -19592,67 +19594,76 @@ public final class R {
|
||||
public static final int calls_not_available = 0x7f12184a; // 2131892298
|
||||
public static final int cannot_write = 0x7f12184b; // 2131892299
|
||||
public static final int change_accent_color = 0x7f12184c; // 2131892300
|
||||
public static final int copydebuginfo_summ = 0x7f12184d; // 2131892301
|
||||
public static final int copydebuginfo_title = 0x7f12184e; // 2131892302
|
||||
public static final int copyownlink_summ = 0x7f12184f; // 2131892303
|
||||
public static final int copyownlink_title = 0x7f121850; // 2131892304
|
||||
public static final int crash_service_name = 0x7f121851; // 2131892305
|
||||
public static final int currentLanguage = 0x7f121852; // 2131892306
|
||||
public static final int current_theme = 0x7f121853; // 2131892307
|
||||
public static final int custom_links_warning = 0x7f121854; // 2131892308
|
||||
public static final int data = 0x7f121855; // 2131892309
|
||||
public static final int data_updated = 0x7f121856; // 2131892310
|
||||
public static final int datasettings_title = 0x7f121857; // 2131892311
|
||||
public static final int device_info = 0x7f121858; // 2131892312
|
||||
public static final int device_info_copied = 0x7f121859; // 2131892313
|
||||
public static final int dialogstats = 0x7f12185a; // 2131892314
|
||||
public static final int disable_analytics = 0x7f12185b; // 2131892315
|
||||
public static final int disable_analytics_summ = 0x7f12185c; // 2131892316
|
||||
public static final int downloading_update = 0x7f12185d; // 2131892317
|
||||
public static final int error_applying_accent = 0x7f12185e; // 2131892318
|
||||
public static final int error_no_text = 0x7f12185f; // 2131892319
|
||||
public static final int error_saving_file = 0x7f121860; // 2131892320
|
||||
public static final int failed_to_get_text = 0x7f121861; // 2131892321
|
||||
public static final int invalid_pack_link = 0x7f121862; // 2131892322
|
||||
public static final int invalidate_theme_cache_title = 0x7f121863; // 2131892323
|
||||
public static final int logColors_title = 0x7f121864; // 2131892324
|
||||
public static final int maxquality_summ = 0x7f121865; // 2131892325
|
||||
public static final int maxquality_title = 0x7f121866; // 2131892326
|
||||
public static final int monettheme_summ = 0x7f121867; // 2131892327
|
||||
public static final int monettheme_title = 0x7f121868; // 2131892328
|
||||
public static final int newsfeed_notif_summ = 0x7f121869; // 2131892329
|
||||
public static final int newsfeed_notif_title = 0x7f12186a; // 2131892330
|
||||
public static final int open_bot = 0x7f12186b; // 2131892331
|
||||
public static final int promotedstickers_title = 0x7f12186c; // 2131892332
|
||||
public static final int remove_encryption_key = 0x7f12186d; // 2131892333
|
||||
public static final int remove_from_ads_stories_whitelist = 0x7f12186e; // 2131892334
|
||||
public static final int reset_accounts = 0x7f12186f; // 2131892335
|
||||
public static final int reset_all_settings = 0x7f121870; // 2131892336
|
||||
public static final int restore_accounts = 0x7f121871; // 2131892337
|
||||
public static final int restore_settings = 0x7f121872; // 2131892338
|
||||
public static final int save_accounts = 0x7f121873; // 2131892339
|
||||
public static final int save_online_data = 0x7f121874; // 2131892340
|
||||
public static final int select_color = 0x7f121875; // 2131892341
|
||||
public static final int select_palette = 0x7f121876; // 2131892342
|
||||
public static final int sources = 0x7f121877; // 2131892343
|
||||
public static final int storiesGroupsAdBlock = 0x7f121878; // 2131892344
|
||||
public static final int storiesGroupsAdBlocksummary = 0x7f121879; // 2131892345
|
||||
public static final int systemtheme = 0x7f12187a; // 2131892346
|
||||
public static final int systemtheme_enabled = 0x7f12187b; // 2131892347
|
||||
public static final int systemtheme_summ = 0x7f12187c; // 2131892348
|
||||
public static final int updateverifdata_summ = 0x7f12187d; // 2131892349
|
||||
public static final int updateverifdata_title = 0x7f12187e; // 2131892350
|
||||
public static final int useCustomPrefsStyle_summ = 0x7f12187f; // 2131892351
|
||||
public static final int useCustomPrefsStyle_title = 0x7f121880; // 2131892352
|
||||
public static final int useGenius_summ = 0x7f121881; // 2131892353
|
||||
public static final int useGenius_title = 0x7f121882; // 2131892354
|
||||
public static final int useNewColorEngine_summ = 0x7f121883; // 2131892355
|
||||
public static final int useNewColorEngine_title = 0x7f121884; // 2131892356
|
||||
public static final int useOldAppVer_summ = 0x7f121885; // 2131892357
|
||||
public static final int useOldAppVer_title = 0x7f121886; // 2131892358
|
||||
public static final int vkx_integration_enabled_info = 0x7f121887; // 2131892359
|
||||
public static final int whitelisted_ad_groups_stories_title = 0x7f121888; // 2131892360
|
||||
public static final int writebar_ios_title = 0x7f121889; // 2131892361
|
||||
public static final int compression_types = 0x7f12184d; // 2131892301
|
||||
public static final int compression_types_selection = 0x7f12184e; // 2131892302
|
||||
public static final int copydebuginfo_summ = 0x7f12184f; // 2131892303
|
||||
public static final int copydebuginfo_title = 0x7f121850; // 2131892304
|
||||
public static final int copyownlink_summ = 0x7f121851; // 2131892305
|
||||
public static final int copyownlink_title = 0x7f121852; // 2131892306
|
||||
public static final int crash_service_name = 0x7f121853; // 2131892307
|
||||
public static final int currentLanguage = 0x7f121854; // 2131892308
|
||||
public static final int current_theme = 0x7f121855; // 2131892309
|
||||
public static final int custom_links_warning = 0x7f121856; // 2131892310
|
||||
public static final int data = 0x7f121857; // 2131892311
|
||||
public static final int data_updated = 0x7f121858; // 2131892312
|
||||
public static final int datasettings_title = 0x7f121859; // 2131892313
|
||||
public static final int device_info = 0x7f12185a; // 2131892314
|
||||
public static final int device_info_copied = 0x7f12185b; // 2131892315
|
||||
public static final int dialogstats = 0x7f12185c; // 2131892316
|
||||
public static final int disable_analytics = 0x7f12185d; // 2131892317
|
||||
public static final int disable_analytics_summ = 0x7f12185e; // 2131892318
|
||||
public static final int downloading_update = 0x7f12185f; // 2131892319
|
||||
public static final int error_applying_accent = 0x7f121860; // 2131892320
|
||||
public static final int error_no_text = 0x7f121861; // 2131892321
|
||||
public static final int error_saving_file = 0x7f121862; // 2131892322
|
||||
public static final int failed_to_get_text = 0x7f121863; // 2131892323
|
||||
public static final int invalid_pack_link = 0x7f121864; // 2131892324
|
||||
public static final int invalidate_theme_cache_title = 0x7f121865; // 2131892325
|
||||
public static final int logColors_title = 0x7f121866; // 2131892326
|
||||
public static final int maxquality_summ = 0x7f121867; // 2131892327
|
||||
public static final int maxquality_title = 0x7f121868; // 2131892328
|
||||
public static final int microgsett = 0x7f121869; // 2131892329
|
||||
public static final int monettheme_summ = 0x7f12186a; // 2131892330
|
||||
public static final int monettheme_title = 0x7f12186b; // 2131892331
|
||||
public static final int newsfeed_notif_summ = 0x7f12186c; // 2131892332
|
||||
public static final int newsfeed_notif_title = 0x7f12186d; // 2131892333
|
||||
public static final int open_bot = 0x7f12186e; // 2131892334
|
||||
public static final int promotedstickers_title = 0x7f12186f; // 2131892335
|
||||
public static final int remove_encryption_key = 0x7f121870; // 2131892336
|
||||
public static final int remove_from_ads_stories_whitelist = 0x7f121871; // 2131892337
|
||||
public static final int reset_accounts = 0x7f121872; // 2131892338
|
||||
public static final int reset_all_settings = 0x7f121873; // 2131892339
|
||||
public static final int restore_accounts = 0x7f121874; // 2131892340
|
||||
public static final int restore_settings = 0x7f121875; // 2131892341
|
||||
public static final int save_accounts = 0x7f121876; // 2131892342
|
||||
public static final int save_online_data = 0x7f121877; // 2131892343
|
||||
public static final int select_color = 0x7f121878; // 2131892344
|
||||
public static final int select_palette = 0x7f121879; // 2131892345
|
||||
public static final int sources = 0x7f12187a; // 2131892346
|
||||
public static final int storiesGroupsAdBlock = 0x7f12187b; // 2131892347
|
||||
public static final int storiesGroupsAdBlocksummary = 0x7f12187c; // 2131892348
|
||||
public static final int systemtheme = 0x7f12187d; // 2131892349
|
||||
public static final int systemtheme_enabled = 0x7f12187e; // 2131892350
|
||||
public static final int systemtheme_summ = 0x7f12187f; // 2131892351
|
||||
public static final int updateverifdata_summ = 0x7f121880; // 2131892352
|
||||
public static final int updateverifdata_title = 0x7f121881; // 2131892353
|
||||
public static final int useCustomPrefsStyle_summ = 0x7f121882; // 2131892354
|
||||
public static final int useCustomPrefsStyle_title = 0x7f121883; // 2131892355
|
||||
public static final int useGenius_summ = 0x7f121884; // 2131892356
|
||||
public static final int useGenius_title = 0x7f121885; // 2131892357
|
||||
public static final int useNewColorEngine_summ = 0x7f121886; // 2131892358
|
||||
public static final int useNewColorEngine_title = 0x7f121887; // 2131892359
|
||||
public static final int useOldAppVer_summ = 0x7f121888; // 2131892360
|
||||
public static final int useOldAppVer_title = 0x7f121889; // 2131892361
|
||||
public static final int vkx_integration_enabled_info = 0x7f12188a; // 2131892362
|
||||
public static final int whitelisted_ad_groups_stories_title = 0x7f12188b; // 2131892363
|
||||
public static final int writebar_ios_title = 0x7f12188c; // 2131892364
|
||||
public static final int cache_size = 0x7f12188d; // 2131892365
|
||||
public static final int cache_size_summ = 0x7f12188e; // 2131892366
|
||||
public static final int clear_all_cache = 0x7f12188f; // 2131892367
|
||||
public static final int invalidate_theme_cache_each_update_title = 0x7f121890; // 2131892368
|
||||
public static final int invertFilters = 0x7f121891; // 2131892369
|
||||
public static final int invertFilters_summ = 0x7f121892; // 2131892370
|
||||
}
|
||||
|
||||
public static final class style {
|
||||
|
||||
@@ -19,11 +19,8 @@ import static ru.vtosters.hooks.other.Preferences.isValidSignature;
|
||||
|
||||
|
||||
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 {
|
||||
@@ -35,15 +32,15 @@ public class GcmHook {
|
||||
}
|
||||
|
||||
public static String requestToken(String orig) {
|
||||
return "yssp9o9p9pamz5t-nvmq8spgwtin3e0==";
|
||||
return isValidSignature() ? "yssp9o9p9pamz5t-nvmq8spgwtin3e0==" : requestToken();
|
||||
}
|
||||
|
||||
public static String requestToken() {
|
||||
String xappide;
|
||||
try {
|
||||
String aid = getRandomAid();
|
||||
String pub2 = genNewKey();
|
||||
String sig = getSig(pub2);
|
||||
String xappide;
|
||||
try {
|
||||
byte[] bytes = MessageDigest.getInstance("SHA1").digest(pair.getPublic().getEncoded());
|
||||
bytes[0] = (byte) (((bytes[0] & 15) + 112) & 255);
|
||||
@@ -200,7 +197,6 @@ public class GcmHook {
|
||||
}).getBytes(StandardCharsets.UTF_8));
|
||||
return Base64.encodeToString(sign.sign(), 0);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,10 @@ public class MainActivityInjector {
|
||||
NotificationChannels.createChannels();
|
||||
}
|
||||
|
||||
if (Preferences.isNewBuild() && !ThemesUtils.isMonetTheme() && ThemesManager.canApplyCustomAccent() && ThemesUtils.useNewColorEngine()) {
|
||||
if (Preferences.isNewBuild()
|
||||
&&!ThemesUtils.isMonetTheme()
|
||||
&&ThemesManager.canApplyCustomAccent())
|
||||
{
|
||||
Preferences.updateBuildNumber();
|
||||
updateBinsAndTmpArchive(activity);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,9 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.vk.core.preference.Preference;
|
||||
import com.vk.discover.DiscoverItemDecorator;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import static java.lang.Long.MAX_VALUE;
|
||||
import static ru.vtosters.hooks.other.Preferences.*;
|
||||
@@ -91,6 +93,7 @@ public class NewsfeedHook {
|
||||
public static boolean isPowerSaveMode() {
|
||||
var pw = (PowerManager) getGlobalContext().getSystemService(Context.POWER_SERVICE);
|
||||
|
||||
return !getBoolValue("force_disable_psm", false) && pw.isPowerSaveMode();
|
||||
// return !getBoolValue("force_disable_psm", false) && pw.isPowerSaveMode();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,16 +7,14 @@ import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.FileProvider;
|
||||
import com.vk.core.dialogs.actionspopup.ActionsPopup;
|
||||
import com.vk.core.dialogs.alert.VkAlertDialog;
|
||||
import com.vk.core.ui.themes.VKThemeHelper;
|
||||
import com.vk.core.util.ContextExtKt;
|
||||
import com.vk.core.util.ToastUtils;
|
||||
import com.vk.dto.common.AttachmentWithMedia;
|
||||
import com.vk.dto.common.ImageSize;
|
||||
@@ -24,318 +22,157 @@ import com.vtosters.lite.R;
|
||||
import com.vtosters.lite.attachments.DocumentAttachment;
|
||||
import com.vtosters.lite.attachments.PhotoAttachment;
|
||||
import okhttp3.*;
|
||||
import okio.BufferedSink;
|
||||
import okio.Okio;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.lite.di.singleton.VtOkHttpClient;
|
||||
import ru.vtosters.lite.themes.utils.RecolorUtils;
|
||||
import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||
import ru.vtosters.lite.utils.SearchEngine;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.List;
|
||||
|
||||
public class PhotoViewer {
|
||||
static OkHttpClient client = VtOkHttpClient.getInstance();
|
||||
|
||||
//region INSERTION INTO SMALI
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
public static void addMenuItems(AttachmentWithMedia attachment, ActionsPopup.b actionPopup, int i, boolean z) {
|
||||
actionPopup.a(
|
||||
R.string.copy,
|
||||
RecolorUtils.fixActionMenuIcons(R.drawable.ic_copy_outline_28),
|
||||
false,
|
||||
() -> {
|
||||
copyImage(attachment);
|
||||
return null;
|
||||
}
|
||||
).a(
|
||||
R.string.search_photo_content,
|
||||
RecolorUtils.fixActionMenuIcons(R.drawable.ic_menu_search_outline_28),
|
||||
false,
|
||||
() -> {
|
||||
searchImageWithUrl(attachment);
|
||||
return null;
|
||||
}
|
||||
).a(
|
||||
R.string.copy_photo_url_content,
|
||||
RecolorUtils.fixActionMenuIcons(R.drawable.ic_copy_outline_28),
|
||||
false,
|
||||
() -> {
|
||||
copyImageUrl(attachment);
|
||||
return null;
|
||||
}
|
||||
).a(
|
||||
R.string.open_original_photo_content,
|
||||
RecolorUtils.fixActionMenuIcons(R.drawable.ic_link_outline_28),
|
||||
false,
|
||||
() -> {
|
||||
openUrl(getImageUrlFromAttachment(attachment));
|
||||
return null;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressLint("NonConstantResourceId")
|
||||
public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.copy_image -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
copyImage(getUrlFromPhotoAttachment((PhotoAttachment) attachment), String.valueOf(attachment.getId()));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
copyImage(getUrlFromDocumentAttachment(documentAttachment), String.valueOf(attachment.getId()));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case R.id.copy_photo_url -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case R.id.open_original_photo -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
openUrl(getUrlFromDocumentAttachment(documentAttachment));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case R.id.copy_image -> copyImage(attachment);
|
||||
case R.id.search_photo -> searchImageWithUrl(attachment);
|
||||
case R.id.copy_photo_url -> copyImageUrl(attachment);
|
||||
case R.id.open_original_photo -> openUrl(getImageUrlFromAttachment(attachment));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//endregion
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
public static void addMenuItems(AttachmentWithMedia attachment, ActionsPopup.b actionPopup, int i, boolean z) {
|
||||
actionPopup.a(R.string.copy,
|
||||
ContextExtKt.b(AndroidUtils.getGlobalContext(), R.drawable.ic_copy_outline_28, VKThemeHelper.g(R.attr.header_tint)),
|
||||
false,
|
||||
() -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
copyImage(getUrlFromPhotoAttachment((PhotoAttachment) attachment), String.valueOf(attachment.getId()));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
copyImage(getUrlFromDocumentAttachment(documentAttachment), String.valueOf(attachment.getId()));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
);
|
||||
actionPopup.a(R.string.search_photo_content,
|
||||
ContextExtKt.b(AndroidUtils.getGlobalContext(), R.drawable.ic_menu_search_outline_28, VKThemeHelper.g(R.attr.header_tint)),
|
||||
false,
|
||||
() -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
searchDialog(LifecycleUtils.getCurrentActivity(), getUrlFromPhotoAttachment((PhotoAttachment) attachment));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
searchDialog(LifecycleUtils.getCurrentActivity(), getUrlFromDocumentAttachment(documentAttachment));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
);
|
||||
actionPopup.a(R.string.copy_photo_url_content,
|
||||
ContextExtKt.b(AndroidUtils.getGlobalContext(), R.drawable.ic_copy_outline_28, VKThemeHelper.g(R.attr.header_tint)),
|
||||
false,
|
||||
() -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
);
|
||||
actionPopup.a(R.string.open_original_photo_content,
|
||||
ContextExtKt.b(AndroidUtils.getGlobalContext(), R.drawable.ic_link_outline_28, VKThemeHelper.g(R.attr.header_tint)),
|
||||
false,
|
||||
() -> {
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
|
||||
} else if (attachment instanceof DocumentAttachment) {
|
||||
var documentAttachment = (DocumentAttachment) attachment;
|
||||
if (documentAttachment.J != null)
|
||||
try {
|
||||
openUrl(getUrlFromDocumentAttachment(documentAttachment));
|
||||
} catch (Exception e) {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
else
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private static String getUrlFromDocumentAttachment(DocumentAttachment attachment) {
|
||||
List<ImageSize> imageSizes = null;
|
||||
if (attachment.J != null) {
|
||||
imageSizes = attachment.J.t1();
|
||||
}
|
||||
return getUrlFromImageSizeList(imageSizes);
|
||||
}
|
||||
|
||||
private static String getUrlFromPhotoAttachment(PhotoAttachment attachment) {
|
||||
var imageSizes = attachment.D.Q.t1();
|
||||
return getUrlFromImageSizeList(imageSizes);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static String getUrlFromImageSizeList(List<ImageSize> imageSizes) {
|
||||
if (imageSizes.isEmpty())
|
||||
return null;
|
||||
var max = imageSizes.get(0);
|
||||
for (int i = 1; i < imageSizes.size(); ++i) {
|
||||
var size = imageSizes.get(i);
|
||||
if (max != null && max.t1() < size.t1()) {
|
||||
max = size;
|
||||
}
|
||||
}
|
||||
return max.url;
|
||||
}
|
||||
|
||||
private static void searchDialog(Context context, String url) {
|
||||
if (selectedEngine() == 0) {
|
||||
var items = new String[]{
|
||||
"Yandex", "Google", "Bing", "TraceMoe", "Ascii2d", "Saucenao"
|
||||
};
|
||||
|
||||
new VkAlertDialog.Builder(context)
|
||||
.setItems(items, (dl, i) -> {
|
||||
searchPhoto(i + 1, url);
|
||||
})
|
||||
.show();
|
||||
} else {
|
||||
searchPhoto(selectedEngine(), url);
|
||||
}
|
||||
}
|
||||
|
||||
private static void copyImage(String link, String name) {
|
||||
Request request = new Request.a().b(link).a();
|
||||
File file = new File(AndroidUtils.getGlobalContext().getExternalCacheDir(), name + ".jpg");
|
||||
|
||||
if (file.exists()) {
|
||||
copyImageToClipboard(file);
|
||||
return;
|
||||
}
|
||||
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try (Response response = client.a(request).execute()) {
|
||||
try (BufferedSink sink = Okio.a(Okio.b(file))) {
|
||||
sink.a(response.a().f());
|
||||
}
|
||||
|
||||
copyImageToClipboard(file);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
|
||||
private static void copyImageToClipboard(File file) {
|
||||
Uri path = FileProvider.getUriForFile(AndroidUtils.getGlobalContext(), "com.vtosters.lite.common.VKFileProvider", file);
|
||||
ClipData clip = ClipData.newUri(AndroidUtils.getGlobalContext().getContentResolver(), "Image", path);
|
||||
((ClipboardManager) AndroidUtils.getGlobalContext().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(clip);
|
||||
}
|
||||
|
||||
private static int selectedEngine() {
|
||||
return Preferences.getPreferences().getInt("search_engine", 0);
|
||||
}
|
||||
|
||||
private static void searchPhoto(int i, String url) {
|
||||
if (url == null || url.isEmpty()) {
|
||||
Log.d("PhotoViewer", "url is null or empty");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (i) {
|
||||
case 1 -> searchWithYandex(url);
|
||||
case 2 -> searchWithGoogle(url);
|
||||
case 3 -> searchWithBing(url);
|
||||
case 4 -> searchWithTraceMoe(url);
|
||||
case 5 -> searchWithAscii2d(url);
|
||||
case 6 -> searchWithSaucenao(url);
|
||||
}
|
||||
}
|
||||
|
||||
private static void searchPhoto(String url) {
|
||||
searchPhoto(selectedEngine(), url);
|
||||
}
|
||||
|
||||
private static void searchWithYandex(String url) {
|
||||
var request = new Request.a()
|
||||
.b(String.format("https://yandex.ru/images-apphost/image-download?url=%s&images_avatars_size=preview&images_avatars_namespace=images-cbir",
|
||||
URLEncoder.encode(url)))
|
||||
private static void copyImage(AttachmentWithMedia attachment) {
|
||||
var req = new Request.a()
|
||||
.b(getImageUrlFromAttachment(attachment))
|
||||
.a();
|
||||
client.a(request).a(new Callback() {
|
||||
client.a(req).a(new Callback() {
|
||||
@Override
|
||||
public void a(Call call, IOException e) {
|
||||
Log.d("PhotoViewer", e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void a(Call call, Response response) throws IOException {
|
||||
try {
|
||||
JSONObject payload = new JSONObject(response.a().g());
|
||||
var cbirId = payload.optInt("image_shard") + "/" + payload.optString("image_id");
|
||||
var imageUrl = String.format("https://avatars.mds.yandex.net/get-images-cbir/%s/orig", cbirId);
|
||||
var searchUrl = String.format("https://yandex.ru/images/search?rpt=imageview&url=%s&cbir_id=%s", imageUrl, cbirId);
|
||||
openUrl(searchUrl);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
public void a(Call call, Response response)
|
||||
throws IOException {
|
||||
var tmpImage = new File(AndroidUtils.getGlobalContext().getExternalCacheDir(), attachment.getId() + ".jpg");
|
||||
try (var resp = client.a(req).execute();
|
||||
var sink = Okio.a(Okio.b(tmpImage))) {
|
||||
sink.a(resp.a().f());
|
||||
var manager = (ClipboardManager) AndroidUtils.getGlobalContext().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
var uri = FileProvider.getUriForFile(
|
||||
AndroidUtils.getGlobalContext(),
|
||||
"com.vtosters.lite.common.VKFileProvider",
|
||||
tmpImage);
|
||||
var data = ClipData.newUri(
|
||||
AndroidUtils.getGlobalContext().getContentResolver(),
|
||||
"image",
|
||||
uri);
|
||||
manager.setPrimaryClip(data);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void searchWithGoogle(String url) {
|
||||
openUrl("https://www.google.com/searchbyimage?image_url=" + URLEncoder.encode(url) + "&client=app");
|
||||
private static void searchImageWithUrl(AttachmentWithMedia attachment) {
|
||||
String url = getImageUrlFromAttachment(attachment);
|
||||
if (TextUtils.isEmpty(url)) return;
|
||||
int selectedEngine = SearchEngine.getDefaultSearchEngine();
|
||||
if (selectedEngine < 0) {
|
||||
var items = new String[SearchEngine.values().length];
|
||||
for (int i = 0; i < SearchEngine.values().length; ++i)
|
||||
items[i] = SearchEngine.values()[i].mTitle;
|
||||
new VkAlertDialog.Builder(LifecycleUtils.getCurrentActivity())
|
||||
.setItems(items, (di, i) -> openUrl(SearchEngine.values()[i].buildSearchUrl(url)))
|
||||
.show();
|
||||
} else {
|
||||
// index correction for old versions with numeration "1-x"
|
||||
if (selectedEngine >= SearchEngine.values().length) SearchEngine.setDefaultSearchEngine(--selectedEngine);
|
||||
openUrl(SearchEngine.values()[selectedEngine].buildSearchUrl(url));
|
||||
}
|
||||
}
|
||||
|
||||
private static void searchWithTraceMoe(String url) {
|
||||
openUrl("https://trace.moe/?url=" + URLEncoder.encode(url));
|
||||
}
|
||||
|
||||
private static void searchWithAscii2d(String url) {
|
||||
openUrl("https://ascii2d.net/search/url/" + URLEncoder.encode(url));
|
||||
}
|
||||
|
||||
private static void searchWithSaucenao(String url) {
|
||||
openUrl("https://saucenao.com/search.php?url=" + URLEncoder.encode(url));
|
||||
}
|
||||
|
||||
private static void searchWithBing(String url) {
|
||||
openUrl("https://www.bing.com/images/search?view=detailv2&iss=SBI&form=SBIIDP&sbisrc=UrlPaste&q=imgurl:"
|
||||
+ URLEncoder.encode(url));
|
||||
}
|
||||
|
||||
private static void copyPhotoUrl(String url) {
|
||||
if (url == null || url.isEmpty()) return;
|
||||
private static void copyImageUrl(AttachmentWithMedia attachment) {
|
||||
String url = getImageUrlFromAttachment(attachment);
|
||||
if (TextUtils.isEmpty(url)) return;
|
||||
ClipboardManager manager = (ClipboardManager) AndroidUtils.getGlobalContext().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
manager.setPrimaryClip(ClipData.newPlainText("vk_photo_url", url));
|
||||
Toast.makeText(AndroidUtils.getGlobalContext(), R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
private static void openUrl(String url) {
|
||||
var uri = Uri.parse(url);
|
||||
var intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
if (TextUtils.isEmpty(url)) {
|
||||
Log.d("PhotoViewer", "url is null or empty");
|
||||
return;
|
||||
}
|
||||
var intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
AndroidUtils.getGlobalContext().startActivity(intent);
|
||||
}
|
||||
|
||||
private static String getImageUrlFromAttachment(AttachmentWithMedia attachment) {
|
||||
List<ImageSize> imageSizes;
|
||||
|
||||
if (attachment instanceof PhotoAttachment) {
|
||||
imageSizes = ((PhotoAttachment) attachment).D.Q.t1();
|
||||
} else if (attachment instanceof DocumentAttachment && ((DocumentAttachment) attachment).J != null) {
|
||||
imageSizes = ((DocumentAttachment) attachment).J.t1();
|
||||
} else {
|
||||
ToastUtils.a(R.string.photo_get_error);
|
||||
return "";
|
||||
}
|
||||
|
||||
if (imageSizes.isEmpty()) return "";
|
||||
|
||||
var max = imageSizes.get(0);
|
||||
for (int i = 1; i < imageSizes.size(); i++) {
|
||||
var tmp = imageSizes.get(i);
|
||||
if (max.t1() < tmp.t1()) max = tmp;
|
||||
}
|
||||
return max.url;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,29 @@
|
||||
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 {
|
||||
int i = obj.getInt("id");
|
||||
if (RenameTool.updateRequested) {
|
||||
RenameTool.reloadDB();
|
||||
}
|
||||
|
||||
Pair<String, String> user = RenameTool.renamedUsers.get(i);
|
||||
if (user == null) return;
|
||||
obj.put(RenameTool.COLUMN_FIRSTNAME, user.first).put(RenameTool.COLUMN_LASTNAME, user.second);
|
||||
// int i = obj.getInt("id");
|
||||
// if (RenameTool.updateRequested) {
|
||||
// RenameTool.reloadDB();
|
||||
// }
|
||||
//
|
||||
// Pair<String, String> user = RenameTool.renamedUsers.get(i);
|
||||
// if (user == null) return;
|
||||
// obj.put(RenameTool.COLUMN_FIRSTNAME, user.first).put(RenameTool.COLUMN_LASTNAME, user.second);
|
||||
}
|
||||
|
||||
public static void injectIntoJsonGroup(JSONObject obj) throws JSONException {
|
||||
int i = obj.getInt("id");
|
||||
|
||||
if (RenameTool.updateRequested) {
|
||||
RenameTool.reloadDB();
|
||||
}
|
||||
|
||||
String user = RenameTool.renamedGroups.get(i);
|
||||
if (user == null) return;
|
||||
obj.put("name", user);
|
||||
// int i = obj.getInt("id");
|
||||
//
|
||||
// if (RenameTool.updateRequested) {
|
||||
// RenameTool.reloadDB();
|
||||
// }
|
||||
//
|
||||
// String user = RenameTool.renamedGroups.get(i);
|
||||
// if (user == null) return;
|
||||
// obj.put("name", user);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ public class VKUIHook {
|
||||
}
|
||||
|
||||
private static void applyVKUIStyles(WebView webView) {
|
||||
if (getBoolValue("VKUI_INJ", true)) {
|
||||
if (getBoolValue("VKUI_INJ", true) && !webView.getUrl().contains("static.vk.com/memories")) {
|
||||
if (!WebViewColoringUtils.isLoaded) {
|
||||
WebViewColoringUtils.load();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.StrictMode;
|
||||
import com.vk.medianative.MediaImageEncoder;
|
||||
import com.vk.medianative.MediaNative;
|
||||
import com.vtosters.lite.data.Users;
|
||||
import com.vtosters.lite.fragments.SettingsListFragment;
|
||||
import ru.vtosters.hooks.GmsHook;
|
||||
@@ -22,7 +23,9 @@ public class Preferences {
|
||||
|
||||
public static void init(Application application) throws Exception {
|
||||
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
|
||||
StrictMode.setThreadPolicy(policy);
|
||||
StrictMode.setThreadPolicy(policy); // fix profiles hide hook
|
||||
|
||||
MediaNative.init(application);
|
||||
|
||||
GmsHook.fixGapps();
|
||||
ProxyUtils.setProxy();
|
||||
@@ -163,7 +166,7 @@ public class Preferences {
|
||||
}
|
||||
|
||||
public static boolean superapp() {
|
||||
return getBoolValue("superapp", true);
|
||||
return getBoolValue("superapp", true) && milkshake();
|
||||
}
|
||||
|
||||
public static boolean vkpay() {
|
||||
@@ -289,12 +292,16 @@ public class Preferences {
|
||||
}
|
||||
|
||||
public static boolean isNewBuild() {
|
||||
try {
|
||||
return getPreferences().getLong("setupTime", 0L) != AndroidUtils.getGlobalContext().getPackageManager().getPackageInfo(AndroidUtils.getPackageName(), 0).lastUpdateTime;
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
if(Preferences.getBoolValue("invalidate_theme_cache_each_update",true))
|
||||
try {
|
||||
return AndroidUtils.getGlobalContext()
|
||||
.getPackageManager()
|
||||
.getPackageInfo(AndroidUtils.getPackageName(), 0)
|
||||
.lastUpdateTime != getPreferences().getLong("setupTime", 0L);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void updateBuildNumber() {
|
||||
@@ -327,7 +334,7 @@ public class Preferences {
|
||||
}
|
||||
|
||||
public static long getSizeForDelete() {
|
||||
return switch (Preferences.getPreferences().getString("clearcache", "")) {
|
||||
return switch (Preferences.getPreferences().getString("autoclearcache", "")) {
|
||||
case "100mb" -> 104857600L;
|
||||
case "500mb" -> 524288000L;
|
||||
case "1gb" -> 1073741824L;
|
||||
|
||||
@@ -16,18 +16,17 @@ 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;
|
||||
import com.vtosters.lite.R;
|
||||
import com.vtosters.lite.data.ThemeTracker;
|
||||
import ru.vtosters.lite.deviceinfo.OEMDetector;
|
||||
import ru.vtosters.lite.themes.ThemesCore;
|
||||
import ru.vtosters.lite.themes.ThemesHacks;
|
||||
import ru.vtosters.lite.ui.wallpapers.WallpapersHooks;
|
||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||
@@ -47,22 +46,10 @@ public class ThemesUtils {
|
||||
}
|
||||
} // Apply VKTheme and ImTheme (hard applying without dynamic theme changing)
|
||||
|
||||
public static boolean isCustomAccentEnabled() {
|
||||
return ThemesUtils.isMonetTheme() || !useNewColorEngine();
|
||||
}
|
||||
|
||||
public static ColorStateList getAccenedColorStateList() {
|
||||
return ColorStateList.valueOf(getAccentColor());
|
||||
}
|
||||
|
||||
public static int getSystemModeTheme() {
|
||||
return AppCompatDelegate.getDefaultNightMode();
|
||||
}
|
||||
|
||||
public static void setSystemModeTheme(int theme) {
|
||||
AppCompatDelegate.setDefaultNightMode(theme);
|
||||
}
|
||||
|
||||
public static void setTheme(VKTheme theme, Activity activity, Boolean restartActivity) {
|
||||
setThemeFL(theme, activity, getCenterScreenCoords(), restartActivity);
|
||||
} // apply changed theme
|
||||
@@ -72,6 +59,7 @@ public class ThemesUtils {
|
||||
activity = LifecycleUtils.getCurrentActivity();
|
||||
}
|
||||
VKThemeHelper.theme(theme, activity, fl);
|
||||
if (isMonetTheme()) ThemesCore.clear();
|
||||
if (restartActivity) activity.recreate();
|
||||
ThemeTracker.a();
|
||||
WebViewColoringUtils.isLoaded = false;
|
||||
@@ -91,13 +79,8 @@ public class ThemesUtils {
|
||||
return getBoolValue("amoledtheme", false);
|
||||
}
|
||||
|
||||
public static boolean useNewColorEngine() {
|
||||
return getBoolValue("useNewColorEngine", false);
|
||||
}
|
||||
|
||||
public static int getAccentColor() {
|
||||
var color = Preferences.getPreferences().getInt("accent_color", getColorFromAttr(R.attr.accent));
|
||||
return color == 0 || useNewColorEngine() || isMonetTheme() ? getColorFromAttr(R.attr.accent) : color;
|
||||
return getColorFromAttr(R.attr.accent);
|
||||
} // Color accent
|
||||
|
||||
//region Used for migrating accent color to new version
|
||||
@@ -261,14 +244,6 @@ public class ThemesUtils {
|
||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? isDarkTheme() ? View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR : 0 : 0;
|
||||
}
|
||||
|
||||
public static int getStockAccent() {
|
||||
if (isMilkshake()) {
|
||||
return isDarkTheme() ? Color.parseColor("#71aaeb") : Color.parseColor("#3f8ae0");
|
||||
} else {
|
||||
return isDarkTheme() ? Color.parseColor("#71aaeb") : Color.parseColor("#528bcc");
|
||||
}
|
||||
}
|
||||
|
||||
public static int getDarkThemeRes() {
|
||||
if (isMonetTheme()) {
|
||||
if (isAmoledTheme()) {
|
||||
@@ -323,7 +298,7 @@ public class ThemesUtils {
|
||||
} // Recolor drawable to accent color
|
||||
|
||||
public static Drawable recolorToolbarDrawable(Drawable drawable) {
|
||||
if (!ThemesUtils.isCustomAccentEnabled()) return drawable;
|
||||
if (!ThemesUtils.isMonetTheme()) return drawable;
|
||||
if (drawable == null) return null;
|
||||
return new RecoloredDrawable(drawable, (ThemesUtils.isMilkshake() && !ThemesUtils.isDarkTheme()) ? ThemesUtils.getAccentColor() : ThemesUtils.getHeaderText());
|
||||
}
|
||||
@@ -408,15 +383,11 @@ public class ThemesUtils {
|
||||
}
|
||||
|
||||
public static int getNavigationHeight(int Default) {
|
||||
int VKME = R.dimen.design_bottom_sheet_peek_height_min;
|
||||
|
||||
return vkme() ? VKME : Default;
|
||||
return vkme() ? R.dimen.design_bottom_sheet_peek_height_min : Default;
|
||||
}
|
||||
|
||||
public static int getNavigationWidth(int Default) {
|
||||
int VKME = R.dimen.app_minimumsize_h;
|
||||
|
||||
return vkme() ? VKME : Default;
|
||||
return vkme() ? R.dimen.app_minimumsize_h : Default;
|
||||
}
|
||||
|
||||
public static ColorStateList getCSTDock() {
|
||||
@@ -427,12 +398,8 @@ public class ThemesUtils {
|
||||
},
|
||||
new int[]{
|
||||
dockbar_accent() ? getAccentColor() : (isDarkTheme() ? getResources().getColor(R.color.white) : getResources().getColor(R.color.gray_700)),
|
||||
isDarkTheme() ? getResources().getColor(R.color.gray_500) : getResources().getColor(R.color.vk_steel_gray_300)
|
||||
getColorFromAttr(R.attr.tabbar_inactive_icon)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private void getCurrentThemeID(VKTheme paramVKTheme) {
|
||||
Preference.b("vk_theme_helper", "current_theme", paramVKTheme.getId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
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;
|
||||
@@ -9,8 +8,8 @@ import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||
|
||||
public class BannerHook {
|
||||
public static JSONObject convBar(JSONObject orig) throws JSONException {
|
||||
return ImBanner.convBar(orig);
|
||||
public static JSONObject convBar(JSONObject orig) {
|
||||
return ImBanner.convertToBanner(orig);
|
||||
}
|
||||
|
||||
public static boolean showAlert() {
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.vk.im.engine.utils.ImDialogsUtils;
|
||||
import okhttp3.Headers;
|
||||
import okhttp3.OkHttpClient;
|
||||
import ru.vtosters.hooks.other.ThemesUtils;
|
||||
import ru.vtosters.lite.concurrent.VTExecutors;
|
||||
import ru.vtosters.lite.net.Request;
|
||||
import ru.vtosters.lite.proxy.ProxyUtils;
|
||||
import ru.vtosters.lite.utils.AccountManagerUtils;
|
||||
@@ -43,7 +44,7 @@ public class Requests {
|
||||
}
|
||||
|
||||
public static void pinnedMsg(int dialogid, boolean needToBePinned) {
|
||||
Thread thread = new Thread(() -> {
|
||||
VTExecutors.getIoExecutor().execute(() -> {
|
||||
try {
|
||||
var request = new okhttp3.Request.a()
|
||||
.b("https://" + ProxyUtils.getApi() + "/method/" + (needToBePinned ? "messages.pinConversation" : "messages.unpinConversation") + "?peer_id=" + dialogid + "&access_token=" + AccountManagerUtils.getUserToken() + "&v=5.119")
|
||||
@@ -56,8 +57,6 @@ public class Requests {
|
||||
}
|
||||
});
|
||||
|
||||
thread.start();
|
||||
|
||||
AndroidUtils.sendToast(AndroidUtils.getString(com.vtosters.lite.R.string.pin_dialog) + " " + AndroidUtils.getString(needToBePinned ? com.vtosters.lite.R.string.dialog_pinned : com.vtosters.lite.R.string.dialog_unpinned));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ import android.text.TextUtils;
|
||||
|
||||
public class TransportStream {
|
||||
|
||||
private String mKeyUri;
|
||||
private final String mMediaSegmentUri;
|
||||
private String mKeyUri;
|
||||
private String mMediaSegmentName;
|
||||
|
||||
public TransportStream(String baseURI, String mediaSegmentName) {
|
||||
|
||||
@@ -15,10 +15,9 @@ 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.other.Preferences.getBoolValue;
|
||||
import static ru.vtosters.hooks.GroupsCatalogInjector.injectIntoCatalog;
|
||||
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
|
||||
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;
|
||||
@@ -30,79 +30,22 @@ public class CatalogJsonInjector {
|
||||
|
||||
public static JSONObject music(JSONObject json) throws JSONException {
|
||||
var catalog = json.optJSONObject("catalog");
|
||||
|
||||
JSONArray oldItems = null;
|
||||
|
||||
if (catalog != null) {
|
||||
oldItems = catalog.optJSONArray("sections");
|
||||
}
|
||||
|
||||
var oldItems = catalog != null ? catalog.optJSONArray("sections") : null;
|
||||
var useOldAppVer = getBoolValue("useOldAppVer", false);
|
||||
var isUsersCatalog = oldItems.optJSONObject(0).optString("url").equals("https://vk.com/audios" + getUserId() + "?section=" + (useOldAppVer ? "all" : "general"));
|
||||
var blocks = oldItems.optJSONObject(0).optJSONArray("blocks");
|
||||
|
||||
if (isUsersCatalog) {
|
||||
var blocks = oldItems.optJSONObject(0).optJSONArray("blocks");
|
||||
|
||||
if (isUsersCatalog && blocks != null) {
|
||||
if (!useOldAppVer) {
|
||||
fixDailyMix(blocks);
|
||||
if (blocks != null) {
|
||||
for (int i = 0; i < blocks.length(); i++) {
|
||||
var block = blocks.optJSONObject(i);
|
||||
var layout = block.optJSONObject("layout");
|
||||
if (layout != null) {
|
||||
var name = layout.optString("name");
|
||||
if (name.equals("header_extended")) {
|
||||
if (layout.has("top_title")) blocks.remove(i);
|
||||
try {
|
||||
layout.put("name", "header");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var playlists = fetchCatalogId("https://vk.com/audio?section=my_playlists");
|
||||
if (playlists != null) {
|
||||
var catalogarr = playlists.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
|
||||
removeUnsupportedLayouts(blocks);
|
||||
|
||||
var title = catalogarr.optString("title");
|
||||
var id = catalogarr.optString("id");
|
||||
var url = catalogarr.optString("url");
|
||||
fetchCatalogId("https://vk.com/audio?section=my_playlists", oldItems);
|
||||
|
||||
Log.d("VKMusic", "Added " + title + " in music sections");
|
||||
fetchCatalogId("https://vk.com/audio?section=albums", oldItems);
|
||||
|
||||
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
|
||||
}
|
||||
|
||||
var albums = fetchCatalogId("https://vk.com/audio?section=albums");
|
||||
if (albums != null) {
|
||||
var catalogarr = albums.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
|
||||
|
||||
var title = catalogarr.optString("title");
|
||||
var id = catalogarr.optString("id");
|
||||
var url = catalogarr.optString("url");
|
||||
|
||||
Log.d("VKMusic", "Added " + title + " in music sections");
|
||||
|
||||
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
|
||||
}
|
||||
|
||||
for (int i = 0; i < oldItems.length(); i++) {
|
||||
var item = oldItems.optJSONObject(i);
|
||||
var title = item.optString("title");
|
||||
var id = item.optString("id");
|
||||
var url = item.optString("url");
|
||||
var value = Preferences.getString("musicdefcatalog");
|
||||
|
||||
Log.d("VKMusic", "title: " + title + " id: " + id + " url: " + url + " value: " + value);
|
||||
|
||||
if (url.contains(value) && !value.isEmpty()) {
|
||||
catalog.put("default_section", id);
|
||||
Log.d("VKMusic", "Added " + title + " as default music section");
|
||||
}
|
||||
}
|
||||
setDefaultAudioPage(oldItems, catalog);
|
||||
}
|
||||
|
||||
if (CacheDatabaseDelegate.hasTracks() && !LibVKXClient.isIntegrationEnabled()) { // inj in playlist list
|
||||
@@ -112,15 +55,11 @@ public class CatalogJsonInjector {
|
||||
json.put("playlists", new JSONArray().put(getPlaylist()));
|
||||
Log.d("catalogInjector", "added new pl");
|
||||
} else {
|
||||
try {
|
||||
json.optJSONArray("playlists").put(getPlaylist());
|
||||
Log.d("catalogInjector", "added to exist pl");
|
||||
} catch (Exception e) {
|
||||
Log.d("catalogInjector", e.toString());
|
||||
}
|
||||
json.optJSONArray("playlists").put(getPlaylist());
|
||||
Log.d("catalogInjector", "added to exist pl");
|
||||
}
|
||||
|
||||
if (blocks != null && (!useOldAppVer || noPlaylists)) {
|
||||
if (!useOldAppVer || noPlaylists) {
|
||||
var newBlocks = new JSONArray();
|
||||
|
||||
newBlocks
|
||||
@@ -155,6 +94,7 @@ public class CatalogJsonInjector {
|
||||
if (!isUsersCatalog || !CacheDatabaseDelegate.hasTracks() || LibVKXClient.isIntegrationEnabled()) {
|
||||
return; // early return if not users catalog or no tracks or integration enabled
|
||||
}
|
||||
|
||||
var noPlaylists = !json.has("playlists");
|
||||
|
||||
if (noPlaylists) {
|
||||
@@ -169,7 +109,7 @@ public class CatalogJsonInjector {
|
||||
}
|
||||
}
|
||||
|
||||
if (!useOldAppVer || noPlaylists) {
|
||||
if (!useOldAppVer && !noPlaylists) {
|
||||
var newBlocks = new JSONArray();
|
||||
|
||||
newBlocks
|
||||
@@ -278,9 +218,38 @@ public class CatalogJsonInjector {
|
||||
}
|
||||
}
|
||||
|
||||
private static JSONObject fetchCatalogId(String section) {
|
||||
if (section.isEmpty()) return null;
|
||||
private static void removeUnsupportedLayouts(JSONArray blocks) throws JSONException {
|
||||
for (int i = 0; i < blocks.length(); i++) {
|
||||
var block = blocks.optJSONObject(i);
|
||||
var layout = block.optJSONObject("layout");
|
||||
if (layout != null) {
|
||||
var name = layout.optString("name");
|
||||
if (name.equals("header_extended")) {
|
||||
if (layout.has("top_title")) blocks.remove(i);
|
||||
layout.put("name", "header");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void setDefaultAudioPage(JSONArray jsonArray, JSONObject catalog) throws JSONException {
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
var item = jsonArray.optJSONObject(i);
|
||||
var title = item.optString("title");
|
||||
var id = item.optString("id");
|
||||
var url = item.optString("url");
|
||||
var value = Preferences.getString("musicdefcatalog");
|
||||
|
||||
Log.d("VKMusic", "title: " + title + " id: " + id + " url: " + url + " value: " + value);
|
||||
|
||||
if (url.contains(value) && !value.isEmpty()) {
|
||||
catalog.put("default_section", id);
|
||||
Log.d("VKMusic", "Added " + title + " as default music section");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void fetchCatalogId(String sectionUrl, JSONArray jsonArray) {
|
||||
var request = new Request.a()
|
||||
.b("https://" + getApi() + "/method/" + "catalog.getAudio"
|
||||
+ "?v=5.119"
|
||||
@@ -291,16 +260,23 @@ public class CatalogJsonInjector {
|
||||
+ "&device_id="
|
||||
+ DeviceIdProvider.d(AndroidUtils.getGlobalContext())
|
||||
+ "&url="
|
||||
+ section
|
||||
+ sectionUrl
|
||||
+ "&access_token="
|
||||
+ AccountManagerUtils.getUserToken())
|
||||
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")).a();
|
||||
try {
|
||||
return new JSONObject(mClient.a(request).execute().a().g()).getJSONObject("response");
|
||||
var json = new JSONObject(mClient.a(request).execute().a().g()).getJSONObject("response");
|
||||
var catalogarr = json.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
|
||||
|
||||
var title = catalogarr.optString("title");
|
||||
var id = catalogarr.optString("id");
|
||||
var url = catalogarr.optString("url");
|
||||
|
||||
Log.d("VKMusic", "Added " + title + " in music sections");
|
||||
|
||||
jsonArray.put(new JSONObject().put("id", id).put("title", title).put("url", url));
|
||||
} catch (JSONException | IOException e) {
|
||||
Log.d("VTLMusic", "Error: " + e.getMessage());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,46 +5,63 @@ import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class ImBanner {
|
||||
private static final String TAG = "ImBanner";
|
||||
|
||||
public static JSONObject convBar(JSONObject orig) throws JSONException {
|
||||
var user_id = orig.getJSONObject("peer").getInt("id");
|
||||
public static JSONObject convertToBanner(JSONObject original) {
|
||||
final String PEER = "peer";
|
||||
final String ID = "id";
|
||||
final String PICTURE = "picture";
|
||||
final String TEXT = "text";
|
||||
final String LINK = "link";
|
||||
final String LINK_TEXT = "link_text";
|
||||
final String NAME = "name";
|
||||
final String BUTTONS = "buttons";
|
||||
final String ICON = "icon";
|
||||
|
||||
if (!UsersList.hasBanner(user_id) || user_id == 0) {
|
||||
Optional<JSONObject> user = Optional.ofNullable(original.optJSONObject(PEER));
|
||||
int userId = user.map(u -> u.optInt(ID)).orElse(0);
|
||||
|
||||
if (userId == 0 || !UsersList.hasBanner(userId)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
JSONObject banner = Handler.getBanner(userId);
|
||||
|
||||
if (banner == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
var jsonBanner = Handler.getBanner(user_id);
|
||||
var pic = jsonBanner.optString("picture");
|
||||
var text = jsonBanner.getString("text");
|
||||
String picture = banner.optString(PICTURE);
|
||||
String text = banner.getString(TEXT);
|
||||
String link = banner.optString(LINK);
|
||||
String linkText = banner.optString(LINK_TEXT);
|
||||
|
||||
var link = jsonBanner.optString("link");
|
||||
var link_text = jsonBanner.optString("link_text");
|
||||
boolean hasIcon = !picture.isEmpty();
|
||||
boolean hasButton = !link.isEmpty();
|
||||
boolean isPicture = picture.endsWith(".png") || picture.endsWith(".jpg") || picture.endsWith(".jpeg") || picture.endsWith(".webp");
|
||||
|
||||
var hasIcon = !pic.isEmpty();
|
||||
var hasButton = !link.isEmpty();
|
||||
var isPicture = pic.endsWith(".png") || pic.endsWith(".jpg") || pic.endsWith(".jpeg") || pic.endsWith(".webp");
|
||||
JSONObject json = new JSONObject();
|
||||
|
||||
var json = new JSONObject();
|
||||
JSONObject buttonJson = new JSONObject();
|
||||
buttonJson.put("layout", "tertiary");
|
||||
buttonJson.put("text", linkText);
|
||||
buttonJson.put("type", "link");
|
||||
buttonJson.put("link", link);
|
||||
|
||||
var buttonsJson = new JSONObject();
|
||||
buttonsJson.put("layout", "tertiary");
|
||||
buttonsJson.put("text", link_text);
|
||||
buttonsJson.put("type", "link");
|
||||
buttonsJson.put("link", link);
|
||||
JSONArray buttons = new JSONArray(); // max 3 buttons in array
|
||||
|
||||
var buttons = new JSONArray(); // max 3 buttons in array
|
||||
if (hasButton) buttons.put(buttonJson);
|
||||
|
||||
if (hasButton) buttons.put(buttonsJson);
|
||||
|
||||
json.put("name", "group_admin_welcome");
|
||||
json.put("text", text);
|
||||
json.put("buttons", buttons);
|
||||
json.put(NAME, "group_admin_welcome");
|
||||
json.put(TEXT, text);
|
||||
json.put(BUTTONS, buttons);
|
||||
|
||||
if (hasIcon && isPicture) {
|
||||
json.put("icon", pic);
|
||||
json.put(ICON, picture);
|
||||
}
|
||||
|
||||
return json;
|
||||
|
||||
@@ -143,8 +143,11 @@ public class ThemesCore {
|
||||
themedColors.put(R.attr.im_reply_separator, accentColor);
|
||||
themedColors.put(R.attr.im_text_name, accentColor);
|
||||
|
||||
outgoinging_msg = ThemesUtils.lighten(accentColor, 0.76f);
|
||||
outgoinging_msg_highlight = ThemesUtils.lighten(accentColor, 0.5f);
|
||||
float out = ThemesUtils.isMonetTheme() ? 0.85f : 0.76f;
|
||||
float outhighlight = ThemesUtils.isMonetTheme() ? 0.75f : 0.5f;
|
||||
|
||||
outgoinging_msg = ThemesUtils.lighten(accentColor, out);
|
||||
outgoinging_msg_highlight = ThemesUtils.lighten(accentColor, outhighlight);
|
||||
|
||||
themedColors.put(R.attr.im_ic_send_msg, accentColor);
|
||||
themedColors.put(R.attr.im_bubble_wallpaper_outgoing, accentColor);
|
||||
@@ -163,7 +166,7 @@ public class ThemesCore {
|
||||
}
|
||||
|
||||
public static boolean hasThemedAttr(Context context, int attrID) {
|
||||
if (ThemesUtils.isCustomAccentEnabled()) {
|
||||
if (ThemesUtils.isMonetTheme()) {
|
||||
if (Preferences.getBoolValue("logColors", false)) {
|
||||
try {
|
||||
Log.d(TAG, "Requesting color by attr " + context.getResources().getResourceName(attrID));
|
||||
|
||||
@@ -23,7 +23,7 @@ public class ThemesHacks {
|
||||
}
|
||||
|
||||
public static int getHackedColor(@NonNull Context context, @ColorRes int color) {
|
||||
if (ThemesUtils.isCustomAccentEnabled()) {
|
||||
if (ThemesUtils.isMonetTheme()) {
|
||||
if (Preferences.getBoolValue("logColors", false)) {
|
||||
try {
|
||||
Log.d("ThemesCore", "Requesting color by color " + context.getResources().getResourceName(color));
|
||||
|
||||
@@ -119,7 +119,7 @@ public class ThemesManager {
|
||||
initPaths(app);
|
||||
validateModApk();
|
||||
|
||||
if (!Preferences.isNewBuild() && !ThemesUtils.isMonetTheme() && canApplyCustomAccent() && ThemesUtils.useNewColorEngine()) {
|
||||
if (!Preferences.isNewBuild() && !ThemesUtils.isMonetTheme() && canApplyCustomAccent()) {
|
||||
ResourcesLoader.init(app);
|
||||
ResourcesLoader.load(app, modApk.getAbsolutePath(), false);
|
||||
}
|
||||
@@ -161,8 +161,7 @@ public class ThemesManager {
|
||||
final var arscEntry = apk.getEntry("resources.arsc");
|
||||
final var arscBis = new BufferedInputStream(apk.getInputStream(arscEntry));
|
||||
final var arsc = BinaryResourceFile.fromInputStream(arscBis);
|
||||
if (!ArscEditor.changeColors(arsc, ACCENT_COLORS, accentColor))
|
||||
throw new IllegalStateException("Not all colors have been changed");
|
||||
ArscEditor.changeColors(arsc, ACCENT_COLORS, accentColor);
|
||||
|
||||
try (
|
||||
final var zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(modApk)))
|
||||
|
||||
@@ -21,7 +21,7 @@ public class ViewInjector {
|
||||
}
|
||||
|
||||
public static View inject(View view, int i, boolean z) {
|
||||
if (ThemesUtils.isCustomAccentEnabled()) {
|
||||
if (ThemesUtils.isMonetTheme()) {
|
||||
for (BaseHook hook : hooks) {
|
||||
hook.inject(view, i, z);
|
||||
}
|
||||
|
||||
@@ -1,37 +1,38 @@
|
||||
package ru.vtosters.lite.themes.utils;
|
||||
|
||||
import com.google.devrel.gmscore.tools.apk.arsc.*;
|
||||
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;
|
||||
|
||||
public class ArscEditor {
|
||||
|
||||
public static boolean changeColors(BinaryResourceFile arsc, int[] colorIds, int color /*int[] colors*/) {
|
||||
int q = 0;
|
||||
public static void changeColors(BinaryResourceFile arsc, int[] colorIds, int color) {
|
||||
for (var chunk : arsc.getChunks()) {
|
||||
final var resourceTableChunk = (ResourceTableChunk) chunk;
|
||||
|
||||
for (PackageChunk packageChunk : resourceTableChunk.getPackages()) {
|
||||
for (TypeSpecChunk typeSpecChunk : packageChunk.getTypeSpecChunks()) {
|
||||
for (TypeChunk typeChunk : packageChunk.getTypeChunks(typeSpecChunk.getId())) {
|
||||
if (!"color".equals(typeChunk.getTypeName())) continue;
|
||||
|
||||
for (var entry : typeChunk.getEntries().entrySet()) {
|
||||
if (entry.getValue().isComplex()) continue;
|
||||
|
||||
final var id = BinaryResourceIdentifier.create(packageChunk.getId(), typeSpecChunk.getId(), entry.getKey());
|
||||
|
||||
for (int colorId : colorIds) {
|
||||
if (colorId != id.resId()) continue;
|
||||
|
||||
final var value = entry.getValue();
|
||||
value.updateValue(new BinaryResourceValue(8, value.value().type(), color /*colors[i]*/));
|
||||
++q;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return q == colorIds.length;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public class RecolorUtils {
|
||||
}
|
||||
|
||||
public static int recolorHexColor(int i) {
|
||||
if (!ThemesUtils.isCustomAccentEnabled()) return i;
|
||||
if (!ThemesUtils.isMonetTheme()) return i;
|
||||
var accented = ColorReferences.isAccentedColor(i);
|
||||
var mutedaccented = ColorReferences.isMutedAccentedColor(i);
|
||||
return (accented || mutedaccented) ? (accented ? ThemesUtils.getAccentColor() : ThemesUtils.getMutedAccentColor()) : i;
|
||||
@@ -57,7 +57,7 @@ public class RecolorUtils {
|
||||
|
||||
@SuppressLint("UseCompatLoadingForColorStateLists")
|
||||
public static ColorStateList themeCSL(Context context, int color) {
|
||||
if (!ThemesUtils.isCustomAccentEnabled()) {
|
||||
if (!ThemesUtils.isMonetTheme()) {
|
||||
if (Build.VERSION.SDK_INT >= 23) {
|
||||
return context.getColorStateList(color);
|
||||
} else {
|
||||
@@ -83,7 +83,7 @@ public class RecolorUtils {
|
||||
} // Recolor ColorStateList
|
||||
|
||||
public static ColorStateList themeCSL(ColorStateList csl) {
|
||||
if (!ThemesUtils.isCustomAccentEnabled()) return csl;
|
||||
if (!ThemesUtils.isMonetTheme()) return csl;
|
||||
|
||||
try {
|
||||
int unsel = csl.getColorForState(new int[]{-android.R.attr.state_selected}, Color.BLACK);
|
||||
|
||||
@@ -18,6 +18,7 @@ import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.lite.utils.LayoutUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@@ -35,6 +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<>();
|
||||
private final IViewHolderBinder mBinder;
|
||||
|
||||
// Min and max counts
|
||||
@@ -48,6 +50,11 @@ public class CategorizedAdapter<T> extends RecyclerView.Adapter<CategorizedAdapt
|
||||
this.mBinder = binder;
|
||||
}
|
||||
|
||||
public void setExceptions(T... exceptions) {
|
||||
mExceptions.clear();
|
||||
mExceptions.addAll(Arrays.asList(exceptions));
|
||||
}
|
||||
|
||||
public void setMinAndMaxCounts(int min, int max) {
|
||||
this.mMinSelectedItems = min;
|
||||
this.mMaxSelectedItems = max;
|
||||
@@ -173,16 +180,20 @@ public class CategorizedAdapter<T> extends RecyclerView.Adapter<CategorizedAdapt
|
||||
public boolean onItemMove(int fromPosition, int toPosition) {
|
||||
if (toPosition == 0 || isUnmovedItem(toPosition))
|
||||
return false;
|
||||
|
||||
switch (getTabType(fromPosition)) {
|
||||
case SELECTED_STATE -> {
|
||||
if (getTabType(toPosition) == DISABLED_STATE
|
||||
&& mSelectedItems.size() == mMinSelectedItems)
|
||||
if ((getTabType(toPosition) == DISABLED_STATE
|
||||
&& mSelectedItems.size() == mMinSelectedItems))
|
||||
return false;
|
||||
if (getItemViewType(toPosition) == CATEGORY_TITLE)
|
||||
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);
|
||||
} else Collections.swap(mSelectedItems, fromPosition - 1, toPosition - 1);
|
||||
}
|
||||
case DISABLED_STATE -> {
|
||||
if (getTabType(toPosition) == SELECTED_STATE
|
||||
@@ -198,7 +209,6 @@ public class CategorizedAdapter<T> extends RecyclerView.Adapter<CategorizedAdapt
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
notifyItemMoved(fromPosition, toPosition);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -59,71 +59,7 @@ 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;
|
||||
}
|
||||
|
||||
private DockBarTab getTabByTag(String tag) {
|
||||
public static DockBarTab getTabByTag(String tag) {
|
||||
return switch (tag) {
|
||||
case "tab_news" -> DockBarTab.valuesOf(
|
||||
"tab_news",
|
||||
@@ -235,4 +171,68 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,37 @@
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.WindowInsetsController;
|
||||
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.core.dialogs.alert.VkAlertDialog;
|
||||
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.stickers.Stickers;
|
||||
import com.vtosters.lite.im.ImEngineProvider;
|
||||
import ru.vtosters.hooks.SwitchHook;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.hooks.other.ThemesUtils;
|
||||
import ru.vtosters.lite.ui.PreferenceFragmentUtils;
|
||||
import ru.vtosters.lite.ui.components.BackupManager;
|
||||
import ru.vtosters.lite.utils.AccountManagerUtils;
|
||||
import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||
import ru.vtosters.lite.utils.VKAccountDB;
|
||||
import ru.vtosters.lite.utils.*;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -58,6 +74,114 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme
|
||||
}
|
||||
}
|
||||
|
||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("data"));
|
||||
|
||||
PreferenceFragmentUtils.addPreference(
|
||||
getPreferenceScreen(),
|
||||
"currcache",
|
||||
getString(com.vtosters.lite.R.string.cache_size),
|
||||
getString(com.vtosters.lite.R.string.cache_size_summ) + ": " + CacheUtils.humanReadableByteCountBin(IOUtils.getDirSize(AndroidUtils.getGlobalContext().getCacheDir())),
|
||||
null,
|
||||
preference -> {
|
||||
new VkAlertDialog.Builder(requireContext())
|
||||
.setTitle(getString(com.vtosters.lite.R.string.clear_all_cache))
|
||||
.setPositiveButton(requireContext().getString(com.vtosters.lite.R.string.yes), (dialogInterface, i) -> {
|
||||
new WebView(requireContext()).clearCache(true);
|
||||
VKImageLoader.e();
|
||||
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
|
||||
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
|
||||
FileUtils.l();
|
||||
AutoPlayCacheHolder.d.a();
|
||||
MediaStorage.a();
|
||||
updateCacheSize();
|
||||
})
|
||||
.setNegativeButton(requireContext().getString(com.vtosters.lite.R.string.cancel), (dialogInterface, i) -> dialogInterface.dismiss())
|
||||
.show();
|
||||
return false;
|
||||
}
|
||||
);
|
||||
|
||||
PreferenceFragmentUtils.addPreference(
|
||||
getPreferenceScreen(),
|
||||
"",
|
||||
AndroidUtils.getString("clearcache_other_title"),
|
||||
"",
|
||||
null,
|
||||
preference -> {
|
||||
new VkAlertDialog.Builder(getContext())
|
||||
.setTitle(requireContext().getString(com.vtosters.lite.R.string.select_which_clean))
|
||||
.setItems(AndroidUtils.getArray(com.vtosters.lite.R.array.cache_cleaner), (dialog, which) -> {
|
||||
switch (which) {
|
||||
case 0 -> {
|
||||
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
|
||||
prefs2.edit().clear().commit();
|
||||
new WebView(requireContext()).clearCache(true);
|
||||
VKImageLoader.e();
|
||||
ImEngineProvider.b().a();
|
||||
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
|
||||
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
|
||||
FileUtils.l();
|
||||
Stickers.l.c();
|
||||
ImEngineExt.a(ImEngine1.a());
|
||||
AutoPlayCacheHolder.d.a();
|
||||
MediaStorage.a();
|
||||
}
|
||||
case 1 -> {
|
||||
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
|
||||
prefs2.edit().clear().commit();
|
||||
Stickers.l.c();
|
||||
}
|
||||
case 2 -> {
|
||||
VKImageLoader.e();
|
||||
ImEngineExt.a(ImEngine1.a());
|
||||
}
|
||||
case 3 -> {
|
||||
AutoPlayCacheHolder.d.a();
|
||||
MediaStorage.a();
|
||||
}
|
||||
case 4 -> {
|
||||
ImEngineProvider.b().a();
|
||||
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
|
||||
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
|
||||
}
|
||||
case 5 -> new WebView(requireContext()).clearCache(true);
|
||||
}
|
||||
Toast.makeText(getContext(), requireContext().getString(com.vtosters.lite.R.string.cache_cleaned), Toast.LENGTH_SHORT).show();
|
||||
updateCacheSize();
|
||||
})
|
||||
.show();
|
||||
return false;
|
||||
}
|
||||
);
|
||||
|
||||
PreferenceFragmentUtils.addPreference(
|
||||
getPreferenceScreen(),
|
||||
"autoclearcache_btn",
|
||||
AndroidUtils.getString("autoclearcache"),
|
||||
"",
|
||||
null,
|
||||
preference -> {
|
||||
cacheAutoCleanDialog();
|
||||
return false;
|
||||
}
|
||||
);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("accounts"));
|
||||
|
||||
PreferenceFragmentUtils.addPreference(
|
||||
@@ -177,4 +301,59 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme
|
||||
|
||||
findPreference("analyticsDisabled").setVisible(Preferences.isValidSignature());
|
||||
}
|
||||
|
||||
private void updateCacheSize() {
|
||||
findPreference("currcache").setSummary(getString(com.vtosters.lite.R.string.cache_size_summ) + ": " + CacheUtils.humanReadableByteCountBin(IOUtils.getDirSize(AndroidUtils.getGlobalContext().getCacheDir())));
|
||||
}
|
||||
|
||||
@SuppressLint({"CommitPrefEdits", "SetTextI18n"})
|
||||
private void cacheAutoCleanDialog() {
|
||||
String[] cacheText = {null, "100 MB", "500 MB", "1 GB", "2 GB", "5 GB"};
|
||||
|
||||
var val = Preferences.getPreferences().getInt("autoclearcache_size", 0);
|
||||
RadioGroup rg = new RadioGroup(getContext());
|
||||
|
||||
rg.setPadding(AndroidUtils.dp2px(18f), AndroidUtils.dp2px(12f), AndroidUtils.dp2px(18f), 0);
|
||||
|
||||
for (int item = 0; item <= 5; item++) {
|
||||
RadioButton rb = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
||||
SwitchHook.setCompoundButton(rb);
|
||||
rg.addView(rb);
|
||||
rb.setId(item);
|
||||
rb.setTextSize(TypedValue.COMPLEX_UNIT_PX, AndroidUtils.dp2px(14f));
|
||||
|
||||
var text = cacheText[item];
|
||||
rb.setText(text != null ? text : AndroidUtils.getString("autoclearcachedisabled"));
|
||||
|
||||
rb.setTextColor(ThemesUtils.getTextAttr());
|
||||
rb.setChecked(val == item);
|
||||
}
|
||||
|
||||
new VkAlertDialog.Builder(getContext())
|
||||
.setTitle(requireContext().getString(com.vtosters.lite.R.string.cache_clean_title))
|
||||
.setMessage(requireContext().getString(com.vtosters.lite.R.string.cache_select_size))
|
||||
.setCancelable(true)
|
||||
.setNegativeButton(requireContext().getString(com.vtosters.lite.R.string.cancel), null)
|
||||
.setView(rg)
|
||||
.setPositiveButton(requireContext().getString(com.vtosters.lite.R.string.save), (dialog, which) -> {
|
||||
var sizes = new String[]{"Default", "100mb", "500mb", "1gb", "2gb", "5gb"};
|
||||
var id = rg.getCheckedRadioButtonId();
|
||||
Preferences.getPreferences().edit()
|
||||
.putInt("autoclearcache_size", id)
|
||||
.putString("autoclearcache", sizes[id])
|
||||
.apply();
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int T4() {
|
||||
return com.vtosters.lite.R.string.data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
updateCacheSize();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,6 +82,9 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
|
||||
holder.bindMovingItem(tab.iconID, tab.titleID);
|
||||
});
|
||||
adapter.setMinAndMaxCounts(DockBarEditorManager.MIN_SELECTED_TABS, DockBarEditorManager.MAX_SELECTED_TABS);
|
||||
adapter.setExceptions(
|
||||
DockBarEditorManager.getTabByTag("tab_profile"),
|
||||
DockBarEditorManager.getTabByTag("")/*settings*/);
|
||||
|
||||
var recyclerView = new RecyclerView(requireContext());
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
|
||||
@@ -34,7 +34,9 @@ public class InterfaceFragment extends TrackedMaterialPreferenceToolbarFragment
|
||||
|
||||
return true;
|
||||
});
|
||||
findPreference("superapp").setOnPreferenceClickListener(preference -> {
|
||||
var superapp = findPreference("superapp");
|
||||
superapp.setVisible(Preferences.milkshake());
|
||||
superapp.setOnPreferenceClickListener(preference -> {
|
||||
LifecycleUtils.restartApplicationWithTimer();
|
||||
|
||||
return true;
|
||||
@@ -70,6 +72,8 @@ public class InterfaceFragment extends TrackedMaterialPreferenceToolbarFragment
|
||||
return true;
|
||||
});
|
||||
|
||||
findPreference("friendsblock").setVisible(Preferences.milkshake());
|
||||
|
||||
if (Preferences.getPreferences().getInt("pic_rounding", 0) == 0) {
|
||||
findPreference("customrounding").setSummary(requireContext().getString(R.string.disabled));
|
||||
} else {
|
||||
|
||||
@@ -20,6 +20,7 @@ import okhttp3.Request;
|
||||
import org.json.JSONObject;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
import ru.vtosters.hooks.other.ThemesUtils;
|
||||
import ru.vtosters.lite.concurrent.VTExecutors;
|
||||
import ru.vtosters.lite.downloaders.AudioDownloader;
|
||||
import ru.vtosters.lite.downloaders.VideoDownloader;
|
||||
import ru.vtosters.lite.music.LastFMScrobbler;
|
||||
@@ -29,8 +30,8 @@ import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
|
||||
import ru.vtosters.lite.utils.AccountManagerUtils;
|
||||
import ru.vtosters.lite.utils.AndroidUtils;
|
||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||
import ru.vtosters.lite.utils.SearchEngine;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
@@ -133,26 +134,26 @@ public class MediaFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
});
|
||||
|
||||
findPreference("select_photo_search_engine").setOnPreferenceClickListener(preference -> {
|
||||
var deficon = ThemesUtils.recolorDrawable(AndroidUtils.getResources().getDrawable(R.drawable.ic_picture_outline_28));
|
||||
var choiceicon = ThemesUtils.recolorDrawable(AndroidUtils.getResources().getDrawable(R.drawable.link_outline_28));
|
||||
var items = new ImagineArrayAdapter.ImagineArrayAdapterItem[SearchEngine.values().length + 1];
|
||||
items[0] = new ImagineArrayAdapter.ImagineArrayAdapterItem(
|
||||
ThemesUtils.recolorDrawable(AndroidUtils.getResources().getDrawable(R.drawable.link_outline_28)),
|
||||
AndroidUtils.getString("by_choice"));
|
||||
for (int i = 0; i < SearchEngine.values().length; ++i) {
|
||||
var engine = SearchEngine.values()[i];
|
||||
items[i + 1] = engine.mIconRes != R.drawable.ic_picture_outline_28
|
||||
? new ImagineArrayAdapter.ImagineArrayAdapterItem(engine.mIconRes, engine.mTitle)
|
||||
: new ImagineArrayAdapter.ImagineArrayAdapterItem(
|
||||
ThemesUtils.recolorDrawable(AndroidUtils.getResources().getDrawable(R.drawable.ic_picture_outline_28)),
|
||||
engine.mTitle);
|
||||
}
|
||||
|
||||
var items = Arrays.asList(
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(choiceicon, AndroidUtils.getString("by_choice")),
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.yandex, "Yandex"),
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.google, "Google"),
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.microsoft, "Bing"),
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(deficon, "TraceMoe"),
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(deficon, "Ascii2d"),
|
||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(deficon, "Saucenao")
|
||||
);
|
||||
|
||||
var adapter = new ImagineArrayAdapter(requireContext(), items);
|
||||
adapter.setSelected(Preferences.getPreferences().getInt("search_engine", 0));
|
||||
var adapter = new ImagineArrayAdapter(requireContext(), Arrays.asList(items));
|
||||
adapter.setSelected(SearchEngine.getDefaultSearchEngine() + 1);
|
||||
|
||||
new VkAlertDialog.Builder(getActivity())
|
||||
.setAdapter(adapter, (dialog, which) -> {
|
||||
Preferences.getPreferences().edit().putInt("search_engine", which).apply();
|
||||
dialog.cancel();
|
||||
.setAdapter(adapter, (di, i) -> {
|
||||
SearchEngine.setDefaultSearchEngine(i != 0 ? i - 1 : -1);
|
||||
di.cancel();
|
||||
})
|
||||
.show();
|
||||
return true;
|
||||
@@ -239,32 +240,26 @@ public class MediaFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
}
|
||||
|
||||
public void deleteVideoHistory() {
|
||||
Thread thread = new Thread(() -> {
|
||||
VTExecutors.getIoExecutor().execute(() -> {
|
||||
var request = new Request.a()
|
||||
.b("https://" + ProxyUtils.getApi() + "/method/" + "video.clearViewingHistoryRecords" + "?https=1" + "&access_token=" + AccountManagerUtils.getUserToken() + "&v=5.119")
|
||||
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
|
||||
.a();
|
||||
|
||||
try {
|
||||
var request = new Request.a()
|
||||
.b("https://" + ProxyUtils.getApi() + "/method/" + "video.clearViewingHistoryRecords" + "?https=1" + "&access_token=" + AccountManagerUtils.getUserToken() + "&v=5.119")
|
||||
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
|
||||
.a();
|
||||
var response = new JSONObject(new OkHttpClient().a(request).execute().a().g());
|
||||
|
||||
try {
|
||||
var response = new JSONObject(new OkHttpClient().a(request).execute().a().g());
|
||||
|
||||
if (response.optInt("response") == 1) {
|
||||
requireActivity().runOnUiThread(() -> AndroidUtils.sendToast(requireContext().getString(R.string.video_history_cleaned)));
|
||||
} else {
|
||||
requireActivity().runOnUiThread(() -> AndroidUtils.sendToast(requireContext().getString(R.string.delete_video_history_error)));
|
||||
}
|
||||
|
||||
Log.d("VideoHistory", response.toString());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
if (response.optInt("response") == 1) {
|
||||
requireActivity().runOnUiThread(() -> AndroidUtils.sendToast(requireContext().getString(R.string.video_history_cleaned)));
|
||||
} else {
|
||||
requireActivity().runOnUiThread(() -> AndroidUtils.sendToast(requireContext().getString(R.string.delete_video_history_error)));
|
||||
}
|
||||
|
||||
Log.d("VideoHistory", response.toString());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private void deleteVideoHistoryDialog(Context context) {
|
||||
|
||||
@@ -1,35 +1,16 @@
|
||||
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;
|
||||
@@ -111,11 +92,6 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
return true;
|
||||
});
|
||||
|
||||
findPreference("clearcache").setOnPreferenceClickListener(preference -> {
|
||||
cacheCleanDialog();
|
||||
return true;
|
||||
});
|
||||
|
||||
findPreference("copyownlink").setOnPreferenceClickListener(preference -> {
|
||||
copyText("https://vk.com/id" + AccountManagerUtils.getUserId());
|
||||
ToastUtils.a(requireContext().getString(R.string.link_copied));
|
||||
@@ -127,11 +103,6 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
return true;
|
||||
});
|
||||
|
||||
findPreference("autoclearcache").setOnPreferenceClickListener(preference -> {
|
||||
cacheAutoCleanDialog();
|
||||
return true;
|
||||
});
|
||||
|
||||
findPreference("datasettings").setOnPreferenceClickListener(preference -> {
|
||||
NavigatorUtils.switchFragment(requireContext(), DataSettingsFragment.class);
|
||||
return true;
|
||||
@@ -146,19 +117,6 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
return true;
|
||||
});
|
||||
|
||||
var pref = Preferences.getPreferences().getString("autoclearcache", "Default");
|
||||
switch (pref) {
|
||||
case "Default" ->
|
||||
findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_disabled));
|
||||
case "100mb" ->
|
||||
findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_100mb));
|
||||
case "500mb" ->
|
||||
findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_500mb));
|
||||
case "1gb" -> findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_1gb));
|
||||
case "2gb" -> findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_2gb));
|
||||
case "5gb" -> findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_5gb));
|
||||
}
|
||||
|
||||
var vkAdminTokenPref = findPreference("vk_admin_token");
|
||||
vkAdminTokenPref.setVisible(Preferences.getPreferences().getBoolean("new_music_downloading_way", false));
|
||||
if (vkAdminTokenPref.isVisible()) {
|
||||
@@ -170,93 +128,6 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint({"CommitPrefEdits", "SetTextI18n"})
|
||||
private void cacheAutoCleanDialog() {
|
||||
String[] cacheText = {null, "100 MB", "500 MB", "1 GB", "2 GB", "5 GB"};
|
||||
|
||||
var val = Preferences.getPreferences().getInt("autoclearcache_size", 0);
|
||||
RadioGroup rg = new RadioGroup(getContext());
|
||||
|
||||
rg.setPadding(AndroidUtils.dp2px(18f), AndroidUtils.dp2px(12f), AndroidUtils.dp2px(18f), 0);
|
||||
|
||||
for (int item = 0; item <= 5; item++) {
|
||||
RadioButton rb = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
||||
SwitchHook.setCompoundButton(rb);
|
||||
rg.addView(rb);
|
||||
rb.setId(item);
|
||||
rb.setTextSize(TypedValue.COMPLEX_UNIT_PX, AndroidUtils.dp2px(14f));
|
||||
|
||||
var text = cacheText[item];
|
||||
rb.setText(text != null ? text : AndroidUtils.getString("autoclearcachedisabled"));
|
||||
|
||||
rb.setTextColor(ThemesUtils.getTextAttr());
|
||||
rb.setChecked(val == item);
|
||||
}
|
||||
|
||||
new VkAlertDialog.Builder(getContext())
|
||||
.setTitle(requireContext().getString(R.string.cache_clean_title))
|
||||
.setMessage(requireContext().getString(R.string.cache_select_size))
|
||||
.setCancelable(true)
|
||||
.setNegativeButton(requireContext().getString(R.string.cancel), null)
|
||||
.setView(rg)
|
||||
.setPositiveButton(requireContext().getString(R.string.save), (dialog, which) -> {
|
||||
var sizes = new String[]{"Default", "100mb", "500mb", "1gb", "2gb", "5gb"};
|
||||
var id = rg.getCheckedRadioButtonId();
|
||||
Preferences.getPreferences().edit()
|
||||
.putInt("autoclearcache_size", id)
|
||||
.putString("autoclearcache", sizes[id])
|
||||
.apply();
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
private void cacheCleanDialog() {
|
||||
new VkAlertDialog.Builder(getContext())
|
||||
.setTitle(requireContext().getString(R.string.select_which_clean))
|
||||
.setItems(AndroidUtils.getArray(R.array.cache_cleaner), (dialog, which) -> {
|
||||
switch (which) {
|
||||
case 0 -> {
|
||||
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
|
||||
prefs2.edit().clear().commit();
|
||||
clearWebViewCache();
|
||||
VKImageLoader.e();
|
||||
ImEngineProvider.b().a();
|
||||
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
|
||||
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
|
||||
FileUtils.l();
|
||||
Stickers.l.c();
|
||||
ImEngineExt.a(ImEngine1.a());
|
||||
AutoPlayCacheHolder.d.a();
|
||||
MediaStorage.a();
|
||||
}
|
||||
case 1 -> {
|
||||
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
|
||||
prefs2.edit().clear().commit();
|
||||
Stickers.l.c();
|
||||
}
|
||||
case 2 -> {
|
||||
VKImageLoader.e();
|
||||
ImEngineExt.a(ImEngine1.a());
|
||||
}
|
||||
case 3 -> {
|
||||
AutoPlayCacheHolder.d.a();
|
||||
MediaStorage.a();
|
||||
}
|
||||
case 4 -> {
|
||||
ImEngineProvider.b().a();
|
||||
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
|
||||
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
|
||||
}
|
||||
case 5 -> clearWebViewCache();
|
||||
}
|
||||
Toast.makeText(getContext(), requireContext().getString(R.string.cache_cleaned), Toast.LENGTH_SHORT).show();
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
private void clearWebViewCache() {
|
||||
new WebView(requireContext()).clearCache(true);
|
||||
}
|
||||
|
||||
private void copyText(String src) {
|
||||
var manager = (ClipboardManager) requireContext().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
|
||||
@@ -43,15 +43,15 @@ public class ThemesFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
|
||||
findPreference("systememoji").setSummary(AndroidUtils.getGlobalContext().getString(R.string.systememojisum) + " \uD83D\uDE00\uD83D\uDE01\uD83E\uDD11\uD83E\uDD75\uD83D\uDC4D");
|
||||
|
||||
findPreference("useNewColorEngine").setVisible(Preferences.dev());
|
||||
|
||||
var invalidateThemeCache = findPreference("invalidate_theme_cache");
|
||||
if (ThemesUtils.getReservedAccent() != Color.TRANSPARENT && Preferences.dev() && ThemesUtils.useNewColorEngine())
|
||||
if (ThemesUtils.getReservedAccent() != Color.TRANSPARENT && Preferences.dev()) {
|
||||
invalidateThemeCache.setOnPreferenceClickListener(preference -> {
|
||||
setAccentColor(ThemesUtils.getReservedAccent());
|
||||
return true;
|
||||
});
|
||||
else invalidateThemeCache.setVisible(false);
|
||||
} else {
|
||||
invalidateThemeCache.setVisible(false);
|
||||
}
|
||||
|
||||
var navBarPreference = findPreference("navbar");
|
||||
navBarPreference.setOnPreferenceClickListener(preference -> {
|
||||
@@ -156,12 +156,8 @@ public class ThemesFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.reset, (dialog, which) -> {
|
||||
if (ThemesUtils.useNewColorEngine()) {
|
||||
ThemesManager.deleteModification();
|
||||
ThemesUtils.reserveAccentColor(Color.TRANSPARENT, false);
|
||||
} else {
|
||||
ThemesUtils.setCustomAccentColor(0, false);
|
||||
}
|
||||
ThemesManager.deleteModification();
|
||||
ThemesUtils.reserveAccentColor(Color.TRANSPARENT, false);
|
||||
restart();
|
||||
})
|
||||
.setPositiveButton(R.string.cancel, null)
|
||||
@@ -207,35 +203,29 @@ public class ThemesFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||
}
|
||||
|
||||
void setAccentColor(int color) {
|
||||
if (ThemesUtils.useNewColorEngine()) {
|
||||
final VKProgressDialog dialog = new VKProgressDialog(requireContext());
|
||||
dialog.setCancelable(false);
|
||||
dialog.setMessage(AndroidUtils.getString("applying_accent") + "...");
|
||||
dialog.show();
|
||||
final VKProgressDialog dialog = new VKProgressDialog(requireContext());
|
||||
dialog.setCancelable(false);
|
||||
dialog.setMessage(AndroidUtils.getString("applying_accent") + "...");
|
||||
dialog.show();
|
||||
|
||||
VTExecutors.getIoExecutor().execute(() -> {
|
||||
try {
|
||||
ThemesUtils.reserveAccentColor(color, true);
|
||||
ThemesManager.generateModApk(color);
|
||||
requireActivity().runOnUiThread(this::restart);
|
||||
} catch (Throwable e) {
|
||||
Log.e("ThemesFragment", e.getMessage());
|
||||
ThemesManager.deleteModification();
|
||||
requireActivity().runOnUiThread(() -> {
|
||||
dialog.dismiss();
|
||||
new VkAlertDialog.Builder(requireContext())
|
||||
.setTitle(AndroidUtils.getString("error"))
|
||||
.setMessage(AndroidUtils.getString("error_applying_accent") + ":\n" + e)
|
||||
.setPositiveButton("OK", null)
|
||||
.show();
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
ThemesUtils.setCustomAccentColor(color, false);
|
||||
ThemesCore.setThemedColors(color);
|
||||
restart();
|
||||
}
|
||||
VTExecutors.getIoExecutor().execute(() -> {
|
||||
try {
|
||||
ThemesUtils.reserveAccentColor(color, true);
|
||||
ThemesManager.generateModApk(color);
|
||||
requireActivity().runOnUiThread(this::restart);
|
||||
} catch (Throwable e) {
|
||||
Log.e("ThemesFragment", e.getMessage());
|
||||
ThemesManager.deleteModification();
|
||||
requireActivity().runOnUiThread(() -> {
|
||||
dialog.dismiss();
|
||||
new VkAlertDialog.Builder(requireContext())
|
||||
.setTitle(AndroidUtils.getString("error"))
|
||||
.setMessage(AndroidUtils.getString("error_applying_accent") + ":\n" + e)
|
||||
.setPositiveButton("OK", null)
|
||||
.show();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void restart() {
|
||||
|
||||
@@ -33,6 +33,7 @@ import ru.vtosters.hooks.other.ThemesUtils;
|
||||
import ru.vtosters.hooks.ui.SystemThemeChangerHook;
|
||||
import ru.vtosters.lite.BuildConfig;
|
||||
import ru.vtosters.lite.concurrent.VTExecutors;
|
||||
import ru.vtosters.lite.deviceinfo.OEMDetector;
|
||||
import ru.vtosters.lite.ssfs.Utils;
|
||||
import ru.vtosters.lite.ui.PreferenceFragmentUtils;
|
||||
import ru.vtosters.lite.ui.dialogs.OTADialog;
|
||||
@@ -487,7 +488,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment impleme
|
||||
}
|
||||
);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
if (Build.VERSION.SDK_INT >= 33 && !OEMDetector.isMIUI()) {
|
||||
PreferenceFragmentUtils.addPreference(
|
||||
getPreferenceScreen(),
|
||||
"",
|
||||
@@ -571,7 +572,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment impleme
|
||||
}
|
||||
);
|
||||
|
||||
if (Preferences.isValidSignature() && BuildConfig.BUILD_TYPE.equals("release")) {
|
||||
if (Preferences.isValidSignature() && !BuildConfig.BUILD_TYPE.equals("dev")) {
|
||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.updates));
|
||||
|
||||
PreferenceFragmentUtils.addPreference(
|
||||
|
||||
@@ -31,4 +31,9 @@ public class DockBarTab {
|
||||
Class<?> fragmentClass) {
|
||||
return new DockBarTab(tag, iconID, titleID, resID, fragmentClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object arg) {
|
||||
return this.id == ((DockBarTab) arg).id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,4 +13,10 @@ public class SuperAppItem {
|
||||
public static SuperAppItem valuesOf(String type, String title) {
|
||||
return new SuperAppItem(type, title);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object arg) {
|
||||
var item = (SuperAppItem) arg;
|
||||
return this.type.equals(item.type) && this.title.equals(item.title);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ 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;
|
||||
@@ -46,15 +45,17 @@ public class MenuBuilder {
|
||||
cfambObject = CommunityFragmentActionsMenuBuilder.class.getDeclaredField("b");
|
||||
cfambObject.setAccessible(true);
|
||||
} catch (NoSuchFieldException | NoSuchMethodException e) {
|
||||
Log.e("VTLite", "Reflection failed");
|
||||
Log.e("MenuBuilder", "Reflection failed");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void injectAP(final ProfileFragmentActionsMenuBuilder mb, final ActionsPopup.b builder) {
|
||||
try {
|
||||
final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb);
|
||||
final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext();
|
||||
ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb);
|
||||
Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext();
|
||||
boolean isPageWhitelistedFilter = isWhitelistedFilter(eup);
|
||||
boolean isPageWhitelistedAdsStories = isWhitelistedAdStories(eup);
|
||||
addItem(builder, AndroidUtils.getString(R.string.menu_copy_id), () -> {
|
||||
copy(ctx, String.valueOf(AccountManagerUtils.getUserID(eup)));
|
||||
return Unit.a;
|
||||
@@ -65,11 +66,22 @@ public class MenuBuilder {
|
||||
return Unit.a;
|
||||
});
|
||||
|
||||
addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
|
||||
RenameTool.createDialog(eup, ctx);
|
||||
// addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
|
||||
// RenameTool.createDialog(eup, ctx);
|
||||
// return Unit.a;
|
||||
// });
|
||||
|
||||
addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> {
|
||||
setWhitelistedFilter(eup, !isPageWhitelistedFilter);
|
||||
AndroidUtils.sendToast(AndroidUtils.getString(isPageWhitelistedFilter ? R.string.removed_from_whitelist_success : R.string.added_to_whitelist_success));
|
||||
return Unit.a;
|
||||
});
|
||||
|
||||
addItem(builder, AndroidUtils.getString(isPageWhitelistedAdsStories ? R.string.remove_from_ads_stories_whitelist : R.string.add_to_ads_stories_whitelist), () -> {
|
||||
setWhitelistedAdStories(eup, !isPageWhitelistedAdsStories);
|
||||
AndroidUtils.sendToast(AndroidUtils.getString(isPageWhitelistedAdsStories ? R.string.removed_from_whitelist_success : R.string.added_to_whitelist_success));
|
||||
return Unit.a;
|
||||
});
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -77,21 +89,21 @@ public class MenuBuilder {
|
||||
|
||||
public static void injectAP(final CommunityFragmentActionsMenuBuilder mb, final ActionsPopup.b builder) {
|
||||
try {
|
||||
final ExtendedCommunityProfile ecp = (ExtendedCommunityProfile) cfambObject.get(mb);
|
||||
final Context ctx = ((View) apView.get(builder)).getContext();
|
||||
final boolean isPageWhitelistedFilter = isWhitelistedFilter(ecp);
|
||||
final boolean isPageWhitelistedAds = isWhitelistedAd(ecp);
|
||||
final boolean isPageWhitelistedAdsStories = isWhitelistedAdStories(ecp);
|
||||
ExtendedCommunityProfile ecp = (ExtendedCommunityProfile) cfambObject.get(mb);
|
||||
Context ctx = ((View) apView.get(builder)).getContext();
|
||||
boolean isPageWhitelistedFilter = isWhitelistedFilter(ecp);
|
||||
boolean isPageWhitelistedAds = isWhitelistedAd(ecp);
|
||||
boolean isPageWhitelistedAdsStories = isWhitelistedAdStories(ecp);
|
||||
|
||||
addItem(builder, AndroidUtils.getString(R.string.menu_copy_id), () -> {
|
||||
copy(ctx, String.valueOf(AccountManagerUtils.getUserID(ecp)));
|
||||
return Unit.a;
|
||||
});
|
||||
|
||||
addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
|
||||
RenameTool.createDialogGroup(ecp, ctx);
|
||||
return Unit.a;
|
||||
});
|
||||
// addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
|
||||
// RenameTool.createDialogGroup(ecp, ctx);
|
||||
// return Unit.a;
|
||||
// });
|
||||
|
||||
addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> {
|
||||
setWhitelistedFilter(ecp, !isPageWhitelistedFilter);
|
||||
@@ -110,7 +122,6 @@ public class MenuBuilder {
|
||||
AndroidUtils.sendToast(AndroidUtils.getString(isPageWhitelistedAdsStories ? R.string.removed_from_whitelist_success : R.string.added_to_whitelist_success));
|
||||
return Unit.a;
|
||||
});
|
||||
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -148,6 +159,19 @@ public class MenuBuilder {
|
||||
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
|
||||
}
|
||||
|
||||
public static boolean isWhitelistedFilter(ExtendedUserProfile eup) {
|
||||
return Preferences.getPreferences().getStringSet(
|
||||
"whitelisted_filters_groups", Collections.emptySet()
|
||||
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
|
||||
}
|
||||
|
||||
public static boolean isWhitelistedAdStories(ExtendedUserProfile eup) {
|
||||
return Preferences.getPreferences().getStringSet(
|
||||
"whitelisted_stories_ad",
|
||||
Collections.emptySet()
|
||||
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
|
||||
}
|
||||
|
||||
public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) {
|
||||
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
|
||||
|
||||
@@ -195,4 +219,36 @@ public class MenuBuilder {
|
||||
|
||||
Preferences.getPreferences().edit().putStringSet("whitelisted_stories_ad", mutableAdsSet).apply();
|
||||
}
|
||||
|
||||
public static void setWhitelistedFilter(ExtendedUserProfile eup, boolean needWhitelist) {
|
||||
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
|
||||
|
||||
var mutableAdsSet = new LinkedHashSet<>(Preferences.getPreferences().getStringSet(
|
||||
"whitelisted_filters_groups",
|
||||
Collections.emptySet())
|
||||
);
|
||||
if (needWhitelist) {
|
||||
mutableAdsSet.add(id);
|
||||
} else {
|
||||
mutableAdsSet.remove(id);
|
||||
}
|
||||
|
||||
Preferences.getPreferences().edit().putStringSet("whitelisted_filters_groups", mutableAdsSet).apply();
|
||||
}
|
||||
|
||||
public static void setWhitelistedAdStories(ExtendedUserProfile eup, boolean needWhitelist) {
|
||||
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
|
||||
|
||||
var mutableAdsSet = new LinkedHashSet<>(Preferences.getPreferences().getStringSet(
|
||||
"whitelisted_stories_ad",
|
||||
Collections.emptySet()));
|
||||
|
||||
if (needWhitelist) {
|
||||
mutableAdsSet.add(id);
|
||||
} else {
|
||||
mutableAdsSet.remove(id);
|
||||
}
|
||||
|
||||
Preferences.getPreferences().edit().putStringSet("whitelisted_stories_ad", mutableAdsSet).apply();
|
||||
}
|
||||
}
|
||||
@@ -5,12 +5,8 @@ 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;
|
||||
|
||||
|
||||
@@ -14,57 +14,46 @@ import static ru.vtosters.hooks.other.Preferences.*;
|
||||
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
||||
|
||||
public class NewsFeedFiltersUtils {
|
||||
public static List<String> mFilters;
|
||||
public static List<String> mFiltersNames;
|
||||
public static List<String> mFiltersLinks;
|
||||
public static List<String> mFilters = new ArrayList<>();
|
||||
public static List<String> mFiltersNames = new ArrayList<>();
|
||||
public static List<String> mFiltersLinks = new ArrayList<>();
|
||||
|
||||
public static void setupFilters() {
|
||||
mFilters = new ArrayList<>();
|
||||
mFiltersNames = new ArrayList<>();
|
||||
mFiltersLinks = new ArrayList<>();
|
||||
|
||||
getFilter("refsfilter", "Referals.txt", mFilters);
|
||||
getFilter("shortlinkfilter", "LinkShorter.txt", mFilters);
|
||||
getFilter("default_ad_list", "StandartFilter.txt", mFilters);
|
||||
getFilter("shitposting", "IDontWantToReadIt.txt", mFilters);
|
||||
getFilter("cringecopyright", "CopyrightAds.txt", mFiltersLinks);
|
||||
|
||||
var customFilters = getString("spamfilters");
|
||||
if (!customFilters.isEmpty()) {
|
||||
mFilters.addAll(Arrays.asList(customFilters.toLowerCase().split(", ")));
|
||||
}
|
||||
|
||||
var sourceNameFilter = getString("sourcenamefilter");
|
||||
if (!sourceNameFilter.isEmpty()) {
|
||||
mFiltersNames.addAll(Arrays.asList(sourceNameFilter.toLowerCase().split(", ")));
|
||||
}
|
||||
|
||||
var linkFilter = getString("linkfilter");
|
||||
if (!linkFilter.isEmpty()) {
|
||||
mFiltersLinks.addAll(Arrays.asList(linkFilter.toLowerCase().split(", ")));
|
||||
}
|
||||
setCustomFilters(mFilters, getString("spamfilters"));
|
||||
setCustomFilters(mFiltersNames, getString("sourcenamefilter"));
|
||||
setCustomFilters(mFiltersLinks, getString("linkfilter"));
|
||||
}
|
||||
|
||||
// Get needed filter list from assets
|
||||
public static void getFilter(String boolname, String filename, List<String> list) {
|
||||
var ctx = getGlobalContext();
|
||||
|
||||
if (getBoolValue(boolname, false)) {
|
||||
try {
|
||||
Scanner scanner;
|
||||
scanner = new Scanner(ctx.getAssets().open(filename));
|
||||
|
||||
try (Scanner scanner = new Scanner(getGlobalContext().getAssets().open(filename))) {
|
||||
while (scanner.hasNextLine()) {
|
||||
var line = scanner.nextLine();
|
||||
if (!line.isEmpty())
|
||||
list.add(line.toLowerCase());
|
||||
addNonEmptyLineToList(scanner.nextLine(), list);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.d("NewsFeedFiltersUtils", e.getMessage());
|
||||
}
|
||||
}
|
||||
} // Get needed filter list from assets
|
||||
}
|
||||
|
||||
public static boolean injectFiltersReposts(JSONObject obj) throws JSONException {
|
||||
private static void addNonEmptyLineToList(String line, List<String> list) {
|
||||
if (!line.isEmpty()) {
|
||||
list.add(line.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
public static void setCustomFilters(List<String> list, String filters) {
|
||||
if (!filters.isEmpty()) list.addAll(Arrays.asList(filters.toLowerCase().split(", ")));
|
||||
}
|
||||
|
||||
public static boolean injectFiltersReposts(JSONObject obj) {
|
||||
if (obj.has("copy_history")) {
|
||||
var copyHistoryNode = obj.optJSONArray("copy_history");
|
||||
if (copyHistoryNode != null && copyHistoryNode.length() != 0) {
|
||||
@@ -94,6 +83,7 @@ public class NewsFeedFiltersUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -101,17 +91,12 @@ public class NewsFeedFiltersUtils {
|
||||
if (json.has("copyright")) {
|
||||
if (copyright_post()) return true;
|
||||
|
||||
var copyright = json.optJSONObject("copyright");
|
||||
|
||||
JSONObject copyright = json.optJSONObject("copyright");
|
||||
String copyrightName = null;
|
||||
|
||||
if (copyright != null) {
|
||||
copyrightName = copyright.getString("name").toLowerCase();
|
||||
}
|
||||
|
||||
String copyrightLink = null;
|
||||
|
||||
if (copyright != null) {
|
||||
copyrightName = copyright.getString("name").toLowerCase();
|
||||
copyrightLink = copyright.getString("link").toLowerCase();
|
||||
}
|
||||
|
||||
@@ -126,8 +111,8 @@ public class NewsFeedFiltersUtils {
|
||||
if (copyrightLink != null && copyrightLink.contains(filter)) return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -144,7 +129,6 @@ public class NewsFeedFiltersUtils {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -154,9 +138,8 @@ public class NewsFeedFiltersUtils {
|
||||
var caption = postJson.optJSONObject("caption");
|
||||
if (postsrecomm()) {
|
||||
try {
|
||||
String type;
|
||||
if (caption != null) {
|
||||
type = caption.getString("type");
|
||||
String type = caption.getString("type");
|
||||
return type.equals("explorebait") || // Может быть интересно
|
||||
type.equals("shared") || // Поделился записью
|
||||
type.equals("digest") || // Рекомедации
|
||||
@@ -187,7 +170,7 @@ public class NewsFeedFiltersUtils {
|
||||
var title = item.optString("title");
|
||||
|
||||
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
|
||||
// this items not working
|
||||
// these items not working
|
||||
|| id.equals("kpop") || id.equals("foryou")
|
||||
|| id.equals("qazaqstan") || id.equals("podcasts"))
|
||||
continue;
|
||||
@@ -201,8 +184,8 @@ public class NewsFeedFiltersUtils {
|
||||
.put("is_unavailable", hide);
|
||||
Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
|
||||
}
|
||||
Preferences.getPreferences().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
|
||||
.apply();
|
||||
|
||||
Preferences.getPreferences().edit().putStringSet("news_feed_items_set", mutableFiltersSet).apply();
|
||||
|
||||
return items;
|
||||
}
|
||||
@@ -284,45 +267,6 @@ public class NewsFeedFiltersUtils {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static JSONObject discoverObj() throws JSONException {
|
||||
var mainjson = new JSONObject();
|
||||
|
||||
var info = new JSONObject();
|
||||
info.put("title", "Test Injection");
|
||||
info.put("text_color", "#ffffff");
|
||||
info.put("description", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat");
|
||||
|
||||
var image = new JSONArray();
|
||||
var imageQuality1 = new JSONObject();
|
||||
imageQuality1.put("url", "https://w7.pngwing.com/pngs/505/1021/png-transparent-konata-izumi-lucky-star-desktop-anime-anime-blue-mammal-face.png");
|
||||
imageQuality1.put("width", 72); // 72, 108, 144, 216, 288
|
||||
imageQuality1.put("height", 72); // 72, 108, 144, 216, 288
|
||||
image.put(imageQuality1);
|
||||
|
||||
var background = new JSONArray();
|
||||
var backgroundQuality1 = new JSONObject();
|
||||
backgroundQuality1.put("url", "https://2ch.life/vg/arch/2022-08-22/src/38524739/16440606579870.jpg");
|
||||
backgroundQuality1.put("width", 344); // 344, 516, 680, 1032, 1376
|
||||
backgroundQuality1.put("height", 215); // 215, 323, 426, 645, 860
|
||||
background.put(backgroundQuality1);
|
||||
|
||||
info.put("image", image);
|
||||
info.put("background", background);
|
||||
|
||||
mainjson.put("info", info);
|
||||
mainjson.put("track_code", "info_banner_donut_catalog");
|
||||
mainjson.put("template", "info");
|
||||
|
||||
var action = new JSONObject();
|
||||
action.put("type", "open_url");
|
||||
action.put("url", "vk.com/vtosters_official");
|
||||
action.put("target", "internal");
|
||||
|
||||
mainjson.put("action", action);
|
||||
|
||||
return mainjson;
|
||||
}
|
||||
|
||||
public static void parseStoriesItem(JSONObject item) throws JSONException {
|
||||
var stories = item.optJSONArray("stories");
|
||||
var newStories = new JSONArray();
|
||||
@@ -382,7 +326,7 @@ public class NewsFeedFiltersUtils {
|
||||
id = String.valueOf(list.optInt("source_id"));
|
||||
}
|
||||
|
||||
if (id.equals("-189659924")) {
|
||||
if (id.equals("-189659924") || id.equals(String.valueOf(AccountManagerUtils.getUserId()))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -391,7 +335,7 @@ public class NewsFeedFiltersUtils {
|
||||
Collections.emptySet()
|
||||
);
|
||||
|
||||
return whitelist.contains(id);
|
||||
return Preferences.getBoolValue("invertFilters", false) != whitelist.contains(id);
|
||||
}
|
||||
|
||||
public static Boolean isWhitelistedAd(JSONObject list) {
|
||||
@@ -425,7 +369,7 @@ public class NewsFeedFiltersUtils {
|
||||
|
||||
if (attachments != null && getBoolValue("blockminiapps", false)) {
|
||||
for (int j = 0; j < attachments.length(); j++) {
|
||||
var type = attachments.optJSONObject(j).optString("type");
|
||||
String type = attachments.optJSONObject(j).optString("type");
|
||||
if (type.contains("mini_app")) return true;
|
||||
}
|
||||
}
|
||||
@@ -439,7 +383,7 @@ public class NewsFeedFiltersUtils {
|
||||
|
||||
for (int i = 0; i < (items != null ? items.length() : 0); i++) {
|
||||
try {
|
||||
var curr = items.getJSONObject(i);
|
||||
JSONObject curr = items.getJSONObject(i);
|
||||
if (!curr.optString("template").contains("info") && discoverAdBlock(curr)) {
|
||||
newObj.put(items.optJSONObject(i));
|
||||
}
|
||||
@@ -460,11 +404,11 @@ public class NewsFeedFiltersUtils {
|
||||
var newItems = new JSONArray();
|
||||
|
||||
for (int j = 0; j < items.length(); j++) {
|
||||
var list = items.optJSONObject(j);
|
||||
JSONObject list = items.optJSONObject(j);
|
||||
|
||||
if (list == null) continue;
|
||||
|
||||
var type = list.optString("type");
|
||||
String type = list.optString("type");
|
||||
|
||||
if (isAds(list, type)) {
|
||||
continue;
|
||||
@@ -549,7 +493,7 @@ public class NewsFeedFiltersUtils {
|
||||
}
|
||||
|
||||
if (json.has("ads")) {
|
||||
var ad = json.optJSONObject("ads");
|
||||
JSONObject ad = json.optJSONObject("ads");
|
||||
if (isDeleteFix) {
|
||||
if (ad != null) {
|
||||
ad.optJSONObject("settings")
|
||||
@@ -567,10 +511,10 @@ public class NewsFeedFiltersUtils {
|
||||
}
|
||||
}
|
||||
|
||||
var items = json.optJSONArray("items");
|
||||
JSONArray items = json.optJSONArray("items");
|
||||
if (items != null) {
|
||||
for (int i = 0; i < items.length(); i++) {
|
||||
var item = items.optJSONObject(i);
|
||||
JSONObject item = items.optJSONObject(i);
|
||||
if (item != null) {
|
||||
parseStoriesItem(item);
|
||||
}
|
||||
|
||||
@@ -27,19 +27,18 @@ import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr;
|
||||
import static ru.vtosters.lite.utils.AndroidUtils.*;
|
||||
|
||||
public class RenameTool {
|
||||
private static final int DB_VERSION = 2;
|
||||
|
||||
private static final String COLUMN_NAME = "name";
|
||||
public static final String COLUMN_FIRSTNAME = "first_name";
|
||||
public static final String COLUMN_LASTNAME = "last_name";
|
||||
public static final SparseArray<Pair<String, String>> renamedUsers = new SparseArray<>();
|
||||
public static final SparseArray<String> renamedGroups = new SparseArray<>();
|
||||
private static final int DB_VERSION = 2;
|
||||
private static final String COLUMN_NAME = "name";
|
||||
private static final String COLUMN_VKID = "vk_id";
|
||||
private static final String DB_NAME = "vt_rename.db";
|
||||
private static final String TABLE_NAME = "renames";
|
||||
private static final String TABLE_NAME_GROUP = "renames_group";
|
||||
public static final SparseArray<Pair<String, String>> renamedUsers = new SparseArray<>();
|
||||
public static final SparseArray<String> renamedGroups = new SparseArray<>();
|
||||
private static RenameTool.DbHelper helperInstance;
|
||||
public static boolean updateRequested = true;
|
||||
private static RenameTool.DbHelper helperInstance;
|
||||
|
||||
protected static RenameTool.DbHelper getHelper() {
|
||||
if (helperInstance == null) {
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package ru.vtosters.lite.utils;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import com.vtosters.lite.R;
|
||||
import ru.vtosters.hooks.other.Preferences;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
|
||||
public enum SearchEngine {
|
||||
YANDEX(R.drawable.yandex,
|
||||
"Yandex",
|
||||
"https://yandex.com/images/search?rpt=imageview&url="),
|
||||
GOOGLE(R.drawable.google,
|
||||
"Google",
|
||||
"https://www.google.com/searchbyimage?client=app&image_url="),
|
||||
BING(R.drawable.bing,
|
||||
"Bing",
|
||||
"https://www.bing.com/images/search?view=detailv2&iss=SBI&form=SBIIDP&sbisrc=UrlPaste&q=imgurl:"),
|
||||
TRACEMOE(R.drawable.tracemoe,
|
||||
"trace.moe",
|
||||
"https://trace.moe/?url="),
|
||||
ASCII2D(R.drawable.ic_picture_outline_28,
|
||||
"Ascii2d",
|
||||
"https://ascii2d.net/search/url/"),
|
||||
SAUCENAO(R.drawable.sauceNAO,
|
||||
"SauceNAO",
|
||||
"https://saucenao.com/search.php?url=");
|
||||
|
||||
@DrawableRes
|
||||
public final int mIconRes;
|
||||
public final String mTitle;
|
||||
private final String mBaseUrl;
|
||||
|
||||
SearchEngine(@DrawableRes int iconRes, String title, String baseUrl) {
|
||||
this.mIconRes = iconRes;
|
||||
this.mTitle = title;
|
||||
this.mBaseUrl = baseUrl;
|
||||
}
|
||||
|
||||
public static int getDefaultSearchEngine() {
|
||||
return Preferences.getPreferences().getInt("search_engine", -1);
|
||||
}
|
||||
|
||||
public static void setDefaultSearchEngine(int i) {
|
||||
Preferences.getPreferences().edit().putInt("search_engine", i).apply();
|
||||
}
|
||||
|
||||
public String buildSearchUrl(String targetUrl) {
|
||||
return this.mBaseUrl + URLEncoder.encode(targetUrl);
|
||||
}
|
||||
}
|
||||
@@ -3,10 +3,6 @@ package ru.vtosters.lite.utils;
|
||||
import android.webkit.WebView;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static ru.vtosters.hooks.other.ThemesUtils.*;
|
||||
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
||||
@@ -16,30 +12,27 @@ public class WebViewColoringUtils {
|
||||
public static String loadedCSS = "";
|
||||
public static String loadedCSSAmoled = "";
|
||||
|
||||
private static String load(String str) {
|
||||
private static String readCSS(String str) {
|
||||
try (var is = getGlobalContext().getAssets().open(str)) {
|
||||
return IOUtils.readAllLines(is);
|
||||
return IOUtils.readAllLines(is)
|
||||
.replace("%header_background%", hex(getHeaderBackground()))
|
||||
.replace("%background_content%", hex(getBackgroundContent()))
|
||||
.replace("%header_text%", hex(getHeaderText()))
|
||||
.replace("%accent%", hex(getAccentColor()))
|
||||
.replace("%background_page%", hex(getBackgroundPage()))
|
||||
.replace("%content_tint_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.content_tint_background)))
|
||||
.replace("%button_primary_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_primary_background)))
|
||||
.replace("%button_outline_foreground%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_foreground)))
|
||||
.replace("%button_outline_border%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_border)))
|
||||
.replace("%text_primary%", hex(getTextAttr()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static void load() {
|
||||
loadedCSS = load("vt_ui_accent.css")
|
||||
.replace("%header_background%", hex(getHeaderBackground()))
|
||||
.replace("%background_content%", hex(getBackgroundContent()))
|
||||
.replace("%header_text%", hex(getHeaderText()))
|
||||
.replace("%accent%", hex(getAccentColor()))
|
||||
.replace("%background_page%", hex(getBackgroundPage()))
|
||||
.replace("%content_tint_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.content_tint_background)))
|
||||
.replace("%button_primary_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_primary_background)))
|
||||
.replace("%button_outline_foreground%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_foreground)))
|
||||
.replace("%button_outline_border%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_border)))
|
||||
.replace("%text_primary%", hex(getTextAttr()));
|
||||
|
||||
|
||||
loadedCSSAmoled = load("vt_ui_oled.css");
|
||||
loadedCSS = readCSS("vt_ui_accent.css");
|
||||
loadedCSSAmoled = readCSS("vt_ui_oled.css");
|
||||
isLoaded = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,3 +14,6 @@
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.jetifier.ignorelist=classes-dex2jar.jar, classes2-dex2jar.jar, classes3-dex2jar.jar, classes4-dex2jar.jar, classes5-dex2jar.jar, classes6-dex2jar.jar, classes7-dex2jar.jar
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
|
||||
@@ -22,9 +22,6 @@ if "%ERRORLEVEL%" == "0" (
|
||||
echo %ESC%[31mFailed%ESC%[0m
|
||||
exit /B 1
|
||||
)
|
||||
del classes6.dex
|
||||
del classes7.dex
|
||||
del assets\version.properties
|
||||
|
||||
echo.
|
||||
echo %ESC%[1;4mSign apk...%ESC%[0m
|
||||
|
||||
@@ -33,8 +33,4 @@ cd ../scripts
|
||||
./apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android ../scripts/VTLite.apk
|
||||
check_result
|
||||
|
||||
echo -e "${BOLD}VTosters Lite успешно собран! APK находится в папке scripts${NC}"
|
||||
|
||||
cd ../smali
|
||||
rm classes6.dex
|
||||
rm classes7.dex
|
||||
echo -e "${BOLD}VTosters Lite успешно собран! APK находится в папке scripts${NC}"
|
||||
@@ -57,6 +57,7 @@ cпocоб зaрaбoтать
|
||||
В закрепленном комментарии
|
||||
В Закрепленном комментарии
|
||||
В закрепленном Комментарии
|
||||
в комментариях
|
||||
Успей подать заявку
|
||||
Успей Подать Заявку
|
||||
Успей подать Заявку
|
||||
@@ -94,6 +95,6 @@ cкорее подписывайся
|
||||
Подписывайтесь👇
|
||||
Подписывайся👇
|
||||
ссылка в комментариях
|
||||
в комментариях👇
|
||||
👉https://
|
||||
👉http://
|
||||
👉http://
|
||||
Ссылка удалится через часов
|
||||
@@ -1,12 +1,14 @@
|
||||
/* vkui.css V2 by iTaysonLab */
|
||||
/* vkui coloring V2 by iTaysonLab */
|
||||
/* rewrited by vtosters team */
|
||||
/* Generic VKUI */
|
||||
/* additional fixes for various VKUI */
|
||||
.Tooltip__content {
|
||||
background-color: %accent% !important;
|
||||
}
|
||||
|
||||
.vkuibright_light, [scheme=bright_light], body[scheme=bright_light] {
|
||||
.vkuibright_light, [scheme=bright_light], body[scheme=bright_light], .vkui--vkBase--light, .vkui--vkIOS--light, .vkui--vkCom--light {
|
||||
--accent: %accent% !important;
|
||||
--vkui--color_icon_accent: %accent% !important;
|
||||
--action_sheet_action_foreground: %accent% !important;
|
||||
--attach_picker_tab_active_background: %accent% !important;
|
||||
--attach_picker_tab_active_text: %accent% !important;
|
||||
@@ -29,22 +31,33 @@
|
||||
--landing_text_title: %accent% !important;
|
||||
--landing_secondary_button_foreground: %accent% !important;
|
||||
--link_alternate: %accent% !important;
|
||||
--vkui--color_text_link_themed: %accent% !important;
|
||||
--loader_track_value_fill: %accent% !important;
|
||||
--vkui--color_track_buffer: %accent% !important;
|
||||
--feed_recommended_friend_promo_background: %accent% !important;
|
||||
--tabbar_active_icon: %accent% !important;
|
||||
--tabbar_tablet_active_icon: %accent% !important;
|
||||
--text_link: %accent% !important;
|
||||
--text_name: %accent% !important;
|
||||
--vkui--color_text_link: %accent% !important;
|
||||
--vkui--color_text_name: %accent% !important;
|
||||
--writebar_icon: %accent% !important;
|
||||
--vkui--color_write_bar_icon: %accent% !important;
|
||||
--dynamic_blue: %accent% !important;
|
||||
/* backgrounds */
|
||||
--background_content: %background_content% !important;
|
||||
--vkui--color_background_content: %background_content% !important;
|
||||
--background_page: %background_page% !important;
|
||||
--vkui--color_background: %background_page% !important;
|
||||
--content_tint_background: %content_tint_background% !important;
|
||||
--vkui--color_background_secondary: %content_tint_background% !important;
|
||||
--loader_background: %background_page% !important;
|
||||
--header_background: %header_background% !important;
|
||||
--header_background_before_blur: %header_background% !important;
|
||||
--header_background_before_blur_alternate: %header_background% !important;
|
||||
--vkui--color_header_background: %header_background% !important;
|
||||
--vkui--color_header_background_before_blur: %header_background% !important;
|
||||
--vkui--color_header_background_before_blur_alternate: %header_background% !important;
|
||||
--header_alternate_background: %header_background% !important;
|
||||
|
||||
--header_text_alternate: %header_text% !important;
|
||||
@@ -52,12 +65,14 @@
|
||||
--header_text_secondary: %header_text% !important;
|
||||
--header_tint: %header_text% !important;
|
||||
--header_tint_alternate: %header_text% !important;
|
||||
--vkui--color_icon_accent_themed: %header_text% !important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.vkuispace_gray, [scheme=space_gray], body[scheme=space_gray] {
|
||||
.vkuispace_gray, [scheme=space_gray], body[scheme=space_gray], .vkui--vkBase--dark, .vkui--vkIOS--dark, .vkui--vkCom--dark {
|
||||
--accent: %accent% !important;
|
||||
--vkui--color_icon_accent: %accent% !important;
|
||||
--action_sheet_action_foreground: %accent% !important;
|
||||
--attach_picker_tab_active_background: %accent% !important;
|
||||
--attach_picker_tab_active_text: %accent% !important;
|
||||
@@ -80,25 +95,36 @@
|
||||
--landing_text_title: %accent% !important;
|
||||
--landing_secondary_button_foreground: %accent% !important;
|
||||
--link_alternate: %accent% !important;
|
||||
--vkui--color_text_link_themed: %accent% !important;
|
||||
--loader_track_value_fill: %accent% !important;
|
||||
--vkui--color_track_buffer: %accent% !important;
|
||||
--feed_recommended_friend_promo_background: %accent% !important;
|
||||
--tabbar_active_icon: %accent% !important;
|
||||
--tabbar_tablet_active_icon: %accent% !important;
|
||||
--text_link: %accent% !important;
|
||||
--text_name: %accent% !important;
|
||||
--vkui--color_text_link: %accent% !important;
|
||||
--vkui--color_text_name: %accent% !important;
|
||||
--writebar_icon: %accent% !important;
|
||||
--vkui--color_write_bar_icon: %accent% !important;
|
||||
--dynamic_blue: %accent% !important;
|
||||
--background_content: %background_content% !important;
|
||||
--vkui--color_background_content: %background_content% !important;
|
||||
--background_page: %background_page% !important;
|
||||
--vkui--color_background: %background_page% !important;
|
||||
--content_tint_background: %content_tint_background% !important;
|
||||
--vkui--color_background_secondary: %content_tint_background% !important;
|
||||
--loader_background: %background_page% !important;
|
||||
--header_background: %header_background% !important;
|
||||
--header_background_before_blur: %header_background% !important;
|
||||
--header_background_before_blur_alternate: %header_background% !important;
|
||||
--vkui--color_header_background: %header_background% !important;
|
||||
--vkui--color_header_background_before_blur: %header_background% !important;
|
||||
--vkui--color_header_background_before_blur_alternate: %header_background% !important;
|
||||
--header_alternate_background: %header_background% !important;
|
||||
--header_tint: %header_text% !important;
|
||||
--header_tint_alternate: %header_text% !important;
|
||||
|
||||
--vkui--color_icon_accent_themed: %header_text% !important;
|
||||
--header_text_alternate: %header_text% !important;
|
||||
--header_text: %header_text% !important;
|
||||
--header_text_secondary: %header_text% !important;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* vkui.css V2 by iTaysonLab */
|
||||
/* vkui coloring V2 by iTaysonLab */
|
||||
/* rewrited by vtosters team */
|
||||
/* Articles */
|
||||
body.article_body.article_dark {
|
||||
background-color: #000000 !important;
|
||||
@@ -19,7 +20,7 @@ body.article_body.article_dark {
|
||||
}
|
||||
|
||||
.article_dark .article>h1 {
|
||||
color: %textColorPrimary% !important;
|
||||
color: %text_primary% !important;
|
||||
}
|
||||
|
||||
.article__info_line {
|
||||
@@ -48,45 +49,60 @@ body.article_body.article_dark {
|
||||
}
|
||||
|
||||
/* Generic VKUI */
|
||||
.vkuispace_gray, [scheme=space_gray], body[scheme=space_gray] {
|
||||
.vkuispace_gray, [scheme=space_gray], body[scheme=space_gray], .vkui--vkBase--dark, .vkui--vkIOS--dark, .vkui--vkCom--dark {
|
||||
/* light background */
|
||||
--attach_picker_tab_active_icon: #000000 !important;
|
||||
--background_content: #000000 !important;
|
||||
--vkui--color_background_content: %background_content% !important;
|
||||
--button_bot_shadow: #000000 !important;
|
||||
--button_primary_foreground: #000000 !important;
|
||||
--content_tint_background: #000000 !important;
|
||||
--vkui--color_background_secondary: %content_tint_background% !important;
|
||||
--counter_secondary_text: #000000 !important;
|
||||
--loader_background: #000000 !important;
|
||||
--overlay_status_background: #000000 !important;
|
||||
--header_background: #000000 !important;
|
||||
--header_alternate_background: #000000 !important;
|
||||
--header_alternate_background: #000000 !important;
|
||||
--vkui--color_header_background: #000000 !important;
|
||||
--separator_alternate: #000000 !important;
|
||||
--segmented_control_bar_background: #000000 !important;
|
||||
--search_bar_background: #000000 !important;
|
||||
/* background */
|
||||
--background_page: #000000 !important;
|
||||
--vkui--color_background: #000000 !important;
|
||||
--header_background_before_blur: #000000 !important;
|
||||
--header_background_before_blur_alternate: #000000 !important;
|
||||
--vkui--color_header_background_before_blur: #000000 !important;
|
||||
--vkui--color_header_background_before_blur_alternate: #000000 !important;
|
||||
/* lighter BG (text fields) */
|
||||
--attach_picker_tab_inactive_background: #121212 !important;
|
||||
--background_keyboard: #121212 !important;
|
||||
--background_suggestions: #121212 !important;
|
||||
--vkui--color_background_modal: #121212 !important;
|
||||
--field_background: #121212 !important;
|
||||
--im_bubble_incoming: #121212 !important;
|
||||
--input_border: #121212 !important;
|
||||
--vkui--color_write_bar_input_background: #121212 !important;
|
||||
--modal_card_background: #121212 !important;
|
||||
--separator_common: #121212 !important;
|
||||
--vkui--color_separator_primary: #121212 !important;
|
||||
--snippet_background: #121212 !important;
|
||||
--android_active_color: #121212 !important;
|
||||
--switch_ios_off_border: #121212 !important;
|
||||
/* third BG (buttons) */
|
||||
--button_secondary_background: #212121 !important;
|
||||
--vkui--color_background_secondary_alpha: #212121 !important;
|
||||
--header_search_field_background: #212121 !important;
|
||||
--icon_tertiary: #212121 !important;
|
||||
--vkui--color_icon_tertiary: #212121 !important;
|
||||
--im_bubble_outgoing: #212121 !important;
|
||||
--input_background: #212121 !important;
|
||||
--vkui--color_write_bar_input_background: #212121 !important;
|
||||
--loader_track_fill: #212121 !important;
|
||||
--vkui--color_track_background: #212121 !important;
|
||||
--search_bar_field_background: #212121 !important;
|
||||
--vkui--color_search_field_background: #212121 !important;
|
||||
--selection_off_icon: #212121 !important;
|
||||
--panel_tab_active_background: #212121 !important;
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 8.3 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -6327,8 +6327,8 @@
|
||||
<string name="globalUsersOnline_summ">Можа выклікаць доўгія загрузкі раздзелаў і вялікае спажыванне трафіку \n\nНе
|
||||
рэкамендуецца ўключаць дадзеную функцыю
|
||||
</string>
|
||||
<string name="savemsgsett_title">Захоўваць налады паведамленняў</string>
|
||||
<string name="savemsgsett_summ">Захоўваць становішча тумблераў у наладах паведамленняў</string>
|
||||
<string name="savemsgsett_title">Захоўваць параметры адпраўкі паведамленняў</string>
|
||||
<string name="savemsgsett_summ">Захоўваць выбраныя параметры статусу выходных паведамленняў як знікненне паведамленняў і бясшумная адпраўка</string>
|
||||
<string name="screenshotdetect_title">Адключыць дэтэкт скрыншотаў</string>
|
||||
<string name="screenshotdetect_summ">Адключыць апавяшчэнне аб тым, што вы зрабілі скрыншот</string>
|
||||
<string name="hideDeviceInfo_title">Адключыць адпраўку метрыкі</string>
|
||||
@@ -6823,8 +6823,8 @@
|
||||
<string name="remove_from_ads_whitelist">Выдаліць з вайтліста рэкламы</string>
|
||||
<string name="add_to_ads_stories_whitelist">Дадаць у вайтліст гісторый</string>
|
||||
<string name="remove_from_ads_stories_whitelist">Выдаліць з вайтліста гісторый</string>
|
||||
<string name="removed_from_whitelist_success">Група выдалена з вайтліста</string>
|
||||
<string name="added_to_whitelist_success">Група дададзена ў вайтліст</string>
|
||||
<string name="removed_from_whitelist_success">Выдаленая з вайтлиста</string>
|
||||
<string name="added_to_whitelist_success">Дададзена ў вайтліст</string>
|
||||
<string name="whitelisted_ad_groups_title">Вайтліст рэкламы</string>
|
||||
|
||||
<string name="whitelisted_ad_groups_stories_title">Вайтліст рэкламы гісторый</string>
|
||||
@@ -6942,6 +6942,8 @@
|
||||
<string name="promotedstickers_title">Не атрымліваць промостикеры</string>
|
||||
<string name="useOldAppVer_title">Выкарыстоўваць стары дызайн</string>
|
||||
<string name="useOldAppVer_summ">Працуе \"як ёсць\". Могуць быць памылкі</string>
|
||||
<string name="invertFilters">Інвертаваць выключэння</string>
|
||||
<string name="invertFilters_summ">Дададзеныя ў выключэння групы будуць фільтраваць</string>
|
||||
<string name="downloading_update">Спампоўка абнаўлення</string>
|
||||
<string name="sources">Крыніцы</string>
|
||||
<string name="businessDisabler_title">Адключыць бізнес-паведамлення</string>
|
||||
@@ -7010,6 +7012,7 @@
|
||||
|
||||
<string name="datasettings_title">Налады дадзеных прыкладання</string>
|
||||
<string name="invalidate_theme_cache_title">Інвалідацыя кэша тэмы</string>
|
||||
<string name="invalidate_theme_cache_each_update_title">Ачыстка кэша тэмы пасля абнаўлення для прадухілення праблем з акцэнтамі</string>
|
||||
|
||||
<string name="useCustomPrefsStyle_title">Выкарыстоўваць новыя тумблеры</string>
|
||||
<string name="useCustomPrefsStyle_summ">Больш сучасны і стыльны выгляд тумблераў у наладах</string>
|
||||
@@ -7025,4 +7028,8 @@
|
||||
|
||||
<string name="compression_types">Спосаб кампрэсіі фота</string>
|
||||
<string name="compression_types_selection">Выберыце спосаб кампрэсіі</string>
|
||||
|
||||
<string name="clear_all_cache">Ачысціць ўвесь кэш?</string>
|
||||
<string name="cache_size">Памер прыкладання</string>
|
||||
<string name="cache_size_summ">Вага кэша прыкладання</string>
|
||||
</resources>
|
||||
@@ -5649,8 +5649,8 @@
|
||||
<string name="onlinefix_title">Обходить онлайн</string>
|
||||
<string name="globalUsersOnline_title">Глобальный обход онлайна</string>
|
||||
<string name="globalUsersOnline_summ">Может вызывать долгие загрузки разделов и большое потребление трафика \n\nНе рекомендуется включать данную функцию</string>
|
||||
<string name="savemsgsett_title">Сохранять настройки сообщений</string>
|
||||
<string name="savemsgsett_summ">Сохранять положение тумблеров в настройках сообщений</string>
|
||||
<string name="savemsgsett_title">Сохранять параметры отправки сообщений</string>
|
||||
<string name="savemsgsett_summ">Сохранять выбранные параметры статуса исходящих сообщений как исчезновение сообщений и бесшумная отправка</string>
|
||||
<string name="screenshotdetect_title">Отключить детект скриншотов</string>
|
||||
<string name="screenshotdetect_summ">Отключить уведомление о том, что вы сделали скриншот</string>
|
||||
<string name="hideDeviceInfo_title">Отключить отправку метрики</string>
|
||||
@@ -6191,8 +6191,8 @@
|
||||
<string name="remove_from_ads_whitelist">Удалить из вайтлиста рекламы</string>
|
||||
<string name="add_to_ads_stories_whitelist">Добавить в вайтлист историй</string>
|
||||
<string name="remove_from_ads_stories_whitelist">Удалить из вайтлиста историй</string>
|
||||
<string name="removed_from_whitelist_success">Группа удалена из вайтлиста</string>
|
||||
<string name="added_to_whitelist_success">Группа добавлена в вайтлист</string>
|
||||
<string name="removed_from_whitelist_success">Удалено из вайтлиста</string>
|
||||
<string name="added_to_whitelist_success">Добавлено в вайтлист</string>
|
||||
|
||||
<string name="whitelisted_ad_groups_title">Вайтлист рекламы</string>
|
||||
<string name="whitelisted_filters_groups_title">Вайтлист фильтров и источников</string>
|
||||
@@ -6330,6 +6330,8 @@
|
||||
<string name="promotedstickers_title">Не получать промостикеры</string>
|
||||
<string name="useOldAppVer_title">Использовать старый дизайн</string>
|
||||
<string name="useOldAppVer_summ">Работает \"как есть\". Могут быть ошибки</string>
|
||||
<string name="invertFilters">Инвертировать исключения</string>
|
||||
<string name="invertFilters_summ">Добавленные в исключения группы будут фильтроваться</string>
|
||||
|
||||
<string name="downloading_update">Скачивание обновления</string>
|
||||
<string name="sources">Источники</string>
|
||||
@@ -6392,6 +6394,7 @@
|
||||
|
||||
<string name="datasettings_title">Настройки данных приложения</string>
|
||||
<string name="invalidate_theme_cache_title">Инвалидация кэша темы</string>
|
||||
<string name="invalidate_theme_cache_each_update_title">Очистка кэша темы после обновления для предотвращения проблем с акцентами</string>
|
||||
|
||||
<string name="useCustomPrefsStyle_title">Использовать новые переключатели</string>
|
||||
<string name="useCustomPrefsStyle_summ">Более современный и стильный вид тумблеров в настройках</string>
|
||||
@@ -6407,4 +6410,8 @@
|
||||
|
||||
<string name="compression_types">Способ компрессии фото</string>
|
||||
<string name="compression_types_selection">Выберите способ компрессии</string>
|
||||
|
||||
<string name="clear_all_cache">Очистить весь кеш?</string>
|
||||
<string name="cache_size">Размер приложения</string>
|
||||
<string name="cache_size_summ">Вес кеша приложения</string>
|
||||
</resources>
|
||||
@@ -5576,8 +5576,8 @@
|
||||
<string name="onlinefix_title">Обходити онлайн</string>
|
||||
<string name="globalUsersOnline_title">Глобальний обхід онлайну</string>
|
||||
<string name="globalUsersOnline_summ">Може викликати тривале завантаження розділів і велике споживання трафіку \n\nНе рекомендується включати цю функцію</string>
|
||||
<string name="savemsgsett_title">Зберігати налаштування повідомлень</string>
|
||||
<string name="savemsgsett_summ">Зберігати положення тумблерів у налаштуваннях повідомлень</string>
|
||||
<string name="savemsgsett_title">Зберігати параметри відправки повідомлень</string>
|
||||
<string name="savemsgsett_summ">Зберігати вибрані параметри статусу вихідних повідомлень як зникнення повідомлень і безшумна відправка</string>
|
||||
<string name="screenshotdetect_title">Вимкнути виявлення скріншотів</string>
|
||||
<string name="screenshotdetect_summ">Відключити повідомлення про те, що ви зробили скриншот</string>
|
||||
<string name="hideDeviceInfo_title">Вимкнути відправку метрики</string>
|
||||
@@ -6116,8 +6116,8 @@
|
||||
<string name="remove_from_ads_whitelist">Видалити з вайтліста реклами</string>
|
||||
<string name="add_to_ads_stories_whitelist">Додати до вайтліста історій</string>
|
||||
<string name="remove_from_ads_stories_whitelist">Видалити з вайтліста історій</string>
|
||||
<string name="removed_from_whitelist_success">Група видалена з вайтліста</string>
|
||||
<string name="added_to_whitelist_success">Група додана до вайтліста</string>
|
||||
<string name="removed_from_whitelist_success">Видалена з вайтліста</string>
|
||||
<string name="added_to_whitelist_success">Додана до вайтліста</string>
|
||||
|
||||
<string name="whitelisted_ad_groups_title">Вайтліст реклами</string>
|
||||
<string name="whitelisted_filters_groups_title">Вайтліст фільтрів та джерел</string>
|
||||
@@ -6255,6 +6255,8 @@
|
||||
<string name="promotedstickers_title">Не отримувати промостикери</string>
|
||||
<string name="useOldAppVer_title">Використовувати старий дизайн</string>
|
||||
<string name="useOldAppVer_summ">Працює \"як є\". Можливі помилки</string>
|
||||
<string name="invertFilters">Інвертувати винятки</string>
|
||||
<string name="invertFilters_summ">Додані в виключення групи будуть фільтруватися</string>
|
||||
|
||||
<string name="downloading_update">Завантаження оновлення</string>
|
||||
<string name="sources">Джерела</string>
|
||||
@@ -6317,6 +6319,7 @@
|
||||
|
||||
<string name="datasettings_title">Налаштування даних додатку</string>
|
||||
<string name="invalidate_theme_cache_title">Інвалідація кешу теми</string>
|
||||
<string name="invalidate_theme_cache_each_update_title">Очищення кешу теми після оновлення для запобігання проблем з акцентами</string>
|
||||
|
||||
<string name="useCustomPrefsStyle_title">Використовувати нові перемикачі</string>
|
||||
<string name="useCustomPrefsStyle_summ">Більш сучасний і стильний вигляд тумблерів у налаштуваннях</string>
|
||||
@@ -6332,4 +6335,8 @@
|
||||
|
||||
<string name="compression_types">Спосіб компресії фото</string>
|
||||
<string name="compression_types_selection">Виберіть спосіб компресії</string>
|
||||
|
||||
<string name="clear_all_cache">Очистити весь кеш?</string>
|
||||
<string name="cache_size">Розмір програми</string>
|
||||
<string name="cache_size_summ">Вага кеша додатки</string>
|
||||
</resources>
|
||||
|
||||
@@ -212,6 +212,11 @@
|
||||
<public type="array" name="targetlang_value" id="0x7f030074" />
|
||||
<public type="array" name="undel_value" id="0x7f030075" />
|
||||
<public type="array" name="wallpaper_change_dialog" id="0x7f030076" />
|
||||
<public type="array" name="accent_select_type" id="0x7f030077" />
|
||||
<public type="array" name="compression" id="0x7f030078" />
|
||||
<public type="array" name="compression_value" id="0x7f030079" />
|
||||
<public type="array" name="theme_type_name" id="0x7f03007a" />
|
||||
<public type="array" name="theme_type_name_checkbox" id="0x7f03007b" />
|
||||
<public type="attr" name="BMSB_error_text_color" id="0x7f040000" />
|
||||
<public type="attr" name="BuyMusicSubscriptionButtonStyle" id="0x7f040001" />
|
||||
<public type="attr" name="PIAlphaNormal" id="0x7f040002" />
|
||||
@@ -2122,6 +2127,7 @@
|
||||
<public type="attr" name="zOrderOnTop" id="0x7f040773" />
|
||||
<public type="attr" name="im_ic_msgdl" id="0x7f040774" />
|
||||
<public type="attr" name="im_ic_msgreload" id="0x7f040775" />
|
||||
<public type="attr" name="im_ic_stats" id="0x7f040776" />
|
||||
<public type="bool" name="abc_action_bar_embed_tabs" id="0x7f050000" />
|
||||
<public type="bool" name="abc_allow_stacked_button_bar" id="0x7f050001" />
|
||||
<public type="bool" name="abc_config_actionMenuItemAllCaps" id="0x7f050002" />
|
||||
@@ -2138,6 +2144,7 @@
|
||||
<public type="bool" name="spb_default_progressiveStart_activated" id="0x7f05000d" />
|
||||
<public type="bool" name="spb_default_reversed" id="0x7f05000e" />
|
||||
<public type="bool" name="vk_is_tablet" id="0x7f05000f" />
|
||||
<public type="bool" name="com_samsung_android_icon_container_has_icon_container" id="0x7f050010" />
|
||||
<public type="color" name="abc_background_cache_hint_selector_material_dark" id="0x7f060000" />
|
||||
<public type="color" name="abc_background_cache_hint_selector_material_light" id="0x7f060001" />
|
||||
<public type="color" name="abc_btn_colored_borderless_text_material" id="0x7f060002" />
|
||||
@@ -2944,6 +2951,7 @@
|
||||
<public type="color" name="yellow_sunflower" id="0x7f060324" />
|
||||
<public type="color" name="iclauncher" id="0x7f060325" />
|
||||
<public type="color" name="abc_color_highlight_material" id="0x7f060004" />
|
||||
<public type="color" name="alpha05" id="0x7f060326" />
|
||||
<public type="dimen" name="_post_side_padding" id="0x7f070000" />
|
||||
<public type="dimen" name="abc_action_bar_content_inset_material" id="0x7f070001" />
|
||||
<public type="dimen" name="abc_action_bar_content_inset_with_nav" id="0x7f070002" />
|
||||
@@ -4944,10 +4952,29 @@
|
||||
<public type="drawable" name="ic_deepl_logo_icon" id="0x7f080bcb" />
|
||||
<public type="drawable" name="ic_google_translate_logo" id="0x7f080bcc" />
|
||||
<public type="drawable" name="ic_yandex_translate_icon" id="0x7f080bd1" />
|
||||
<public type="drawable" name="microsoft" id="0x7f080bd2" />
|
||||
<public type="drawable" name="$splash__0" id="0x7f080bd2" />
|
||||
<public type="drawable" name="roundmsg" id="0x7f080bd3" />
|
||||
<public type="drawable" name="tgs_entry_background" id="0x7f080bd4" />
|
||||
<public type="drawable" name="yandex" id="0x7f080bd7" />
|
||||
<public type="drawable" name="$splash__1" id="0x7f080bd8" />
|
||||
<public type="drawable" name="$splash__10" id="0x7f080bd9" />
|
||||
<public type="drawable" name="$splash__11" id="0x7f080bda" />
|
||||
<public type="drawable" name="$splash__12" id="0x7f080bdb" />
|
||||
<public type="drawable" name="$splash__13" id="0x7f080bdc" />
|
||||
<public type="drawable" name="$splash__14" id="0x7f080bdd" />
|
||||
<public type="drawable" name="$splash__15" id="0x7f080bde" />
|
||||
<public type="drawable" name="$splash__2" id="0x7f080bdf" />
|
||||
<public type="drawable" name="$splash__3" id="0x7f080be0" />
|
||||
<public type="drawable" name="$splash__4" id="0x7f080be1" />
|
||||
<public type="drawable" name="$splash__5" id="0x7f080be2" />
|
||||
<public type="drawable" name="$splash__6" id="0x7f080be3" />
|
||||
<public type="drawable" name="$splash__7" id="0x7f080be4" />
|
||||
<public type="drawable" name="$splash__8" id="0x7f080be5" />
|
||||
<public type="drawable" name="$splash__9" id="0x7f080be6" />
|
||||
<public type="drawable" name="checker_background" id="0x7f080be8" />
|
||||
<public type="drawable" name="custom_thumb_selector" id="0x7f080be9" />
|
||||
<public type="drawable" name="custom_track_selector" id="0x7f080bea" />
|
||||
<public type="drawable" name="splash" id="0x7f080bec" />
|
||||
<public type="drawable" name="abc_control_background_material" id="0x7f080032" />
|
||||
<public type="drawable" name="ic_action_close" id="0x7f080322" />
|
||||
<public type="drawable" name="ic_camera_outline_28_new" id="0x7f0803a0" />
|
||||
@@ -6745,6 +6772,9 @@
|
||||
<public type="drawable" name="ic_telegram_24" id="0x7f080bcf" />
|
||||
<public type="drawable" name="ic_telegram_outline_28" id="0x7f080bd0" />
|
||||
<public type="drawable" name="vtlogo" id="0x7f080bd6" />
|
||||
<public type="drawable" name="bing" id="0x7f080be7" />
|
||||
<public type="drawable" name="sauceNAO" id="0x7f080beb" />
|
||||
<public type="drawable" name="tracemoe" id="0x7f080bed" />
|
||||
<public type="drawable" name="bg_music_play_button_white" id="0x7f08015e" />
|
||||
<public type="drawable" name="bg_poll_bg_thumb" id="0x7f080181" />
|
||||
<public type="drawable" name="bg_stickers_suggestions_left" id="0x7f0801ad" />
|
||||
@@ -6867,10 +6897,6 @@
|
||||
<public type="font" name="vk_sans_text_light" id="0x7f09001a" />
|
||||
<public type="font" name="vk_sans_text_medium" id="0x7f09001b" />
|
||||
<public type="font" name="vk_sans_text_regular" id="0x7f09001c" />
|
||||
<public name="color_preview" id="0x7f0a1021" type="id" />
|
||||
<public name="color_name" id="0x7f0a1022" type="id" />
|
||||
<public name="color_value" id="0x7f0a1023" type="id" />
|
||||
<public name="color_preview_border" id="0x7f0a1024" type="id" />
|
||||
<public type="id" name="ALT" id="0x7f0a0000" />
|
||||
<public type="id" name="CIRCLE" id="0x7f0a0001" />
|
||||
<public type="id" name="CTRL" id="0x7f0a0002" />
|
||||
@@ -11000,6 +11026,12 @@
|
||||
<public type="id" name="savedmsg" id="0x7f0a101e" />
|
||||
<public type="id" name="search_photo" id="0x7f0a101f" />
|
||||
<public type="id" name="text_hex_wrapper" id="0x7f0a1020" />
|
||||
<public type="id" name="color_preview" id="0x7f0a1021" />
|
||||
<public type="id" name="color_name" id="0x7f0a1022" />
|
||||
<public type="id" name="color_value" id="0x7f0a1023" />
|
||||
<public type="id" name="color_preview_border" id="0x7f0a1024" />
|
||||
<public type="id" name="account_backup_view" id="0x7f0a1025" />
|
||||
<public type="id" name="copy_image" id="0x7f0a1026" />
|
||||
<public type="integer" name="abc_config_activityDefaultDur" id="0x7f0b0000" />
|
||||
<public type="integer" name="abc_config_activityShortDur" id="0x7f0b0001" />
|
||||
<public type="integer" name="angle_rtl_180" id="0x7f0b0002" />
|
||||
@@ -12811,6 +12843,7 @@
|
||||
<public type="layout" name="tgs_entry" id="0x7f0d06de" />
|
||||
<public type="layout" name="wppreview" id="0x7f0d06df" />
|
||||
<public type="layout" name="write_bar_i" id="0x7f0d06e0" />
|
||||
<public type="layout" name="color_picker_item" id="0x7f0d06e1" />
|
||||
<public type="menu" name="add" id="0x7f0e0000" />
|
||||
<public type="menu" name="attach_item" id="0x7f0e0001" />
|
||||
<public type="menu" name="audio" id="0x7f0e0002" />
|
||||
@@ -12923,6 +12956,30 @@
|
||||
<public type="mipmap" name="vt_changeable_foreground" id="0x7f0f0044" />
|
||||
<public type="mipmap" name="vt_launcher" id="0x7f0f0045" />
|
||||
<public type="mipmap" name="vt_party_foreground" id="0x7f0f0047" />
|
||||
<public type="mipmap" name="ic_launcher_balloon_pink" id="0x7f0f0048" />
|
||||
<public type="mipmap" name="ic_launcher_balloon_pink_background" id="0x7f0f0049" />
|
||||
<public type="mipmap" name="ic_launcher_balloon_pink_foreground" id="0x7f0f004a" />
|
||||
<public type="mipmap" name="ic_launcher_bubble_gum" id="0x7f0f004b" />
|
||||
<public type="mipmap" name="ic_launcher_bubble_gum_background" id="0x7f0f004c" />
|
||||
<public type="mipmap" name="ic_launcher_bubble_gum_foreground" id="0x7f0f004d" />
|
||||
<public type="mipmap" name="ic_launcher_comics" id="0x7f0f004e" />
|
||||
<public type="mipmap" name="ic_launcher_comics_background" id="0x7f0f004f" />
|
||||
<public type="mipmap" name="ic_launcher_comics_foreground" id="0x7f0f0050" />
|
||||
<public type="mipmap" name="ic_launcher_flowers" id="0x7f0f0051" />
|
||||
<public type="mipmap" name="ic_launcher_flowers_background" id="0x7f0f0052" />
|
||||
<public type="mipmap" name="ic_launcher_flowers_foreground" id="0x7f0f0053" />
|
||||
<public type="mipmap" name="ic_launcher_metal_dark" id="0x7f0f0054" />
|
||||
<public type="mipmap" name="ic_launcher_metal_dark_background" id="0x7f0f0055" />
|
||||
<public type="mipmap" name="ic_launcher_metal_dark_foreground" id="0x7f0f0056" />
|
||||
<public type="mipmap" name="ic_launcher_pin_blue" id="0x7f0f0057" />
|
||||
<public type="mipmap" name="ic_launcher_pin_blue_background" id="0x7f0f0058" />
|
||||
<public type="mipmap" name="ic_launcher_pin_blue_foreground" id="0x7f0f0059" />
|
||||
<public type="mipmap" name="ic_launcher_rabbit" id="0x7f0f005a" />
|
||||
<public type="mipmap" name="ic_launcher_rabbit_background" id="0x7f0f005b" />
|
||||
<public type="mipmap" name="ic_launcher_rabbit_foreground" id="0x7f0f005c" />
|
||||
<public type="mipmap" name="ic_launcher_shine" id="0x7f0f005d" />
|
||||
<public type="mipmap" name="ic_launcher_shine_background" id="0x7f0f005e" />
|
||||
<public type="mipmap" name="ic_launcher_shine_foreground" id="0x7f0f005f" />
|
||||
<public type="mipmap" name="vt_adaptive_launcher_foneground" id="0x7f0f0043" />
|
||||
<public type="mipmap" name="vt_launcher_round" id="0x7f0f0046" />
|
||||
<public type="mipmap" name="ic_logo_facebook_28" id="0x7f0f0003" />
|
||||
@@ -19465,6 +19522,88 @@
|
||||
<public type="string" name="whitelisted_filters_groups_title" id="0x7f121838" />
|
||||
<public type="string" name="why_news_not_updated_summ" id="0x7f121839" />
|
||||
<public type="string" name="why_news_not_updated_title" id="0x7f12183a" />
|
||||
<public type="string" name="accent_color_summ" id="0x7f12183b" />
|
||||
<public type="string" name="accent_color_title" id="0x7f12183c" />
|
||||
<public type="string" name="accents" id="0x7f12183d" />
|
||||
<public type="string" name="accounts_saved_by_path" id="0x7f12183e" />
|
||||
<public type="string" name="add_to_ads_stories_whitelist" id="0x7f12183f" />
|
||||
<public type="string" name="amoledtheme_summ" id="0x7f121840" />
|
||||
<public type="string" name="amoledtheme_title" id="0x7f121841" />
|
||||
<public type="string" name="appLanguage" id="0x7f121842" />
|
||||
<public type="string" name="app_open_by_default_settings" id="0x7f121843" />
|
||||
<public type="string" name="applying_accent" id="0x7f121844" />
|
||||
<public type="string" name="audio_deleted_from_cache" id="0x7f121845" />
|
||||
<public type="string" name="blockminiapps_summ" id="0x7f121846" />
|
||||
<public type="string" name="blockminiapps_title" id="0x7f121847" />
|
||||
<public type="string" name="businessDisabler_title" id="0x7f121848" />
|
||||
<public type="string" name="by_choice" id="0x7f121849" />
|
||||
<public type="string" name="calls_not_available" id="0x7f12184a" />
|
||||
<public type="string" name="cannot_write" id="0x7f12184b" />
|
||||
<public type="string" name="change_accent_color" id="0x7f12184c" />
|
||||
<public type="string" name="compression_types" id="0x7f12184d" />
|
||||
<public type="string" name="compression_types_selection" id="0x7f12184e" />
|
||||
<public type="string" name="copydebuginfo_summ" id="0x7f12184f" />
|
||||
<public type="string" name="copydebuginfo_title" id="0x7f121850" />
|
||||
<public type="string" name="copyownlink_summ" id="0x7f121851" />
|
||||
<public type="string" name="copyownlink_title" id="0x7f121852" />
|
||||
<public type="string" name="crash_service_name" id="0x7f121853" />
|
||||
<public type="string" name="currentLanguage" id="0x7f121854" />
|
||||
<public type="string" name="current_theme" id="0x7f121855" />
|
||||
<public type="string" name="custom_links_warning" id="0x7f121856" />
|
||||
<public type="string" name="data" id="0x7f121857" />
|
||||
<public type="string" name="data_updated" id="0x7f121858" />
|
||||
<public type="string" name="datasettings_title" id="0x7f121859" />
|
||||
<public type="string" name="device_info" id="0x7f12185a" />
|
||||
<public type="string" name="device_info_copied" id="0x7f12185b" />
|
||||
<public type="string" name="dialogstats" id="0x7f12185c" />
|
||||
<public type="string" name="disable_analytics" id="0x7f12185d" />
|
||||
<public type="string" name="disable_analytics_summ" id="0x7f12185e" />
|
||||
<public type="string" name="downloading_update" id="0x7f12185f" />
|
||||
<public type="string" name="error_applying_accent" id="0x7f121860" />
|
||||
<public type="string" name="error_no_text" id="0x7f121861" />
|
||||
<public type="string" name="error_saving_file" id="0x7f121862" />
|
||||
<public type="string" name="failed_to_get_text" id="0x7f121863" />
|
||||
<public type="string" name="invalid_pack_link" id="0x7f121864" />
|
||||
<public type="string" name="invalidate_theme_cache_title" id="0x7f121865" />
|
||||
<public type="string" name="logColors_title" id="0x7f121866" />
|
||||
<public type="string" name="maxquality_summ" id="0x7f121867" />
|
||||
<public type="string" name="maxquality_title" id="0x7f121868" />
|
||||
<public type="string" name="microgsett" id="0x7f121869" />
|
||||
<public type="string" name="monettheme_summ" id="0x7f12186a" />
|
||||
<public type="string" name="monettheme_title" id="0x7f12186b" />
|
||||
<public type="string" name="newsfeed_notif_summ" id="0x7f12186c" />
|
||||
<public type="string" name="newsfeed_notif_title" id="0x7f12186d" />
|
||||
<public type="string" name="open_bot" id="0x7f12186e" />
|
||||
<public type="string" name="promotedstickers_title" id="0x7f12186f" />
|
||||
<public type="string" name="remove_encryption_key" id="0x7f121870" />
|
||||
<public type="string" name="remove_from_ads_stories_whitelist" id="0x7f121871" />
|
||||
<public type="string" name="reset_accounts" id="0x7f121872" />
|
||||
<public type="string" name="reset_all_settings" id="0x7f121873" />
|
||||
<public type="string" name="restore_accounts" id="0x7f121874" />
|
||||
<public type="string" name="restore_settings" id="0x7f121875" />
|
||||
<public type="string" name="save_accounts" id="0x7f121876" />
|
||||
<public type="string" name="save_online_data" id="0x7f121877" />
|
||||
<public type="string" name="select_color" id="0x7f121878" />
|
||||
<public type="string" name="select_palette" id="0x7f121879" />
|
||||
<public type="string" name="sources" id="0x7f12187a" />
|
||||
<public type="string" name="storiesGroupsAdBlock" id="0x7f12187b" />
|
||||
<public type="string" name="storiesGroupsAdBlocksummary" id="0x7f12187c" />
|
||||
<public type="string" name="systemtheme" id="0x7f12187d" />
|
||||
<public type="string" name="systemtheme_enabled" id="0x7f12187e" />
|
||||
<public type="string" name="systemtheme_summ" id="0x7f12187f" />
|
||||
<public type="string" name="updateverifdata_summ" id="0x7f121880" />
|
||||
<public type="string" name="updateverifdata_title" id="0x7f121881" />
|
||||
<public type="string" name="useCustomPrefsStyle_summ" id="0x7f121882" />
|
||||
<public type="string" name="useCustomPrefsStyle_title" id="0x7f121883" />
|
||||
<public type="string" name="useGenius_summ" id="0x7f121884" />
|
||||
<public type="string" name="useGenius_title" id="0x7f121885" />
|
||||
<public type="string" name="useNewColorEngine_summ" id="0x7f121886" />
|
||||
<public type="string" name="useNewColorEngine_title" id="0x7f121887" />
|
||||
<public type="string" name="useOldAppVer_summ" id="0x7f121888" />
|
||||
<public type="string" name="useOldAppVer_title" id="0x7f121889" />
|
||||
<public type="string" name="vkx_integration_enabled_info" id="0x7f12188a" />
|
||||
<public type="string" name="whitelisted_ad_groups_stories_title" id="0x7f12188b" />
|
||||
<public type="string" name="writebar_ios_title" id="0x7f12188c" />
|
||||
<public type="style" name="ActionBarGrayTheme" id="0x7f130000" />
|
||||
<public type="style" name="ActionBarProgress" id="0x7f130001" />
|
||||
<public type="style" name="ActionBarSpinner" id="0x7f130002" />
|
||||
@@ -20606,6 +20745,24 @@
|
||||
<public type="style" name="Base.V26.Widget.AppCompat.Toolbar" id="0x7f1300a1" />
|
||||
<public type="style" name="Base.V28.Theme.AppCompat" id="0x7f1300a2" />
|
||||
<public type="style" name="Base.V28.Theme.AppCompat.Light" id="0x7f1300a3" />
|
||||
<public type="style" name="Vk.Theme.VkApp.amoled_monet_generated" id="0x7f130475" />
|
||||
<public type="style" name="Vk.Theme.VkApp.amoled_monet_old_generated" id="0x7f130476" />
|
||||
<public type="style" name="Vk.Theme.VkApp.bright_light_monet_generated" id="0x7f130477" />
|
||||
<public type="style" name="Vk.Theme.VkApp.client_dark_monet_generated" id="0x7f130478" />
|
||||
<public type="style" name="Vk.Theme.VkApp.client_light_monet_generated" id="0x7f130479" />
|
||||
<public type="style" name="Vk.Theme.VkApp.space_gray_monet_generated" id="0x7f13047a" />
|
||||
<public type="style" name="VkAmoledMonetStyle" id="0x7f13047b" />
|
||||
<public type="style" name="VkAmoledMonetTheme" id="0x7f13047c" />
|
||||
<public type="style" name="VkDarkMonetStyle" id="0x7f13047d" />
|
||||
<public type="style" name="VkDarkMonetTheme" id="0x7f13047e" />
|
||||
<public type="style" name="VkLightMonetStyle" id="0x7f13047f" />
|
||||
<public type="style" name="VkLightMonetTheme" id="0x7f130480" />
|
||||
<public type="style" name="VkMilkAmoledMonetStyle" id="0x7f130481" />
|
||||
<public type="style" name="VkMilkAmoledMonetTheme" id="0x7f130482" />
|
||||
<public type="style" name="VkMilkDarkMonetStyle" id="0x7f130483" />
|
||||
<public type="style" name="VkMilkDarkMonetTheme" id="0x7f130484" />
|
||||
<public type="style" name="VkMilkLightMonetStyle" id="0x7f130485" />
|
||||
<public type="style" name="VkMilkLightMonetTheme" id="0x7f130486" />
|
||||
<public type="xml" name="account_preferences" id="0x7f150000" />
|
||||
<public type="xml" name="authenticator" id="0x7f150001" />
|
||||
<public type="xml" name="contacts_custom_type" id="0x7f150002" />
|
||||
@@ -20637,4 +20794,5 @@
|
||||
<public type="xml" name="preferences_proxy" id="0x7f15001c" />
|
||||
<public type="xml" name="preferences_tgs" id="0x7f15001d" />
|
||||
<public type="xml" name="preferences_themes" id="0x7f15001e" />
|
||||
<public type="xml" name="locales_config" id="0x7f15001f" />
|
||||
</resources>
|
||||
@@ -5783,8 +5783,8 @@ You need to restart the application to apply proxy settings"</string>
|
||||
<string name="onlinefix_title">Bypass online indicator</string>
|
||||
<string name="globalUsersOnline_title">Global online bypass</string>
|
||||
<string name="globalUsersOnline_summ">May cause slow partition loading and high traffic consumption \n\nIt is not recommended to enable this feature</string>
|
||||
<string name="savemsgsett_title">Save message settings</string>
|
||||
<string name="savemsgsett_summ">Save the position of the toggle switches in the message settings</string>
|
||||
<string name="savemsgsett_title">Save message sending parameters</string>
|
||||
<string name="savemsgsett_summ">Save selected outgoing message status parameters like message disappearing and silent sending</string>
|
||||
<string name="screenshotdetect_title">Disable screenshot detection</string>
|
||||
<string name="screenshotdetect_summ">Turn off the notification that you took a screenshot</string>
|
||||
<string name="hideDeviceInfo_title">Disable sending metric</string>
|
||||
@@ -6329,8 +6329,8 @@ May look like a fake leaving the online"</string>
|
||||
<string name="remove_from_ads_stories_whitelist">Remove from stories whitelist</string>
|
||||
<string name="add_to_ads_whitelist">Add to ads stories whitelist</string>
|
||||
<string name="remove_from_ads_whitelist">Remove from ads stories whitelist</string>
|
||||
<string name="removed_from_whitelist_success">Group removed from whitelist</string>
|
||||
<string name="added_to_whitelist_success">Group added to whitelist</string>
|
||||
<string name="removed_from_whitelist_success">Removed from whitelist</string>
|
||||
<string name="added_to_whitelist_success">Added to whitelist</string>
|
||||
|
||||
<string name="whitelisted_ad_groups_title">Ads whitelist</string>
|
||||
<string name="whitelisted_filters_groups_title">Filters whitelist and copyrights</string>
|
||||
@@ -6468,6 +6468,8 @@ May look like a fake leaving the online"</string>
|
||||
<string name="promotedstickers_title">Don\'t receive promoted stickers</string>
|
||||
<string name="useOldAppVer_title">Use old music catalog</string>
|
||||
<string name="useOldAppVer_summ">Works \"as is\". There may be errors</string>
|
||||
<string name="invertFilters">Invert exceptions</string>
|
||||
<string name="invertFilters_summ">Groups added to exceptions will be filtered</string>
|
||||
|
||||
<string name="downloading_update">Downloading update</string>
|
||||
<string name="sources">Sources</string>
|
||||
@@ -6530,6 +6532,7 @@ May look like a fake leaving the online"</string>
|
||||
|
||||
<string name="datasettings_title">Application data settings</string>
|
||||
<string name="invalidate_theme_cache_title">Invalidate theme cache</string>
|
||||
<string name="invalidate_theme_cache_each_update_title">Clear theme cache after update to prevent problems with accents</string>
|
||||
|
||||
<string name="useCustomPrefsStyle_title">Use new switches</string>
|
||||
<string name="useCustomPrefsStyle_summ">More modern and stylish toggle switches in settings</string>
|
||||
@@ -6545,4 +6548,8 @@ May look like a fake leaving the online"</string>
|
||||
|
||||
<string name="compression_types">Photo compression method</string>
|
||||
<string name="compression_types_selection">Choose the compression method</string>
|
||||
|
||||
<string name="clear_all_cache">Clear all cache?</string>
|
||||
<string name="cache_size">App size</string>
|
||||
<string name="cache_size_summ">Cache size</string>
|
||||
</resources>
|
||||
|
||||
@@ -89,6 +89,16 @@
|
||||
<Preference
|
||||
android:key="whitelisted_filters_groups"
|
||||
android:title="@string/whitelisted_filters_groups_title"/>
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="invertFilters"
|
||||
android:summary="@string/invertFilters_summ"
|
||||
android:title="@string/invertFilters"/>
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="blockminiapps"
|
||||
android:summary="@string/blockminiapps_summ"
|
||||
android:title="@string/blockminiapps_title"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/sources">
|
||||
<EditTextPreference
|
||||
@@ -141,20 +151,15 @@
|
||||
<Preference
|
||||
android:key="newsfeedlistmanager_reset"
|
||||
android:title="@string/newsfeedlistmanager_reset_title"/>
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="force_disable_psm"
|
||||
android:summary="@string/force_disable_psm_summ"
|
||||
android:title="@string/force_disable_psm_title"/>
|
||||
<!-- <com.vtosters.lite.ui.MaterialSwitchPreference-->
|
||||
<!-- android:defaultValue="false"-->
|
||||
<!-- android:key="force_disable_psm"-->
|
||||
<!-- android:summary="@string/force_disable_psm_summ"-->
|
||||
<!-- android:title="@string/force_disable_psm_title"/>-->
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="true"
|
||||
android:key="feedcache"
|
||||
android:summary="@string/feed_other_cache_summary"
|
||||
android:title="@string/vtlfeedcache"/>
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="blockminiapps"
|
||||
android:summary="@string/blockminiapps_summ"
|
||||
android:title="@string/blockminiapps_title"/>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
||||
@@ -4,12 +4,6 @@
|
||||
<Preference
|
||||
android:key="datasettings"
|
||||
android:title="@string/datasettings_title"/>
|
||||
<Preference
|
||||
android:key="clearcache"
|
||||
android:title="@string/clearcache_other_title"/>
|
||||
<Preference
|
||||
android:key="autoclearcache"
|
||||
android:title="@string/autoclearcache"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/other_fix_app">
|
||||
<Preference
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
android:summary="@string/accent_color_summ"
|
||||
android:icon="@drawable/bg_accent_circle"
|
||||
android:title="@string/accent_color_title"/>
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="true"
|
||||
android:key="invalidate_theme_cache_each_update"
|
||||
android:summary="@string/invalidate_theme_cache_each_update_title"
|
||||
android:title="@string/invalidate_theme_cache_title"/>
|
||||
<Preference
|
||||
android:key="invalidate_theme_cache"
|
||||
android:title="@string/invalidate_theme_cache_title" />
|
||||
@@ -84,10 +89,5 @@
|
||||
android:key="VKUI_INJ"
|
||||
android:summary="@string/appearance_other_color_webview_summary"
|
||||
android:title="@string/vkuiinj"/>
|
||||
<com.vtosters.lite.ui.MaterialSwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="useNewColorEngine"
|
||||
android:summary="@string/useNewColorEngine_summ"
|
||||
android:title="@string/useNewColorEngine_title"/>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
@@ -43,9 +43,9 @@
|
||||
# .line 4
|
||||
# array-length v1, p1
|
||||
#
|
||||
# const/4 v2, 0x0
|
||||
#
|
||||
# const/4 v3, 0x0
|
||||
const/4 v2, 0x0
|
||||
|
||||
const/4 v3, 0x0
|
||||
#
|
||||
# :goto_0
|
||||
# if-ge v3, v1, :cond_0
|
||||
|
||||
@@ -778,42 +778,42 @@
|
||||
}
|
||||
.end annotation
|
||||
|
||||
.line 2
|
||||
invoke-static {}, Lcom/vk/dto/discover/DiscoverItem$Template;->values()[Lcom/vk/dto/discover/DiscoverItem$Template;
|
||||
# .line 2
|
||||
# invoke-static {}, Lcom/vk/dto/discover/DiscoverItem$Template;->values()[Lcom/vk/dto/discover/DiscoverItem$Template;
|
||||
|
||||
move-result-object v0
|
||||
# move-result-object v0
|
||||
|
||||
.line 3
|
||||
new-instance v1, Ljava/util/ArrayList;
|
||||
# .line 3
|
||||
# new-instance v1, Ljava/util/ArrayList;
|
||||
|
||||
array-length v2, v0
|
||||
# array-length v2, v0
|
||||
|
||||
invoke-direct {v1, v2}, Ljava/util/ArrayList;-><init>(I)V
|
||||
# invoke-direct {v1, v2}, Ljava/util/ArrayList;-><init>(I)V
|
||||
|
||||
.line 4
|
||||
array-length v2, v0
|
||||
# .line 4
|
||||
# array-length v2, v0
|
||||
|
||||
const/4 v3, 0x0
|
||||
|
||||
const/4 v4, 0x0
|
||||
|
||||
:goto_0
|
||||
if-ge v4, v2, :cond_0
|
||||
# :goto_0
|
||||
# if-ge v4, v2, :cond_0
|
||||
|
||||
aget-object v5, v0, v4
|
||||
# aget-object v5, v0, v4
|
||||
|
||||
.line 5
|
||||
invoke-virtual {v5}, Lcom/vk/dto/discover/DiscoverItem$Template;->b()Ljava/lang/String;
|
||||
# .line 5
|
||||
# invoke-virtual {v5}, Lcom/vk/dto/discover/DiscoverItem$Template;->b()Ljava/lang/String;
|
||||
|
||||
move-result-object v5
|
||||
# move-result-object v5
|
||||
|
||||
invoke-interface {v1, v5}, Ljava/util/Collection;->add(Ljava/lang/Object;)Z
|
||||
# invoke-interface {v1, v5}, Ljava/util/Collection;->add(Ljava/lang/Object;)Z
|
||||
|
||||
add-int/lit8 v4, v4, 0x1
|
||||
# add-int/lit8 v4, v4, 0x1
|
||||
|
||||
goto :goto_0
|
||||
# goto :goto_0
|
||||
|
||||
:cond_0
|
||||
# :cond_0
|
||||
|
||||
invoke-static {}, Lru/vtosters/hooks/DiscoverTemplates;->getTemplates()Ljava/util/ArrayList;
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
.method public getResources()Landroid/content/res/Resources;
|
||||
.registers 3
|
||||
|
||||
invoke-static {}, Lru/vtosters/hooks/other/ThemesUtils;->isCustomAccentEnabled()Z
|
||||
invoke-static {}, Lru/vtosters/hooks/other/ThemesUtils;->isMonetTheme()Z
|
||||
|
||||
move-result v1
|
||||
|
||||
|
||||
@@ -234,20 +234,6 @@
|
||||
|
||||
.line 6
|
||||
iget v2, p0, Lcom/vk/im/engine/internal/api_commands/messages/MessagesGetConversationsApiCmd;->a:I
|
||||
|
||||
const-string v3, "major_sort_id"
|
||||
|
||||
const-string v4, "1023"
|
||||
|
||||
const v5, 0x7fffffff
|
||||
|
||||
if-eq v5, v2, :cond_4
|
||||
|
||||
const-string v4, "0"
|
||||
|
||||
.line 6
|
||||
:cond_4
|
||||
invoke-virtual {v1, v3, v4}, Lcom/vk/api/internal/MethodCall$a;->a(Ljava/lang/String;Ljava/lang/String;)Lcom/vk/api/internal/MethodCall$a;
|
||||
|
||||
invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
|
||||
|
||||
@@ -303,11 +289,6 @@
|
||||
|
||||
invoke-virtual {v1, v0}, Lcom/vk/api/internal/MethodCall$a;->b(Z)Lcom/vk/api/internal/MethodCall$a;
|
||||
|
||||
const-string v2, "5.131"
|
||||
|
||||
.line 10
|
||||
invoke-virtual {v1, v2}, Lcom/vk/api/internal/MethodCall$a;->b(Ljava/lang/String;)Lcom/vk/api/internal/MethodCall$a;
|
||||
|
||||
.line 13
|
||||
invoke-virtual {v1}, Lcom/vk/api/internal/MethodCall$a;->a()Lcom/vk/api/internal/MethodCall;
|
||||
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
.class public interface abstract Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;
|
||||
.super Ljava/lang/Object;
|
||||
.source "MediaNative.java"
|
||||
|
||||
|
||||
# annotations
|
||||
.annotation system Ldalvik/annotation/EnclosingClass;
|
||||
value = Lcom/vk/medianative/MediaNative$EncoderHandler;
|
||||
.end annotation
|
||||
|
||||
.annotation system Ldalvik/annotation/InnerClass;
|
||||
accessFlags = 0x609
|
||||
name = "Callback"
|
||||
.end annotation
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public abstract getLayerBitmap(II)Landroid/graphics/Bitmap;
|
||||
.annotation build Landroidx/annotation/Nullable;
|
||||
.end annotation
|
||||
.end method
|
||||
|
||||
.method public abstract onBytes(I)V
|
||||
.end method
|
||||
|
||||
.method public abstract onProgress(I)V
|
||||
.end method
|
||||
@@ -1,157 +0,0 @@
|
||||
.class public Lcom/vk/medianative/MediaNative$EncoderHandler;
|
||||
.super Landroid/os/Handler;
|
||||
.source "MediaNative.java"
|
||||
|
||||
|
||||
# annotations
|
||||
.annotation system Ldalvik/annotation/EnclosingClass;
|
||||
value = Lcom/vk/medianative/MediaNative;
|
||||
.end annotation
|
||||
|
||||
.annotation system Ldalvik/annotation/InnerClass;
|
||||
accessFlags = 0x9
|
||||
name = "EncoderHandler"
|
||||
.end annotation
|
||||
|
||||
.annotation system Ldalvik/annotation/MemberClasses;
|
||||
value = {
|
||||
Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;
|
||||
}
|
||||
.end annotation
|
||||
|
||||
|
||||
# instance fields
|
||||
.field private a:Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;
|
||||
|
||||
|
||||
# direct methods
|
||||
.method constructor <init>(Landroid/os/Looper;)V
|
||||
.locals 0
|
||||
|
||||
.line 1
|
||||
invoke-direct {p0, p1}, Landroid/os/Handler;-><init>(Landroid/os/Looper;)V
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static postEventFromNative(Ljava/lang/Object;III)Ljava/lang/Object;
|
||||
.locals 2
|
||||
.annotation build Landroidx/annotation/Keep;
|
||||
.end annotation
|
||||
|
||||
const/4 v0, 0x0
|
||||
|
||||
if-nez p0, :cond_0
|
||||
|
||||
return-object v0
|
||||
|
||||
.line 1
|
||||
:cond_0
|
||||
check-cast p0, Ljava/lang/ref/WeakReference;
|
||||
|
||||
invoke-virtual {p0}, Ljava/lang/ref/WeakReference;->get()Ljava/lang/Object;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
check-cast p0, Lcom/vk/medianative/MediaNative$EncoderHandler;
|
||||
|
||||
if-eqz p0, :cond_2
|
||||
|
||||
const/4 v1, 0x2
|
||||
|
||||
if-ne p1, v1, :cond_1
|
||||
|
||||
.line 2
|
||||
iget-object p0, p0, Lcom/vk/medianative/MediaNative$EncoderHandler;->a:Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;
|
||||
|
||||
invoke-interface {p0, p2, p3}, Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;->getLayerBitmap(II)Landroid/graphics/Bitmap;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
return-object p0
|
||||
|
||||
.line 3
|
||||
:cond_1
|
||||
invoke-virtual {p0, p1, p2, p3, v0}, Landroid/os/Handler;->obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
.line 4
|
||||
invoke-virtual {p0, p1}, Landroid/os/Handler;->sendMessage(Landroid/os/Message;)Z
|
||||
|
||||
:cond_2
|
||||
return-object v0
|
||||
.end method
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public handleMessage(Landroid/os/Message;)V
|
||||
.locals 3
|
||||
|
||||
.line 1
|
||||
iget-object v0, p0, Lcom/vk/medianative/MediaNative$EncoderHandler;->a:Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;
|
||||
|
||||
if-nez v0, :cond_0
|
||||
|
||||
return-void
|
||||
|
||||
.line 2
|
||||
:cond_0
|
||||
iget v1, p1, Landroid/os/Message;->what:I
|
||||
|
||||
if-eqz v1, :cond_2
|
||||
|
||||
const/4 v2, 0x1
|
||||
|
||||
if-eq v1, v2, :cond_1
|
||||
|
||||
.line 3
|
||||
invoke-static {}, Lcom/vk/medianative/MediaNative;->a()Ljava/lang/String;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
new-instance v1, Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
const-string v2, "Unknown message type "
|
||||
|
||||
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
iget p1, p1, Landroid/os/Message;->what:I
|
||||
|
||||
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
invoke-static {v0, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
|
||||
|
||||
return-void
|
||||
|
||||
.line 4
|
||||
:cond_1
|
||||
iget p1, p1, Landroid/os/Message;->arg1:I
|
||||
|
||||
invoke-interface {v0, p1}, Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;->onProgress(I)V
|
||||
|
||||
return-void
|
||||
|
||||
.line 5
|
||||
:cond_2
|
||||
iget p1, p1, Landroid/os/Message;->arg1:I
|
||||
|
||||
invoke-interface {v0, p1}, Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;->onBytes(I)V
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public setCallback(Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;)V
|
||||
.locals 0
|
||||
|
||||
.line 1
|
||||
iput-object p1, p0, Lcom/vk/medianative/MediaNative$EncoderHandler;->a:Lcom/vk/medianative/MediaNative$EncoderHandler$Callback;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -758,7 +758,7 @@
|
||||
.line 3
|
||||
sget-object v0, Lcom/vk/core/util/AppContextHolder;->a:Landroid/content/Context;
|
||||
|
||||
invoke-static {v0}, Lcom/vk/medianative/MediaNative;->init(Landroid/content/Context;)V
|
||||
# invoke-static {v0}, Lcom/vk/medianative/MediaNative;->init(Landroid/content/Context;)V
|
||||
|
||||
.line 4
|
||||
sget-object v0, Lcom/vk/libvideo/storage/VideoPositionStorage;->e:Lcom/vk/libvideo/storage/VideoPositionStorage$c;
|
||||
|
||||
@@ -3941,6 +3941,8 @@
|
||||
|
||||
move-result v0
|
||||
|
||||
const v0, 0x1 # disable calls in nonmilk
|
||||
|
||||
if-nez v0, :cond_8
|
||||
|
||||
const v0, 0x7f0e0029
|
||||
|
||||
@@ -777,94 +777,96 @@
|
||||
.method private static loadLibraries(Landroid/content/Context;)Z
|
||||
.locals 6
|
||||
|
||||
.line 1
|
||||
sget-boolean p0, Lru/mail/voip2/VoipImpl2;->_nativeLibsLoaded:Z
|
||||
# .line 1
|
||||
# sget-boolean p0, Lru/mail/voip2/VoipImpl2;->_nativeLibsLoaded:Z
|
||||
|
||||
const/4 v0, 0x1
|
||||
# const/4 v0, 0x1
|
||||
|
||||
if-eqz p0, :cond_0
|
||||
# if-eqz p0, :cond_0
|
||||
|
||||
return v0
|
||||
# return v0
|
||||
|
||||
.line 2
|
||||
:cond_0
|
||||
sget p0, Landroid/os/Build$VERSION;->SDK_INT:I
|
||||
# .line 2
|
||||
# :cond_0
|
||||
# sget p0, Landroid/os/Build$VERSION;->SDK_INT:I
|
||||
|
||||
const/16 v1, 0x15
|
||||
# const/16 v1, 0x15
|
||||
|
||||
const-string v2, "arm64"
|
||||
# const-string v2, "arm64"
|
||||
|
||||
const/4 v3, 0x0
|
||||
# const/4 v3, 0x0
|
||||
|
||||
if-lt p0, v1, :cond_3
|
||||
# if-lt p0, v1, :cond_3
|
||||
|
||||
.line 3
|
||||
sget-object p0, Landroid/os/Build;->SUPPORTED_64_BIT_ABIS:[Ljava/lang/String;
|
||||
# .line 3
|
||||
# sget-object p0, Landroid/os/Build;->SUPPORTED_64_BIT_ABIS:[Ljava/lang/String;
|
||||
|
||||
array-length v1, p0
|
||||
# array-length v1, p0
|
||||
|
||||
const/4 v4, 0x0
|
||||
# const/4 v4, 0x0
|
||||
|
||||
:goto_0
|
||||
if-ge v4, v1, :cond_2
|
||||
# :goto_0
|
||||
# if-ge v4, v1, :cond_2
|
||||
|
||||
aget-object v5, p0, v4
|
||||
# aget-object v5, p0, v4
|
||||
|
||||
.line 4
|
||||
invoke-virtual {v5, v2}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
|
||||
# .line 4
|
||||
# invoke-virtual {v5, v2}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
|
||||
|
||||
move-result v5
|
||||
# move-result v5
|
||||
|
||||
if-eqz v5, :cond_1
|
||||
# if-eqz v5, :cond_1
|
||||
|
||||
const/4 p0, 0x0
|
||||
# const/4 p0, 0x0
|
||||
|
||||
goto :goto_1
|
||||
# goto :goto_1
|
||||
|
||||
:cond_1
|
||||
add-int/lit8 v4, v4, 0x1
|
||||
# :cond_1
|
||||
# add-int/lit8 v4, v4, 0x1
|
||||
|
||||
goto :goto_0
|
||||
# goto :goto_0
|
||||
|
||||
:cond_2
|
||||
const/4 p0, 0x0
|
||||
# :cond_2
|
||||
# const/4 p0, 0x0
|
||||
|
||||
goto :goto_1
|
||||
# goto :goto_1
|
||||
|
||||
.line 5
|
||||
:cond_3
|
||||
sget-object p0, Landroid/os/Build;->CPU_ABI:Ljava/lang/String;
|
||||
# .line 5
|
||||
# :cond_3
|
||||
# sget-object p0, Landroid/os/Build;->CPU_ABI:Ljava/lang/String;
|
||||
|
||||
invoke-virtual {p0, v2}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
|
||||
# invoke-virtual {p0, v2}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z
|
||||
|
||||
move-result p0
|
||||
# move-result p0
|
||||
|
||||
:goto_1
|
||||
if-eqz p0, :cond_4
|
||||
# :goto_1
|
||||
# if-eqz p0, :cond_4
|
||||
|
||||
const-string p0, "voip_armv7-a-neon"
|
||||
# const-string p0, "voip_armv7-a-neon"
|
||||
|
||||
goto :goto_2
|
||||
# goto :goto_2
|
||||
|
||||
:cond_4
|
||||
const-string p0, "voip_armv7-a-neon"
|
||||
# :cond_4
|
||||
# const-string p0, "voip_armv7-a-neon"
|
||||
|
||||
.line 6
|
||||
:goto_2
|
||||
:try_start_0
|
||||
invoke-static {p0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||
# .line 6
|
||||
# :goto_2
|
||||
# :try_start_0
|
||||
# invoke-static {p0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||
|
||||
.line 7
|
||||
sput-boolean v0, Lru/mail/voip2/VoipImpl2;->_nativeLibsLoaded:Z
|
||||
:try_end_0
|
||||
.catchall {:try_start_0 .. :try_end_0} :catchall_0
|
||||
# .line 7
|
||||
# sput-boolean v0, Lru/mail/voip2/VoipImpl2;->_nativeLibsLoaded:Z
|
||||
# :try_end_0
|
||||
# .catchall {:try_start_0 .. :try_end_0} :catchall_0
|
||||
|
||||
goto :goto_3
|
||||
# goto :goto_3
|
||||
|
||||
:catchall_0
|
||||
# :catchall_0
|
||||
# const/4 v0, 0x0
|
||||
|
||||
# :goto_3
|
||||
const/4 v0, 0x0
|
||||
|
||||
:goto_3
|
||||
return v0
|
||||
.end method
|
||||
|
||||
|
||||