Compare commits

...
Author SHA1 Message Date
gdlbo f887648f48 I love NullPointerException
NullPointerException
NullPointerException
NullPointerException
NullPointerException
NullPointerException
2022-08-26 23:03:35 +03:00
gdlbo 8ee29b4b83 Update WallpapersHooks.java 2022-08-26 22:10:43 +03:00
gdlbo a4c6af8ace Update WallpapersHooks.java 2022-08-26 22:05:47 +03:00
gdlbo 9ec4e52eba newsfeed improves 2022-08-26 21:56:11 +03:00
gdlbo b756bfa622 proxy fixes 2022-08-26 21:33:29 +03:00
Erik Kiznov f96baa58ac wallpapers hooks: fix (maybe)
- close outputstream > release dedicated memory
- delete temp file on exit
- improved check"compress" for null
2022-08-26 23:12:48 +05:00
Erik Kiznov d9f03a5d0e msg downloader: VK_DOMAIN -> private 2022-08-26 21:13:58 +05:00
Erik Kiznov 15d2daa887 msg downloader: update
- add wall_reply support
- add story support
- add podcast support
- add gift support
- add miniapp support
- add audio playlist support
- add poll support
- add market support
- add VK_DOMAIN constant (idk why но пусть будет)
2022-08-26 21:09:01 +05:00
gdlbo 8e12f50a7f updated todo in msgdl 2022-08-26 17:00:42 +03:00
Erik Kiznov 9ff220475d msg downloader: update
- fix group links
2022-08-26 18:39:35 +05:00
Erik Kiznov 2c6619a512 msg downloader: update
- add geo support
- add chat screenshot support
- add custom action support
- add audio message support
- add audio support
- add video support
2022-08-26 18:09:18 +05:00
Erik Kiznov 5ea599b61e msg downloader: update
- replace "get" to "opt" for avoid errors
- fix vmoji sticker resolution
2022-08-26 03:11:09 +05:00
Erik Kiznov 4eea4e2011 msg downloader: update
- decrypt replies & forward messages
- fix html bug
2022-08-26 02:41:16 +05:00
Erik Kiznov f1a7816e69 msg downloader: remove some returns 2022-08-26 01:16:01 +05:00
Erik Kiznov 12c01133e1 msg downloader: update
- fix photo attach size
- replace mentions to links
- add sticker support
- add reply support
- add forward messages support
- add chat actions support
2022-08-26 01:13:20 +05:00
gdlbo 3856932a3f some proxy fixes (vkui dead idk why) 2022-08-24 22:36:22 +03:00
gdlbo a10c333cc6 deleted duplicate of profile 2022-08-24 14:11:31 +03:00
gdlbo 4d950e5c68 deleted duplicate of profile 2022-08-24 14:06:33 +03:00
gdlbo c72e102076 dl icon for msg dl 2022-08-24 14:00:24 +03:00
gdlbo 43f3df487b msg downloader test 2022-08-24 13:15:37 +03:00
Erik Kiznov ca48f97d83 remove send toast
fix messages load
2022-08-23 19:52:25 +03:00
gdlbo b69beff4d2 fix https://github.com/vtosters/lite/issues/643 2022-08-23 16:15:22 +03:00
gdlbo 67401c6868 disabled vk api ping url (cringe and dead already) 2022-08-23 16:08:17 +03:00
gdlbo 9fa8df30eb wp compress 2022-08-23 15:40:35 +03:00
gdlbo ecf896e44e maybe fix 649 2022-08-23 14:04:14 +03:00
gdlbo 58a9b69dd9 fix https://github.com/vtosters/lite/issues/669 2022-08-23 13:38:56 +03:00
Erik Kiznov 26a64545ff translate strings
translate all new untranslated strings, removed useless cast to WithUserContent in ReplyMsgHook.java
2022-08-22 18:09:35 +03:00
gdlbo 05c557a8f7 fix whitelist toast 2022-08-22 16:17:54 +03:00
gdlbo c8c8678785 notif counter for newsfeed if enabled milk 2022-08-22 04:41:25 +03:00
gdlbo 4e6eb74a8e fix bg color 2022-08-22 03:52:01 +03:00
gdlbo 52cb007a67 code improvements 2022-08-22 03:44:16 +03:00
gdlbo 657d038d9c groups filters whitelist 2022-08-22 03:31:44 +03:00
gdlbo de4d283f75 fix open vk.com links 2022-08-21 16:37:12 +03:00
gdlbo 3b37412a58 gmsless frag fixes 2022-08-21 16:23:16 +03:00
gdlbo dd6b9b32b8 some link fixes 2022-08-21 15:15:27 +03:00
gdlbo 31a456582b vk.com -> vk.ru 2022-08-21 14:54:14 +03:00
gdlbo 6ab317cbf5 fix ded wp 2022-08-20 23:33:51 +03:00
gdlbo 32c469d870 fix https://github.com/vtosters/lite/issues/657 2022-08-20 23:26:15 +03:00
gdlbo e0f09cea24 fix strange miui 13 bug 2022-08-20 22:31:43 +03:00
gdlbo e668cfb2a3 Update NewsfeedHook.java 2022-08-20 21:13:49 +03:00
241 changed files with 1656 additions and 520 deletions
+3 -3
View File
@@ -10,7 +10,7 @@
<a href="https://t.me/s/vtosters">
<img src="https://img.shields.io/badge/-Telegram-blue?style=for-the-badge&logo=telegram&color=2AABEE"/>
</a>
<a href="https://vk.com/vtosters_official">
<a href="https://vk.ru/vtosters_official">
<img src="https://img.shields.io/badge/-VK-blue?style=for-the-badge&logo=vk&color=0077FF"/>
</a>
<a href="https://discord.gg/j9CAt3uYXj">
@@ -133,7 +133,7 @@
`android:debuggable="false"` ➝ `android:debuggable="true"`
Настройки, необходимые для **отладки** вне Android Studio, находятся по этой ссылке: [vk.com/vt/debug](https://vk.com/vt/debug)
Настройки, необходимые для **отладки** вне Android Studio, находятся по этой ссылке: [vk.ru/vt/debug](https://vk.ru/vt/debug)
* Для дополнительной отладки ответов и логов необходимо включить **[Режим разработчика]**
@@ -145,7 +145,7 @@
Сразу после нажатия на запись приложение начнет записывать **все ваши действия** по пути `/Download/VK/logs/com.vtosters.lite/`
При следующем открытии приложения оно автоматически сохранит логи и отправит вам в [**Документы** ВК](https://vk.com/docs), откуда вы можете скачать архив логов и работать с ними.
При следующем открытии приложения оно автоматически сохранит логи и отправит вам в [**Документы** ВК](https://vk.ru/docs), откуда вы можете скачать архив логов и работать с ними.
## Разработка
@@ -1,6 +1,5 @@
package com.vk.core.util;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getDownloadsDir;
import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import static ru.vtosters.lite.utils.Preferences.getPhotosDir;
@@ -13,10 +12,8 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import com.facebook.common.i.MediaUtils;
import com.facebook.x.g.EncodedImage;
@@ -24,7 +21,6 @@ import com.vk.core.concurrent.VkExecutors;
import com.vk.imageloader.VKImageLoader;
import com.vk.log.L;
import com.vk.metrics.eventtracking.VkTracker;
import com.vtosters.lite.MainActivity;
import com.vtosters.lite.R;
import java.io.File;
@@ -35,5 +35,6 @@ public enum DialogAction {
pinmsg,
unpinmsg,
ENCRYPT_SETT,
ENCRYPT
ENCRYPT,
DOWNLOAD
}
@@ -11,7 +11,6 @@ import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.RectF;
import android.graphics.Shader;
@@ -36,8 +35,6 @@ import com.vtosters.lite.a0;
import java.util.Arrays;
import ru.vtosters.lite.utils.AndroidUtils;
@UiThread
public class TargetImageView extends VKMultiImageView {
private static final int I = Screen.a(2);
@@ -1,7 +1,5 @@
package com.vk.stories.view;
import static ru.vtosters.lite.utils.ThemesUtils.getColor2;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -29,7 +27,6 @@ import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.u.b.a.PipelineDraweeControllerBuilder;
import com.facebook.x.g.CloseableImage;
import com.vk.core.drawable.BorderDrawable;
import com.vk.core.ui.themes.Themable;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vk.core.util.DrawableUtils;
@@ -50,8 +47,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import ru.vtosters.lite.utils.AndroidUtils;
public class StoryCircleImageView extends BorderedCircleImageView implements Themable{
private static final HashSet<Integer> B0 = new HashSet<>();
private final PipelineDraweeControllerBuilder f0;
@@ -1,6 +1,6 @@
package com.vtosters.lite.ui.bottomnavigation;
import static ru.vtosters.lite.utils.Preferences.*;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.getCSTDock;
import android.annotation.SuppressLint;
@@ -31,7 +31,6 @@ import com.vk.core.ui.themes.VKThemeHelper;
import com.vtosters.lite.R;
import me.grishka.appkit.utils.V;
import ru.vtosters.lite.utils.Preferences;
public class BottomNavigationItemView extends FrameLayout implements MenuView.ItemView {
private final TextView mSmallLabel;
@@ -5,26 +5,28 @@ import static com.vk.im.engine.h.im_ic_edit_msg;
import static com.vk.im.engine.h.im_ic_more_vertical;
import static com.vk.im.engine.h.im_ic_pinned_msg_hide;
import static com.vk.im.engine.h.im_ic_pinned_msg_show;
import static com.vk.im.engine.h.im_ic_write_msg;
import static com.vk.im.ui.c.im_ic_keyboard;
import static ru.vtosters.lite.dnr.DNRModule.hookDNR;
import static ru.vtosters.lite.dnr.DNRModule.hookDNT;
import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.getDownloadsDir;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import com.vk.core.network.Network;
import com.vk.im.engine.ImEngine1;
import com.vk.im.engine.events.OnDialogUpdateEvent;
import com.vk.im.engine.models.EntityIntMap;
import com.vk.im.engine.models.ProfilesSimpleInfo;
import com.vk.im.engine.models.dialogs.Dialog;
import com.vk.im.engine.models.messages.Msg;
import com.vk.im.engine.models.messages.MsgFromUser;
@@ -33,6 +35,7 @@ import com.vk.im.ui.components.common.MsgAction;
import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg;
import com.vk.im.ui.views.dialog_actions.DialogActionsListView;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -41,11 +44,11 @@ import java.util.List;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import ru.vtosters.lite.downloaders.MessagesDownloader;
import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.hooks.CryptImHook;
import ru.vtosters.lite.ui.dialogs.Translate;
import ru.vtosters.lite.utils.AndroidUtils;
public class DNRInjector {
public static void inject(Dialog dialog, List<DialogAction> list) {
@@ -55,6 +58,8 @@ public class DNRInjector {
peerId = dialog.getId();
}
list.add(DialogAction.DOWNLOAD);
list.add(DialogAction.pinmsg);
list.add(DialogAction.unpinmsg);
@@ -78,6 +83,8 @@ public class DNRInjector {
}
public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) {
hashMap.put(DialogAction.DOWNLOAD, getIdentifier("download_dl", "string"));
hashMap.put(DialogAction.DNR_ON, getIdentifier("DNR_ON", "string"));
hashMap.put(DialogAction.DNR_OFF, getIdentifier("DNR_OFF", "string"));
hashMap.put(DialogAction.DNT_ON, getIdentifier("DNT_ON", "string"));
@@ -94,6 +101,7 @@ public class DNRInjector {
@SuppressLint("ResourceType")
public static List<Object> injectToList(List<Object> actions) {
var list = new ArrayList<>(actions);
list.add(new DialogActionsListView.b.a(DialogAction.DOWNLOAD, 1, getIdentifier("im_ic_msgdl", "attr"), getIdentifier("download_dl", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNR_ON, 2, im_ic_pinned_msg_hide, getIdentifier("DNR_ON", "string"))); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNR_OFF, 2, im_ic_pinned_msg_show, getIdentifier("DNR_OFF", "string"))); // DialogAction, Int, Icon, String
@@ -122,6 +130,8 @@ public class DNRInjector {
peerId = dialog.getId();
}
actions.add(DialogAction.DOWNLOAD);
if (isDnrEnabledFor(peerId)) {
actions.add(DialogAction.DNR_OFF);
} else {
@@ -156,6 +166,17 @@ public class DNRInjector {
forceInvalidateDialogActions(dialog);
}
if (action == DialogAction.DOWNLOAD) {
File out = new File(Environment.getExternalStoragePublicDirectory(getDownloadsDir().getName()), "dialog-" + peerId + ".html");
try {
new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out);
} catch (Exception e) {
sendToast(getString("download_dl_error"));
e.printStackTrace();
}
return true;
}
if (action == DialogAction.DNR_ON) {
setDnr(dialog, true);
forceInvalidateDialogActions(dialog);
@@ -198,6 +219,16 @@ public class DNRInjector {
DNRModule.hookRead(dialog);
}
if (action == DialogAction.DOWNLOAD) {
File out = new File(Environment.getExternalStoragePublicDirectory(getDownloadsDir().getPath()), peerId + "-dialog.html");
try {
new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
if (action == DialogAction.DNR_ON) {
setDnr(dialog, true);
return true;
@@ -264,13 +295,13 @@ public class DNRInjector {
if (action == MsgAction.valueOf("TRANSLATE")) {
if (isTextExist && isReplyExist) {
Translate.showTranslatedText(context, text + "\n\n" + AndroidUtils.getString("translator_reply") + "\n" + reply);
Translate.showTranslatedText(context, text + "\n\n" + getString("translator_reply") + "\n" + reply);
} else if (isReplyExist) {
Translate.showTranslatedText(context, AndroidUtils.getString("translator_reply") + "\n" + reply);
Translate.showTranslatedText(context, getString("translator_reply") + "\n" + reply);
} else if (isTextExist) {
Translate.showTranslatedText(context, text);
} else {
sendToast(AndroidUtils.getString("translator_no_text"));
sendToast(getString("translator_no_text"));
}
}
@@ -281,7 +312,7 @@ public class DNRInjector {
Thread thread = new Thread(() -> {
try {
var request = new Request.a()
.b("https://api.vk.com/method/" + (needToBePinned ? "messages.pinConversation" : "messages.unpinConversation") + "?peer_id=" + dialogid + "&access_token=" + getUserToken() + "&v=5.119")
.b("https://" + getApi() + "/method/" + (needToBePinned ? "messages.pinConversation" : "messages.unpinConversation") + "?peer_id=" + dialogid + "&access_token=" + getUserToken() + "&v=5.119")
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
.a();
@@ -298,7 +329,7 @@ public class DNRInjector {
thread.start();
sendToast(AndroidUtils.getString("pin_dialog") + " " + (needToBePinned ? AndroidUtils.getString("dialog_pinned") : AndroidUtils.getString("dialog_unpinned")));
sendToast(getString("pin_dialog") + " " + getString(needToBePinned ? "dialog_pinned" : "dialog_unpinned"));
}
public static void setDnr(Dialog dialog, boolean value) {
@@ -1,8 +1,8 @@
package ru.vtosters.lite.dnr;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import android.util.Log;
@@ -2,7 +2,6 @@ package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import android.os.Environment;
import android.util.Log;
import androidx.core.app.NotificationCompat;
@@ -0,0 +1,604 @@
package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import android.util.SparseArray;
import android.widget.Toast;
import androidx.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
public class MessagesDownloader{
private static SimpleDateFormat sdformat;
private static SparseArray<MiniUser> usersArray;
private static final String VK_DOMAIN = "vk.ru";
public static String formatTime(long now){
return sdformat.format(new Date(now));
}
public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements){
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
StringBuilder builder = new StringBuilder();
for (CharSequence cs : elements) {
builder.append(cs).append(delimiter);
}
return builder.toString();
}
public void downloadDialog(int peer_id, DialogDownloaderFormatProvider format, File out) throws Exception{
sdformat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", getResources().getConfiguration().locale);
FileOutputStream fos = new FileOutputStream(out);
// fix TODO with conversation name (API method messages.getConversationsById)
fos.write(format.provideDocumentStart("TODO", formatTime(System.currentTimeMillis())).getBytes(StandardCharsets.UTF_8));
fetchDialogInfo(peer_id, 0, ((users, messages) -> {
try {
fos.write(format.provideHeader("TODO", formatTime(System.currentTimeMillis())).getBytes(StandardCharsets.UTF_8));
for (MiniMsg msg : messages) {
fos.write(format.provideMessage(msg, users.get(msg.fromId)).getBytes(StandardCharsets.UTF_8));
}
fos.write(format.provideDocumentEnd().getBytes(StandardCharsets.UTF_8));
fos.close();
Toast.makeText(getGlobalContext(), "Сохранено как " + out.getAbsolutePath(), Toast.LENGTH_SHORT).show();
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}));
}
public void fetchDialogInfo(int peer_id, int offset, FetchListener fl){
makeRequest("https://" + getApi() + "/method/messages.getHistory?extended=1&v=5.140&offset=" + offset + "&count=200&peer_id=" + peer_id + "&access_token=" + getUserToken(),
response -> {
try {
JSONObject mainJson = new JSONObject(response);
JSONObject obj = mainJson.getJSONObject("response");
SparseArray<MiniUser> users = new SparseArray<>();
parseUsers(users, obj.optJSONArray("profiles"), false);
parseUsers(users, obj.optJSONArray("groups"), true);
List<MiniMsg> msgs = parseMessages(obj.getJSONArray("items"));
usersArray = users;
fl.onReceive(users, msgs);
} catch (JSONException e) {
e.printStackTrace();
}
});
}
private List<MiniMsg> parseMessages(JSONArray jsonArray) throws JSONException{
ArrayList<MiniMsg> thing = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
MiniMsg msg = new MiniMsg(jsonArray.getJSONObject(i));
thing.add(msg);
}
return thing;
}
private void parseUsers(SparseArray<MiniUser> array, @Nullable JSONArray jsonArray, boolean groups) throws JSONException{
if (jsonArray == null) return;
for (int i = 0; i < jsonArray.length(); i++) {
MiniUser user = new MiniUser(jsonArray.getJSONObject(i), groups);
array.put(groups ? -user.id : user.id, user);
}
}
interface FetchListener{
void onReceive(SparseArray<MiniUser> users, List<MiniMsg> messages);
}
static class MiniUser{
public String firstName;
public String lastName;
public boolean isGroup;
int id;
String photo100;
public MiniUser(JSONObject obj, boolean is_group) throws JSONException {
id = obj.getInt("id");
firstName = obj.optString("first_name", obj.optString("name"));
lastName = obj.optString("last_name", "");
photo100 = obj.getString("photo_100");
isGroup = is_group;
}
}
static class MiniMsg{
long date;
int fromId;
int id; // message id
String text;
List<JSONObject> attachments;
List<JSONObject> fwd_messages;
JSONObject reply_message; // one reply
JSONObject chat_action;
JSONObject geo;
public MiniMsg(JSONObject obj) throws JSONException{
date = obj.getLong("date") * 1000;
fromId = obj.getInt("from_id");
id = obj.getInt("id");
text = decryptMessage(obj.getString("text"), obj.getInt("peer_id"));
reply_message = obj.optJSONObject("reply_message");
chat_action = obj.optJSONObject("action");
geo = obj.optJSONObject("geo");
attachments = new ArrayList<>();
fwd_messages = new ArrayList<>();
JSONArray arr = obj.optJSONArray("attachments");
if (arr != null)
for (int i = 0; i < arr.length(); i++) attachments.add(arr.getJSONObject(i));
JSONArray fwdArr = obj.optJSONArray("fwd_messages");
if (fwdArr != null)
for (int i = 0; i < fwdArr.length(); i++) fwd_messages.add(fwdArr.getJSONObject(i));
}
}
// This class defines everything which is needed to create an output file
abstract static class DialogDownloaderFormatProvider{
// Internal, for JSON/HTML
abstract String provideDocumentStart(String dialogName, String date);
abstract String provideDocumentEnd();
abstract String provideHeader(String dialogName, String date);
abstract String provideMessage(MiniMsg message, MiniUser user) throws JSONException;
}
public static class HtmlDialogDownloaderFormatProvider extends DialogDownloaderFormatProvider{
@Override
String provideDocumentStart(String dialogName, String date){
String style = ".vtex-milk-msg {\n" +
" border-radius: 8px;\n" +
" padding: 24px;\n" +
" background: white;\n" +
" margin: 16px;\n" +
" box-shadow: 0 4px 8px 0 rgba(0,0,0,0.07);\n" +
" word-wrap: break-word;\n" +
"}\n" +
"\n" +
".vtex-milk-msgcont br {\n" +
" display: none;\n" +
"}\n" +
"\n" +
".vtex-milk-msg p {\n" +
" margin: 0;\n" +
"}\n" +
"\n" +
".vtex-milk-msg.vtex-milk-msg-out {\n" +
" background: #ADD3FF;\n" +
"}\n" +
"\n" +
"p.msg-attaches {\n" +
" margin-top: 8px;\n" +
" font-style: italic;\n" +
"}\n" +
"p.chat-action {\n" +
" font-style: italic;\n" +
"}\n" +
"\n" +
".vtex-milk-header {\n" +
" border-radius: 8px;\n" +
" padding: 24px;\n" +
" background: white;\n" +
" margin: 16px;\n" +
" box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);\n" +
"}\n" +
"\n" +
"h4.vtex-milk-header-txt {\n" +
" margin: 0;\n" +
"}\n" +
"\n" +
"h5.vtex-milk-header-sub {\n" +
" margin: 0;\n" +
" padding-top: 8px;\n" +
"}\n" +
"\n" +
"a.msg-attach-link {\n" +
" color: #5181B8;\n" +
" text-decoration: none;\n" +
"}\n" +
"\n" +
".msg-from a {\n" +
" color: #5181B8;\n" +
" text-decoration: none;\n" +
"}\n" +
"\n" +
".msg-from-date {\n" +
" color: rgba(0, 0, 0, 0.75);\n" +
"}\n" +
"\n" +
"body {\n" +
" font-family: Roboto, system-ui, sans-serif;\n" +
"}\n" +
"\n" +
".msg-body {\n" +
" padding-top: 4px;\n" +
"}\n" +
".msg-reply {\n" +
" border-left: 3px solid #7aa7f6;\n" +
" margin-top: 5px;\n" +
" padding-left: 3px;\n" +
"}\n\n" +
".msg-reply p {\n" +
" padding-left: 5px;\n" +
"}\n\n" +
".msg-reply p.reply-header {\n" +
" color: #5181B8;\n" +
"}\n\n" +
".msg-reply p.reply-content {\n" +
" color: #000000;\n" +
"}\n" +
".vtex-milk-msg.poll {\n" +
" width: 45%;\n" +
" background: linear-gradient(to bottom right, #707c8c, #4d5565);\n" +
" font-style: normal;" +
"}\n" +
".vtex-milk-msg.poll p { color: white; }\n" +
".vtex-milk-msg.poll hr { border-top: 1px; background: #ffffff; }\n" +
"\n" +
"";
return "<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta charset=\"utf-8\"><title>Экспорт из VTLite</title><style>" + style + "</style></head><body>";
}
@Override
String provideDocumentEnd(){
return "</div></body></html>";
}
@Override
String provideHeader(String dialogName, String date){
return "<div class=\"vtex-milk-header\"><h4 class=\"vtex-milk-header-txt\">VTLite</h4><h5 class=\"vtex-milk-header-sub\">Экспорт истории чата (" + date + ")</h5></div><div class=\"vtex-milk-msgcont\">";
}
@Override
String provideMessage(MiniMsg message, MiniUser user) throws JSONException{
String isOut = (user.id == getUserId()) ? " vtex-milk-msg-out" : "";
String geoPosition = "";
if (message.geo != null) {
var coordinates = message.geo.optJSONObject("coordinates");
if (coordinates != null) {
var latitude = coordinates.optDouble("latitude");
var longitude = coordinates.optDouble("longitude");
var ll = longitude + "," + latitude;
geoPosition = "<a href=\"https://yandex.ru/maps/?ll=" + ll + "&mode=search&sll=" + ll + "&text=" + latitude + "," + longitude + "&z=12\">" +
"<img src=\"https://static-maps.yandex.ru/1.x/?ll=" + longitude + "," + latitude + "&z=12&l=map&size=300,200&pt=" + ll + ",vkgrm\"/>" +
"</a>";
}
}
String chatAction = (message.chat_action != null) ? getHtmlForChatAction(message.chat_action) : "";
String attaches = (message.attachments.size() > 0) ? "<p class=\"msg-attaches\">Вложения: " + getHtmlForAttach(message.attachments) + "</p>" : "";
String reply = (message.reply_message != null) ? provideReply(message.reply_message) : "";
String fwdMessages = (message.fwd_messages.size() > 0) ? provideForwardMessages(message.fwd_messages) : "";
String userLink = (user.isGroup ? "club" : "id") + user.id;
return "<div class=\"vtex-milk-msg" + isOut + "\" id=\"" + message.id + "\">" +
"<p class=\"msg-from\">от <a href=\"https://" + VK_DOMAIN + "/" + userLink + "\">" + user.firstName + " " + user.lastName + "</a> <span class=\"msg-from-date\">" + formatTime(message.date) + "</span></p>" + // TODO photo100
"<p class=\"msg-body\">" + mentionsReplace(message.text) + "</p>" +
geoPosition +
chatAction +
attaches +
reply +
fwdMessages +
"</div>";
}
private String provideReply(JSONObject replyMessage) {
var messageId = replyMessage.optInt("id");
var userId = replyMessage.optInt("from_id");
var peerId = replyMessage.optInt("peer_id");
var text = mentionsReplace(decryptMessage(replyMessage.optString("text"), peerId));
var fwdMessages = replyMessage.optJSONArray("fwd_messages");
var user = usersArray.get(userId);
if (text.isEmpty()) {
if (fwdMessages != null) {
var length = fwdMessages.length();
if (length > 0) text = length + " " + pluralMsg(length);
} else text = "Вложение";
}
return "<a href=\"#" + messageId + "\" class=\"msg-attach-link\">" +
"<div class=\"msg-reply\">" +
"<p class=\"reply-header\">Пересланное сообщение</p>" +
"<p class=\"reply-content\">" + user.firstName + " " + user.lastName + ": " + text + "</p>" +
"</div>" +
"</a>";
}
private String provideForwardMessages(List<JSONObject> fwd_messages) throws JSONException {
StringBuilder fwdmsgs = new StringBuilder("<div class=\"msg-reply\">");
for (JSONObject fwd_message : fwd_messages) {
if (fwd_message == null) continue;
List<JSONObject> attaches = new ArrayList<>();
JSONArray arr = fwd_message.optJSONArray("attachments");
if (arr != null) {
for (int i = 0; i < arr.length(); i++) {
try {
attaches.add(arr.getJSONObject(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
List<JSONObject> fwdsMsg = new ArrayList<>();
JSONArray fwd_msgs = fwd_message.optJSONArray("fwd_messages");
if (fwd_msgs != null) {
for (int i = 0; i < fwd_msgs.length(); i++) {
try {
fwdsMsg.add(fwd_msgs.getJSONObject(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
JSONObject reply_message = fwd_message.optJSONObject("reply_message");
var attachesHtml = (attaches.size() > 0) ? "Вложения: " + getHtmlForAttach(attaches) : "";
var replyHtml = (reply_message != null) ? provideReply(reply_message) : "";
var fwdsHtml = (fwdsMsg.size() > 0) ? provideForwardMessages(fwdsMsg) : ""; // recursion XD :>
var userId = fwd_message.optInt("from_id");
var peerId = fwd_message.optInt("peer_id");
var text = mentionsReplace(decryptMessage(fwd_message.optString("text"), peerId));
var userLink = ((userId < 0) ? "club" : "id") + Math.abs(userId);
fwdmsgs.append("<p class=\"reply-content\"><a class=\"msg-attach-link\" href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\">@").append(userLink).append("</a>: ").append(text).append(attachesHtml).append(replyHtml).append(fwdsHtml);
}
return fwdmsgs.append("</div>").toString();
}
private String mentionsReplace(String text) {
var matcher = Pattern.compile("\\[((?:club|id|public)\\d+)\\|([^]]+)\\]").matcher(text);
return matcher.replaceAll("<a class=\"msg-attach-link\" href=\"https://" + VK_DOMAIN + "/$1\">$2</a>");
}
private String pluralMsg(int count) {
String[] plurals = {"сообщение", "сообщения", "сообщений"};
var hundredModulo = count % 100;
var tenModulo = count % 10;
if (hundredModulo > 10 && hundredModulo < 20) return plurals[2];
else if (tenModulo > 1 && tenModulo < 5) return plurals[1];
else if (tenModulo == 1) return plurals[0];
return plurals[2];
}
private String getHtmlForChatAction(JSONObject action) {
var type = action.optString("type");
StringBuilder htmlAction = new StringBuilder("<p class=\"chat-action\">");
switch(type) {
case "chat_photo_update":
htmlAction.append("Обновил фотографию беседы");
break;
case "chat_photo_remove":
htmlAction.append("Удалил фотографию беседы");
break;
case "chat_create":
var name = action.optString("text");
htmlAction.append("Создал беседу").append((!name.isEmpty()) ? " с названием \"" + name + "\"" : "");
break;
case "chat_title_update":
var newName = action.optString("text");
htmlAction.append("Сменил название беседы").append((!newName.isEmpty()) ? " на \"" + newName : "\"");
break;
case "chat_invite_user":
var newUserId = action.optInt("member_id");
htmlAction.append("Добавил ").append((newUserId > 0) ? "пользователя" : "группу");
if (newUserId != 0) {
var userLink = ((newUserId < 0) ? "club" : "id") + Math.abs(newUserId);
htmlAction.append(" <a href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\" class=\"msg-attach-link\">@").append(userLink).append("</a>");
}
break;
case "chat_kick_user":
var removedUserId = action.optInt("member_id");
htmlAction.append("Исключил ").append((removedUserId > 0) ? "пользователя" : "группу");
if (removedUserId != 0) {
var userLink = ((removedUserId < 0) ? "club" : "id") + Math.abs(removedUserId);
htmlAction.append(" <a href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\" class=\"msg-attach-link\">@").append(userLink).append("</a>");
}
break;
case "chat_pin_message":
var message = action.optString("message");
htmlAction.append("Закрепил сообщение").append((!message.isEmpty()) ? (" с текстом: \"" + message + "\"") : "");
break;
case "chat_unpin_message":
htmlAction.append("Открепил сообщение");
break;
case "chat_invite_user_by_link":
htmlAction.append("Вступил в беседу по ссылке");
break;
case "chat_screenshot":
htmlAction.append("Сделал скриншот беседы");
break;
case "custom":
htmlAction.append(action.optString("message"));
break;
default:
htmlAction.append("Действие не поддерживается (").append(type).append(")");
break;
}
return htmlAction.append("</p>").toString();
}
private String getHtmlForAttach(List<JSONObject> attaches) throws JSONException{
StringBuilder rs = new StringBuilder();
for (JSONObject attach : attaches) {
String type = attach.getString("type");
JSONObject item = attach.optJSONObject(type);
if (item == null) continue;
switch(type) { // market_album is not supported
case "photo":
var sizes = item.getJSONArray("sizes");
rs.append("<a href=\"").append(sizes.getJSONObject(sizes.length() - 1).getString("url")).append("\" class=\"msg-attach-link\">фотография</a>");
break;
case "doc":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">документ</a>");
break;
case "link":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">ссылка</a>");
break;
case "wall":
rs.append("<a href=\"https://" + VK_DOMAIN + "/wall").append(item.optString("to_id", item.optString("owner_id"))).append("_").append(item.getString("id")).append("\" class=\"msg-attach-link\">запись на стене</a>");
break;
case "sticker":
rs.append("<img style=\"width:128px;height:128px;\" src=\"").append(item.getJSONArray("images").getJSONObject(1).getString("url")).append("\"/>");
break;
case "audio_message":
rs.append("<a href=\"").append(item.optString("link_mp3")).append("\" class=\"msg-attach-link\">голосовое сообщение</a>");
break;
case "audio":
rs.append("аудиозапись (").append(item.optString("artist")).append(" — ").append(item.optString("title")).append(")");
break;
case "video":
rs.append("видеозапись ( ").append(getVideoHtml(item.optJSONObject("files"))).append(")");
break;
case "wall_reply":
var link = "https://" + VK_DOMAIN + "/wall" + item.optString("owner_id") + "_" + item.optString("post_id") + "?reply=" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(link).append("\">комментарий на стене</a>");
break;
case "story":
var story_link = "https://" + VK_DOMAIN + "/story" + item.optString("owner_id") + "_" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(story_link).append("\">история</a>");
break;
case "podcast":
var podcast_link = "https://" + VK_DOMAIN + "/podcast" + item.optString("owner_id") + "_" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(podcast_link).append("\">подкаст</a>");
break;
case "gift":
rs.append("<img src=\"").append(item.optString("thumb_96")).append("\"/>");
break;
case "mini_app":
var app = item.optJSONObject("app");
if (app != null) {
var miniapp_link = "https://" + VK_DOMAIN + "/app" + app.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(miniapp_link).append("\">мини-приложение</a>");
break;
}
rs.append("ошибка");
break;
case "audio_playlist":
var playlist_link = "https://" + VK_DOMAIN + "/music/album/" + item.optString("owner_id") + "_" + item.optString("id") + "_" + item.optString("access_key");
rs.append("<a class=\"msg-attach-link\" href=\"").append(playlist_link).append("\">плейлист (").append(item.optString("title")).append(")</a>");
break;
case "poll":
rs.append((item.optBoolean("anonymous") ? "анонимный" : "публичный")).append(" опрос ").append(getPollHtml(item));
break;
case "market":
var market_item_link = "https://" + VK_DOMAIN + "/market" + item.optString("owner_id") + "_" + item.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(market_item_link).append("\">товар</a>");
break;
default:
rs.append("не поддерживается (").append(type).append(")");
break;
}
rs.append(" ");
}
return rs.toString();
}
}
private static String getPollHtml(JSONObject poll) throws JSONException {
StringBuilder pollHtml = new StringBuilder(
"<div class=\"vtex-milk-msg poll\">" +
"<p style=\"text-align:center;\">" + poll.optString("question") + "</p>"
);
var answers = poll.optJSONArray("answers");
for (int i = 0; i < answers.length(); i++) {
var jsonObject = answers.optJSONObject(i);
if (jsonObject != null)
pollHtml.append("<hr><p>").append(jsonObject.optString("text")).append(" · ").append(jsonObject.optString("votes")).append(" (").append(jsonObject.optString("rate")).append("%)</p>");
}
pollHtml.append("<hr><p style=\"text-align:center;\">Проголосовало ").append(poll.optString("votes")).append(" чел.</p>");
return pollHtml.append("</div>").toString();
}
private static String getVideoHtml(JSONObject files) throws JSONException {
if (files == null) return "ссылки отсутствуют";
Iterator< ? > keys = files.keys();
StringBuilder videoHtml = new StringBuilder();
int qualityIndex = 0;
String[] quality = {"144", "240", "360", "480", "720", "1080", "1440", "2160"};
while (keys.hasNext()) {
String key = (String) keys.next();
if (key.equals("mp4_" + quality[qualityIndex])) {
videoHtml.append("<a class=\"msg-attach-link\" href=\"").append(files.get(key)).append("\">").append(quality[qualityIndex]).append("p</a>").append(" ");
if (qualityIndex == quality.length - 1) break;
++qualityIndex;
}
}
return videoHtml.toString();
}
}
@@ -7,12 +7,10 @@ import static ru.vtosters.lite.utils.Preferences.getPhotosDir;
import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import com.vk.dto.common.ImageSize;
import com.vk.dto.stories.model.StoryEntry;
import java.io.File;
import java.util.List;
public class StoryDownloader {
@@ -1,18 +1,17 @@
package ru.vtosters.lite.downloaders;
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.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getVideosDir;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.widget.Toast;
import com.vk.core.dialogs.alert.VkAlertDialog;
@@ -127,12 +126,12 @@ public class VideoDownloader {
}
public static void parseVideoLink(String url, Context ctx) {
if (url.contains("vk.com/story")) {
if (url.contains("vk.ru/story") || url.contains("vk.com/story")) {
ToastUtils.a(AndroidUtils.getString("video_dl_stories_not_supported"));
return;
}
if (!url.contains("vk.com/video")) {
if (!url.contains("vk.ru/video") || !url.contains("vk.com/video")) {
ToastUtils.a(AndroidUtils.getString("video_dl_wrong_link"));
return;
}
@@ -144,7 +143,7 @@ public class VideoDownloader {
progressDialog.setMessage(AndroidUtils.getString("video_dl_progress"));
progressDialog.show();
makeRequest("https://" + "api.vk.com" + "/method/video.get?owner_id=" + ownerId + "&videos=" + videoId + "&v=5.99&access_token=" + getUserToken(),
makeRequest("https://" + getApi() + "/method/video.get?owner_id=" + ownerId + "&videos=" + videoId + "&v=5.99&access_token=" + getUserToken(),
response -> {
progressDialog.cancel();
@@ -2,11 +2,11 @@ package ru.vtosters.lite.foaf;
import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.proxy.ProxyUtils.isApiProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
@@ -35,7 +35,6 @@ import java.util.regex.Pattern;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import ru.vtosters.lite.net.Request;
import ru.vtosters.lite.utils.AccountManagerUtils;
public class FoafBase {
private static final Pattern FOAF_REGEX = Pattern.compile("<ya:created dc:date=\"(.+?)\"\\/>");
@@ -115,12 +114,12 @@ public class FoafBase {
private static String getLink(int i) {
String str;
StringBuilder sb;
if (isApiProxyEnabled()) {
if (isAnyProxyEnabled()) {
sb = new StringBuilder();
str = "https://" + getApi() + "/_/vk.com/foaf.php?id=";
str = "https://" + getApi() + "/_/vk.ru/foaf.php?id=";
} else {
sb = new StringBuilder();
str = "https://vk.com/foaf.php?id=";
str = "https://vk.ru/foaf.php?id=";
}
sb.append(str);
sb.append(i);
@@ -4,13 +4,10 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import java.util.Random;
public class DeviceInfoHook{
public static String getDeviceInfo(String input) {
Log.d("DeviceInfoHook", "getDeviceInfo: " + input);
@@ -35,7 +35,6 @@ import com.vk.core.fragments.FragmentImpl;
import com.vk.core.util.StringUtils;
import com.vk.navigation.right.RightMenu;
import com.vtosters.lite.MenuCountersState;
import com.vtosters.lite.fragments.ProfileFragment;
import com.vtosters.lite.ui.bottomnavigation.BottomNavigationMenuView;
import com.vtosters.lite.ui.bottomnavigation.BottomNavigationView;
@@ -209,6 +208,7 @@ public class DockBarInjector {
val = MenuCountersState.n();
break;
case tab_feedback:
case tab_news:
if (milkshake())
val = MenuCountersState.k();
break;
@@ -1,11 +1,11 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.foaf.FoafBase.getLastSeen;
import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo;
import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.getStatic;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.Base64Utils.decode;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews;
@@ -76,7 +76,7 @@ public class JsonInjectors {
public static JSONObject donateRecomm() throws JSONException {
var title = AndroidUtils.getString("donate_to_vtl");
var link = "https://vk.com/vtosters_official";
var link = "https://vk.ru/vtosters_official";
var text_color = "2D81E0";
var json = new JSONObject();
@@ -118,7 +118,7 @@ public class JsonInjectors {
public static JSONObject vktesters(int id) throws JSONException {
var title = AndroidUtils.getString("tester_profile");
var text_color = "2D81E0";
var link = "https://static.vk.com/bugs?lang=" + LangUtils.a() + "#/reporter" + id;
var link = "https://" + getStatic() + "/bugs?lang=" + LangUtils.a() + "#/reporter" + id;
var json = new JSONObject();
var icons = new JSONArray();
@@ -157,8 +157,6 @@ public class JsonInjectors {
}
public static JSONObject convBar(JSONObject orig) throws JSONException {
if (!dev()) return orig.optJSONObject("conversation_bar"); // for devs only
var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id");
var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null
@@ -182,6 +180,9 @@ public class JsonInjectors {
return orig.optJSONObject("conversation_bar");
}
}
if (!dev()) return orig.optJSONObject("conversation_bar"); // for devs only
var json = new JSONObject();
var buttonsJson = new JSONObject();
@@ -434,6 +435,30 @@ public class JsonInjectors {
return false;
}
public static Boolean isWhitelistedFilters(JSONObject list) throws JSONException {
var id = String.valueOf(list.optInt("owner_id"));
if (id.equals("0")) {
id = String.valueOf(list.optInt("source_id"));
}
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>()));
return whitelist.contains(id);
}
public static Boolean isWhitelistedAd(JSONObject list) throws JSONException {
var id = String.valueOf(list.optInt("owner_id"));
if (id.equals("0")) {
id = String.valueOf(list.optInt("source_id"));
}
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>()));
return whitelist.contains(id);
}
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null);
@@ -505,31 +530,31 @@ public class JsonInjectors {
continue;
}
if (adsgroup() && list.optInt("marked_as_ads") == 1) {
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"))) {
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)) {
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)) {
if (checkCaption(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters");
continue;
}
if (NewsFeedFiltersUtils.injectFiltersReposts(list)) {
if (NewsFeedFiltersUtils.injectFiltersReposts(list) && !isWhitelistedFilters(list)) {
if (dev())
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad");
continue;
@@ -566,7 +591,7 @@ public class JsonInjectors {
}
}
var playlists = fetchCatalogId("https://vk.com/audio?section=my_playlists");
var playlists = fetchCatalogId("https://vk.ru/audio?section=my_playlists");
if (playlists != null) {
var catalogarr = playlists.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
@@ -579,7 +604,7 @@ public class JsonInjectors {
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
}
var albums = fetchCatalogId("https://vk.com/audio?section=albums");
var albums = fetchCatalogId("https://vk.ru/audio?section=albums");
if (albums != null) {
var catalogarr = albums.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
@@ -592,7 +617,7 @@ public class JsonInjectors {
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
}
var recent = fetchCatalogId("https://vk.com/audio?section=recent");
var recent = fetchCatalogId("https://vk.ru/audio?section=recent");
if (recent != null) {
var catalogarr = recent.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
@@ -628,7 +653,7 @@ public class JsonInjectors {
if (section == null) return null;
var request = new Request.a()
.b("https://api.vk.com/method/catalog.getAudio"
.b("https://" + getApi() + "/method/catalog.getAudio"
+ "?v=5.119"
+ "&https=1"
+ "&need_blocks=1"
@@ -652,7 +677,7 @@ public class JsonInjectors {
public static JSONObject fetchCatalogPodcast() {
var request = new Request.a()
.b("https://api.vk.com/method/catalog.getPodcasts"
.b("https://" + getApi() + "/method/catalog.getPodcasts"
+ "?v=5.119"
+ "&https=1"
+ "&need_blocks=1"
@@ -12,11 +12,10 @@ import android.view.View;
import com.vk.api.internal.MethodCall;
import ru.vtosters.lite.translators.BaseTranslator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.regex.Pattern;
import ru.vtosters.lite.translators.BaseTranslator;
public class MessagesHook {
public static String injectOwnText(String oldText) {
@@ -1,6 +1,7 @@
package ru.vtosters.lite.hooks;
import static java.lang.Long.MAX_VALUE;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright;
@@ -22,14 +23,19 @@ import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.vkme;
import com.vk.core.preference.Preference;
import com.vtosters.lite.api.ExtendedCommunityProfile;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import ru.vtosters.lite.utils.AccountManagerUtils;
public class NewsfeedHook {
public static boolean injectFilters(JSONObject obj) throws JSONException {
if (getBoolValue("newadblock", true)) return true;
@@ -85,7 +91,7 @@ public class NewsfeedHook {
params.add("photo");
params.add("photo_tag");
if (!friendsrecomm()) {
if (!friendsrecomm() && !getBoolValue("donotgetads", false)) {
params.add("friends_recomm");
}
@@ -94,23 +100,65 @@ public class NewsfeedHook {
params.add("promo_button");
}
if (!authorsrecomm()) {
if (!authorsrecomm() && !getBoolValue("donotgetads", false)) {
params.add("authors_rec");
}
return params.toArray(new String[0]);
}
public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
}
public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) {
var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet<String>());
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_filters_groups", mutableAdsSet));
if (needWhitelist) {
mutableAdsSet.add(id);
} else {
mutableAdsSet.remove(id);
}
getDefaultPrefs().edit().putStringSet("whitelisted_filters_groups", mutableAdsSet).apply();
}
public static void setWhitelistedAd(ExtendedCommunityProfile eup, boolean needWhitelist) {
var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet<String>());
var id = String.valueOf(AccountManagerUtils.getUserID(eup));
mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_ad_groups", mutableAdsSet));
if (needWhitelist) {
mutableAdsSet.add(id);
} else {
mutableAdsSet.remove(id);
}
getDefaultPrefs().edit().putStringSet("whitelisted_ad_groups", mutableAdsSet).apply();
}
public static void adsParams(HashSet<String> hashSet) {
if (ads() || adsslider()) {
if (ads()) {
hashSet.add("ads_disabled");
return;
if (getBoolValue("donotgetads", false)) {
return;
}
}
hashSet.add("ads_app");
hashSet.add("ads_site");
hashSet.add("ads_post");
hashSet.add("ads_app_slider");
if (!adsslider()) {
hashSet.add("ads_app_slider");
}
hashSet.add("ads_site_slider");
hashSet.add("ads_app_video");
hashSet.add("ads_post_pretty_cards");
@@ -3,13 +3,13 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfo;
import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfoUsers;
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.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.getPrefsFromFile;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import android.util.Log;
@@ -123,7 +123,7 @@ public class OnlineFormatterHook {
case 5632485:
return "SpaceVK";
case 6287487:
return "vk.com";
return "vk.ru";
case 4542624:
return "Black VK";
case 3917910:
@@ -1,8 +1,8 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.annotation.SuppressLint;
import android.content.ClipData;
@@ -67,7 +67,19 @@ public class PhotoViewer {
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()),
false,
() -> {
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
if (attachment instanceof PhotoAttachment) {
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
searchPhoto(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(getString("photo_get_error"));
}
else
ToastUtils.a(getString("photo_get_error"));
}
return null;
}
);
@@ -77,7 +89,19 @@ public class PhotoViewer {
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE),
false,
() -> {
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
if (attachment instanceof PhotoAttachment) {
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
try {
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(getString("photo_get_error"));
}
else
ToastUtils.a(getString("photo_get_error"));
}
return null;
}
);
@@ -93,7 +117,11 @@ public class PhotoViewer {
} else if (attachment instanceof DocumentAttachment) {
var documentAttachment = (DocumentAttachment) attachment;
if (documentAttachment.J != null)
openUrl(getUrlFromDocumentAttachment(documentAttachment));
try {
openUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) {
ToastUtils.a(getString("photo_get_error"));
}
else
ToastUtils.a(getString("photo_get_error"));
}
@@ -103,8 +131,11 @@ public class PhotoViewer {
}
private static String getUrlFromDocumentAttachment(DocumentAttachment attachment) {
var imageSizes = attachment.J.t1();
return getUrlFromImageSizeList(imageSizes);
List<ImageSize> imageSizes = null;
if (attachment.J != null) {
imageSizes = attachment.J.t1();
}
return getUrlFromImageSizeList(imageSizes != null ? imageSizes : null);
}
private static String getUrlFromPhotoAttachment(PhotoAttachment attachment) {
@@ -1,11 +1,11 @@
package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.proxy.ProxyUtils.isRandomProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isVikaProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isZaboronaEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import static ru.vtosters.lite.proxy.ProxyUtils.isRandomProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isZaboronaEnabled;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getAlertStyle;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -5,18 +5,17 @@ import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
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.engine.models.messages.WithUserContent;
import com.vk.im.ui.views.ReplyView;
public class ReplyMsgHook {
public static void injectWithDecrypt(ReplyView replyView, MsgFromUser msgFromUser, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool) {
msgFromUser.d(decryptMessage(msgFromUser)); // set new value of text in MsgFromUser class
replyView.a((WithUserContent) msgFromUser, profilesSimpleInfo, someBool);
replyView.a(msgFromUser, profilesSimpleInfo, someBool);
}
public static void injectWithDecrypt(ReplyView replyView, NestedMsg nestedMsg, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool) {
nestedMsg.d(decryptMessage(nestedMsg.f(), nestedMsg.t1())); // set new value of text in NestedMsg class
replyView.a((WithUserContent) nestedMsg, profilesSimpleInfo, someBool);
replyView.a(nestedMsg, profilesSimpleInfo, someBool);
}
public static void injectWithDecrypt(ReplyView replyView, NestedMsg nestedMsg, ProfilesSimpleInfo profilesSimpleInfo, boolean someBool, int i) {
@@ -1,11 +1,11 @@
package ru.vtosters.lite.music;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.Preferences.getMusicDir;
import android.app.DownloadManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
@@ -28,7 +28,7 @@ import ru.vtosters.lite.utils.AndroidUtils;
public class MP3Downloader {
private static final String URL_FORMAT = "https://api.vk.com/method/audio.getById?v=5.131&access_token=%s&audios=%s&copyright=https://vtosters.app/";
private static final String URL_FORMAT = "https://" + getApi() + "/method/audio.getById?v=5.131&access_token=%s&audios=%s&copyright=https://vtosters.app/";
private static final OkHttpClient client = new OkHttpClient();
public static void execute(MusicTrack track) {
@@ -1,6 +1,9 @@
package ru.vtosters.lite.proxy;
import static java.lang.System.clearProperty;
import static ru.vtosters.lite.proxy.api.VikaMobile.getApiHost;
import static ru.vtosters.lite.proxy.api.VikaMobile.getOauthHost;
import static ru.vtosters.lite.proxy.api.VikaMobile.getStaticHost;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
@@ -23,11 +26,47 @@ public class ProxyUtils{
public static String getApi(){
var proxyapi = getPrefsValue("proxyapi");
if (isApiProxyEnabled() & !proxyapi.isEmpty()) {
if (isVikaProxyEnabled()) {
proxyapi = getApiHost();
}
if (isAnyProxyEnabled() & !proxyapi.isEmpty()) {
return proxyapi;
}
return "api.vk.com";
return "api.vk.ru";
}
public static String getOauth(){
var oauth = getPrefsValue("proxyoauth");
if (isVikaProxyEnabled()) {
oauth = getOauthHost();
}
if (isAnyProxyEnabled() & !oauth.isEmpty()) {
return oauth;
}
return "oauth.vk.ru";
}
public static String getStatic(){
var staticapi = getPrefsValue("proxystatic");
if (isVikaProxyEnabled()) {
staticapi = getStaticHost();
}
if (isAnyProxyEnabled() & !staticapi.isEmpty()) {
return staticapi;
}
return "static.vk.ru";
}
public static Boolean isAnyProxyEnabled(){
return isApiProxyEnabled() || isVikaProxyEnabled();
}
public static Boolean isZaboronaEnabled(){
@@ -2,7 +2,6 @@ package ru.vtosters.lite.proxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.resetProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.preferences;
import java.io.IOException;
@@ -1,5 +1,5 @@
package ru.vtosters.lite.proxy.api;
import static ru.vtosters.lite.proxy.ProxyUtils.isApiProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.proxy.ProxyUtils.isVikaProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
@@ -7,9 +7,12 @@ import android.util.Log;
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 vkapi = "api.vk.ru";
var oauth = "oauth.vk.ru";
var vkstatic = "static.vk.ru";
var vkapiold = "api.vk.com";
var oauthold = "oauth.vk.com";
var vkstaticold = "static.vk.com";
var proxyapi = getPrefsValue("proxyapi");
var proxyoauth = getPrefsValue("proxyoauth");
@@ -21,7 +24,7 @@ public class ApiProxy{
proxystatic = VikaMobile.getStaticHost();
}
if (!isApiProxyEnabled() || link.isEmpty()) {
if (!isAnyProxyEnabled() || link.isEmpty()) {
return link;
}
@@ -31,27 +34,57 @@ public class ApiProxy{
}
if (link.contains(vkapi)) {
return link.replace(proxyapi, vkapi);
return link.replaceAll(vkapi, proxyapi);
}
if (link.contains(oauth)) {
return link.replace(proxyoauth, oauth);
return link.replaceAll(oauth, proxyoauth);
}
if (link.contains(vkstatic)) {
return link.replace(proxystatic, vkstatic);
return link.replaceAll(vkstatic, proxystatic);
}
if (link.contains(vkapiold)) {
return link.replaceAll(vkapiold, proxyapi);
}
if (link.contains(oauthold)) {
return link.replaceAll(vkapiold, proxyoauth);
}
if (link.contains(vkstaticold)) {
return link.replaceAll(vkapiold, proxystatic);
}
return link;
}
public static String staticFix(String str) {
var string = getPrefsValue("proxystatic");
if (isVikaProxyEnabled()) {
string = VikaMobile.getStaticHost();
}
if (isAnyProxyEnabled() && !string.isEmpty()) {
return str.replaceAll(string, "static.vk.ru");
}
return str;
}
public static String getAwayPhpCom(){
var proxyapi = getPrefsValue("proxyapi");
if (isApiProxyEnabled() & !proxyapi.isEmpty()) {
if (isVikaProxyEnabled()) {
proxyapi = VikaMobile.getApiHost();
}
if (isAnyProxyEnabled() && !proxyapi.isEmpty()) {
return proxyapi;
}
return "m.vk.com";
return "m.vk.ru";
}
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class Jetkai{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class TheSpeedX{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class Jetkai{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class Roosterkid{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class Hookzof{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class Jetkai{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class Roosterkid{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -3,6 +3,7 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log;
@@ -33,7 +34,7 @@ public class TheSpeedX{
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast("Прокси установлен, хост: " + proxy);
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy);
RandomProxy.showProxyResult = false;
}
@@ -1,5 +1,7 @@
package ru.vtosters.lite.ui.activities;
import static ru.vtosters.lite.proxy.ProxyUtils.getOauth;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
@@ -20,7 +22,7 @@ import ru.vtosters.lite.utils.LayoutUtils;
public class VKAdminTokenActivity extends AppCompatActivity {
private static final String URL = "https://oauth.vk.com/authorize?client_id=6121396&scope=1073737727&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1";
private static final String URL = "https://" + getOauth() +"/authorize?client_id=6121396&scope=1073737727&redirect_uri=https://oauth.vk.ru/blank.html&display=page&response_type=token&revoke=1";
@Override
protected void onCreate(@Nullable Bundle bundle) {
@@ -37,7 +39,7 @@ public class VKAdminTokenActivity extends AppCompatActivity {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
var url = request.getUrl().toString();
if (url.startsWith("https://oauth.vk.com/auth_redirect?")) {
if (url.startsWith("https://" + getOauth() + "/auth_redirect?")) {
var redirectUri = Uri.parse(URLDecoder.decode(url));
var authorizeUrl = redirectUri.getQueryParameter("authorize_url");
var accessToken = authorizeUrl.substring(authorizeUrl.indexOf("=") + 1, authorizeUrl.indexOf("&"));
@@ -97,7 +97,7 @@ public class DockBarEditorManager {
private void parseSelectedTabs(String[] selectedTabsTags) {
List<String> allTags = new ArrayList<>(Arrays.asList("tab_news", "tab_superapps", "tab_messages", "tab_feedback", "tab_profile",
"tab_friends", "tab_groups", "tab_photos", "tab_audios", "tab_videos", "tab_lives", "tab_games", "tab_liked",
"tab_fave", "tab_documents", "tab_payments", "tab_vk_apps", "tab_settings", "tab_menu"));
"tab_fave", "tab_documents", "tab_payments", "tab_vk_apps", "tab_settings"));
for (String tag : selectedTabsTags) {
mSelectedTabs.add(getTabByTag(tag));
@@ -260,13 +260,6 @@ public class DockBarEditorManager {
R.string.menu_apps,
R.id.menu_vk_apps,
AppsFragment.class);
case "tab_menu":
return DockBarTab.valuesOf(
"tab_menu",
milkshake() ? R.drawable.ic_user_circle_outline_28 : R.drawable.ic_menu_more_outline_28,
milkshake() ? R.string.profile : R.string.menu,
R.id.tab_menu,
milkshake() ? ProfileFragment.class : MenuFragment.class);
case "tab_settings":
default:
return DockBarTab.valuesOf(
@@ -9,7 +9,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import ru.vtosters.lite.ui.items.DockBarTab;
import ru.vtosters.lite.ui.items.SuperAppItem;
import ru.vtosters.lite.utils.AndroidUtils;
@@ -19,7 +19,7 @@ public class InstallGMS {
public static void alert(final Activity activity) {
if (!isGmsInstalled()) {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(getString("debug_warning"));
builder.setTitle(getString("warning"));
builder.setMessage(getString("gmsissuesumm"));
builder.setCancelable(false);
builder.setPositiveButton(getString("gmsissuebtn1"), (dialogInterface, i) -> edit().putBoolean("showAlertGms", false).apply());
@@ -8,7 +8,6 @@ import android.content.Context;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import com.vk.core.dialogs.alert.VkAlertDialog;
import ru.vtosters.lite.utils.AndroidUtils;
@@ -19,7 +19,7 @@ public class Start {
activity.requestPermissions(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 228);
}
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(getString("debug_warning"));
builder.setTitle(getString("warning"));
builder.setMessage(getWelcome());
builder.setCancelable(false);
// android.content.DialogInterface.OnClickListener
@@ -1,5 +1,7 @@
package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
@@ -15,7 +17,7 @@ import ru.vtosters.lite.ui.fragments.VKUIwrapper;
public class VKIDProtection {
public static void alert(final Activity activity) {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(activity);
builder.setTitle(getString("debug_warning"));
builder.setTitle(getString("warning"));
builder.setMessage(getString("vkidsumm"));
builder.setCancelable(false);
// android.content.DialogInterface.OnClickListener
@@ -23,7 +25,7 @@ public class VKIDProtection {
// android.content.DialogInterface.OnClickListener
builder.setNeutralButton(getString("vkiddisable"), (dialogInterface, i) -> {
edit().putBoolean("showAlertVkId", false).apply();
VKUIwrapper.setLink("https://id.vk.com/account");
VKUIwrapper.setLink((isAnyProxyEnabled() ? "https://id.vk.ru/account" : "https://" + getApi() + "/_/id.vk.ru/account"));
Intent a2 = new Navigator(VKUIwrapper.class).b(activity);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(a2);
@@ -22,8 +22,6 @@ import androidx.recyclerview.widget.RecyclerView;
import com.vtosters.lite.R;
import java.util.Objects;
import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
import ru.vtosters.lite.ui.components.DockBarEditorManager;
import ru.vtosters.lite.ui.components.ItemMovingCallback;
@@ -1,8 +1,10 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.copyright_post;
import android.content.Context;
@@ -12,6 +14,7 @@ import android.text.TextUtils;
import androidx.preference.Preference;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator;
import com.vk.newsfeed.NewsfeedSettingsFragment;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
@@ -34,6 +37,20 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
findPreference("spamfilters").setSummary(count(getPrefsValue("spamfilters")));
findPreference("sourcenamefilter").setSummary(count(getPrefsValue("sourcenamefilter")));
findPreference("linkfilter").setSummary(count(getPrefsValue("linkfilter")));
findPreference("whitelisted_ad_groups").setSummary(countSet("whitelisted_ad_groups"));
findPreference("whitelisted_filters_groups").setSummary(countSet("whitelisted_filters_groups"));
findPreference("whitelisted_ad_groups").setOnPreferenceClickListener(preference -> {
remdialog("whitelisted_ad_groups", getContext());
return true;
});
findPreference("whitelisted_filters_groups").setOnPreferenceClickListener(preference -> {
remdialog("whitelisted_filters_groups", getContext());
return true;
});
findPreference("newsfeedlistmanager").setOnPreferenceClickListener(preference -> {
NewsfeedListManager.callEditorPopup(getActivity());
return true;
@@ -59,6 +76,38 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
}
}
private void remdialog(String key, Context context) {
VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context);
builder.setTitle(AndroidUtils.getString("warning"));
builder.setMessage(AndroidUtils.getString("delete_elements_confirm"));
builder.setCancelable(false);
builder.setPositiveButton(AndroidUtils.getString("yes"), (dialogInterface, i) -> {
edit().remove(key).apply();
sendToast(AndroidUtils.getString("elements_deleted_success"));
});
builder.setNegativeButton(AndroidUtils.getString("cancel"), (dialogInterface, i) -> dialogInterface.dismiss());
builder.show();
}
private String countSet(String key) {
var set = getDefaultPrefs().getStringSet(key, null);
StringBuilder str = new StringBuilder();
if (set != null) {
for (var s : set) {
str.append(s).append(", ");
}
}
var count = str.toString().split(", ").length;
if (count < 1 || (str.length() == 0)) {
return AndroidUtils.getString("feed_no_elements");
} else {
return String.format(AndroidUtils.getString("feed_elements_count"), count);
}
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
findPreference("cringecopyright").setEnabled(!copyright_post());
@@ -1,6 +1,7 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.music.Scrobbler.isLoggedIn;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
@@ -244,7 +245,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
Thread thread = new Thread(() -> {
try {
var request = new Request.a()
.b("https://api.vk.com/method/" + "video.clearViewingHistoryRecords" + "?https=1" + "&access_token=" + getUserToken() + "&v=5.187")
.b("https://" + getApi() + "/method/" + "video.clearViewingHistoryRecords" + "?https=1" + "&access_token=" + getUserToken() + "&v=5.187")
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
.a();
@@ -1,12 +1,12 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.*;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
import static ru.vtosters.lite.utils.Preferences.autoalltranslate;
import static ru.vtosters.lite.utils.Preferences.vkme;
import static ru.vtosters.lite.utils.ThemesUtils.*;
import static ru.vtosters.lite.utils.ThemesUtils.recolorDrawable;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -22,12 +22,9 @@ import com.vk.navigation.Navigator;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import java.util.Arrays;
import java.util.Objects;
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
import ru.vtosters.lite.ui.wallpapers.WallpaperMenuFragment;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class MessagesFragment extends MaterialPreferenceToolbarFragment {
@Override
@@ -12,7 +12,6 @@ import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.CacheUtils.deleteCache;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.proxy.RandomProxy.setupNewProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
@@ -11,7 +10,7 @@ import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import java.io.IOException;
import ru.vtosters.lite.proxy.RandomProxy;
import ru.vtosters.lite.utils.AndroidUtils;
public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment {
@Override
@@ -22,7 +21,7 @@ public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment {
try {
setupNewProxy();
} catch (IOException e) {
sendToast("Ошибка при получении прокси");
sendToast(AndroidUtils.getString("get_proxy_error"));
}
return true;
});
@@ -14,7 +14,7 @@ public class VKPayFragment extends FragmentImpl {
}
public void start() {
VKUIwrapper.setLink("https://vk.com/vkpay");
VKUIwrapper.setLink("https://vk.ru/vkpay");
Intent a2 = new Navigator(VKUIwrapper.class).b(getActivity());
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a2);
@@ -183,7 +183,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}
if (!isGmsInstalled()) {
addPreference(this, "", AndroidUtils.getString("installgms"), "", "ic_warning_24", preference -> {
addPreference(this, "", AndroidUtils.getString("installgms"), "", "ic_about_outline_28", preference -> {
Context context = getContext();
Intent a2 = new Navigator(InstallGMSFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -330,7 +330,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
});
}
} else {
addPreference(this, "", AndroidUtils.getString("debug_warning"), AndroidUtils.getString("vkme_mode_info"), "ic_about_outline_28", preference -> false);
addPreference(this, "", AndroidUtils.getString("warning"), AndroidUtils.getString("vkme_mode_info"), "ic_about_outline_28", preference -> false);
}
addPreference(this, "", AndroidUtils.getString("vtlmedia"), mediasumm, "ic_media_outline_28", preference -> {
@@ -40,7 +40,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.vk.navigation.Navigator;
import java.io.File;
import java.util.Objects;
import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.ui.adapters.StickerPackAdapter;
@@ -1,7 +1,10 @@
package ru.vtosters.lite.ui.vkui;
import static ru.vtosters.lite.foaf.FoafBase.loadAndShow;
import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedAd;
import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedFilter;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserID;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.content.ClipData;
@@ -24,7 +27,7 @@ import java.util.Objects;
import kotlin.Unit;
import kotlin.jvm.b.Functions;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.hooks.NewsfeedHook;
import ru.vtosters.lite.utils.RenameTool;
public class MenuBuilder {
@@ -55,18 +58,17 @@ public class MenuBuilder {
try {
final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb);
final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext();
addItem(builder, AndroidUtils.getString("menu_copy_id"), () -> {
addItem(builder, getString("menu_copy_id"), () -> {
copy(ctx, String.valueOf(getUserID(eup)));
return Unit.a;
});
addItem(builder, AndroidUtils.getString("menu_addon_info"), () -> {
addItem(builder, getString("menu_addon_info"), () -> {
loadAndShow(ctx, getUserID(eup));
return Unit.a;
});
addItem(builder, AndroidUtils.getString("menu_change_name"), () -> {
addItem(builder, getString("menu_change_name"), () -> {
RenameTool.createDialog(eup, ctx);
return Unit.a;
});
@@ -80,17 +82,31 @@ public class MenuBuilder {
try {
final ExtendedCommunityProfile ecp = (ExtendedCommunityProfile) cfambObject.get(mb);
final Context ctx = ((View) apView.get(builder)).getContext();
final boolean isPageWhitelistedFilter = NewsfeedHook.isWhitelistedFilter(ecp);
final boolean isPageWhitelistedAds = NewsfeedHook.isWhitelistedAd(ecp);
addItem(builder, AndroidUtils.getString("menu_copy_id"), () -> {
addItem(builder, getString("menu_copy_id"), () -> {
copy(ctx, String.valueOf(getUserID(ecp)));
return Unit.a;
});
addItem(builder, AndroidUtils.getString("menu_change_name"), () -> {
addItem(builder, getString("menu_change_name"), () -> {
RenameTool.createDialogGroup(ecp, ctx);
return Unit.a;
});
addItem(builder, getString(isPageWhitelistedFilter ? "remove_from_filter_whitelist" : "add_to_filter_whitelist"), () -> {
setWhitelistedFilter(ecp, !isPageWhitelistedFilter);
sendToast(getString(isPageWhitelistedFilter ? "removed_from_whitelist_success" : "added_to_whitelist_success"));
return Unit.a;
});
addItem(builder, getString(isPageWhitelistedAds ? "remove_from_ads_whitelist" : "add_to_ads_whitelist"), () -> {
setWhitelistedAd(ecp, !isPageWhitelistedAds);
sendToast(getString(isPageWhitelistedAds ? "removed_from_whitelist_success" : "added_to_whitelist_success"));
return Unit.a;
});
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
@@ -101,7 +117,7 @@ public class MenuBuilder {
ClipData clip = ClipData.newPlainText("MBH-ST", txt);
clipboard.setPrimaryClip(clip);
sendToast(AndroidUtils.getString("menu_copied"));
sendToast(getString("menu_copied"));
}
public static void addItem(final ActionsPopup.b builder, final String title, final Functions onClick) throws InvocationTargetException, IllegalAccessException {
@@ -1,7 +1,9 @@
package ru.vtosters.lite.ui.wallpapers;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.removeWallpaper;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -12,6 +14,7 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import com.vk.medianative.MediaNative;
@@ -27,7 +30,23 @@ public class ImageFilters {
public static Drawable getFilteredDrawable(Drawable orig) {
if (orig == null) return null;
if (!(orig instanceof BitmapDrawable)) return orig;
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
Bitmap bm = ((BitmapDrawable) orig).getBitmap();
if (bm == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
Bitmap instance = bm.copy(Bitmap.Config.ARGB_8888, true);
if (instance == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
if (getPreferences().getBoolean("msg_invert", false)) {
instance = applyInvertEffect(instance);
@@ -60,7 +79,24 @@ public class ImageFilters {
try {
if (orig == null) return null;
if (!(orig instanceof BitmapDrawable)) return orig; // we need only BitmapDrawable
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
Bitmap bm = ((BitmapDrawable) orig).getBitmap();
if (bm == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
Bitmap instance = bm.copy(Bitmap.Config.ARGB_8888, true);
if (instance == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
MediaNative.blurBitmap(instance, radius);
return new BitmapDrawable(getResources(), instance);
} catch (Exception e) {
@@ -74,7 +110,24 @@ public class ImageFilters {
if (orig == null) return null;
if (!(orig instanceof BitmapDrawable)) return orig;
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
Bitmap bm = ((BitmapDrawable) orig).getBitmap();
if (bm == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
Bitmap instance = bm.copy(Bitmap.Config.ARGB_8888, true);
if (instance == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
String radius = getPreferences().getString("msg_mosaic", "disabled");
switch (radius) {
@@ -97,7 +150,24 @@ public class ImageFilters {
public static Drawable getDimmed(Drawable orig) {
if (orig == null) return null;
if (!(orig instanceof BitmapDrawable)) return orig;
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
Bitmap bm = ((BitmapDrawable) orig).getBitmap();
if (bm == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
Bitmap instance = bm.copy(Bitmap.Config.ARGB_8888, true);
if (instance == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
String radius = getPreferences().getString("msg_dim", "disabled");
switch (radius) {
case "dim_black":
@@ -111,7 +181,23 @@ public class ImageFilters {
public static Drawable getMonochrome(Drawable orig) {
if (orig == null) return null;
if (!(orig instanceof BitmapDrawable)) return orig;
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
Bitmap bm = ((BitmapDrawable) orig).getBitmap();
if (bm == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
Bitmap instance = bm.copy(Bitmap.Config.ARGB_8888, true);
if (instance == null) {
Log.d("Wallpaper", "bitmap null");
sendToast("Ошибка при установке фильтра. Сбрасываем настройки на по умолчанию");
removeWallpaper();
return orig;
}
Bitmap bwBitmap = Bitmap.createBitmap(instance.getWidth(), instance.getHeight(), Bitmap.Config.RGB_565);
float[] hsv = new float[3];
@@ -130,19 +216,27 @@ public class ImageFilters {
}
private static void darken(Bitmap bm) {
Canvas canvas = new Canvas(bm);
Paint p = new Paint(Color.RED);
ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); // darken
p.setColorFilter(filter);
canvas.drawBitmap(bm, new Matrix(), p);
try {
Canvas canvas = new Canvas(bm);
Paint p = new Paint(Color.RED);
ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); // darken
p.setColorFilter(filter);
canvas.drawBitmap(bm, new Matrix(), p);
} catch (Exception e) {
Log.d("WallpaperD", e.getMessage());
}
}
private static void lighten(Bitmap bm) {
Canvas canvas = new Canvas(bm);
Paint p = new Paint(Color.RED);
ColorFilter filter = new LightingColorFilter(0xFFFFFFFF, 0x00222222); // lighten
p.setColorFilter(filter);
canvas.drawBitmap(bm, new Matrix(), p);
try {
Canvas canvas = new Canvas(bm);
Paint p = new Paint(Color.RED);
ColorFilter filter = new LightingColorFilter(0xFFFFFFFF, 0x00222222); // lighten
p.setColorFilter(filter);
canvas.drawBitmap(bm, new Matrix(), p);
} catch (Exception e) {
Log.d("WallpaperL", e.getMessage());
}
}
public static Bitmap applyInvertEffect(Bitmap src) {
@@ -8,7 +8,6 @@ import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.removeWallpaper;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.requestUpdateWallpaper;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.CacheUtils.deleteCache;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.hasVerification;
@@ -158,6 +157,14 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
});
}
PreferencesUtil.addMaterialSwitchPreference(this, "compresswp", "Сжимать обои", "Значительно ускоряет открытие чатов", null, true, (preference, o) -> {
boolean value = (boolean) o;
edit().putBoolean("compresswp", value).commit();
requestUpdateWallpaper();
mWPPreviewPref.redraw();
return true;
});
ListPreference blur = (ListPreference) findPreference("msg_blur_radius");
ListPreference dim = (ListPreference) findPreference("msg_dim");
ListPreference mosaic = (ListPreference) findPreference("msg_mosaic");
@@ -8,20 +8,26 @@ import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getMonochrome;
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getMosaic;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.hasVerification;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class WallpapersHooks {
private static File mWallpaperFile;
@@ -30,28 +36,60 @@ public class WallpapersHooks {
private static boolean mUpdateWallpaperRequested = true;
public static File getWallpaperFile() {
return mWallpaperFile == null ? mWallpaperFile = compressFile(new File(getGlobalContext().getFilesDir(), "wallpaper.png")) : mWallpaperFile;
return mWallpaperFile == null ? mWallpaperFile = new File(getGlobalContext().getFilesDir(), "wallpaper.png") : mWallpaperFile;
}
public static File compressFile(File file) {
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
File compressedFile = new File(file.getParent(), file.getName());
OutputStream out = null;
private static Boolean eligibleWallpaperFile(File file) {
if (file.length() >= 6291456) {
sendToast("Размер файла превышает лимит 6 MB");
removeWallpaper();
return false;
} else {
return true;
}
}
public static File compress(File file){
try {
out = new FileOutputStream(compressedFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 95, out);
} catch (Exception e) {
e.printStackTrace();
} finally {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
o.inSampleSize = 6;
FileInputStream inputStream = new FileInputStream(file);
BitmapFactory.decodeStream(inputStream, null, o);
inputStream.close();
final int REQUIRED_SIZE=200;
int scale = 1;
while(o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) {
scale *= 2;
}
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
inputStream = new FileInputStream(file);
Bitmap selectedBitmap = BitmapFactory.decodeStream(inputStream, null, o2);
inputStream.close();
File outPutFile = File.createTempFile("wallpaper_temp","image");
outPutFile.deleteOnExit();
FileOutputStream outputStream = new FileOutputStream(outPutFile);
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
selectedBitmap.compress(Bitmap.CompressFormat.PNG, 85 , outputStream);
} catch (Exception e) {
Log.e("WallpapersCompression", e.getMessage());
}
outputStream.close();
return outPutFile;
} catch (Exception e) {
Log.d("Wallpapers", e.getMessage());
return file;
}
return compressedFile;
}
public static void setBg(View view) {
@@ -60,22 +98,43 @@ public class WallpapersHooks {
return;
}
((ImageView) view).setColorFilter(im_bg_chat); // set default bg color
view.setBackgroundColor(ThemesUtils.getColorFromAttr(im_bg_chat)); // set default bg color
}
public static String getWallpaperUrl() {
if (getWallpaperFile().exists())
return getWallpaperFile().getAbsolutePath();
else
return "default";
var file = getWallpaperFile();
if (file.exists() && eligibleWallpaperFile(file)) {
if (getBoolValue("compresswp", true)) {
return compress(file).getAbsolutePath();
} else {
return file.getAbsolutePath();
}
}
return "default";
}
public static Drawable getWallpaper() {
if (mWallpaper == null || mUpdateWallpaperRequested) {
String url = getWallpaperUrl();
if (url.equals("default") || url.isEmpty()) {
return null;
}
Drawable drawable = Drawable.createFromPath(getWallpaperUrl());
if (drawable == null || ((BitmapDrawable) drawable).getBitmap() == null) {
Log.d("Wallpaper", "drawable null");
removeWallpaper();
return null;
}
if (!getPreferences().getString("msg_blur_radius", "disabled").equals("disabled")) {
mWallpaper = getBlurredWallpaper(Drawable.createFromPath(getWallpaperUrl()), getRadius());
mWallpaper = getBlurredWallpaper(drawable, getRadius());
} else {
mWallpaper = Drawable.createFromPath(getWallpaperUrl());
mWallpaper = drawable;
}
if (!getPreferences().getString("msg_dim", "off").equals("off")) {
mWallpaper = getDimmed(mWallpaper);
@@ -13,9 +13,7 @@ import com.vk.im.ui.providers.audiomsg.ImAudioMsgPlayerProvider;
import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
import com.vk.imageloader.VKImageLoader;
import com.vk.media.player.cache.AutoPlayCacheHolder;
import com.vk.mediastore.MediaStorage;
import com.vk.stickers.Stickers;
import com.vtosters.lite.im.ImEngineProvider;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
@@ -25,6 +23,7 @@ import b.h.g.m.FileUtils;
public class CacheUtils {
private static CacheUtils sInstance = new CacheUtils();
public long size = 0;
public static boolean needToDelete = false;
public static CacheUtils getInstance() {
if (sInstance == null)
@@ -55,7 +54,7 @@ public class CacheUtils {
public void autoCleaningCache() {
size = IOUtils.getDirSize(getGlobalContext().getCacheDir());
if (size >= getSizeForDelete()) {
if (size >= getSizeForDelete() && needToDelete) {
if (dev()) sendToast(AndroidUtils.getString("cache_cleaned"));
VKImageLoader.e();
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
@@ -10,7 +10,6 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.RectF;
@@ -1,14 +1,15 @@
package ru.vtosters.lite.utils;
import static java.lang.Long.MAX_VALUE;
import static ru.vtosters.lite.proxy.ProxyUtils.setProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.CacheUtils.getInstance;
import static ru.vtosters.lite.utils.CacheUtils.needToDelete;
import static ru.vtosters.lite.utils.DeletedMessagesHandler.reloadMessagesList;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters;
import static ru.vtosters.lite.proxy.ProxyUtils.setProxy;
import static ru.vtosters.lite.utils.SignatureChecker.validateAppSignature;
import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme;
import static ru.vtosters.lite.utils.VTVerifications.isPrometheus;
@@ -362,16 +363,22 @@ public class Preferences {
public static long getSizeForDelete() {
switch (getPrefsValue("clearcache")) {
case "100mb":
needToDelete = true;
return 104857600L;
case "500mb":
needToDelete = true;
return 524288000L;
case "1gb":
needToDelete = true;
return 1073741824L;
case "2gb":
needToDelete = true;
return 2147483648L;
case "5gb":
needToDelete = true;
return 5368709120L;
default:
needToDelete = false;
return MAX_VALUE;
}
}
@@ -1,11 +1,11 @@
package ru.vtosters.lite.utils;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.About.getBuildNumber;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.vksans;
import static ru.vtosters.lite.proxy.ProxyUtils.isApiProxyEnabled;
import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme;
public class SSFSUtils {
@@ -39,7 +39,7 @@ public class SSFSUtils {
}
public static String getUserProxy() {
return isApiProxyEnabled() ? "1" : "0";
return isAnyProxyEnabled() ? "1" : "0";
}
public static String isVKSansEnabled() {
+71 -25
View File
@@ -960,6 +960,17 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="vk.ru"
android:pathPattern="/.*"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="vk.com"
android:pathPattern="/.*"
@@ -971,28 +982,6 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="vkontakte.ru"
android:pathPattern="/.*"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="new.vk.com"
android:pathPattern="/.*"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="vk.com"
android:pathPattern="/.*"
@@ -1007,6 +996,28 @@
<data
android:host="vkontakte.ru"
android:pathPattern="/.*"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="new.vk.ru"
android:pathPattern="/.*"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="vk.ru"
android:pathPattern="/.*"
android:scheme="https" />
</intent-filter>
<intent-filter>
@@ -1016,7 +1027,18 @@
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="new.vk.com"
android:host="vkontakte.ru"
android:pathPattern="/.*"
android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="new.vk.ru"
android:pathPattern="/.*"
android:scheme="https" />
</intent-filter>
@@ -1107,6 +1129,30 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<data
android:host="m.vk.ru"
android:pathPattern="/.*"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<data
android:host="m.vk.ru"
android:pathPattern="/.*"
android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<data
android:host="m.vk.com"
@@ -1132,7 +1178,7 @@
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="m.vk.com"
android:host="m.vk.ru"
android:pathPattern="/restore"
android:scheme="http" />
</intent-filter>
@@ -1143,7 +1189,7 @@
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="m.vk.com"
android:host="m.vk.ru"
android:pathPattern="/restore"
android:scheme="https" />
</intent-filter>
+1
View File
@@ -1,6 +1,7 @@
appscent
//t.me/
vk.com
vk.ru
apps-cent
app-cent
appcent
+3 -3
View File
@@ -394,12 +394,12 @@ function showPhotosBox(url, id, num, link){
<div class="wk_text" style="max-width: 604px">
<div class="header">
<div style="float: left;">
<a href="https://vk.com/club{GROUP_ID}">
<a href="https://vk.ru/club{GROUP_ID}">
<img src="{GROUP_PHOTO}" width="50" height="50" border="0"/>
</a>
</div>
<div class="headGroupName">
<a href="https://vk.com/club{GROUP_ID}">{GROUP_NAME}</a>
<a href="https://vk.ru/club{GROUP_ID}">{GROUP_NAME}</a>
</div>
<div class="headOrigLink">
{L_PREVIEW} <a href="http://{ORIG_URL}">{ORIG_URL}</a>
@@ -412,7 +412,7 @@ function showPhotosBox(url, id, num, link){
<div class="footer">
{L_SOURCE} <a href="http://{ORIG_URL}">{ORIG_URL}</a><br/>
{DATE} - {VIEWS}<br/>
<a href="https://vk.com/id{PROFILE_ID}">{L_GO_TO_GROUP}</a>
<a href="https://vk.ru/id{PROFILE_ID}">{L_GO_TO_GROUP}</a>
</div>
</div>
</body>
+1 -1
View File
@@ -85,7 +85,7 @@
android:layout_height="wrap_content"
android:background="@null"
android:padding="0.0dip"
android:text="https://vk.com/"
android:text="https://vk.ru/"
android:textColor="#ffb8b8b8" />
<EditText
+1 -1
View File
@@ -46,7 +46,7 @@
android:id="@id/domain_current_link"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="https://vk.com/durov"
android:text="https://vk.ru/durov"
android:textColor="?accent"
android:textSize="14.0dip" />
</LinearLayout>
+6 -6
View File
@@ -454,7 +454,7 @@ resultados"</string>
<string name="collection_add_selection">Añadir a la transmisión en vivo</string>
<string name="collection_add_to_stream">Añadir a la transmisión en vivo</string>
<string name="collection_add_wall_to_list_hint">Selecciona una publicación de tu muro que quieras compartir con tus espectadores </string>
<string name="collection_link_add_link_input_hint">https://vk.com</string>
<string name="collection_link_add_link_input_hint">https://vk.ru</string>
<string name="collection_link_limit">Límite de enlaces alcanzado</string>
<string name="collection_link_not_valid">URL no compatible</string>
<string name="collection_links_list">Lista de enlaces</string>
@@ -1086,7 +1086,7 @@ y organízalo con la ayuda de etiquetas"</string>
<string name="friends_recommendations_gmail">Gmail</string>
<string name="friends_recommendations_invete_by_link">Invitar vía enlace</string>
<string name="friends_recommendations_invite">Invitar</string>
<string name="friends_recommendations_invite_message">¡Únete a mí en VK! http://vk.com/join</string>
<string name="friends_recommendations_invite_message">¡Únete a mí en VK! http://vk.ru/join</string>
<string name="friends_recommendations_locator_text">Para ver amigos cercanos, pídeles que abran esta pantalla en sus dispositivos</string>
<string name="friends_recommendations_ok">OK</string>
<string name="friends_recommendations_request_done">Sois amigos</string>
@@ -1368,7 +1368,7 @@ menos frecuentemente"</string>
<string name="identity_address">Dirección</string>
<string name="identity_address_dat">dirección</string>
<string name="identity_custom_label">Personalizado</string>
<string name="identity_desc">Puede introducir tu información aquí para que las mini apps de [https://vk.com/services|catalog] puedan usarla para configurar la entrega o contactarte</string>
<string name="identity_desc">Puede introducir tu información aquí para que las mini apps de [https://vk.ru/services|catalog] puedan usarla para configurar la entrega o contactarte</string>
<string name="identity_email">Сorreo electrónico</string>
<string name="identity_email_dat">dirección de correo electrónico</string>
<string name="identity_label">Categoría</string>
@@ -1398,7 +1398,7 @@ menos frecuentemente"</string>
<string name="include_community">Activar notificaciones</string>
<string name="installed_games_title">Mis juegos</string>
<string name="invalid_date">Fecha de publicación no válida</string>
<string name="invitation">¡Vamos a conectar en VK! Únete aquí: http://vk.com/join</string>
<string name="invitation">¡Vamos a conectar en VK! Únete aquí: http://vk.ru/join</string>
<string name="invitation_declined">Invitación rechazada.</string>
<string name="invitation_sent">Tu invitación ha sido enviada.</string>
<string name="invite">Invitar</string>
@@ -3268,7 +3268,7 @@ cámara VK"</string>
<string name="serv_user_returned_m">%1$s regresó a este chat</string>
<string name="service_account_admin_100_info">"Este perfil sólo se usa para notificaciones personales.
Para ayuda o información, contacta con nuestro [https://vk.com/support|Equipo de Soporte.]"</string>
Para ayuda o información, contacta con nuestro [https://vk.ru/support|Equipo de Soporte.]"</string>
<string name="service_account_admin_101_info">Esta página se usa para proporcionar compatibilidad con versiones anteriores para comentarios de las comunidades.</string>
<string name="service_account_mobile_info">Este es el perfil oficial del soporte móvil VK.</string>
<string name="sett_accept_calls">Activar</string>
@@ -5253,7 +5253,7 @@ con vídeo"</string>
<string name="votes_your_balance">Tu saldo</string>
<string name="wall">Muro</string>
<string name="wall_all_posts">Todas las entradas</string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Comentario para &lt;/font>&lt;a href=\"vklink://view/?http://vk.com/wall%1$d_%2$d\">entrada&lt;/a></string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Comentario para &lt;/font>&lt;a href=\"vklink://view/?http://vk.ru/wall%1$d_%2$d\">entrada&lt;/a></string>
<string name="wall_disabled">Muro desactivado</string>
<string name="wall_empty">Aún no hay entradas aquí</string>
<string name="wall_empty_my">Aún no has publicado nada</string>
+6 -6
View File
@@ -448,7 +448,7 @@
<string name="collection_add_selection">Трансляцияға бекіту</string>
<string name="collection_add_to_stream">Эфирге қосу</string>
<string name="collection_add_wall_to_list_hint">Парақшаңыздан көрермендермен бөлісетін жазба таңдаңыз</string>
<string name="collection_link_add_link_input_hint">https://vk.com</string>
<string name="collection_link_add_link_input_hint">https://vk.ru</string>
<string name="collection_link_limit">Осыдан әрі сілтеме қосуға болмайды, сіз шекке жеттіңіз</string>
<string name="collection_link_not_valid">Сілтеме қолдаулы емес</string>
<string name="collection_links_list">Сілтемелер тізімі</string>
@@ -1054,7 +1054,7 @@
<string name="friends_recommendations_gmail">Gmail</string>
<string name="friends_recommendations_invete_by_link">Сілтеме бойынша шақыру</string>
<string name="friends_recommendations_invite">Шақыру</string>
<string name="friends_recommendations_invite_message">VK-да дос болайық! http://vk.com/join</string>
<string name="friends_recommendations_invite_message">VK-да дос болайық! http://vk.ru/join</string>
<string name="friends_recommendations_locator_text">Қасыңыздағы адамдарды көру үшін олардан өз құрылғыларынан осы экранға кіруді сұраңыз</string>
<string name="friends_recommendations_ok">ОК</string>
<string name="friends_recommendations_request_done">Доссыздар</string>
@@ -1335,7 +1335,7 @@
<string name="identity_address">Мекенжай</string>
<string name="identity_address_dat">мекенжай</string>
<string name="identity_custom_label">Өз категория</string>
<string name="identity_desc">Сіз деректерді бір-ақ рет толтырып келесіде [https://vk.com/services|топтамадағы] мини-қосымшаларға ол деректерді тез бере алатын боласыз</string>
<string name="identity_desc">Сіз деректерді бір-ақ рет толтырып келесіде [https://vk.ru/services|топтамадағы] мини-қосымшаларға ол деректерді тез бере алатын боласыз</string>
<string name="identity_email">Электрондық пошта</string>
<string name="identity_email_dat">электрондық пошта мекенжайы</string>
<string name="identity_label">Категория</string>
@@ -1365,7 +1365,7 @@
<string name="include_community">Бірлестік қосу</string>
<string name="installed_games_title">Ойындарым</string>
<string name="invalid_date">Жариялау күні дұрыс емес</string>
<string name="invitation">VK-да дос болайық! http://vk.com/join</string>
<string name="invitation">VK-да дос болайық! http://vk.ru/join</string>
<string name="invitation_declined">Шақыру қабылданбады.</string>
<string name="invitation_sent">Шақыру жіберілді.</string>
<string name="invite">Шақыру</string>
@@ -3221,7 +3221,7 @@
<string name="serv_user_returned_m">%1$s әңгімеге қайтып оралды</string>
<string name="service_account_admin_100_info">"Профиль тек жеке мәлімдемелерге пайдаланылады.
Кез келген сұрықтарыңыз болса [https://vk.com/support|Жәрдемге] жазыңыз."</string>
Кез келген сұрықтарыңыз болса [https://vk.ru/support|Жәрдемге] жазыңыз."</string>
<string name="service_account_admin_101_info">Парақша пікірлер қызметінің кері үйлесімділік үшін пайдаланылады.</string>
<string name="service_account_mobile_info">VK мобильді жәрдемнің ресми парақшасы.</string>
<string name="sett_accept_calls">Қосу</string>
@@ -5201,7 +5201,7 @@ https://vk.me"</string>
<string name="votes_your_balance">Теңгеріміңіз</string>
<string name="wall">Қабырға</string>
<string name="wall_all_posts">Барлық жазбалар</string>
<string name="wall_comment_repost">&lt;a href=\"vklink://view/?http://vk.com/wall%1$d_%2$d\">жазбаға&lt;/a>&lt;font color=\"#aaaaaa\"> пікір&lt;/font></string>
<string name="wall_comment_repost">&lt;a href=\"vklink://view/?http://vk.ru/wall%1$d_%2$d\">жазбаға&lt;/a>&lt;font color=\"#aaaaaa\"> пікір&lt;/font></string>
<string name="wall_disabled">Қабырған өшірулі</string>
<string name="wall_empty">Әзірше жазба жоқ</string>
<string name="wall_empty_my">Әзірше жазба жоқ</string>
+6 -6
View File
@@ -454,7 +454,7 @@ resultados"</string>
<string name="collection_add_selection">Anexar a transmissão</string>
<string name="collection_add_to_stream">Adicionar a transmissão</string>
<string name="collection_add_wall_to_list_hint">Escolha o recado de sua página que deseja compartilhar com seus espectadores</string>
<string name="collection_link_add_link_input_hint">https://vk.com</string>
<string name="collection_link_add_link_input_hint">https://vk.ru</string>
<string name="collection_link_limit">Você atingiu o número máximo de links</string>
<string name="collection_link_not_valid">Link não suportado</string>
<string name="collection_links_list">Lista de links</string>
@@ -1058,7 +1058,7 @@ e utilize as etiquetas para o sortear"</string>
<string name="friends_recommendations_gmail">Gmail</string>
<string name="friends_recommendations_invete_by_link">Convidar por link</string>
<string name="friends_recommendations_invite">Convidar</string>
<string name="friends_recommendations_invite_message">Vamos ser amigos no VK! http://vk.com/join</string>
<string name="friends_recommendations_invite_message">Vamos ser amigos no VK! http://vk.ru/join</string>
<string name="friends_recommendations_locator_text">Para ver as pessoas que estão perto, peça-lhes para abrir a mesma tela no dispositivo deles</string>
<string name="friends_recommendations_ok">OK</string>
<string name="friends_recommendations_request_done">Vocês são amigos</string>
@@ -1338,7 +1338,7 @@ menos frequência"</string>
<string name="identity_address">Endereço</string>
<string name="identity_address_dat">endereço</string>
<string name="identity_custom_label">Minha categoria</string>
<string name="identity_desc">Adicione suas informações para o preenchimento automático pelos mini apps do [https://vk.com/services|catálogo] em caso da entrega de produtos ou para contatar você</string>
<string name="identity_desc">Adicione suas informações para o preenchimento automático pelos mini apps do [https://vk.ru/services|catálogo] em caso da entrega de produtos ou para contatar você</string>
<string name="identity_email">Email</string>
<string name="identity_email_dat">email</string>
<string name="identity_label">Categoria</string>
@@ -1368,7 +1368,7 @@ menos frequência"</string>
<string name="include_community">Conectar comunidade</string>
<string name="installed_games_title">Meus jogos</string>
<string name="invalid_date">Data de publicação invalida</string>
<string name="invitation">Vamos conectar ao VK! Participe aqui: http://vk.com/join</string>
<string name="invitation">Vamos conectar ao VK! Participe aqui: http://vk.ru/join</string>
<string name="invitation_declined">Convite recusado.</string>
<string name="invitation_sent">Convite enviado.</string>
<string name="invite">Convidar</string>
@@ -3236,7 +3236,7 @@ com a câmera do VK"</string>
<string name="serv_user_returned_m">%1$s voltou a este bate-papo</string>
<string name="service_account_admin_100_info">"O perfil é usado somente para as notificações pessoais.
Para ajuda ou informações, contate nossa [https://vk.com/support|equipe de Supporte.]"</string>
Para ajuda ou informações, contate nossa [https://vk.ru/support|equipe de Supporte.]"</string>
<string name="service_account_admin_101_info">Esta página é utilizada para fornecer a compatibilidade para os comentários deixados em nome da comunidade.</string>
<string name="service_account_mobile_info">Este é o perfil oficial do Suporte móvel do VK.</string>
<string name="sett_accept_calls">Habilitar</string>
@@ -5219,7 +5219,7 @@ com vídeo"</string>
<string name="votes_your_balance">Seu saldo</string>
<string name="wall">Mural</string>
<string name="wall_all_posts">Todos os recados</string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Comentar para &lt;/font>&lt;a href=\"vklink://view/?http://vk.com/wall%1$d_%2$d\">post&lt;/a></string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Comentar para &lt;/font>&lt;a href=\"vklink://view/?http://vk.ru/wall%1$d_%2$d\">post&lt;/a></string>
<string name="wall_disabled">Mural desabilitado</string>
<string name="wall_empty">Ainda não há publicações aqui</string>
<string name="wall_empty_my">Ainda não tem recados</string>
+30 -13
View File
@@ -462,7 +462,7 @@
<string name="collection_add_selection">Прикрепить к трансляции</string>
<string name="collection_add_to_stream">Добавить в эфир</string>
<string name="collection_add_wall_to_list_hint">Выберите запись со своей страницы, которой Вы хотите поделиться со зрителями</string>
<string name="collection_link_add_link_input_hint">https://vk.com</string>
<string name="collection_link_add_link_input_hint">https://vk.ru</string>
<string name="collection_link_limit">Добавлено максимально возможное количество ссылок</string>
<string name="collection_link_not_valid">Ссылка не поддерживается</string>
<string name="collection_links_list">Список ссылок</string>
@@ -1113,7 +1113,7 @@
<string name="friends_recommendations_gmail">Gmail</string>
<string name="friends_recommendations_invete_by_link">Пригласить по ссылке</string>
<string name="friends_recommendations_invite">Пригласить</string>
<string name="friends_recommendations_invite_message">Приглашаю дружить ВКонтакте! http://vk.com/join</string>
<string name="friends_recommendations_invite_message">Приглашаю дружить ВКонтакте! http://vk.ru/join</string>
<string name="friends_recommendations_locator_text">Чтобы увидеть людей рядом, попросите их зайти на этот экран со своих устройств</string>
<string name="friends_recommendations_ok">OK</string>
<string name="friends_recommendations_request_done">Вы друзья</string>
@@ -1395,7 +1395,7 @@
<string name="identity_address">Адрес</string>
<string name="identity_address_dat">адрес</string>
<string name="identity_custom_label">Своя категория</string>
<string name="identity_desc">Вы можете указать данные один раз и быстро предоставлять мини-приложениям из [https://vk.com/services|каталога] — для доставки товаров или связи с Вами</string>
<string name="identity_desc">Вы можете указать данные один раз и быстро предоставлять мини-приложениям из [https://vk.ru/services|каталога] — для доставки товаров или связи с Вами</string>
<string name="identity_email">Электронная почта</string>
<string name="identity_email_dat">адрес электронной почты</string>
<string name="identity_label">Категория</string>
@@ -1425,7 +1425,7 @@
<string name="include_community">Подключить сообщество</string>
<string name="installed_games_title">Мои игры</string>
<string name="invalid_date">Неверная дата публикации</string>
<string name="invitation">Приглашаю дружить ВКонтакте! http://vk.com/join</string>
<string name="invitation">Приглашаю дружить ВКонтакте! http://vk.ru/join</string>
<string name="invitation_declined">Приглашение отклонено.</string>
<string name="invitation_sent">Приглашение отправлено.</string>
<string name="invite">Пригласить</string>
@@ -3310,7 +3310,7 @@
<string name="serv_user_returned_m">%1$s вернулся в беседу</string>
<string name="service_account_admin_100_info">"Профиль используется только для персональных оповещений.
По любым вопросам пишите в [https://vk.com/support|Поддержку.]"</string>
По любым вопросам пишите в [https://vk.ru/support|Поддержку.]"</string>
<string name="service_account_admin_101_info">Страница используется для обратной совместимости сервиса комментариев от имени сообщества.</string>
<string name="service_account_mobile_info">Официальная страница мобильной поддержки ВКонтакте.</string>
<string name="sett_accept_calls">Включить</string>
@@ -5300,7 +5300,7 @@
<string name="votes_your_balance">Ваш баланс</string>
<string name="wall">Стена</string>
<string name="wall_all_posts">Все записи</string>
<string name="wall_comment_repost">&lt;font color=#aaaaaa>Комментарий к &lt;/font>&lt;a href=vklink://view/?http://vk.com/wall%1$d_%2$d>записи&lt;/a></string>
<string name="wall_comment_repost">&lt;font color=#aaaaaa>Комментарий к &lt;/font>&lt;a href=vklink://view/?http://vk.ru/wall%1$d_%2$d>записи&lt;/a></string>
<string name="wall_disabled">Стена выключена</string>
<string name="wall_empty">Здесь пока нет записей</string>
<string name="wall_empty_my">У Вас пока нет записей</string>
@@ -5414,7 +5414,7 @@
<string name="gms_download_microg">Скачать MicroG</string>
<string name="gms_what_to_do_next">Что делать дальше?</string>
<string name="gms_what_to_do_after_microg_title">Что делать после установки MicroG?</string>
<string name="gms_what_to_do_after_microg_summ">Обновите регистрацию Firebase в настройках в разделе "Другое"</string>
<string name="gms_what_to_do_after_microg_summ">1. Войдите в свой Google аккаунт \n2. Разрешите VTLite получать уведомления\n3. Обновите регистрацию Firebase в настройках в разделе "Другое"</string>
<string name="donate">Помочь проекту</string>
<string name="fulltime">dd MMMM yyyy в HH:mm:ss</string>
<string name="fulltime2">dd MMMM в HH:mm:ss</string>
@@ -5591,8 +5591,6 @@
<string name="otaupd">Обновить</string>
<string name="otaupdavalible">Доступно обновление!</string>
<string name="otaupdchanges">Список изменений</string>
<string name="otawarning">Внимание!</string>
<string name="otawarnwait">Пожалуйста, не закрывайте приложение до окончания загрузки обновления</string>
<string name="privacy_vtl">Приватность</string>
<string name="proxyadvsettings">Расширенные настройки прокси</string>
<string name="proxyapi">API Домен</string>
@@ -5600,7 +5598,6 @@
<string name="proxydonate">Донат</string>
<string name="proxyhttp">HTTP Прокси</string>
<string name="proxyhttps">HTTPS Прокси</string>
<string name="proxyimpinfo">Внимание!</string>
<string name="proxyimpinfosum">"Не используйте прокси если ВК не заблокирован в вашей стране
Для применения изменений необходимо перезапустить приложение"</string>
@@ -5749,7 +5746,6 @@
<string name="activity_dnw_summary">Функция позволяет вам не отправлять статус вашего набора/написания сообщения</string>
<string name="activity_dns_summary">Функция позволяет вам не отправлять статус просмотра вами историй</string>
<string name="activity_dnr_warn">Внимание!</string>
<string name="activity_dnr_visual">Визуально может работать некорректно (сообщение прочиталось локально), но у собеседника оно прочитано не будет</string>
<string name="activity_undel">Анти-удаление сообщений</string>
@@ -5793,7 +5789,7 @@
<string name="debug_no_toggles">Значения toggles не были получены с сервера</string>
<string name="debug_warning">Внимание!</string>
<string name="warning">Внимание!</string>
<string name="debug_warning_summary">Данное меню предназначено только для тестирования работоспособности приложения. Если вы являетесь рядовым юзером, то вам не следует ничего не трогать в данных настройках (пожалуйста)</string>
<string name="debug_show_settings_item">Показывать пункт дебага в настройках</string>
@@ -5891,7 +5887,7 @@
<string name="DNR_ON">Включить нечиталку</string>
<string name="DNR_OFF">Отключить нечиталку</string>
<string name="vtl_crashed">Произошла ошибка в работе Vtosters!</string>
<string name="vtl_crashed">Произошла ошибка в работе VTLite!</string>
<string name="vtl_crash_upload">Загрузить логи</string>
<string name="vtl_crash_save">Сохранить в файл</string>
@@ -6169,4 +6165,25 @@
<string name="denial_of_responsibility_proxy_summ">Разработчики клиента VTLite не несут никакой ответственности за работу и безопасность использования сторонних прокси-серверов \n\nИспользуйте на свой страх и риск</string>
<string name="altervika_title">Альтернативный домен VikaMobile</string>
<string name="proxy_setup_title">Установить прокси</string>
<string name="proxy_setup_summ">Получение стороннего прокси из поддерживаемых списков прокси</string>
<string name="proxy_setup_success">Прокси установлен, хост:</string>
<string name="delete_elements_confirm">Вы действительно хотите удалить все элементы из списка?</string>
<string name="elements_deleted_success">Список элементов успешно очищен</string>
<string name="get_proxy_error">Ошибка при получении прокси</string>
<string name="add_to_filter_whitelist">Добавить в вайтлист фильтров</string>
<string name="remove_from_filter_whitelist">Удалить из вайтлиста фильтров</string>
<string name="add_to_ads_whitelist">Добавить в вайтлист рекламы</string>
<string name="remove_from_ads_whitelist">Удалить из вайтлиста рекламы</string>
<string name="removed_from_whitelist_success">Группа удалена из вайтлиста</string>
<string name="added_to_whitelist_success">Группа добавлена в вайтлист</string>
<string name="whitelisted_ad_groups_title">Вайтлист рекламы</string>
<string name="whitelisted_filters_groups_title">Вайтлист фильтров</string>
<string name="download_dl">Скачать диалог</string>
<string name="download_dl_error">Произошла ошибка при попытке скачать диалог</string>
</resources>
+6 -6
View File
@@ -455,7 +455,7 @@
<string name="collection_add_selection">Прикріпити до трансляції</string>
<string name="collection_add_to_stream">Додати до ефіру</string>
<string name="collection_add_wall_to_list_hint">Виберіть запис зі своєї сторінки, яким Ви хочете поділитися з глядачами</string>
<string name="collection_link_add_link_input_hint">https://vk.com</string>
<string name="collection_link_add_link_input_hint">https://vk.ru</string>
<string name="collection_link_limit">Додано максимально можливу кількість посилань</string>
<string name="collection_link_not_valid">Посилання не підтримується</string>
<string name="collection_links_list">Список посилань</string>
@@ -1058,7 +1058,7 @@
<string name="friends_recommendations_gmail">Gmail</string>
<string name="friends_recommendations_invete_by_link">Запросити за посиланням</string>
<string name="friends_recommendations_invite">Запросити</string>
<string name="friends_recommendations_invite_message">Запрошую дружити VK! http://vk.com/join</string>
<string name="friends_recommendations_invite_message">Запрошую дружити VK! http://vk.ru/join</string>
<string name="friends_recommendations_locator_text">Щоб побачити людей, що поруч, попросіть їх зайти на цей екран зі своїх пристроїв</string>
<string name="friends_recommendations_ok">OK</string>
<string name="friends_recommendations_request_done">Ви друзі</string>
@@ -1340,7 +1340,7 @@
<string name="identity_address">Адреса</string>
<string name="identity_address_dat">адреса</string>
<string name="identity_custom_label">Своя категорія</string>
<string name="identity_desc">Ви можете вказати дані один раз і швидко надавати міні-додаткам з [https://vk.com/services|каталогу] — для доставки товарів або зв‘язку з Вами</string>
<string name="identity_desc">Ви можете вказати дані один раз і швидко надавати міні-додаткам з [https://vk.ru/services|каталогу] — для доставки товарів або зв‘язку з Вами</string>
<string name="identity_email">Електронна пошта</string>
<string name="identity_email_dat">адреса електронної пошти</string>
<string name="identity_label">Категорія</string>
@@ -1370,7 +1370,7 @@
<string name="include_community">Підключити спільноту</string>
<string name="installed_games_title">Мої ігри</string>
<string name="invalid_date">Невірна дата публікації</string>
<string name="invitation">Запрошую дружити ВКонтакті! http://vk.com/join</string>
<string name="invitation">Запрошую дружити ВКонтакті! http://vk.ru/join</string>
<string name="invitation_declined">Запрошення відхилено.</string>
<string name="invitation_sent">Запрошення надіслано.</string>
<string name="invite">Запросити</string>
@@ -3242,7 +3242,7 @@
<string name="serv_user_returned_m">%1$s повернувся в бесіду</string>
<string name="service_account_admin_100_info">"Профіль використовується лише для персональних сповіщень.
З будь-яких питань пишіть в [https://vk.com/support|Підтримку.]"</string>
З будь-яких питань пишіть в [https://vk.ru/support|Підтримку.]"</string>
<string name="service_account_admin_101_info">Сторінка використовується для забезпечення сумісності сервісу коментарів від імені спільноти.</string>
<string name="service_account_mobile_info">Офіційна сторінка мобільної підтримки VK.</string>
<string name="sett_accept_calls">Увімкнути</string>
@@ -5228,7 +5228,7 @@
<string name="votes_your_balance">Ваш баланс</string>
<string name="wall">Стіна</string>
<string name="wall_all_posts">Всі записи</string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Коментар до &lt;/font>&lt;a href=\"vklink://view/?http://vk.com/wall%1$d_%2$d\">записи&lt;/a></string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Коментар до &lt;/font>&lt;a href=\"vklink://view/?http://vk.ru/wall%1$d_%2$d\">записи&lt;/a></string>
<string name="wall_disabled">Стіну вимкнено</string>
<string name="wall_empty">Тут поки немає записів</string>
<string name="wall_empty_my">У Вас поки немає записів</string>
+2
View File
@@ -160,6 +160,7 @@
<item name="im_ic_voip_call_video">@drawable/vkui_ic_voip_call_video_24</item>
<item name="im_ic_write_msg">@drawable/ic_add_24</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_48</item>
<item name="im_ic_msgdl">@drawable/ic_download_24</item>
<item name="im_msg_avatar_margin_top">1.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">6.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">6.0dip</item>
@@ -234,6 +235,7 @@
<item name="im_ic_voip_call_video">@drawable/ic_videocam_28_outline</item>
<item name="im_ic_write_msg">@drawable/ic_add_24</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_48</item>
<item name="im_ic_msgdl">@drawable/ic_download_24</item>
<item name="im_msg_avatar_margin_top">3.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">0.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">8.0dip</item>
+1 -1
View File
@@ -741,7 +741,7 @@
<item>liked</item>
</string-array>
<string-array name="proxy">
<item>No Proxy</item>
<item>No proxy</item>
<item>zaborona.help</item>
<item>VikaMobile</item>
<item>Random proxy</item>
+1
View File
@@ -2509,4 +2509,5 @@
<attr name="yesNoPreferenceStyle" format="reference" />
<attr name="zOrderOnTop" format="boolean" />
<attr name="im_ic_msgreload" format="reference" />
<attr name="im_ic_msgdl" format="reference" />
</resources>
+31 -14
View File
@@ -267,7 +267,7 @@
<string name="article_subscribers_formatted">%s followers</string>
<string name="article_view_count_formatted">%s views</string>
<string name="articles">Articles</string>
<string name="asset_statements">[ { \"include\": \"https://vk.com/.well-known/assetlinks.json\" }, { \"relation\":[ \"delegate_permission/common.handle_all_urls\" ], \"target\":{ \"namespace\":\"web\", \"site\":\"https://vk.com\" } }, { \"relation\":[ \"delegate_permission/common.handle_all_urls\" ], \"target\":{ \"namespace\":\"web\", \"site\":\"https://m.vk.com\" } } ]</string>
<string name="asset_statements">[ { \"include\": \"https://vk.ru/.well-known/assetlinks.json\" }, { \"relation\":[ \"delegate_permission/common.handle_all_urls\" ], \"target\":{ \"namespace\":\"web\", \"site\":\"https://vk.ru\" } }, { \"relation\":[ \"delegate_permission/common.handle_all_urls\" ], \"target\":{ \"namespace\":\"web\", \"site\":\"https://m.vk.ru\" } } ]</string>
<string name="attach">Add</string>
<string name="attach_action_link_successed">Link added</string>
<string name="attach_album">Album</string>
@@ -485,7 +485,7 @@ no results"</string>
<string name="collection_add_selection">Attach to live stream</string>
<string name="collection_add_to_stream">Add to live stream</string>
<string name="collection_add_wall_to_list_hint">Select a post from your wall that you want to share with your viewers</string>
<string name="collection_link_add_link_input_hint">https://vk.com</string>
<string name="collection_link_add_link_input_hint">https://vk.ru</string>
<string name="collection_link_limit">Link limit reached</string>
<string name="collection_link_not_valid">URL not supported</string>
<string name="collection_links_list">Link list</string>
@@ -1171,7 +1171,7 @@ and organize it with the help of tags"</string>
<string name="friends_recommendations_gmail">Gmail</string>
<string name="friends_recommendations_invete_by_link">Invite by link</string>
<string name="friends_recommendations_invite">Invite</string>
<string name="friends_recommendations_invite_message">Join me on VK! http://vk.com/join</string>
<string name="friends_recommendations_invite_message">Join me on VK! http://vk.ru/join</string>
<string name="friends_recommendations_locator_text">To find friends nearby, ask them to open this screen on their devices</string>
<string name="friends_recommendations_ok">OK</string>
<string name="friends_recommendations_request_done">You are friends</string>
@@ -1460,7 +1460,7 @@ less often."</string>
<string name="identity_address">Address</string>
<string name="identity_address_dat">address</string>
<string name="identity_custom_label">Custom</string>
<string name="identity_desc">You can enter your information here so that mini apps from the [https://vk.com/services|catalog] can use it to set up delivery or contact you</string>
<string name="identity_desc">You can enter your information here so that mini apps from the [https://vk.ru/services|catalog] can use it to set up delivery or contact you</string>
<string name="identity_email">Email</string>
<string name="identity_email_dat">email address</string>
<string name="identity_label">Category</string>
@@ -1490,7 +1490,7 @@ less often."</string>
<string name="include_community">Add community</string>
<string name="installed_games_title">My games</string>
<string name="invalid_date">Invalid posting date</string>
<string name="invitation">Join me on VK! http://vk.com/join</string>
<string name="invitation">Join me on VK! http://vk.ru/join</string>
<string name="invitation_declined">Invitation declined.</string>
<string name="invitation_sent">Your invitation has been sent.</string>
<string name="invite">Invite</string>
@@ -3405,7 +3405,7 @@ the VK camera"</string>
<string name="serv_user_returned_m">%1$s returned to the chat</string>
<string name="service_account_admin_100_info">"This profile is only used for personal notifications.
If you have any questions, please contact [https://vk.com/support|Support.]"</string>
If you have any questions, please contact [https://vk.ru/support|Support.]"</string>
<string name="service_account_admin_101_info">This page is used to provide backward compatibility for comments by communities.</string>
<string name="service_account_mobile_info">This is the official profile of VK Mobile Support.</string>
<string name="sett_accept_calls">Enable</string>
@@ -5430,7 +5430,7 @@ with video"</string>
<string name="votes_your_balance">Your balance</string>
<string name="wall">Wall</string>
<string name="wall_all_posts">All posts</string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Comment on &lt;/font>&lt;a href=\"vklink://view/?http://vk.com/wall%1$d_%2$d\">post&lt;/a></string>
<string name="wall_comment_repost">&lt;font color=\"#aaaaaa\">Comment on &lt;/font>&lt;a href=\"vklink://view/?http://vk.ru/wall%1$d_%2$d\">post&lt;/a></string>
<string name="wall_disabled">Wall disabled</string>
<string name="wall_empty">No posts here yet</string>
<string name="wall_empty_my">"You haven't posted anything yet"</string>
@@ -5548,7 +5548,7 @@ Filters are not case-sensitive!"</string>
<string name="gms_download_microg">Download MicroG</string>
<string name="gms_what_to_do_next">What to do next?</string>
<string name="gms_what_to_do_after_microg_title">What to do after installing MicroG?</string>
<string name="gms_what_to_do_after_microg_summ">Update Firebase registration in Other settings</string>
<string name="gms_what_to_do_after_microg_summ">1. Log in to your Google account \n2. Allow VTLite to receive notifications\n3. Update Firebase registration in Other settings</string>
<string name="donate">Donate</string>
<string name="fulltime">dd MMMM yyyy HH:mm:ss</string>
<string name="fulltime2">dd MMMM HH:mm:ss</string>
@@ -5725,8 +5725,6 @@ Expand text..."</string>
<string name="otaupd">Update</string>
<string name="otaupdavalible">Update available!</string>
<string name="otaupdchanges">Changelog</string>
<string name="otawarning">Warning!</string>
<string name="otawarnwait">"Please don't close the app until the end of the update download"</string>
<string name="privacy_vtl">Privacy</string>
<string name="proxyadvsettings">Advanced proxy settings</string>
<string name="proxyapi">API Domain</string>
@@ -5734,7 +5732,6 @@ Expand text..."</string>
<string name="proxydonate">Donate</string>
<string name="proxyhttp">HTTP Proxy</string>
<string name="proxyhttps">HTTPS Proxy</string>
<string name="proxyimpinfo">Warning!</string>
<string name="proxyimpinfosum">"Don't use proxy if VK is available in your country
You need to restart the application to apply proxy settings"</string>
@@ -5882,7 +5879,6 @@ May look like a fake leaving the online"</string>
<string name="activity_dnw_summary">Function lets you don\'t send write message status</string>
<string name="activity_dns_summary">Function lets you don\'t send read stories status</string>
<string name="activity_dnr_warn">Warning!</string>
<string name="activity_dnr_visual">Visually may not work correctly (locally read), but companion will see that it wasn\'t read.</string>
<string name="activity_undel">Anti-delete messages</string>
@@ -5925,7 +5921,7 @@ May look like a fake leaving the online"</string>
<string name="checkforupdates">Check for updates</string>
<string name="debug_warning">Warning!</string>
<string name="warning">Warning!</string>
<string name="debug_warning_summary">These options are for testing this app only. If you are a regular user, please, don\'t use them</string>
<string name="debug_show_settings_item">Show debug category in settings</string>
@@ -6029,7 +6025,7 @@ May look like a fake leaving the online"</string>
<string name="DNR_ON">Enable Do Not Read</string>
<string name="DNR_OFF">Disable Do Not Read</string>
<string name="vtl_crashed">An error has occurred in VTL!</string>
<string name="vtl_crashed">An error has occurred in VTLite!</string>
<string name="vtl_crash_upload">Upload logs</string>
<string name="vtl_crash_save">Save to local file</string>
@@ -6307,4 +6303,25 @@ May look like a fake leaving the online"</string>
<string name="denial_of_responsibility_proxy_summ">The developers of the VTLite client assume no responsibility for the safety of using third-party proxies \n\nUse at your own risk</string>
<string name="altervika_title">Alternative VikaMobile domain</string>
<string name="proxy_setup_title">Set proxy</string>
<string name="proxy_setup_summ">Getting a third party proxy from supported proxy lists</string>
<string name="proxy_setup_success">Proxy set up, host:</string>
<string name="delete_elements_confirm">Are you sure you want to delete all elements from the list?</string>
<string name="elements_deleted_success">Element list cleared successfully</string>
<string name="get_proxy_error">An error occurred while getting the proxy</string>
<string name="add_to_filter_whitelist">Add to filters whitelist</string>
<string name="remove_from_filter_whitelist">Remove from filters whitelist</string>
<string name="add_to_ads_whitelist">Add to ads whitelist</string>
<string name="remove_from_ads_whitelist">Remove from ads whitelist</string>
<string name="removed_from_whitelist_success">Group removed from whitelist</string>
<string name="added_to_whitelist_success">Group added to whitelist</string>
<string name="whitelisted_ad_groups_title">Ads whitelist</string>
<string name="whitelisted_filters_groups_title">Filters whitelist</string>
<string name="download_dl">Download dialog</string>
<string name="download_dl_error">An error occurred while trying to download the dialog</string>
</resources>
+5
View File
@@ -5176,6 +5176,7 @@
<item name="im_ic_voip_call_video">@drawable/vkui_ic_voip_call_video_24</item>
<item name="im_ic_write_msg">@drawable/ic_add_24</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_48</item>
<item name="im_ic_msgdl">@drawable/ic_download_24</item>
<item name="im_msg_avatar_margin_top">1.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">6.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">6.0dip</item>
@@ -6809,6 +6810,7 @@
<item name="im_ic_voip_call_video">@drawable/ic_videocam_28_outline</item>
<item name="im_ic_write_msg">@drawable/ic_add_24</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_48</item>
<item name="im_ic_msgdl">@drawable/ic_download_24</item>
<item name="im_msg_avatar_margin_top">3.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">0.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">8.0dip</item>
@@ -9166,6 +9168,7 @@
<item name="im_ic_voip_call_video">@drawable/ic_videocam_28_outline</item>
<item name="im_ic_write_msg">@drawable/ic_write_outline_28_new</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_outline_24</item>
<item name="im_ic_msgdl">@drawable/ic_download_outline_28</item>
<item name="im_msg_avatar_margin_top">3.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">0.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">8.0dip</item>
@@ -9324,6 +9327,7 @@
<item name="im_ic_voip_call_video">@drawable/ic_videocam_28_outline</item>
<item name="im_ic_write_msg">@drawable/ic_write_outline_28_new</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_outline_24</item>
<item name="im_ic_msgdl">@drawable/ic_download_outline_28</item>
<item name="im_msg_avatar_margin_top">3.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">0.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">8.0dip</item>
@@ -9483,6 +9487,7 @@
<item name="im_ic_voip_call_video">@drawable/ic_videocam_28_outline</item>
<item name="im_ic_write_msg">@drawable/ic_write_outline_28_new</item>
<item name="im_ic_msgreload">@drawable/ic_camera_switch_outline_24</item>
<item name="im_ic_msgdl">@drawable/ic_download_outline_28</item>
<item name="im_msg_avatar_margin_top">3.0dip</item>
<item name="im_msg_box_margin_start_no_avatar">0.0dip</item>
<item name="im_msg_box_margin_start_with_avatar">8.0dip</item>
@@ -14,7 +14,7 @@
</base-config>
<domain-config>
<!-- Make sure your URL Server here -->
<domain includeSubdomains="true">vk.com</domain>
<domain includeSubdomains="true">vk.ru</domain>
<trust-anchors>
<certificates src="user" />
<certificates src="system" />
@@ -22,7 +22,7 @@
</domain-config>
<domain-config>
<!-- Make sure your URL Server here -->
<domain includeSubdomains="true">api.vk.com</domain>
<domain includeSubdomains="true">api.vk.ru</domain>
<trust-anchors>
<certificates src="user" />
<certificates src="system" />
+1 -1
View File
@@ -40,7 +40,7 @@
<Preference
android:enabled="false"
android:summary="@string/activity_dnr_visual"
android:title="@string/activity_dnr_warn" />
android:title="@string/warning" />
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="false"
android:key="read_pm"
+7 -7
View File
@@ -4,7 +4,7 @@
<Preference
android:enabled="false"
android:summary="@string/debug_warning_summary"
android:title="@string/debug_warning" />
android:title="@string/warning" />
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="false"
android:key="devmenu"
@@ -99,23 +99,23 @@
android:key="domains"
android:title="@string/debug_domains">
<Preference
android:defaultValue="api.vk.com"
android:defaultValue="api.vk.ru"
android:key="apiHost"
android:title="@string/debug_domains_api" />
<Preference
android:defaultValue="oauth.vk.com"
android:defaultValue="oauth.vk.ru"
android:key="oauthHost"
android:title="@string/debug_domains_oauth" />
<Preference
android:defaultValue="static.vk.com"
android:defaultValue="static.vk.ru"
android:key="vkUiHostUri"
android:title="VK UI host uri" />
<Preference
android:defaultValue="vk.com/spa"
android:defaultValue="vk.ru/spa"
android:key="spaUri"
android:title="VK UI SPA uri" />
<Preference
android:defaultValue="m.vk.com"
android:defaultValue="m.vk.ru"
android:key="awayPhpDomain"
android:title="@string/debug_domains_awayphp" />
</PreferenceCategory>
@@ -246,7 +246,7 @@
android:key="__dbg_test_crash"
android:title="@string/debug_tests_crash" />
<EditTextPreference
android:defaultValue="https://static.vk.com/demo"
android:defaultValue="https://static.vk.ru/demo"
android:key="__dbg_spa_uri"
android:title="@string/debug_tests_spa_uri" />
<com.vtosters.lite.ui.MaterialSwitchPreference
+11
View File
@@ -21,6 +21,9 @@
android:key="adsstories"
android:summary="@string/feed_ads_stories_summary"
android:title="@string/vtldas" />
<Preference
android:key="whitelisted_ad_groups"
android:title="@string/whitelisted_ad_groups_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/vtlfilters">
<Preference
@@ -74,6 +77,9 @@
android:key="copyright_post"
android:summary="@string/feed_ads_sources_summary"
android:title="@string/feed_ads_sources" />
<Preference
android:key="whitelisted_filters_groups"
android:title="@string/whitelisted_filters_groups_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/vtlrecommend">
<com.vtosters.lite.ui.MaterialSwitchPreference
@@ -125,5 +131,10 @@
<Preference
android:key="newsfeedlistmanager_reset"
android:title="@string/newsfeedlistmanager_reset_title" />
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="false"
android:key="donotgetads"
android:summary="Не запрашивать рекламу и рекомендации\nМогуть быть проблемы"
android:title="Не пытаться получать рекламу" />
</PreferenceCategory>
</PreferenceScreen>
+3 -3
View File
@@ -4,7 +4,7 @@
<Preference
android:enabled="false"
android:summary="@string/proxyimpinfosum"
android:title="@string/proxyimpinfo" />
android:title="@string/warning" />
<Preference
android:enabled="false"
android:summary="@string/denial_of_responsibility_proxy_summ"
@@ -18,8 +18,8 @@
android:title="@string/useproxy" />
<Preference
android:key="random_proxy"
android:summary="Получение стороннего прокси из поддерживаемых списков прокси"
android:title="Установить прокси" />
android:summary="@string/proxy_setup_summ"
android:title="@string/proxy_setup_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/proxyadvsettings">
<EditTextPreference
@@ -73,7 +73,7 @@
goto :goto_0
:cond_0
const-string p1, "https://vk.com/android_app"
const-string p1, "https://vk.ru/android_app"
:goto_0
move-object v3, p1
@@ -140,7 +140,7 @@
.line 9
new-instance p1, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;
const-string v0, "https://m.vk.com/privacy"
const-string v0, "https://m.vk.ru/privacy"
invoke-direct {p1, v0}, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;-><init>(Ljava/lang/String;)V
@@ -184,7 +184,7 @@
.line 16
new-instance p1, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;
const-string v0, "https://m.vk.com/terms"
const-string v0, "https://m.vk.ru/terms"
invoke-direct {p1, v0}, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;-><init>(Ljava/lang/String;)V
@@ -271,7 +271,7 @@
.line 27
new-instance p1, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;
const-string v0, "https://m.vk.com/privacy/cookies"
const-string v0, "https://m.vk.ru/privacy/cookies"
invoke-direct {p1, v0}, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;-><init>(Ljava/lang/String;)V
@@ -315,7 +315,7 @@
.line 34
new-instance p1, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;
const-string v0, "https://vk.com/data_protection"
const-string v0, "https://vk.ru/data_protection"
invoke-direct {p1, v0}, Lcom/vtosters/lite/general/fragments/WebViewFragment$g;-><init>(Ljava/lang/String;)V
@@ -51,7 +51,7 @@
invoke-direct {p2}, Ljava/lang/StringBuilder;-><init>()V
const-string p4, "https://vk.com/app"
const-string p4, "https://vk.ru/app"
invoke-virtual {p2, p4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -38,7 +38,7 @@
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "https://vk.com/app"
const-string v1, "https://vk.ru/app"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -101,7 +101,7 @@
.method public R1()Ljava/lang/String;
.locals 1
const-string v0, "api.vk.com"
const-string v0, "api.vk.ru"
invoke-static {v0}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -121,7 +121,7 @@
.method public T1()Ljava/lang/String;
.locals 1
const-string v0, "api.vk.com"
const-string v0, "api.vk.ru"
invoke-static {v0}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -18,7 +18,7 @@
.method public static a(Lcom/vk/api/base/ApiConfig$a;)Ljava/lang/String;
.locals 0
const-string p0, "http://vk.com"
const-string p0, "http://vk.ru"
return-object p0
.end method
@@ -1265,7 +1265,7 @@
return-object v0
:cond_0
const-string v0, "api.vk.com"
const-string v0, "api.vk.ru"
invoke-static {v0}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -1739,7 +1739,7 @@
invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V
const-string v7, "vkontakte://vk.com/"
const-string v7, "vkontakte://vk.ru/"
invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -18,7 +18,7 @@
iput-wide p1, p0, Lcom/vk/api/internal/PingCall;->b:J
const-string p1, "https://vk.com/ping.txt"
const-string p1, "https://vk.ru/ping.txt"
.line 2
iput-object p1, p0, Lcom/vk/api/internal/PingCall;->a:Ljava/lang/String;
@@ -32,7 +32,7 @@
const/4 v1, 0x1
const-string v2, "https://vk.com/source/masks/android_model.zip"
const-string v2, "https://vk.ru/source/masks/android_model.zip"
invoke-direct {v0, v1, v2}, Lcom/vk/api/masks/MasksGetModel$MasksGetModelResponse;-><init>(ILjava/lang/String;)V
@@ -69,7 +69,7 @@
.method public final invoke()Ljava/lang/String;
.locals 1
const-string v0, "api.vk.com"
const-string v0, "api.vk.ru"
invoke-static {v0}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -112,7 +112,7 @@
:cond_2
const-string v1, "vk_app_redirect_url"
const-string v3, "https://oauth.vk.com/blank.html"
const-string v3, "https://oauth.vk.ru/blank.html"
invoke-static {v3}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -84,7 +84,7 @@
:cond_0
new-instance p1, Ljava/lang/IllegalStateException;
const-string p2, "AppId is empty! Find out how to get your appId at https://vk.com/dev/access_token"
const-string p2, "AppId is empty! Find out how to get your appId at https://vk.ru/dev/access_token"
invoke-direct {p1, p2}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
@@ -1041,7 +1041,7 @@
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "https://vk.com/?"
const-string v2, "https://vk.ru/?"
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -200,7 +200,7 @@
goto :goto_1
:cond_0
const-string v0, "https://oauth.vk.com/authorize"
const-string v0, "https://oauth.vk.ru/authorize"
invoke-static {v0}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -145,7 +145,7 @@
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string v4, "vk.com/"
const-string v4, "vk.ru/"
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -55,7 +55,7 @@
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "https://vk.com/@"
const-string v1, "https://vk.ru/@"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
@@ -125,7 +125,7 @@
const-string v2, "referer"
const-string v3, "https://vk.com"
const-string v3, "https://vk.ru"
invoke-direct {v1, v2, v3}, Lkotlin/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
File diff suppressed because one or more lines are too long
@@ -136,7 +136,7 @@
invoke-direct {v1, v2}, Lcom/vk/auth/api/VKAuthApiManager;-><init>(Lcom/vk/api/sdk/VKApiConfig;)V
const-string v1, "support@vk.com"
const-string v1, "support@vk.ru"
.line 9
iput-object v1, v0, Lcom/vk/auth/DefaultAuthModel;->b:Ljava/lang/String;
@@ -276,7 +276,7 @@
move-result-object p1
const-string v0, "https://m.vk.com/terms?api_view=1&cc=%s&lang=%s"
const-string v0, "https://m.vk.ru/terms?api_view=1&cc=%s&lang=%s"
invoke-static {v0, p1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
@@ -328,7 +328,7 @@
move-result-object p1
const-string v0, "https://m.vk.com/privacy?api_view=1&cc=%s&lang=%s"
const-string v0, "https://m.vk.ru/privacy?api_view=1&cc=%s&lang=%s"
invoke-static {v0, p1}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
@@ -45,7 +45,7 @@
move-result-object v0
const-string v1, "static.vk.com/restore"
const-string v1, "static.vk.ru/restore"
invoke-static {v1}, Lru/vtosters/lite/proxy/api/ApiProxy;->linkReplacer(Ljava/lang/String;)Ljava/lang/String;
@@ -648,7 +648,7 @@
move-result-object v0
const-string v1, "oauth.vk.com"
const-string v1, "oauth.vk.ru"
const-string v2, "oauthHost"
@@ -3281,14 +3281,14 @@
const-string v7, "invite_link"
const-string v8, "https://vk.com/join"
const-string v8, "https://vk.ru/join"
.line 51
invoke-virtual {v2, v7, v8}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object v7
const-string v8, "it.optString(\"invite_link\", \"https://vk.com/join\")"
const-string v8, "it.optString(\"invite_link\", \"https://vk.ru/join\")"
invoke-static {v7, v8}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V

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