Compare commits

..
Author SHA1 Message Date
gdlbo 6d3ddede38 Update WebViewColoringUtils.java 2023-05-22 19:01:39 +03:00
gdlbo 08dae9b342 Experimental proguard config with hooks refactoring (#1323)
fixed telegram stickers issue
speedup webview coloring
refactored VKUIHook
fixed duplication of eruda
added a check for duplication of adding styles for coloring vkui
2023-05-22 18:48:15 +03:00
549 changed files with 2361 additions and 2197 deletions
+3 -1
View File
@@ -32,13 +32,15 @@
-repackageclasses
-allowaccessmodification
-optimizations
-optimizationpasses 5
-keepattributes SourceFile, LineNumberTable
-keep,allowoptimization class ru.vtosters.lite.** {
-keep,allowoptimization class ru.vtosters.hooks.**, ru.vtosters.lite.utils.AndroidUtils, ru.vtosters.lite.utils.NetworkUtils, ru.vtosters.lite.utils.CrashReporter, ru.vtosters.lite.ui.activities.**, ru.vtosters.lite.services.**, ru.vtosters.lite.ui.fragments.**, ru.vtosters.lite.themes.**, ru.vtosters.lite.music.hook.**, ru.vtosters.lite.music.cache.injectors.**, ru.vtosters.lite.ui.wallpapers.NativeEffects, com.aefyr.tsg.g2.TelegramStickersService {
public <fields>;
public <methods>;
public <init>(...);
}
-keep class com.vtosters.lite.** { *; }
-keep class com.vk.** { *; }
-keep class bruhcollective.itaysonlab.libvkx.client.** { *; }
@@ -11,8 +11,8 @@ import java.util.ArrayList;
import java.util.List;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.isValidSignature;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.isValidSignature;
public class LibVKXClient {
@SuppressLint("StaticFieldLeak")
@@ -8,7 +8,7 @@ import com.vk.log.L;
import org.json.JSONObject;
import ru.vtosters.lite.music.Genius;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.hooks.other.Preferences;
import java.util.ArrayList;
@@ -14,7 +14,7 @@ import b.h.v.InitialValueObservable;
import b.h.v.TextViewTextChangeEvent;
import b.h.v.TextViewTextChangeEventObservable;
import com.vk.core.util.ContextExtKt;
import ru.vtosters.lite.utils.ThemesUtils;
import ru.vtosters.hooks.other.ThemesUtils;
public final class TextViewExt {
public static void a(TextView textView, Drawable drawable) {
@@ -14,7 +14,7 @@ import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.dto.common.VerifyInfo;
import com.vk.extensions.ViewExtKt;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.ThemesUtils;
import ru.vtosters.hooks.other.ThemesUtils;
public final class VerifyInfoHelper {
@@ -11,7 +11,7 @@ import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.engine.models.groups.Group;
import com.vk.im.engine.utils.DialogPermissionHelper;
import com.vk.im.ui.p.ImBridge7;
import ru.vtosters.lite.dialogs.DialogMenuInjectors;
import ru.vtosters.hooks.DialogMenuInjectors;
import java.util.ArrayList;
import java.util.List;
@@ -21,7 +21,7 @@ import com.vk.im.ui.views.msg.MsgPartIconTwoRowView;
import com.vtosters.lite.R;
import kotlin.TypeCastException;
import kotlin.jvm.internal.Intrinsics;
import ru.vtosters.lite.hooks.CallsHook;
import ru.vtosters.hooks.CallsHook;
public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
public static final a I = new a();
@@ -39,7 +39,7 @@ import com.vk.im.ui.views.avatars.AvatarView;
import com.vk.im.ui.views.avatars.StoryBorderView;
import static com.vk.im.ui.d.vkim_administration_title;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.hooks.other.ThemesUtils.getAccentColor;
public class DialogItemView extends ViewGroup {
private final int B;
@@ -4,7 +4,7 @@ import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Build;
import android.util.Log;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.hooks.other.Preferences;
import java.io.File;
import java.io.FileOutputStream;
@@ -24,7 +24,7 @@ import com.vtosters.lite.ViewUtils;
import com.vtosters.lite.ui.MusicErrorViewHelper;
import com.vtosters.lite.ui.holder.RecyclerHolder;
import ru.vtosters.lite.music.Genius;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.hooks.other.Preferences;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -18,12 +18,12 @@ import com.vk.imageloader.view.VKMultiImageView;
import com.vk.navigation.NavigatorKeys;
import com.vtosters.lite.R;
import com.vtosters.lite.a0;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.hooks.other.Preferences;
import java.util.Arrays;
import static b.h.z.f.roboto_medium;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.hooks.other.ThemesUtils.getAccentColor;
@UiThread
public class TargetImageView extends VKMultiImageView {
@@ -26,8 +26,8 @@ import com.vk.core.ui.themes.VKThemeHelper;
import com.vtosters.lite.R;
import me.grishka.appkit.utils.V;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock;
import static ru.vtosters.hooks.other.Preferences.vkme;
import static ru.vtosters.hooks.other.ThemesUtils.getCSTDock;
public class BottomNavigationItemView extends FrameLayout implements MenuView.ItemView {
private final TextView mSmallLabel;
@@ -1,14 +1,17 @@
package ru.vtosters.lite.utils;
package ru.vtosters.hooks;
import android.view.View;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.VersionReader;
import static ru.vtosters.hooks.other.Preferences.devmenu;
import static ru.vtosters.hooks.other.Preferences.getBuildName;
import static ru.vtosters.lite.utils.AndroidUtils.getApplicationName;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.devmenu;
import static ru.vtosters.lite.utils.Preferences.getBuildName;
public class About {
public class AboutHook {
public static void inject(View view) {
view.setOnLongClickListener(v -> {
if (devmenu()) {
@@ -0,0 +1,21 @@
package ru.vtosters.hooks;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
public class AdBlockHook {
public static JSONObject discoverInject(JSONObject json) throws JSONException {
return NewsFeedFiltersUtils.discoverInject(json);
}
public static JSONArray feedInject(JSONArray items) {
return NewsFeedFiltersUtils.feedInject(items);
}
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
return NewsFeedFiltersUtils.storiesads(json, isDeleteFix);
}
}
@@ -1,8 +1,8 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import b.h.g.g.BuildInfo;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class AppVerHook {
public static int appBuild() {
@@ -1,6 +1,6 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class BusinessNotifHook {
public static boolean hook(boolean i) {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.content.Context;
import android.content.Intent;
@@ -0,0 +1,27 @@
package ru.vtosters.hooks;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.music.catalog.inject.CatalogJsonInjector;
public class CatalogsHook {
public static JSONObject injectCatalogGetAudio(JSONObject json) {
try {
return CatalogJsonInjector.music(json);
} catch (JSONException e) {
return json;
}
}
public static JSONObject injectCatalogGetAudioArtist(JSONObject json) {
try {
return CatalogJsonInjector.fixArtists(json);
} catch (JSONException e) {
return json;
}
}
public static JSONObject injectCatalogGetSection(JSONObject json) {
return CatalogJsonInjector.injectIntoCatalogs(json);
}
}
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.app.Activity;
import android.content.Context;
@@ -17,11 +17,11 @@ import ru.vtosters.lite.utils.AndroidUtils;
import java.util.List;
import java.util.Objects;
import static ru.vtosters.lite.dialogs.DialogHeaderInjector.forceInvalidateDialogActions;
import static ru.vtosters.hooks.DialogHeaderInjector.forceInvalidateDialogActions;
import static ru.vtosters.hooks.other.ThemesUtils.getSTextAttr;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
public class CryptImHook {
public static boolean isPrivateProcessor(int peerID) {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
import com.vtosters.lite.R;
@@ -8,8 +8,8 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.lite.utils.AndroidUtils.getStringDate;
import static ru.vtosters.lite.utils.Preferences.getString;
public class DateHook {
public static boolean fulltime() {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.utils;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
import android.content.ContentValues;
@@ -12,18 +12,16 @@ import com.vk.im.engine.models.messages.NestedMsg;
import com.vk.libsqliteext.CustomSqliteExtensionsKt;
import io.requery.android.database.sqlite.SQLiteDatabase;
import io.requery.android.database.sqlite.SQLiteOpenHelper;
import ru.vtosters.lite.encryption.EncryptProvider;
import java.util.ArrayList;
import java.util.List;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.getString;
public class DeletedMessagesHandler {
public class DeletedMessagesHook {
private static List<Integer> sDeletedMessagesList = new ArrayList<>();
private static SQLiteDatabase sVKSQLiteDatabase;
private static int sBodyIndex = -1;
private static DeletedMessagesDBHelper sVTDatabase;
@@ -60,13 +58,13 @@ public class DeletedMessagesHandler {
for (NestedMsg nestedMsg : nestedMsgs) {
if (!nestedMsg.w0().isEmpty()) checkForNestedMsg(nestedMsg.w0());
nestedMsg.d(EncryptProvider.decryptMessage(nestedMsg.f(), nestedMsg.getFrom().getId()));
nestedMsg.d(EncryptionMessagesHook.decryptMessage(nestedMsg.f(), nestedMsg.getFrom().getId()));
}
}
private static void editTextOfMsg(MsgFromUser msgFromUser) {
if (!msgFromUser.f().startsWith(getPrefixUndelete())) {
msgFromUser.d(getPrefixUndelete() + EncryptProvider.decryptMessage(msgFromUser));
msgFromUser.d(getPrefixUndelete() + EncryptionMessagesHook.decryptMessage(msgFromUser));
}
}
@@ -87,7 +85,7 @@ public class DeletedMessagesHandler {
@SuppressLint("Range")
int localId = cursor.getInt(cursor.getColumnIndex("local_id"));
var className = DeletedMessagesHandler.class.getSimpleName();
var className = DeletedMessagesHook.class.getSimpleName();
var imEnvironment = msgDeleteLpTask.b;
var cint = msgDeleteLpTask.c;
imEnvironment.a(className, new OnMsgUpdateEvent(className, cint, localId));
@@ -1,13 +1,13 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.AndroidUtils.MD5;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
public class DeviceInfoHook {
public static String getDeviceInfo(String input) {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.dialogs;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
import android.os.Environment;
@@ -8,11 +8,11 @@ import com.vk.im.engine.models.EntityIntMap;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.ui.components.common.DialogAction;
import com.vk.im.ui.views.dialog_actions.DialogActionsListView;
import ru.vtosters.lite.dialogs.Requests;
import ru.vtosters.lite.downloaders.messages.HtmlDialogDownloaderFormatProvider;
import ru.vtosters.lite.downloaders.messages.MessagesDownloader;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.hooks.CryptImHook;
import ru.vtosters.lite.utils.AndroidUtils;
import java.io.File;
@@ -35,12 +35,12 @@ public class DialogHeaderInjector {
forceInvalidateDialogActions(dialog);
}
case DNR_ON, DNR_OFF -> {
DNRModule.hookDNR(peerId);
MessagesActivityHook.hookDNR(peerId);
forceInvalidateDialogActions(dialog);
return true;
}
case DNT_ON, DNT_OFF -> {
DNRModule.hookDNT(peerId);
MessagesActivityHook.hookDNT(peerId);
forceInvalidateDialogActions(dialog);
return true;
}
@@ -84,13 +84,13 @@ public class DialogHeaderInjector {
actions.add(DialogAction.DOWNLOAD);
if (DNRModule.isDnrEnabledFor(peerId)) {
if (MessagesActivityHook.isDnrEnabledFor(peerId)) {
actions.add(DialogAction.DNR_OFF);
} else {
actions.add(DialogAction.DNR_ON);
}
if (DNRModule.isDntEnabledFor(peerId)) {
if (MessagesActivityHook.isDntEnabledFor(peerId)) {
actions.add(DialogAction.DNT_OFF);
} else {
actions.add(DialogAction.DNT_ON);
@@ -1,14 +1,14 @@
package ru.vtosters.lite.dialogs;
package ru.vtosters.hooks;
import android.os.Environment;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.ui.components.common.DialogAction;
import com.vtosters.lite.R;
import ru.vtosters.lite.dialogs.Requests;
import ru.vtosters.lite.downloaders.messages.HtmlDialogDownloaderFormatProvider;
import ru.vtosters.lite.downloaders.messages.MessagesDownloader;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.hooks.CryptImHook;
import java.io.File;
import java.util.LinkedHashMap;
@@ -30,9 +30,9 @@ public class DialogMenuInjectors {
list.add(DialogAction.pinmsg);
list.add(DialogAction.unpinmsg);
list.add(DNRModule.isDnrEnabledFor(peerId) ? DialogAction.DNR_OFF : DialogAction.DNR_ON);
list.add(MessagesActivityHook.isDnrEnabledFor(peerId) ? DialogAction.DNR_OFF : DialogAction.DNR_ON);
list.add(DNRModule.isDntEnabledFor(peerId) ? DialogAction.DNT_OFF : DialogAction.DNT_ON);
list.add(MessagesActivityHook.isDntEnabledFor(peerId) ? DialogAction.DNT_OFF : DialogAction.DNT_ON);
list.add(DialogAction.ENCRYPT);
@@ -83,11 +83,11 @@ public class DialogMenuInjectors {
return true;
}
case DNR_ON, DNR_OFF -> {
DNRModule.hookDNR(peerId);
MessagesActivityHook.hookDNR(peerId);
return true;
}
case DNT_ON, DNT_OFF -> {
DNRModule.hookDNT(peerId);
MessagesActivityHook.hookDNT(peerId);
return true;
}
case pinmsg -> {
@@ -1,11 +1,11 @@
package ru.vtosters.lite.dialogs;
package ru.vtosters.hooks;
import android.content.Context;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.common.MsgAction;
import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.dialogs.Requests;
import ru.vtosters.lite.ui.dialogs.Translate;
import ru.vtosters.lite.utils.AndroidUtils;
@@ -37,7 +37,7 @@ public class DialogMessageInjector {
var isTextExist = !text.isEmpty() && !text.equals(" ");
if (isTextExist) {
Translate.showTranslatedText(context, EncryptProvider.decryptMessage(text, peerId));
Translate.showTranslatedText(context, EncryptionMessagesHook.decryptMessage(text, peerId));
} else {
AndroidUtils.sendToast(context.getString(com.vtosters.lite.R.string.translator_no_text));
}
@@ -1,4 +1,4 @@
package ru.vtosters.lite.feature.discover;
package ru.vtosters.hooks;
import com.vk.dto.discover.DiscoverItem;
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
import android.view.Menu;
@@ -24,10 +24,10 @@ import java.lang.reflect.Method;
import java.util.*;
import static com.vtosters.lite.R.id.*;
import static ru.vtosters.hooks.other.Preferences.*;
import static ru.vtosters.hooks.other.ThemesUtils.getCSTDock;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import static ru.vtosters.lite.utils.Preferences.*;
import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock;
public class DockBarInjector {
private static final DockBarEditorManager sManager = DockBarEditorManager.getInstance();
@@ -0,0 +1,40 @@
package ru.vtosters.hooks;
import android.content.Context;
import com.vk.core.dialogs.bottomsheet.MenuBottomSheetAction;
import com.vk.dto.common.VideoFile;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.stories.model.StoryEntry;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.downloaders.StoryDownloader;
import ru.vtosters.lite.downloaders.VideoDownloader;
import ru.vtosters.lite.utils.ExternalLinkParser;
import java.util.ArrayList;
public class DownloadersHook {
public static boolean onClickVideo(int id, VideoFile video, Context ctx) {
if (id == VideoDownloader.DOWNLOAD_ID) {
VideoDownloader.downloadVideo(video, ctx);
return true;
} else if (id == VideoDownloader.OPEN_EXTERNAL_LINK_ID) {
ExternalLinkParser.parseVideoFile(video, ctx, true);
}
return false;
}
public static void injectActionVideo(ArrayList<MenuBottomSheetAction> list, VideoFile video) {
if (!video.U && !video.I1()) {
VideoDownloader.addAction(list, VideoDownloader.DOWNLOAD_ID, com.vtosters.lite.R.drawable.ic_download_outline_24, com.vtosters.lite.R.string.download, 9);
VideoDownloader.addAction(list, VideoDownloader.OPEN_EXTERNAL_LINK_ID, com.vtosters.lite.R.drawable.ic_link_outline_28, com.vtosters.lite.R.string.interfacevideoext_short, 9);
}
}
public static Runnable injectActionStory(StoryEntry story) {
return () -> StoryDownloader.downloadStory(story);
}
public static void injectCacheAudio(MusicTrack mt) {
AudioDownloader.cacheTrack(mt);
}
}
@@ -0,0 +1,102 @@
package ru.vtosters.hooks;
import android.util.Log;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.msg_list.MsgListComponent;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import static ru.vtosters.hooks.MessagesHook.injectOwnText;
import static ru.vtosters.hooks.MessagesHook.injectOwnTextAll;
public class EncryptionMessagesHook {
// For message editing
public static String decryptMessage(MsgFromUser msg, boolean showEmoji) {
var decryptedMessage = decryptMessage(EncryptProvider.getBody(msg), EncryptProvider.getPeerId(msg));
if (!showEmoji && !decryptedMessage.equals(injectOwnTextAll(EncryptProvider.getBody(msg))))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
public static String decryptMessage(String msg, MsgListComponent list) {
var peerid = list.G().getId();
var decryptedMessage = decryptMessage(msg, peerid);
if (!decryptedMessage.equals(injectOwnTextAll(msg)))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
public static CharSequence decryptMessage(CharSequence msg, int peerid) {
return decryptMessage(msg.toString(), peerid);
}
public static CharSequence decryptMessage(Msg msg, CharSequence orig) {
if (msg instanceof MsgFromUser) {
var decrypted = decryptMessage(((MsgFromUser) msg).f(), msg.v1());
if (decrypted.contains("\uD83D\uDD12")) {
return decrypted;
}
}
return orig;
}
public static String decryptMessages(String msgBody, int peer, boolean showEmoji) {
return (String) decryptMessage(msgBody, peer, showEmoji);
}
public static CharSequence decryptMessage(CharSequence msgBody, MsgFromUser msgFromUser, boolean showEmoji) {
try {
return decryptMessage((String) msgBody, msgFromUser.v1(), showEmoji);
} catch (Exception e) {
return decryptMessage((String) msgBody, 0, showEmoji);
}
}
// For MentionsFormatter that requires CharSequence
public static CharSequence decryptMessage(String msgBody, int peer, boolean showEmoji) {
var decryptedMessage = decryptMessage(msgBody, peer);
if (!showEmoji && !decryptedMessage.equals(injectOwnTextAll(msgBody)))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
// This will run through EVERY single processor available.
public static String decryptMessage(MsgFromUser msg) {
return decryptMessage(EncryptProvider.getBody(msg), EncryptProvider.getPeerId(msg));
}
public static String decryptMessage(String msgBody, int peer) {
try {
for (IMProcessor processor : EncryptProvider.processors) {
if ((processor.isUsed() || !processor.isPublic()) && processor.isEncrypted(msgBody) && (processor.isPublic() || EncryptProvider.getKeyForProcessor(processor, peer) != null))
return "\uD83D\uDD12 " + injectOwnTextAll(processor.decode(msgBody, EncryptProvider.getKeyForProcessor(processor, peer)));
}
} catch (Exception e) {
e.printStackTrace();
}
return injectOwnTextAll(msgBody);
}
// This will use only the processor which was chosen in chat menu
public static String encryptMessage(MsgFromUser msg) {
String msgBody = EncryptProvider.getBody(msg);
Log.d("EncryptProvider", "encryptMessage: msg = " + msg);
Log.d("EncryptProvider", "encryptMessage: body = " + msgBody);
Log.d("EncryptProvider", "encryptMessage: peerId = " + EncryptProvider.getPeerId(msg));
for (IMProcessor processor : EncryptProvider.processors) {
int peer = EncryptProvider.getPeerId(msg);
if (processor.isUsedToEncrypt(peer)) {
return injectOwnText(processor.encode(msgBody, EncryptProvider.getKeyForProcessor(processor, peer)));
}
}
return injectOwnText(msgBody);
}
}
@@ -1,9 +1,9 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import androidx.fragment.app.FragmentTransaction;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.lite.ui.components.FragAnimationKit.setAnimations;
import static ru.vtosters.lite.utils.Preferences.getString;
public class FragAnimationHook {
public static boolean animateOpen(FragmentTransaction transaction) {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.os.Build;
import android.util.Base64;
@@ -15,7 +15,7 @@ import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
import static ru.vtosters.lite.utils.Preferences.isValidSignature;
import static ru.vtosters.hooks.other.Preferences.isValidSignature;
public class GcmHook {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.utils;
package ru.vtosters.hooks;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -7,8 +7,9 @@ import android.os.Build;
import com.google.firebase.iid.FirebaseInstanceIdReceiver;
import com.google.firebase.iid.FirebaseInstanceIdReceiver2;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils;
public class GmsUtils {
public class GmsHook {
private static final boolean needToSpoof = !isGmsInstalled() && isFakeGmsInstalled();
public static boolean isGmsInstalled() {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.feature.groupslist;
package ru.vtosters.hooks;
import android.util.Log;
import org.json.JSONArray;
@@ -0,0 +1,39 @@
package ru.vtosters.hooks;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.utils.FriendsCatalogUtils;
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
import ru.vtosters.lite.utils.OnlineBypass;
import ru.vtosters.lite.utils.SuperAppUtils;
import java.io.IOException;
import java.text.ParseException;
public class JsonInjectors {
public static JSONObject menu(JSONObject orig) throws JSONException {
return SuperAppUtils.menu(orig);
}
public static JSONObject superapp(JSONObject json) throws JSONException {
return SuperAppUtils.superapp(json);
}
public static JSONObject setOnlineInfo(JSONObject json) throws JSONException {
return OnlineBypass.setOnlineInfo(json);
}
public static JSONArray setOnlineInfoUsers(JSONArray profiles) throws JSONException {
return OnlineBypass.setOnlineInfoUsers(profiles);
}
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
return NewsFeedFiltersUtils.newsfeedlist(items);
}
public static JSONObject friends(JSONObject json) throws JSONException, ParseException, IOException {
return FriendsCatalogUtils.inject(json);
}
}
@@ -0,0 +1,10 @@
package ru.vtosters.hooks;
import com.vk.dto.music.MusicTrack;
import ru.vtosters.lite.music.LastFMScrobbler;
public class LastFMHook {
public static void grabMusicTrack(MusicTrack musictrack) {
LastFMScrobbler.grabMusicTrack(musictrack);
}
}
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.app.Activity;
import android.content.Intent;
@@ -6,27 +6,33 @@ import android.os.Build;
import b.h.g.k.VKProgressDialog;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.hooks.other.ThemesUtils;
import ru.vtosters.hooks.ui.SystemThemeChangerHook;
import ru.vtosters.lite.concurrent.VTExecutors;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.hooks.ui.SystemThemeChangerHook;
import ru.vtosters.lite.ssfs.UsersList;
import ru.vtosters.lite.themes.ThemesManager;
import ru.vtosters.lite.ui.dialogs.DisableBattery;
import ru.vtosters.lite.ui.dialogs.InstallGMS;
import ru.vtosters.lite.ui.dialogs.OTADialog;
import ru.vtosters.lite.ui.dialogs.Start;
import ru.vtosters.lite.utils.*;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
import ru.vtosters.lite.utils.NavigatorUtils;
import ru.vtosters.lite.utils.VTVerifications;
import static ru.vtosters.hooks.other.Preferences.checkupdates;
import static ru.vtosters.lite.ui.dialogs.ServerDialog.sendRequest;
import static ru.vtosters.lite.utils.CacheUtils.getInstance;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters;
import static ru.vtosters.lite.utils.Preferences.checkupdates;
public class MainActivityInjector {
public static void inject(Activity activity) {
SystemThemeChangerHook.themeOnStart(activity);
sendRequest();
UsersList.getUsersList();
VTVerifications.load(activity);
if (checkupdates()) OTADialog.checkUpdates(activity);
@@ -45,7 +51,7 @@ public class MainActivityInjector {
updateBinsAndTmpArchive(activity);
}
VTExecutors.getIoScheduler().a(DeletedMessagesHandler::reloadMessagesList); // ioScheduler
VTExecutors.getIoScheduler().a(DeletedMessagesHook::reloadMessagesList); // ioScheduler
if (activity.getIntent().getAction() != null && Intent.ACTION_APPLICATION_PREFERENCES.equals(activity.getIntent().getAction())) {
NavigatorUtils.switchToSettings(activity);
@@ -1,4 +1,4 @@
package ru.vtosters.lite.dialogs;
package ru.vtosters.hooks;
import com.vk.im.engine.commands.messages.SetUserActivityCmd;
import com.vk.im.engine.models.dialogs.Dialog;
@@ -7,7 +7,7 @@ import ru.vtosters.lite.dialogs.helpers.DoNotTypeDBHelper;
import java.util.List;
public class DNRModule {
public class MessagesActivityHook {
public static DoNotReadDBHelper mDoNotReadDBHelper = new DoNotReadDBHelper();
public static DoNotTypeDBHelper mDoNotTypeDBHelper = new DoNotTypeDBHelper();
@@ -1,9 +1,12 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import com.vk.api.internal.MethodCall;
import com.vk.im.ui.providers.audiomsg.ImAudioMsgPlayerProvider;
import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
import com.vtosters.lite.im.ImEngineProvider;
import ru.vtosters.lite.translators.BaseTranslator;
import ru.vtosters.lite.ui.dialogs.MessageSettings;
import ru.vtosters.lite.utils.LifecycleUtils;
@@ -11,9 +14,9 @@ import ru.vtosters.lite.utils.LifecycleUtils;
import java.util.ArrayList;
import java.util.regex.Pattern;
import static ru.vtosters.hooks.other.Preferences.*;
import static ru.vtosters.lite.ui.dialogs.MessageSettings.bombCount;
import static ru.vtosters.lite.ui.dialogs.MessageSettings.isSilentEnabled;
import static ru.vtosters.lite.utils.Preferences.*;
public class MessagesHook {
public static String injectOwnText(String oldText) {
@@ -104,4 +107,10 @@ public class MessagesHook {
default -> 0;
};
}
public static void reloadMessages() {
ImEngineProvider.b().a();
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
} // Delete and reload msg cache
}
@@ -0,0 +1,16 @@
package ru.vtosters.hooks;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
import java.io.File;
public class MusicCacheFilesHook {
public static File getTrackFile(String trackId) {
return new File(FileCacheImplementation.getTrackFolder(trackId), "track.mp3");
}
public static boolean isTrackExist(String trackId) {
return CacheDatabaseDelegate.isCached(trackId);
}
}
@@ -1,19 +1,16 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.content.Context;
import android.os.PowerManager;
import androidx.recyclerview.widget.RecyclerView;
import com.vk.core.preference.Preference;
import com.vk.discover.DiscoverItemDecorator;
import com.vtosters.lite.api.ExtendedCommunityProfile;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.Preferences;
import java.util.*;
import static java.lang.Long.MAX_VALUE;
import static ru.vtosters.hooks.other.Preferences.*;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.*;
public class NewsfeedHook {
public static long getUpdateNewsfeed(boolean refresh_timeout) {
@@ -75,74 +72,6 @@ public class NewsfeedHook {
return params.toArray(new String[0]);
}
public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) {
return Preferences.getPreferences().getStringSet(
"whitelisted_filters_groups", Collections.emptySet()
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) {
return Preferences.getPreferences().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static boolean isWhitelistedAdStories(ExtendedCommunityProfile 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));
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 setWhitelistedAd(ExtendedCommunityProfile eup, boolean needWhitelist) {
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
var mutableAdsSet = new LinkedHashSet<>(Preferences.getPreferences().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()));
if (needWhitelist) {
mutableAdsSet.add(id);
} else {
mutableAdsSet.remove(id);
}
Preferences.getPreferences().edit().putStringSet("whitelisted_ad_groups", mutableAdsSet).apply();
}
public static void setWhitelistedAdStories(ExtendedCommunityProfile 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();
}
public static void adsParams(HashSet<String> hashSet) {
if (ads()) {
hashSet.add("ads_disabled");
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.util.Log;
import com.vtosters.lite.R;
@@ -10,13 +10,11 @@ import ru.vtosters.lite.utils.AndroidUtils;
import java.io.IOException;
import java.text.ParseException;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfo;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfoUsers;
import static ru.vtosters.hooks.other.Preferences.*;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.*;
public class OnlineFormatterHook {
private static String AppName;
@@ -71,6 +69,7 @@ public class OnlineFormatterHook {
case 6614620 -> "Laney";
case 5632485 -> "SpaceVK";
case 6287487 -> "vk.com";
case 8202606 -> "VK Me Web";
case 4542624 -> "Black VK";
case 3917910 -> "Miranda NG (bridge)";
case 8043814 -> "Quise";
@@ -117,7 +116,7 @@ public class OnlineFormatterHook {
}
public static JSONObject onlineHook(JSONObject json) throws ParseException, IOException, JSONException {
if (getBoolValue("onlinefix", false)) setOnlineInfo(json);
if (getBoolValue("onlinefix", false)) JsonInjectors.setOnlineInfo(json);
return json;
}
@@ -126,7 +125,7 @@ public class OnlineFormatterHook {
if (!getBoolValue("onlinefix", false)) return jsonArr;
try {
setOnlineInfoUsers(jsonArr);
JsonInjectors.setOnlineInfoUsers(jsonArr);
} catch (Exception e) {
Log.e("onlineHookProfiles", e.getMessage());
}
@@ -134,25 +133,27 @@ public class OnlineFormatterHook {
return jsonArr;
}
public static JSONObject onlineHookProfiles(JSONObject json) throws ParseException, IOException, JSONException {
public static JSONObject onlineHookProfiles(JSONObject json) {
if (!getBoolValue("onlinefix", false)) return json;
try {
setOnlineInfoUsers(json.optJSONArray("profiles"));
JsonInjectors.setOnlineInfoUsers(json.optJSONArray("profiles"));
} catch (Exception e) {
Log.e("onlineHookProfiles", e.getMessage());
}
return json;
}
public static JSONObject onlineHookItems(JSONObject json) throws ParseException, IOException, JSONException {
public static JSONObject onlineHookItems(JSONObject json) {
if (!getBoolValue("onlinefix", false)) return json;
try {
setOnlineInfoUsers(json.optJSONArray("items"));
JsonInjectors.setOnlineInfoUsers(json.optJSONArray("items"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
return json;
}
@@ -160,22 +161,23 @@ public class OnlineFormatterHook {
if (!getBoolValue("onlinefix", false)) return json;
try {
setOnlineInfoUsers(json.optJSONObject("read_requests").optJSONArray("items"));
JsonInjectors.setOnlineInfoUsers(json.optJSONObject("read_requests").optJSONArray("items"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
try {
setOnlineInfoUsers(json.optJSONObject("recommendations").optJSONArray("items"));
JsonInjectors.setOnlineInfoUsers(json.optJSONObject("recommendations").optJSONArray("items"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
try {
setOnlineInfoUsers(json.optJSONArray("profiles"));
JsonInjectors.setOnlineInfoUsers(json.optJSONArray("profiles"));
} catch (Exception e) {
Log.e("onlineHookItems", e.getMessage());
}
return json;
}
}
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
@@ -28,10 +28,10 @@ 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.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.File;
import java.io.IOException;
@@ -1,9 +1,9 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.graphics.*;
import com.facebook.drawee.generic.RoundingParams;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
public class PicRoundingHook {
private static final int pref = Preferences.getPreferences().getInt("pic_rounding", 0);
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.view.View;
import android.view.ViewGroup;
@@ -6,7 +6,7 @@ import android.widget.TextView;
import com.vk.dto.polls.PollOption;
import com.vk.polls.ui.views.PollOptionView;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class PollHook {
public static void show(PollOptionView view) {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.view.View;
import android.view.ViewGroup;
@@ -6,7 +6,7 @@ import android.widget.RelativeLayout;
import androidx.recyclerview.widget.RecyclerView;
import com.vk.newsfeed.holders.BaseFooterHolder;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.hooks.other.Preferences;
public class PostViewHook {
@@ -0,0 +1,16 @@
package ru.vtosters.hooks;
import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.profile.ui.components.CommunityFragmentActionsMenuBuilder;
import com.vk.profile.ui.components.ProfileFragmentActionsMenuBuilder;
import ru.vtosters.lite.ui.vkui.MenuBuilder;
public class ProfileMenuHook {
public static void inject(final CommunityFragmentActionsMenuBuilder mb, final ActionsPopup.b builder) {
MenuBuilder.injectAP(mb, builder);
}
public static void inject(final ProfileFragmentActionsMenuBuilder mb, final ActionsPopup.b builder) {
MenuBuilder.injectAP(mb, builder);
}
}
@@ -1,6 +1,6 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class PromoStickersHook {
public static String hook() {
@@ -1,7 +1,8 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.RadioButton;
@@ -10,18 +11,87 @@ import androidx.appcompat.view.ContextThemeWrapper;
import com.vk.auth.ui.VkAuthTextView;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.api.VikaMobile;
import ru.vtosters.lite.ui.fragments.DataSettingsFragment;
import ru.vtosters.lite.ui.fragments.ProxySettingsFragment;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NavigatorUtils;
import ru.vtosters.lite.utils.Preferences;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr;
import static ru.vtosters.lite.proxy.ProxyUtils.*;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
public class ProxyHook {
public static String linkReplacer(String link) {
var vkapi = "api.vk.com";
var oauth = "oauth.vk.com";
var vkstatic = "static.vk.com";
var proxyapi = getString("proxyapi");
var proxyoauth = getString("proxyoauth");
var proxystatic = getString("proxystatic");
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
proxyoauth = VikaMobile.getOauthHost();
proxystatic = VikaMobile.getStaticHost();
}
if (!isAnyProxyEnabled() || link.isEmpty()) {
return link;
}
if (proxyapi.isEmpty() || proxyoauth.isEmpty() || proxystatic.isEmpty()) {
Log.d("VTLite", "Proxy is not set" + " " + proxyapi + " " + proxyoauth + " " + proxystatic);
return link;
}
if (link.contains(vkapi)) {
return link.replaceAll(vkapi, proxyapi);
}
if (link.contains(oauth)) {
return link.replaceAll(oauth, proxyoauth);
}
if (link.contains(vkstatic)) {
return link.replaceAll(vkstatic, proxystatic);
}
return link;
}
public static String staticFix(String str) {
var string = getString("proxystatic");
if (isVikaProxyEnabled()) {
string = VikaMobile.getStaticHost();
}
if (isAnyProxyEnabled() && !string.isEmpty()) {
return str.replaceAll(string, "static.vk.com");
}
return str;
}
public static String getAwayPhpCom() {
var proxyapi = getString("proxyapi");
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
}
if (isAnyProxyEnabled() && !proxyapi.isEmpty()) {
return proxyapi;
}
return "m.vk.com";
}
public static void hookAuth(View v) {
VkAuthTextView button = v.findViewById(AndroidUtils.getIdentifier("already_have_account", "id"));
button.setText(R.string.proxy_setup);
@@ -0,0 +1,31 @@
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);
}
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);
}
}
@@ -1,11 +1,11 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import com.vk.im.engine.models.ProfilesSimpleInfo;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.engine.models.messages.NestedMsg;
import com.vk.im.ui.views.ReplyView;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.hooks.EncryptionMessagesHook.decryptMessage;
public class ReplyMsgHook {
public static void injectWithDecrypt(ReplyView replyView, MsgFromUser msgFromUser, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool) {
@@ -1,11 +1,11 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.util.Log;
import com.vk.api.internal.MethodCall;
import java.util.LinkedHashMap;
import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.hooks.other.Preferences.dev;
public class RequestDumper {
public static void addParams(MethodCall.a paramslist, String method, LinkedHashMap<String, String> params, String apiver) {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import com.vk.apps.AppsFragment;
import com.vk.discover.DiscoverFragment;
@@ -23,8 +23,8 @@ import com.vtosters.lite.fragments.y2.VideoCatalogFragment;
import com.vtosters.lite.general.fragments.GamesFragment;
import com.vtosters.lite.general.fragments.PhotosFragment;
import static ru.vtosters.hooks.other.Preferences.*;
import static ru.vtosters.lite.ui.components.DockBarEditorManager.getInstance;
import static ru.vtosters.lite.utils.Preferences.*;
public class StartFragmentHook {
public static Class getStartFragment() {
@@ -1,7 +1,6 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import static ru.vtosters.lite.utils.Preferences.adsstories;
import static ru.vtosters.lite.utils.Preferences.stories;
import static ru.vtosters.hooks.other.Preferences.*;
public class StoriesHook {
public static String ads() {
@@ -11,4 +10,8 @@ public class StoriesHook {
public static boolean showstories() {
return stories();
}
public static boolean getStoriesRead() {
return getBoolValue("read_s", false);
}
}
@@ -1,4 +1,4 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -10,9 +10,9 @@ import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.CompoundButtonCompat;
import com.vk.core.util.ColorUtils;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.hooks.other.ThemesUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.lite.utils.ThemesUtils;
import static com.vtosters.lite.R.color.*;
@@ -0,0 +1,87 @@
package ru.vtosters.hooks;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.aefyr.tsg.g2.TelegramStickersPack;
import com.aefyr.tsg.g2.TelegramStickersService;
import com.vk.dto.common.Attachment;
import com.vk.dto.stickers.StickerItem;
import com.vk.dto.stickers.StickerStockItem;
import com.vk.im.engine.models.attaches.Attach;
import com.vtosters.lite.attachments.PendingGraffitiAttachment;
import com.vtosters.lite.im.AppAttachToImAttachConverter;
import com.vtosters.lite.upload.Upload;
import ru.vtosters.lite.tgs.TGRoot;
import ru.vtosters.lite.utils.AndroidUtils;
import java.util.List;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
public class TelegramStickersHook {
public static StickerStockItem getPackBySticker(int stickerId) {
if (stickerId < TGRoot.N) return null;
int index = (stickerId - TGRoot.N) / 120;
TelegramStickersPack p = null;
for (TelegramStickersPack p_ : TelegramStickersService.getInstance(AndroidUtils.getGlobalContext())
.getActivePacksListReference()) {
if (p_.index == index) {
p = p_;
break;
}
}
if (p == null) return null;
try {
return TGRoot.toStickerPack(p);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Attachment processSticker(StickerItem item) {
int id = item.getId();
if (id < TGRoot.N) return null;
int index = (id - TGRoot.N) / 120;
int stickerId = (id - TGRoot.N) % 120;
TelegramStickersPack pack = null;
for (TelegramStickersPack p : TelegramStickersService.getInstance(getGlobalContext()).getActivePacksListReference()) {
if (p.index == index) {
pack = p;
break;
}
}
String image = pack.getStickerFile(stickerId).getAbsolutePath();
Bitmap bm = BitmapFactory.decodeFile(image);
int upid = Upload.a();
TGRoot.pendingStickers.push(upid);
Attachment att = new PendingGraffitiAttachment(upid, 0, image, bm.getWidth(), bm.getHeight(), null);
bm.recycle();
return att;
}
public static void injectStickers(List<StickerStockItem> list) {
try {
List<TelegramStickersPack> packs = TelegramStickersService.getInstance(getGlobalContext()).getActivePacksListReference();
for (int i = packs.size() - 1; i >= 0; i--)
list.add(0, TGRoot.toStickerPack(packs.get(i)));
} catch (Exception e) {
e.printStackTrace();
}
}
public static Attach modifyStickerIM(int i, StickerItem stickerItem, String str) {
if (stickerItem.getId() < 76820000) {
return AppAttachToImAttachConverter.a.a(i, stickerItem, str);
}
return AppAttachToImAttachConverter.a.a(processSticker(stickerItem));
}
}
@@ -1,12 +1,12 @@
package ru.vtosters.lite.ui.dialogs;
package ru.vtosters.hooks;
import android.app.Activity;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.lite.utils.ThemesUtils;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.hooks.other.ThemesUtils;
public class ThemeChanging {
public class ThemeChangeDrawerHook {
public static void changeTheme(Activity activity, float[] f) {
if (Preferences.systemtheme()) {
new VkAlertDialog.Builder(activity)
@@ -1,10 +1,10 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import com.vk.medianative.MediaImageEncoder;
import com.vk.toggle.FeatureManager;
import com.vk.toggle.Features;
import static ru.vtosters.lite.utils.Preferences.*;
import static ru.vtosters.hooks.other.Preferences.*;
public class TogglesHook {
public static boolean shouldPatch(Features.Type feature) {
@@ -0,0 +1,49 @@
package ru.vtosters.hooks;
import android.webkit.WebView;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.hooks.other.ThemesUtils;
import ru.vtosters.lite.themes.ThemesCore;
import ru.vtosters.lite.utils.WebViewColoringUtils;
import static android.util.Base64.encodeToString;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class VKUIHook {
public static void inject(WebView webView) {
debugWebView(webView);
applyVKUIStyles(webView);
}
private static void debugWebView(WebView webView) {
if (Preferences.getBoolValue("__dbg_webview", false)) {
WebView.setWebContentsDebuggingEnabled(true);
webView.evaluateJavascript("if (!window.eruda) {let parent = document.head || document.documentElement; let script = parent.appendChild(document.createElement('script')); script.src = 'https://cdn.jsdelivr.net/npm/eruda'; script.onload = () => eruda.init();}", null);
}
}
private static void applyVKUIStyles(WebView webView) {
if (getBoolValue("VKUI_INJ", true)) {
if (!WebViewColoringUtils.isLoaded) {
WebViewColoringUtils.load();
}
loadAndApplyCSS(webView);
}
}
private static void loadAndApplyCSS(WebView webView) {
StringBuilder sb = new StringBuilder();
if (ThemesCore.isCachedAccents()) {
sb.append("\n\n");
sb.append(WebViewColoringUtils.loadedCSS);
}
if (ThemesUtils.isAmoledTheme()) {
sb.append("\n\n");
sb.append(WebViewColoringUtils.loadedCSSAmoled);
}
WebViewColoringUtils.inject(webView, encodeToString(sb.toString().getBytes(), 2));
}
}
@@ -0,0 +1,53 @@
package ru.vtosters.hooks;
import com.vk.dto.common.VerifyInfo;
import org.json.JSONObject;
import ru.vtosters.lite.utils.VTVerifications;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class VerificationsHook {
public static boolean isVerified(int id) {
return VTVerifications.sVerifications.contains(id);
}
public static boolean vtverif() {
return getBoolValue("VT_Verification", true);
}
public static boolean isVerified(JSONObject jSONObject) {
if (jSONObject.optInt("verified", 0) == 1) {
return true;
}
if (!getBoolValue("VT_Verification", true)) {
return false;
}
return isVerified(VTVerifications.getId(jSONObject));
}
public static boolean hasPrometheus(JSONObject jSONObject) {
if (jSONObject.optInt("trending", 0) == 1) {
return true;
}
if (!getBoolValue("VT_Fire", true)) {
return false;
}
return VTVerifications.isPrometheus(VTVerifications.getId(jSONObject));
}
public static boolean hasDeveloper(JSONObject jSONObject) {
if (!getBoolValue("VT_Dev", true)) {
return false;
}
return VTVerifications.isDeveloper(VTVerifications.getId(jSONObject));
}
public static VerifyInfo VerifyInfo(JSONObject jSONObject) {
return new VerifyInfo(isVerified(jSONObject), hasPrometheus(jSONObject));
}
}
@@ -0,0 +1,23 @@
package ru.vtosters.hooks;
import android.app.Activity;
import android.content.Context;
import com.vk.dto.common.VideoFile;
import ru.vtosters.lite.utils.ExternalLinkParser;
import static ru.vtosters.hooks.other.Preferences.isEnableExternalOpening;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
public class VideoPlayerHook {
public static boolean parseVideoFile(VideoFile file) {
return ExternalLinkParser.parseVideoFile(file, getGlobalContext(), isEnableExternalOpening());
}
public static boolean parseVideoFile(VideoFile file, Context context) {
return ExternalLinkParser.parseVideoFile(file, context, isEnableExternalOpening());
}
public static boolean parseVideoFile(VideoFile file, Activity activity) {
return ExternalLinkParser.parseVideoFile(file, activity, isEnableExternalOpening());
}
}
@@ -0,0 +1,9 @@
package ru.vtosters.hooks;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class VoiceMessagesHook {
public static boolean getVoiceListened() {
return getBoolValue("listen_v", false);
}
}
@@ -0,0 +1,19 @@
package ru.vtosters.hooks;
import android.view.View;
import android.widget.ImageView;
import com.vk.im.engine.h;
import ru.vtosters.hooks.other.ThemesUtils;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaper;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.hasWallpapers;
public class WallpapersHooks {
public static void setBg(View view) {
if (hasWallpapers()) {
((ImageView) view).setImageDrawable(getWallpaper()); // set picture to background
} else {
view.setBackgroundColor(ThemesUtils.getColorFromAttr(h.im_bg_chat)); // set default bg color
}
}
}
@@ -1,21 +1,18 @@
package ru.vtosters.lite.utils;
package ru.vtosters.hooks;
import com.vk.api.base.ApiConfig;
import com.vk.core.preference.Preference;
import com.vk.core.ui.themes.VKThemeHelper;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.proxy.api.ApiProxy;
public class WebAppUtils {
public class WebAppHook {
public static JSONObject getWebAppConfig() throws JSONException {
JSONObject jSONObject = new JSONObject()
return new JSONObject()
.put("scheme", VKThemeHelper.l().b())
.put("app", "vkclient")
.put("app_id", ApiConfig.a)
.put("appearance", VKThemeHelper.l().a() ? "light" : "dark")
.put("api_host", ApiProxy.linkReplacer(Preference.a().getString("apiHost", "api.vk.com")));
return jSONObject;
.put("api_host", ProxyHook.linkReplacer(Preference.a().getString("apiHost", "api.vk.com")));
}
}
@@ -1,9 +1,9 @@
package ru.vtosters.lite.hooks;
package ru.vtosters.hooks;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.ThemesUtils;
import ru.vtosters.hooks.other.ThemesUtils;
import static ru.vtosters.lite.utils.Preferences.wbios;
import static ru.vtosters.hooks.other.Preferences.wbios;
public class WritebarHook {
public static int getWriteBar() {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.utils;
package ru.vtosters.hooks.other;
import android.app.Application;
import android.content.Context;
@@ -9,9 +9,12 @@ import android.os.StrictMode;
import com.vk.medianative.MediaImageEncoder;
import com.vtosters.lite.data.Users;
import com.vtosters.lite.fragments.SettingsListFragment;
import ru.vtosters.hooks.GmsHook;
import ru.vtosters.hooks.VerificationsHook;
import ru.vtosters.lite.BuildConfig;
import ru.vtosters.lite.proxy.ProxyUtils;
import ru.vtosters.lite.ui.fragments.VTSettings;
import ru.vtosters.lite.utils.*;
import java.security.NoSuchAlgorithmException;
@@ -21,7 +24,7 @@ public class Preferences {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
GmsUtils.fixGapps();
GmsHook.fixGapps();
ProxyUtils.setProxy();
NewsFeedFiltersUtils.setupFilters();
VTVerifications.load(application);
@@ -312,7 +315,7 @@ public class Preferences {
}
public static boolean hasVerification() {
return VTVerifications.isVerified(AccountManagerUtils.getUserId());
return VerificationsHook.isVerified(AccountManagerUtils.getUserId());
}
public static boolean hasSpecialVerif() {
@@ -1,4 +1,4 @@
package ru.vtosters.lite.utils;
package ru.vtosters.hooks.other;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -28,14 +28,15 @@ 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.hooks.VKUIHook;
import ru.vtosters.lite.themes.ThemesHacks;
import ru.vtosters.lite.ui.wallpapers.WallpapersHooks;
import ru.vtosters.lite.utils.LifecycleUtils;
import ru.vtosters.lite.utils.WebViewColoringUtils;
import java.lang.reflect.Field;
import static ru.vtosters.hooks.other.Preferences.*;
import static ru.vtosters.lite.utils.AndroidUtils.*;
import static ru.vtosters.lite.utils.Preferences.*;
public class ThemesUtils {
public static void applyTheme(VKTheme theme, Boolean restartActivity) {
@@ -73,7 +74,7 @@ public class ThemesUtils {
VKThemeHelper.theme(theme, activity, fl);
if (restartActivity) activity.recreate();
ThemeTracker.a();
VKUIHook.isLoaded = false;
WebViewColoringUtils.isLoaded = false;
new WebView(activity).clearCache(true);
WebCachePreloader.e();
}
@@ -0,0 +1,36 @@
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;
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 boolean showAlert() {
var context = LifecycleUtils.getCurrentActivity();
var bool = Preferences.getBoolValue("linkalert", false);
if (!bool) {
new VkAlertDialog.Builder(context)
.setTitle(com.vtosters.lite.R.string.warning)
.setMessage(AndroidUtils.getString("custom_links_warning"))
.setCancelable(false)
.setPositiveButton(com.vtosters.lite.R.string.continue_, (dialogInterface, i) -> {
Preferences.getPreferences().edit().putBoolean("linkalert", true).commit();
})
.setNeutralButton(com.vtosters.lite.R.string.cancel, (dialogInterface, i) -> {
dialogInterface.cancel();
})
.show();
}
return bool;
}
}
@@ -1,15 +1,18 @@
package ru.vtosters.lite.ssfs;
package ru.vtosters.hooks.ssfs;
import android.text.TextUtils;
import android.util.Log;
import com.vk.profile.presenter.UserPresenter;
import com.vtosters.lite.api.ExtendedUserProfile;
import org.json.JSONObject;
import ru.vtosters.lite.ssfs.Handler;
import ru.vtosters.lite.ssfs.ProfileButtons;
import ru.vtosters.lite.ssfs.UsersList;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserID;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
public class ProfileHider {
public class ProfileHook {
private static final String TAG = "ProfileHider";
public static boolean isService(Integer id) {
@@ -39,4 +42,8 @@ public class ProfileHider {
}
return getGlobalContext().getString(UserPresenter.q0.a(userID));
}
}
public static JSONObject getProfileButton(JSONObject orig) {
return ProfileButtons.profileButton(orig);
}
}
@@ -1,11 +1,11 @@
package ru.vtosters.lite.hooks.ui;
package ru.vtosters.hooks.ui;
import android.app.Activity;
import android.content.res.Configuration;
import com.vk.core.ui.themes.VKTheme;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.hooks.other.ThemesUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.lite.utils.ThemesUtils;
public class SystemThemeChangerHook {
public static void onThemeChanged(Configuration configuration) {
@@ -1,7 +1,7 @@
package ru.vtosters.lite.deviceinfo;
import ru.vtosters.hooks.other.ThemesUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
import ru.vtosters.lite.utils.VersionReader;
import static ru.vtosters.lite.deviceinfo.OEMDetector.*;
@@ -1,15 +1,10 @@
package ru.vtosters.lite.dialogs;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import ru.vtosters.hooks.MessagesActivityHook;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class DNRPrefs {
public static boolean getStoriesRead() {
return getBoolValue("read_s", false);
}
public static boolean getVoiceListened() {
return getBoolValue("listen_v", false);
}
public static boolean getMarkAsReadWithoutExceptions(int peerId) {
if (readPM(peerId))
@@ -24,34 +19,34 @@ public class DNRPrefs {
}
public static boolean isInDNRExceptions(int peerId) {
return DNRModule.mDoNotReadDBHelper.isEnabledForPeerId(peerId);
return MessagesActivityHook.mDoNotReadDBHelper.isEnabledForPeerId(peerId);
}
public static boolean isInDNTExceptions(int peerId) {
return DNRModule.mDoNotTypeDBHelper.isEnabledForPeerId(peerId);
return MessagesActivityHook.mDoNotTypeDBHelper.isEnabledForPeerId(peerId);
}
public static boolean readPM(int peer) {
private static boolean readPM(int peer) {
return (peer > 0 && peer < 2000000000) && getBoolValue("read_pm", false);
}
public static boolean readConversations(int peer) {
private static boolean readConversations(int peer) {
return (peer > 2000000000) && getBoolValue("read_conversations", false);
}
public static boolean readBots(int peer) {
private static boolean readBots(int peer) {
return (peer < 0) && getBoolValue("read_bot", false);
}
public static boolean writePM(int peer) {
private static boolean writePM(int peer) {
return (peer > 0 && peer < 2000000000) && getBoolValue("write_pm", false);
}
public static boolean writeConversations(int peer) {
private static boolean writeConversations(int peer) {
return (peer > 2000000000) && getBoolValue("write_conversations", false);
}
public static boolean writeBots(int peer) {
private static boolean writeBots(int peer) {
return (peer < 0) && getBoolValue("write_bot", false);
}
@@ -7,12 +7,12 @@ import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.utils.ImDialogsUtils;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import ru.vtosters.hooks.other.ThemesUtils;
import ru.vtosters.lite.net.Request;
import ru.vtosters.lite.proxy.ProxyUtils;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class Requests {
public static void hookRead(Dialog dialog) {
@@ -6,8 +6,8 @@ import com.vk.core.util.ToastUtils;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import com.vtosters.lite.R;
import ru.vtosters.hooks.MusicCacheFilesHook;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation;
import ru.vtosters.lite.music.callback.MusicCallbackBuilder;
import ru.vtosters.lite.music.converter.playlist.PlaylistConverter;
import ru.vtosters.lite.music.downloader.AudioGet;
@@ -66,7 +66,7 @@ public class AudioDownloader {
return;
}
var trackFile = FileCacheImplementation.getTrackFile(trackId);
var trackFile = MusicCacheFilesHook.getTrackFile(trackId);
if (!trackFile.exists())
trackFile.getParentFile().mkdirs();
executor.submit(() -> downloadM3U8(track, true));
@@ -13,9 +13,6 @@ import static ru.vtosters.lite.downloaders.VideoDownloader.downloadVideo;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
public class StoryDownloader {
public static Runnable injectButton(StoryEntry story) {
return () -> downloadStory(story);
}
public static void downloadStory(StoryEntry story) {
if (story.T1()) {
@@ -20,39 +20,21 @@ import com.vtosters.lite.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.utils.ExternalLinkParser;
import ru.vtosters.lite.utils.LifecycleUtils;
import java.util.ArrayList;
import java.util.List;
import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
public class VideoDownloader {
private static final int DOWNLOAD_ID = 0;
private static final int OPEN_EXTERNAL_LINK_ID = 1;
public static final int DOWNLOAD_ID = 0;
public static final int OPEN_EXTERNAL_LINK_ID = 1;
public static boolean onClick(int id, VideoFile video, Context ctx) {
if (id == DOWNLOAD_ID) {
downloadVideo(video, ctx);
return true;
} else if (id == OPEN_EXTERNAL_LINK_ID) {
ExternalLinkParser.parseVideoFile(video, ctx, true);
}
return false;
}
public static void injectAction(ArrayList<MenuBottomSheetAction> list, VideoFile video) {
if (!video.U && !video.I1()) {
addAction(list, DOWNLOAD_ID, R.drawable.ic_download_outline_24, R.string.download, 9);
addAction(list, OPEN_EXTERNAL_LINK_ID, R.drawable.ic_link_outline_28, R.string.interfacevideoext_short, 9);
}
}
private static void addAction(List<MenuBottomSheetAction> actions, int... ints) {
public static void addAction(List<MenuBottomSheetAction> actions, int... ints) {
actions.add(new MenuBottomSheetAction(ints[0], ints[1], ints[2], ints[3]));
}
@@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.hooks.EncryptionMessagesHook.decryptMessage;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.AndroidUtils.getArray;
@@ -7,7 +7,7 @@ import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.hooks.EncryptionMessagesHook.decryptMessage;
public class MiniMsg {
public long date;
@@ -1,10 +1,8 @@
package ru.vtosters.lite.encryption;
import android.util.Log;
import android.util.Pair;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
import com.vk.im.ui.components.msg_list.MsgListComponent;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.encryption.processors.*;
@@ -13,9 +11,6 @@ import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import static ru.vtosters.lite.hooks.MessagesHook.injectOwnText;
import static ru.vtosters.lite.hooks.MessagesHook.injectOwnTextAll;
public class EncryptProvider {
public static List<IMProcessor> processors = new ArrayList<>();
@@ -46,78 +41,19 @@ public class EncryptProvider {
return msg.v1();
}
// For message editing
public static String decryptMessage(MsgFromUser msg, boolean showEmoji) {
var decryptedMessage = decryptMessage(getBody(msg), getPeerId(msg));
if (!showEmoji && !decryptedMessage.equals(injectOwnTextAll(getBody(msg))))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
public static String decryptMessage(String msg, MsgListComponent list) {
var peerid = list.G().getId();
var decryptedMessage = decryptMessage(msg, peerid);
if (!decryptedMessage.equals(injectOwnTextAll(msg)))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
public static CharSequence decryptMessage(CharSequence msg, int peerid) {
return decryptMessage(msg.toString(), peerid);
}
public static CharSequence decryptMessage(Msg msg, CharSequence orig) {
if (msg instanceof MsgFromUser) {
var decrypted = decryptMessage(((MsgFromUser) msg).f(), msg.v1());
if (decrypted.contains("\uD83D\uDD12")) {
return decrypted;
}
// For rendering UI
public static List<Pair<String, String>> getUserVisibleEncoders() {
List<Pair<String, String>> theList = new ArrayList<>();
for (IMProcessor processor : processors) {
if (processor.isPublic())
theList.add(new Pair<>("VT_IMDecode_" + processor.getPrefKey(), processor.getUIName()));
}
return orig;
return theList;
}
public static String decryptMessages(String msgBody, int peer, boolean showEmoji) {
return (String) decryptMessage(msgBody, peer, showEmoji);
}
public static CharSequence decryptMessage(CharSequence msgBody, MsgFromUser msgFromUser, boolean showEmoji) {
try {
return decryptMessage((String) msgBody, msgFromUser.v1(), showEmoji);
} catch (Exception e) {
return decryptMessage((String) msgBody, 0, showEmoji);
}
}
// For MentionsFormatter that requires CharSequence
public static CharSequence decryptMessage(String msgBody, int peer, boolean showEmoji) {
var decryptedMessage = decryptMessage(msgBody, peer);
if (!showEmoji && !decryptedMessage.equals(injectOwnTextAll(msgBody)))
decryptedMessage = decryptedMessage.replaceAll("^\uD83D\uDD12 ", "");
return decryptedMessage;
}
// This will run through EVERY single processor available.
public static String decryptMessage(MsgFromUser msg) {
return decryptMessage(getBody(msg), getPeerId(msg));
}
public static String decryptMessage(String msgBody, int peer) {
try {
for (IMProcessor processor : processors) {
if ((processor.isUsed() || !processor.isPublic()) && processor.isEncrypted(msgBody) && (processor.isPublic() || getKeyForProcessor(processor, peer) != null))
return "\uD83D\uDD12 " + injectOwnTextAll(processor.decode(msgBody, getKeyForProcessor(processor, peer)));
}
} catch (Exception e) {
e.printStackTrace();
}
return injectOwnTextAll(msgBody);
}
private static byte[] getKeyForProcessor(IMProcessor processor, int peer) {
public static byte[] getKeyForProcessor(IMProcessor processor, int peer) {
if (processor.isPublic()) return null;
String keyString = processor.getEncryptionKeyFor(peer);
if (keyString == null) return null;
@@ -134,34 +70,4 @@ public class EncryptProvider {
return keyString.getBytes();
}
// This will use only the processor which was chosen in chat menu
public static String encryptMessage(MsgFromUser msg) {
String msgBody = getBody(msg);
Log.d("EncryptProvider", "encryptMessage: msg = " + msg);
Log.d("EncryptProvider", "encryptMessage: body = " + msgBody);
Log.d("EncryptProvider", "encryptMessage: peerId = " + getPeerId(msg));
for (IMProcessor processor : processors) {
int peer = getPeerId(msg);
if (processor.isUsedToEncrypt(peer)) {
return injectOwnText(processor.encode(msgBody, getKeyForProcessor(processor, peer)));
}
}
return injectOwnText(msgBody);
}
// For rendering UI
public static List<Pair<String, String>> getUserVisibleEncoders() {
List<Pair<String, String>> theList = new ArrayList<>();
for (IMProcessor processor : processors) {
if (processor.isPublic())
theList.add(new Pair<>("VT_IMDecode_" + processor.getPrefKey(), processor.getUIName()));
}
return theList;
}
}
@@ -2,9 +2,9 @@ package ru.vtosters.lite.encryption.base;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.hooks.other.Preferences;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public abstract class IMProcessor {
// By default it checks start and end tag.
@@ -3,8 +3,8 @@ package ru.vtosters.lite.encryption.processors;
import android.util.Base64;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.utils.Preferences;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
@@ -1,390 +0,0 @@
package ru.vtosters.lite.hooks;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
import ru.vtosters.lite.utils.Preferences;
import java.util.Collections;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.*;
import static ru.vtosters.lite.utils.Preferences.*;
public class AdBlockHook {
public static Boolean discoverAdBlock(JSONObject jsonObject) {
if (jsonObject == null) return true;
try {
var type = jsonObject.optString("type");
var post = jsonObject.optJSONObject("post");
if (jsonObject.optString("template").contains("ads") || jsonObject.has("ads")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: ads");
return false;
}
if (isAds(post, type)) {
return false;
}
if (authorsrecomm() && (type.equals("authors_rec")
|| type.startsWith("recommended_") && (type.endsWith("audios")
|| type.endsWith("artists")
|| type.endsWith("playlists")
|| type.endsWith("groups")))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: authorsrecomm");
return false;
}
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: postsrecomm");
return false;
}
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: friendsrecomm");
return false;
}
if (adsgroup() && (post != null ? post.optInt("marked_as_ads") : 0) == 1 && !isWhitelistedAd(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: marked_as_ads is true");
return false;
}
if (post != null) {
if (isBadNews(post.optString("text")) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: text filters");
return false;
}
if (checkCopyright(post) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: copyright filters");
return false;
}
if (checkCaption(post) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: caption filters");
return false;
}
if (NewsFeedFiltersUtils.injectFiltersReposts(post) && !isWhitelistedFilters(post)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: repost ad");
return false;
}
}
} catch (Exception e) {
Log.d("NewsfeedAdBlockV2", "discover: " + e.getMessage());
}
return true;
}
public static JSONObject discoverInject(JSONObject json) throws JSONException {
var items = json.optJSONArray("items");
var newObj = new JSONArray();
// newObj.put(discoverObj()); // template injection
for (int i = 0; i < (items != null ? items.length() : 0); i++) {
try {
var curr = items.getJSONObject(i);
if (!curr.optString("template").contains("info") && discoverAdBlock(curr)) {
newObj.put(items.optJSONObject(i));
}
} catch (Exception e) {
Log.d("NewsfeedAdBlockV2", "discover: " + e);
}
}
json.put("items", newObj);
return json;
}
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 JSONArray feedInject(JSONArray items) {
if (items.length() == 0) return items;
try {
var newItems = new JSONArray();
for (int j = 0; j < items.length(); j++) {
var list = items.optJSONObject(j);
if (list == null) continue;
var type = list.optString("type");
if (isAds(list, type)) {
continue;
}
if (authorsrecomm() && (type.equals("authors_rec")
|| type.startsWith("recommended_") && (type.endsWith("audios")
|| type.endsWith("artists")
|| type.endsWith("playlists")
|| type.endsWith("groups")))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: authorsrecomm");
continue;
}
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: postsrecomm");
continue;
}
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: friendsrecomm");
continue;
}
if (adsgroup() && list.optInt("marked_as_ads") == 1 && !isWhitelistedAd(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: marked_as_ads is true");
continue;
}
if (isBadNews(list.optString("text")) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: text filters");
continue;
}
if (checkCopyright(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: copyright filters");
continue;
}
if (checkCaption(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters");
continue;
}
if (hasMiniAppAds(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: MiniApp filters");
continue;
}
try {
if (NewsFeedFiltersUtils.injectFiltersReposts(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad");
continue;
}
} catch (Exception ex) {
Log.d("RepostInj", ex.getMessage());
}
newItems.put(list);
}
return newItems;
} catch (Exception e) {
Log.d("NewsfeedAdBlockV2", e.getMessage());
}
return items;
}
private static void parseStoriesItem(JSONObject item) throws JSONException {
var stories = item.optJSONArray("stories");
var newStories = new JSONArray();
if (stories == null) return;
for (int j = 0; j < stories.length(); j++) {
var story = stories.optJSONObject(j);
if (!story.optBoolean("is_ads") && !story.optBoolean("is_promo")) {
if (isStoryNotAd(story)) {
newStories.put(story);
}
} else {
if (dev())
Log.d("StoriesAds", "Fetched ad, owner id " + story.optString("owner_id") + ", caption " + story.optString("caption"));
}
}
item.put("stories", newStories);
}
private static Boolean isStoryNotAd(JSONObject json) {
return !getBoolValue("storiesGroupsAdBlock", false) || (json.has("link") ? isWhitelistedAdStories(json) : true);
}
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
if (!adsstories()) {
return json;
}
if (json.has("ads")) {
var ad = json.optJSONObject("ads");
if (isDeleteFix) {
if (ad != null) {
ad.optJSONObject("settings")
.put("stories_interval", 0)
.put("authors_interval", 0)
.put("time_interval", 0)
.put("stories_init", 0)
.put("authors_init", 0)
.put("time_init", 0);
}
if (dev()) Log.d("StoriesAds", "Set ads settings at zero values");
} else {
json.remove("ads");
if (dev()) Log.d("StoriesAds", "Removed ads block");
}
}
var items = json.optJSONArray("items");
if (items != null) {
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item != null) {
parseStoriesItem(item);
}
}
}
return json;
}
public static Boolean isAds(JSONObject list, String type) {
if (list == null || type == null || !ads()) return false;
if (list.has("ads")
|| type.equals("ads")
|| type.equals("carousel")
|| type.equals("html5_ad")
|| type.equals("ads_easy_promote")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: ads");
return true;
}
if (type.equals("promo_button")
|| type.equals("app_widget")
|| type.equals("app_video")
|| type.equals("app_slider")
|| type.equals("tags_suggestions")) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: promo");
return true;
}
return false;
}
public static Boolean isWhitelistedFilters(JSONObject list) {
var id = String.valueOf(list.optInt("owner_id"));
if (id.equals("0")) {
id = String.valueOf(list.optInt("source_id"));
}
if (id.equals("-189659924")) {
return true;
}
var whitelist = Preferences.getPreferences().getStringSet(
"whitelisted_filters_groups",
Collections.emptySet()
);
return whitelist.contains(id);
}
public static Boolean isWhitelistedAd(JSONObject list) {
var id = String.valueOf(list.optInt("owner_id"));
if (id.equals("0")) {
id = String.valueOf(list.optInt("source_id"));
}
var whitelist = Preferences.getPreferences().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()
);
return whitelist.contains(id);
}
public static Boolean isWhitelistedAdStories(JSONObject list) {
var id = String.valueOf(list.optInt("owner_id"));
var whitelist = Preferences.getPreferences().getStringSet(
"whitelisted_stories_ad",
Collections.emptySet()
);
return whitelist.contains(id);
}
public static Boolean hasMiniAppAds(JSONObject list) {
var attachments = list.optJSONArray("attachments");
if (attachments != null && getBoolValue("blockminiapps", false)) {
for (int j = 0; j < attachments.length(); j++) {
var type = attachments.optJSONObject(j).optString("type");
if (type.contains("mini_app")) return true;
}
}
return false;
}
}
@@ -1,240 +0,0 @@
package ru.vtosters.lite.hooks;
import android.text.TextUtils;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.text.ParseException;
import java.util.LinkedHashSet;
import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo;
import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles;
import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.friendsblock;
public class JsonInjectors {
public static JSONObject menu(JSONObject orig) throws JSONException {
var Special = orig.optJSONArray("special");
var Main = orig.getJSONArray("main");
var Other = orig.optJSONArray("other");
if (Special != null) {
orig.remove("special");
}
return orig;
}
public static JSONObject superapp(JSONObject json) throws JSONException {
var superApps = Preferences.getPreferences().getString("superapp_items",
"menu,miniapps,vkpay_slim,greeting,promo,holiday,weather,sport,games,informer,food,event,music,vk_run").split(",");
if (superApps.length == 0) return json;
var oldItems = json.optJSONArray("items");
var newItems = new JSONArray();
if (oldItems != null) {
for (int i = 0; i < oldItems.length(); i++) {
var item = oldItems.optJSONObject(i);
var type = item.optString("type");
for (String superApp : superApps) {
if (type.equals(superApp))
newItems.put(item);
}
}
for (int i = 0; i < superApps.length; i++) {
for (int j = i; j < newItems.length(); j++) {
var item = newItems.optJSONObject(j);
if (superApps[i].equals(item.optString("type")))
newItems.put(j, newItems.getJSONObject(i))
.put(i, item);
}
}
}
return json.putOpt("items", newItems);
}
public static JSONObject setOnlineInfo(JSONObject json) throws JSONException {
var id = json.optInt("id");
if (id == AccountManagerUtils.getUserId()) {
return json;
}
var onlineinfo = json.optJSONObject("online_info");
if (onlineinfo != null && !onlineinfo.optBoolean("visible")) {
var bypassed = getBypassedOnlineInfo(id);
if (bypassed.optInt("last_seen", 0) != 0) {
json.remove("online_info");
var online_info = new JSONObject()
.put("visible", true)
.put("last_seen", bypassed.optInt("last_seen"))
.put("is_online", bypassed.optBoolean("is_online"))
.put("app_id", bypassed.optInt("app_id"))
.put("is_mobile", bypassed.optBoolean("is_mobile"));
var last_seen = new JSONObject()
.put("platform", bypassed.optInt("platform"))
.put("time", bypassed.optInt("last_seen"));
json.put("last_seen", last_seen).put("online_info", online_info);
}
}
return json;
}
public static JSONArray setOnlineInfoUsers(JSONArray profiles) throws JSONException {
if (profiles == null || profiles.length() == 0) return profiles;
StringBuilder sb = new StringBuilder();
var curVkId = AccountManagerUtils.getUserId();
for (int i = 0; i < profiles.length(); i++) {
JSONObject profile = profiles.getJSONObject(i);
int id = profile.optInt("id", -1);
JSONObject onlinfo = profile.optJSONObject("online_info");
if (id == curVkId || id < 0 || onlinfo == null || onlinfo.optBoolean("visible")) {
continue;
}
sb.append(id);
sb.append(",");
}
var ids = sb.toString();
if (ids.length() > 0) {
ids = ids.substring(0, ids.length() - 1);
} else {
return profiles;
}
JSONObject bypassedObj = getBypassedOnlineInfo(ids);
for (int i = 0; i < profiles.length(); i++) {
JSONObject profile = profiles.getJSONObject(i);
int id = profile.optInt("id");
JSONObject bypassed = bypassedObj.optJSONObject(Integer.toString(id));
if (bypassed == null) {
continue;
}
profile.remove("online_info");
var online_info = new JSONObject()
.put("visible", true)
.put("last_seen", bypassed.optInt("last_seen"))
.put("is_online", bypassed.optBoolean("is_online"))
.put("app_id", bypassed.optInt("app_id"))
.put("is_mobile", bypassed.optBoolean("is_mobile"));
var last_seen = new JSONObject()
.put("platform", bypassed.optInt("platform"))
.put("time", bypassed.optInt("last_seen"));
profile.put("last_seen", last_seen).put("online_info", online_info);
}
return profiles;
}
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
var selectedItems = Preferences.getPreferences().getString("news_feed_selected_items", "");
var filtersSet = Preferences.getPreferences().getStringSet("news_feed_items_set", null);
var mutableFiltersSet = new LinkedHashSet<String>();
if (filtersSet != null)
mutableFiltersSet.addAll(filtersSet);
for (int i = 0; i < items.length(); i++) {
var item = items.optJSONObject(i);
if (item == null) continue;
var id = item.optString("id");
var title = item.optString("title");
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
// this items not working
|| id.equals("kpop") || id.equals("foryou")
|| id.equals("qazaqstan") || id.equals("podcasts"))
continue;
mutableFiltersSet.add(id + "|" + title);
var hide = selectedItems.contains(id);
Log.d("NewsfeedList", "Added list " + id + " to feed");
item.put("is_hidden", hide)
.put("is_unavailable", hide);
Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
}
Preferences.getPreferences().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
.apply();
return items;
}
public static JSONObject friends(JSONObject json) throws JSONException, ParseException, IOException {
JSONObject catalog = onlineHookProfiles(json);
boolean sectionexecute = true;
boolean hasBirthday = false;
if (json.optJSONObject("catalog") != null) {
catalog = json.optJSONObject("catalog");
sectionexecute = false;
}
JSONArray section = null;
JSONObject sections = null;
if (sectionexecute) {
sections = catalog.optJSONObject("section");
} else {
section = catalog.optJSONArray("sections");
}
JSONArray oldItems;
if (sectionexecute) {
oldItems = sections.optJSONArray("blocks");
} else {
oldItems = section.optJSONObject(0).optJSONArray("blocks");
}
var newItems = new JSONArray();
if (oldItems != null) {
for (int i = 0; i < oldItems.length(); i++) {
var type = oldItems.optJSONObject(i);
var name = type.optJSONObject("layout").optString("name");
var buttons = "";
var skip = false;
if (type.optJSONArray("buttons") != null) {
buttons = type.optJSONArray("buttons").optJSONObject(0).optString("ref_layout_name");
}
if (name.contains("list_friend_suggests") || buttons.contains("list_friend_suggests") || name.contains("separator")) {
skip = friendsblock();
}
if (buttons.contains("friends_birthdays_list")) {
hasBirthday = true;
}
if (name.contains("separator") && hasBirthday) {
skip = false;
hasBirthday = false;
}
if (!skip) {
newItems.put(type);
}
}
}
if (sectionexecute) {
sections.putOpt("blocks", newItems);
} else {
section.optJSONObject(0).putOpt("blocks", newItems);
}
return json;
}
}
@@ -1,106 +0,0 @@
package ru.vtosters.lite.hooks;
import android.webkit.WebView;
import com.vk.articles.preload.WebCachePreloader;
import com.vtosters.lite.R;
import com.vtosters.lite.data.ThemeTracker;
import ru.vtosters.lite.themes.ThemesCore;
import ru.vtosters.lite.utils.Preferences;
import ru.vtosters.lite.utils.ThemesUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import static android.util.Base64.encodeToString;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.ThemesUtils.*;
public class VKUIHook {
public static boolean isLoaded = false;
private static String loadedCSS = "";
private static String loadedCSSAmoled = "";
private static String load(String str) {
try {
InputStream open = getGlobalContext().getAssets().open(str);
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open, StandardCharsets.UTF_8));
while (true) {
String readLine = bufferedReader.readLine();
if (readLine != null) {
sb.append(readLine);
} else {
bufferedReader.close();
return sb.toString();
}
}
} 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(R.attr.content_tint_background)))
.replace("%button_primary_background%", hex(getColorFromAttr(R.attr.button_primary_background)))
.replace("%button_outline_foreground%", hex(getColorFromAttr(R.attr.button_outline_foreground)))
.replace("%button_outline_border%", hex(getColorFromAttr(R.attr.button_outline_border)))
.replace("%text_primary%", hex(getTextAttr()));
loadedCSSAmoled = load("vt_ui_oled.css");
isLoaded = true;
}
private static void inject(WebView webView, String str) {
webView.loadUrl("javascript:(function() {let parent = document.head || document.documentElement; parent.appendChild(document.createElement('style')).innerText = window.atob('" + str + "');})()");
}
public static void inject(WebView webView) {
if (Preferences.getBoolValue("__dbg_webview", false)) {
WebView.setWebContentsDebuggingEnabled(true);
webView.loadUrl("javascript:(function() {let parent = document.head || document.documentElement; let script = parent.appendChild(document.createElement('script')); script.src = 'https://cdn.jsdelivr.net/npm/eruda'; script.onload = () => eruda.init();})()");
}
if (getBoolValue("VKUI_INJ", true)) {
if (!isLoaded) {
load();
}
StringBuilder sb = new StringBuilder();
if (ThemesCore.isCachedAccents()) {
sb.append("\n\n");
sb.append(loadedCSS);
}
if (ThemesUtils.isAmoledTheme()) {
sb.append("\n\n");
sb.append(loadedCSSAmoled);
}
inject(webView, encodeToString(sb.toString().getBytes(), 2));
}
}
public static void clearWebCache() {
ThemeTracker.a();
isLoaded = false;
new WebView(getGlobalContext()).clearCache(true);
WebCachePreloader.e();
}
}
@@ -11,11 +11,11 @@ import okhttp3.Callback;
import okhttp3.*;
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.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -2,6 +2,7 @@ package ru.vtosters.lite.music.cache;
import android.net.Uri;
import com.vk.dto.music.MusicTrack;
import ru.vtosters.hooks.MusicCacheFilesHook;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils;
@@ -30,16 +31,8 @@ public class FileCacheImplementation {
return dir;
}
public static File getTrackFile(String trackId) {
return new File(getTrackFolder(trackId), "track.mp3");
}
public static boolean isTrackExist(String trackId) {
return CacheDatabaseDelegate.isCached(trackId);
}
public static File getTrackFile(MusicTrack track) {
return getTrackFile(track.y1());
return MusicCacheFilesHook.getTrackFile(track.y1());
}
public static File getTrackThumbnail(String trackId, int factor) {
@@ -10,20 +10,20 @@ import okhttp3.Request;
import org.json.JSONArray;
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.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import static ru.vtosters.lite.feature.groupslist.GroupsCatalogInjector.injectIntoCatalog;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
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.lite.music.cache.helpers.PlaylistHelper.*;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
public class CatalogJsonInjector {
private static final OkHttpClient mClient = VtOkHttpClient.getInstance();
@@ -237,14 +237,8 @@ public class CatalogJsonInjector {
}
}
public static JSONObject fixArtists(JSONObject json) {
try {
fixHeaders(json.getJSONObject("catalog").getJSONArray("sections").getJSONObject(0));
} catch (Exception e) {
e.printStackTrace();
}
public static JSONObject fixArtists(JSONObject json) throws JSONException {
fixHeaders(json.getJSONObject("catalog").getJSONArray("sections").getJSONObject(0));
return json;
}
@@ -19,7 +19,7 @@ import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.hooks.DateHook.getLocale;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
/**
@@ -18,7 +18,7 @@ import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.hooks.DateHook.getLocale;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
@@ -14,10 +14,10 @@ import ru.vtosters.lite.utils.AndroidUtils;
import java.util.ArrayList;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.*;
import static ru.vtosters.hooks.other.Preferences.milkshake;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.isCached;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.isVkxCached;
import static ru.vtosters.lite.utils.NetworkUtils.isNetworkConnected;
import static ru.vtosters.lite.utils.Preferences.milkshake;
public class MusicBottomSheetHook {
public static ArrayList<MusicAction> hook(ArrayList<MusicAction> actions, MusicTrack musicTrack) {
@@ -5,11 +5,11 @@ import android.content.Context;
import android.content.Intent;
import android.util.ArrayMap;
import android.util.Log;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.http.CustomHttp;
import ru.vtosters.lite.proxy.https.CustomHttps;
import ru.vtosters.lite.proxy.socks.CustomSocks;
import ru.vtosters.lite.proxy.socks.Zaborona;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.lang.reflect.Field;
@@ -1,10 +1,10 @@
package ru.vtosters.lite.proxy;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.socks.Hookzof;
import ru.vtosters.lite.proxy.socks.Jetkai;
import ru.vtosters.lite.proxy.socks.Roosterkid;
import ru.vtosters.lite.proxy.socks.TheSpeedX;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
@@ -1,76 +0,0 @@
package ru.vtosters.lite.proxy.api;
import android.util.Log;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isVikaProxyEnabled;
import static ru.vtosters.lite.utils.Preferences.getString;
public class ApiProxy {
public static String linkReplacer(String link) {
var vkapi = "api.vk.com";
var oauth = "oauth.vk.com";
var vkstatic = "static.vk.com";
var proxyapi = getString("proxyapi");
var proxyoauth = getString("proxyoauth");
var proxystatic = getString("proxystatic");
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
proxyoauth = VikaMobile.getOauthHost();
proxystatic = VikaMobile.getStaticHost();
}
if (!isAnyProxyEnabled() || link.isEmpty()) {
return link;
}
if (proxyapi.isEmpty() || proxyoauth.isEmpty() || proxystatic.isEmpty()) {
Log.d("VTLite", "Proxy is not set" + " " + proxyapi + " " + proxyoauth + " " + proxystatic);
return link;
}
if (link.contains(vkapi)) {
return link.replaceAll(vkapi, proxyapi);
}
if (link.contains(oauth)) {
return link.replaceAll(oauth, proxyoauth);
}
if (link.contains(vkstatic)) {
return link.replaceAll(vkstatic, proxystatic);
}
return link;
}
public static String staticFix(String str) {
var string = getString("proxystatic");
if (isVikaProxyEnabled()) {
string = VikaMobile.getStaticHost();
}
if (isAnyProxyEnabled() && !string.isEmpty()) {
return str.replaceAll(string, "static.vk.com");
}
return str;
}
public static String getAwayPhpCom() {
var proxyapi = getString("proxyapi");
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
}
if (isAnyProxyEnabled() && !proxyapi.isEmpty()) {
return proxyapi;
}
return "m.vk.com";
}
}
@@ -1,6 +1,6 @@
package ru.vtosters.lite.proxy.api;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
public class VikaMobile {
public static String getApiHost() {
@@ -1,7 +1,7 @@
package ru.vtosters.lite.proxy.http;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.utils.Preferences.getString;
public class CustomHttp {
public static void loadProxy() {
@@ -2,9 +2,9 @@ package ru.vtosters.lite.proxy.http;
import android.util.Log;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.util.ArrayList;
@@ -2,9 +2,9 @@ package ru.vtosters.lite.proxy.http;
import android.util.Log;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.util.ArrayList;
@@ -1,7 +1,7 @@
package ru.vtosters.lite.proxy.https;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.utils.Preferences.getString;
public class CustomHttps {
public static void loadProxy() {
@@ -2,9 +2,9 @@ package ru.vtosters.lite.proxy.https;
import android.util.Log;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.util.ArrayList;
@@ -2,9 +2,9 @@ package ru.vtosters.lite.proxy.https;
import android.util.Log;
import com.vtosters.lite.R;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
import java.io.IOException;
import java.util.ArrayList;
@@ -1,7 +1,7 @@
package ru.vtosters.lite.proxy.socks;
import static ru.vtosters.hooks.other.Preferences.getString;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.utils.Preferences.getString;
public class CustomSocks {
public static void loadProxy() {

Some files were not shown because too many files have changed in this diff Show More