Compare commits

..
Author SHA1 Message Date
Vologhat 5e66a5b924 Merge branch 'main' of https://github.com/vtosters/lite 2022-10-08 20:54:54 +03:00
Vologhat 98a58c9e94 regenerated R.java and public.xml, replaced getIdentifier calls to id constants 2022-10-08 20:54:18 +03:00
aliveoutside baba2c0009 [music] download playlist synchronously 2022-10-08 17:45:36 +03:00
aliveoutside 2ae3f48d9a [music] move temp tses dir to app internal storage 2022-10-08 17:45:36 +03:00
k1zn 9e5eae49d1 remove shadow from attachments 2022-10-08 19:19:36 +05:00
Vologhat 9e50a116ef Merge pull request #824 from zelvalea/main
Чрезмерное создание потоков
2022-10-08 14:23:37 +03:00
Vologhat 19fb86ca58 refactored last.fm scrobbler 2022-10-08 10:37:47 +03:00
zelva e7db1e2359 cleanup and fixed unwanted races 2022-10-07 14:42:04 +03:00
aliveoutside bc25be1a27 Merge pull request #823 from vtosters/gettext-removing
remove clipdata$item gettext
2022-10-07 12:21:58 +03:00
k1zn a583c98f44 fix renaming app bug 2022-10-06 18:24:57 +05:00
gdlbo d40162caa1 disabled auto theme for non milk users 2022-10-05 20:57:15 +03:00
Sunmisc 5bc4451355 cleanup 2022-10-05 16:22:20 +03:00
Sunmisc b62de5b90e cleanup 2022-10-05 16:21:59 +03:00
Sunmisc e79322a18c cleaned up and got rid of deprecated class 2022-10-05 16:16:34 +03:00
Sunmisc b9a55799fe fixed redundant thread creation 2022-10-05 15:49:25 +03:00
gdlbo 9ba210e166 fixed crash 2022-10-05 15:33:34 +03:00
k1zn eab3549ff9 remove clipdata$item gettext 2022-10-05 16:58:25 +05:00
Vologhat 98bbdf872b returned alert dialog for disabling Doze and refactored code 2022-10-04 00:51:16 +03:00
Vologhat d17e4849eb remove comment 2022-10-04 00:28:34 +03:00
Vologhat 18709ac89f added permission in AndroidManifest.xml for ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS flag 2022-10-04 00:27:50 +03:00
gdlbo 9de8e3e409 newsfeed notif counter feature 2022-10-03 23:53:59 +03:00
gdlbo 3f3d1c7f28 Update DisableBattery.java 2022-10-03 22:59:55 +03:00
gdlbo 5250ba39d2 Update ContactsUtils.java 2022-10-03 22:59:48 +03:00
gdlbo ae08e57c80 magic fix 2022-10-03 21:29:04 +03:00
gdlbo 2f24eb6145 Update README.md 2022-10-03 20:28:43 +03:00
Denis 88fa60fcfb Update README.md 2022-10-03 20:19:28 +03:00
Denis df2d5ceb12 Update README.md 2022-10-03 20:19:28 +03:00
Denis f2bc275430 Update README.md 2022-10-03 20:19:28 +03:00
Denis fbf7a3520b Update README.md 2022-10-03 20:19:28 +03:00
Denis 510952913b Update features.md 2022-10-03 20:19:28 +03:00
Denis 39c05533d0 Create features.md 2022-10-03 20:19:28 +03:00
gdlbo 4f7d00b0a0 fixed saving pics...? 2022-10-03 19:53:33 +03:00
k1zn 12e9c14838 Update README.md 2022-10-03 20:17:31 +05:00
k1zn 072fd007ca Update README.md 2022-10-03 19:57:43 +05:00
k1zn 002bf7e155 Update README.md 2022-10-03 19:55:17 +05:00
120 changed files with 42870 additions and 40730 deletions
+78
View File
@@ -0,0 +1,78 @@
### Все функции модификации
* Лента
* Блокировка рекламы в ленте
* Блокировка постов через фильтры
* Возможность добавлять в вайтлист фильтров группы, чтобы в них не удалялись посты
* Возможность отключить рекомендации от ВК
* Медиаконтент
* Округление дат
* 1 января в 4:20
* 1 января в 4:20:00
* 1 января 2000 в 4:20:00
* Округление чисел
* Сокращение постов **(Показать полностью)**
* Результаты опросов без участия
* Возможность указывать папку для загрузки фото/видео/музыки/всего
* Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга)
* Возможность **кешировать музыку / автокешировать ее при прослушивании**
* Возможность выбирать раздел музыки, открываемый по умолчанию
* Возможность скачивать видео, очищать историю просмотра видео
* Возможность найти фотографию через поисковые системы
* Интеграция с <a href="https://vkx.app/">VK X</a>
* Возможность кешировать треки в приложении
* Сообщения
* Обои в сообщениях
* Возможность выключения кнопки записи голосовых сообщений
* Возможность скрыть блок рекомендаций в сообщениях
* Режим **VK Me**
* Возможность вернуть вкладку уведомлений для режима VK Me
* Встроенный переводчик текста для сообщений
* Возможность выбрать язык перевода
* Автоматический перевод ваших сообщений на выбранный язык
* Альтернативный дизайн эмодзи меню
* Возможность использовать системные эмодзи
* Возможнсть использовать Enter с аппаратной клавиатуры
* Панель ввода из приложения VK для iOS
* Telegram Стикеры
* Возможность загружать свои стикерпаки из Telegram во ВКонтакте
* Внешний вид
* Возможность отключать новый дизайн версий VK (Milkshake)
* Название заголовков в докбаре
* Возможность использовать акцент для иконок
* Возможность отключить счётчики в докбаре
* Смена иконки приложения (содержит много уникальных иконок для донатеров)
* Возможность покрасить панель навигации, веб-страницы
* Интерфейс
* Возможность отключить блок историй наверху ленты
* Возможность отключить боковую камеру в разделе «Новости»
* Возможность отключить блок «Что у вас нового?» в разделе «Новости»
* Возможность показывать лайки у постов справа
* Возможность менять стартовый раздел при запуске приложения
* Анимации фрагментов
* Возможность изменять размер закругления картинок (аватарок и прочего)
* Возможность отключить редизайн видеопостов
* Возможность отключить блок миниаппов/VK Pay/Superapp
* Возможность отключить сокращение названий разделов в меню
* Возможность скрыть блок рекомендаций друзей в разделе «Друзья»
* Возможность скрыть подписи в настройках
* Редактор докбара
* Редактор элементов Superapp
* Активность
* Возможность видеть удаленные сообщения
* Функционал, позволяющий оставаться в «оффлайне» (принудительный оффлайн/не отправлять статус онлайна и т.п.)
* Нечиталка/неписалка для ЛС/бесед/ботов/групп
* Возможность отключить информацию о том, что вы просмотрели историю/прослушали голосовое сообщение
* Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger
* Возможность сохранять настройки бесшумных сообщений/сообщений-бомбочек
* Отключить уведомление о том, что вы сделали скриншот в беседе
* Отключение редиректа через away.php
* Отключение отправки метрики
* Прокси
* Поддержка сторонних прокси, таких как: Zaborona, VikaMobile, рандомные прокси и прочие
* Возможность использовать **HTTP/HTTPS/SOCKS** прокси, менять домены **API/OAuth/Static**
* Другое
* Синхронизация контактов с VK
* Очистка кеша приложения (**всё/стикеры/изображения/видео/сообщения/WebView**)
* Автоочистка кеша при достижении указанного вами значения (**100/500 MB, 1/2/5 GB**)
* Функционал для **дебага приложения/бэкап возможности/верификации VTosters**
+22 -87
View File
@@ -41,96 +41,31 @@
### Быстрая навигация ### Быстрая навигация
* [Функционал](#функционал) - [Функциональность](#функциональность)
* [Отладка приложения](#отладка-приложения) - [Отладка приложения](#отладка-приложения)
* [Разработка](#разработка) - [Разработка](#разработка)
* [Всё необходимое для сборки и компиляции](#всё-необходимое-для-сборки-и-компиляции) - [Всё необходимое для сборки и компиляции](#всё-необходимое-для-сборки-и-компиляции)
* [Необходимые зависимости](#необходимые-зависимости) - [Необходимые зависимости](#необходимые-зависимости)
* [Linux/macOS](#linuxmacos) - [Linux/macOS](#linuxmacos)
* [Windows](#windows) - [Windows](#windows)
## Функционал ## Функциональность
* Лента * Возможность вернуть старый дизайн ВКонтакте
* Блокировка рекламы в ленте * Нет рекламы и ограничений музыки
* Блокировка постов через фильтры * Интеграция с <a href="https://vkx.app/">VKX</a> и <a href="https://www.last.fm/">Last.FM</a>
* Возможность добавлять в вайтлист фильтров группы, чтобы в них не удалялись посты * Самая большая кастомизация и фильтрация ленты новостей
* Возможность отключить рекомендации от ВК * Кеширование и скачивание треков
* Редактор докбара * Редактор нижней панели
* Редактор элементов Superapp * Скрытие активности в сообщениях и офлайн-режим
* Медиаконтент * Возможность отправлять стикеры из Telegram
* Округление дат * Отключение редиректа через away.php
* 1 января в 4:20 * Поддержка сторонних прокси для пользователей из Украины
* 1 января в 4:20:00 * Эксклюзивные функции и галочки для тех кто поддержал разработку. <a href="https://vtosters.app/donate">Подробнее</a>
* 1 января 2000 в 4:20:00 * Глобальная оптимизация приложения VK (Удалены сторонние библиотеки рекламы, аналитики и метрики, заглушки для рекламных запросов)
* Округление чисел
* Сокращение постов **(Показать полностью)**
* Результаты опросов без участия
* Возможность указывать папку для загрузки фото/видео/музыки/всего
* Интеграция с <a href="https://www.last.fm/">LAST.FM</a> (а также возможность скробблинга)
* Возможность скачивать видео, очищать историю просмотра видео
* Возможность найти фотографию через поисковые системы
* Интеграция с <a href="https://vkx.app/">VK X</a>
* Возможность кешировать треки в приложении
* Сообщения
* Обои в сообщениях
* Возможность выключения кнопки записи голосовых сообщений
* Возможность скрыть блок рекомендаций в сообщениях
* Режим **VK Me**
* Возможность вернуть вкладку уведомлений для режима VK Me
* Встроенный переводчик текста для сообщений
* Возможность выбрать язык перевода
* Автоматический перевод ваших сообщений на выбранный язык
* Альтернативный дизайн эмодзи меню
* Возможность использовать системные эмодзи
* Возможнсть использовать Enter с аппаратной клавиатуры
* Панель ввода из приложения ВК для IOS
* Активность
* Возможность видеть удаленные сообщения
* Функционал, позволяющий оставаться в «оффлайне» (принудительный оффлайн/не отправлять статус онлайна и т.п.)
* Нечиталка/неписалка для ЛС/бесед/ботов/групп
* Возможность отключить информацию о том, что вы просмотрели историю/прослушали голосовое сообщение
* Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger
* Возможность сохранять настройки бесшумных сообщений/сообщений-бомбочек
* Отключить уведомление о том, что вы сделали скриншот в беседе
* Отключение редиректа через away.php
* Отключение отправки метрики
* Внешний вид
* **Milkshake** тема (дизайн новых версий ВК)
* Название заголовков в докбаре
* Возможность использовать акцент для иконок
* Возможность отключить счётчики в докбаре
* Смена иконки приложения (содержит много уникальных иконок для донатеров)
* Возможность покрасить панель навигации, веб-страницы
* Telegram Стикеры
* Возможность загружать свои стикерпаки из Telegram во ВКонтакте
* Интерфейс
* Возможность отключить блок историй наверху ленты
* Возможность отключить боковую камеру в разделе «Новости»
* Возможность отключить блок «Что у вас нового?» в разделе «Новости»
* Возможность показывать лайки у постов справа
* Возможность менять стартовый раздел при запуске приложения
* Анимации фрагментов
* Возможность изменять размер закругления картинок (аватарок и прочего)
* Возможность отключить редизайн видеопостов
* Возможность отключить блок миниаппов/VK Pay/Superapp
* Возможность отключить сокращение названий разделов в меню
* Возможность скрыть блок рекомендаций друзей в разделе «Друзья»
* Возможность скрыть подписи в настройках
* Прокси
* Поддержка сторонних прокси, таких как: Zaborona, VikaMobile, рандомные прокси и прочие
* Возможность использовать **HTTP/HTTPS/SOCKS** прокси, менять домены **API/OAuth/Static**
* Другое
* Очистка кеша приложения (**всё/стикеры/изображения/видео/сообщения/WebView**)
* Автоочистка кеша при достижении указанного вами значения (**100/500 MB, 1/2/5 GB**)
* Функционал для **дебага приложения/бэкап возможности/верификации VTosters**
А также: Все функции модификации описаны [здесь](https://github.com/vtosters/lite/blob/main/.github/features.md)
* Галочки, которые видны только пользователям приложения **ВТостерс Lite** (подробнее тут: [vtosters.app](https://vtosters.app) ➝ Пожертвования)
* Оптимизация приложения VK (удаление ненужных библиотек, которые встроены в оригинальный VK)
И многое другое!
## Отладка приложения ## Отладка приложения
@@ -158,7 +93,7 @@
При нахождении решения каких-либо проблем ждем вас в [Pull Requests](https://github.com/vtosters/lite/pulls) При нахождении решения каких-либо проблем ждем вас в [Pull Requests](https://github.com/vtosters/lite/pulls)
* Рекомендуется установка **ADB** в систему ([гайд](https://technastic.com/system-wide-adb-fastboot-windows-10)) * Рекомендуется установка **ADB** в систему ([Как это сделать](https://technastic.com/system-wide-adb-fastboot-windows-10))
* Для индексации декомпилированного кода в Studio используется [dex2jar](https://github.com/pxb1988/dex2jar) * Для индексации декомпилированного кода в Studio используется [dex2jar](https://github.com/pxb1988/dex2jar)
@@ -1,7 +1,5 @@
package com.aefyr.tsg.g2; package com.aefyr.tsg.g2;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel; import android.app.NotificationChannel;
import android.app.NotificationManager; import android.app.NotificationManager;
@@ -12,6 +10,7 @@ import androidx.annotation.Nullable;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber; import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import com.vtosters.lite.R;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
@@ -40,7 +39,7 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds = new HashMap<>(); downloadingPacksNotificationsIds = new HashMap<>();
if (oreo()) { if (oreo()) {
NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, AndroidUtils.getString("telegram_stickers_service"), NotificationManager.IMPORTANCE_HIGH); NotificationChannel notificationChan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, AndroidUtils.getString(R.string.telegram_stickers_service), NotificationManager.IMPORTANCE_HIGH);
((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChan); ((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(notificationChan);
} }
} }
@@ -50,8 +49,8 @@ public class NotificationsHelper {
downloadingPacksNotificationsIds.put(pack, notificationId); downloadingPacksNotificationsIds.put(pack, notificationId);
Notification.Builder builder = commonBuilder(); Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString("telegram_stickers_downloading") : pack.title + AndroidUtils.getString("telegram_stickers_updating")); builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString(R.string.telegram_stickers_downloading) : pack.title + AndroidUtils.getString(R.string.telegram_stickers_updating));
builder.setContentText(AndroidUtils.getString("telegram_stickers_gettinginfo")); builder.setContentText(AndroidUtils.getString(R.string.telegram_stickers_gettinginfo));
builder.setOngoing(true); builder.setOngoing(true);
manager.notify(notificationId, builder.build()); manager.notify(notificationId, builder.build());
@@ -64,7 +63,7 @@ public class NotificationsHelper {
lastNotificationTime.set(System.currentTimeMillis()); lastNotificationTime.set(System.currentTimeMillis());
Notification.Builder builder = commonBuilder(); Notification.Builder builder = commonBuilder();
builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString("telegram_stickers_downloading") : pack.title + AndroidUtils.getString("telegram_stickers_updating")); builder.setContentTitle(pack.state == TelegramStickersPack.DOWNLOADING ? pack.title + AndroidUtils.getString(R.string.telegram_stickers_downloading) : pack.title + AndroidUtils.getString(R.string.telegram_stickers_updating));
builder.setContentText(downloadProgress + "/" + pack.stickersCount); builder.setContentText(downloadProgress + "/" + pack.stickersCount);
builder.setProgress(pack.stickersCount, downloadProgress, false); builder.setProgress(pack.stickersCount, downloadProgress, false);
builder.setOngoing(true); builder.setOngoing(true);
@@ -78,13 +77,13 @@ public class NotificationsHelper {
Notification.Builder builder = commonBuilder(); Notification.Builder builder = commonBuilder();
builder.setProgress(0, 0, false); builder.setProgress(0, 0, false);
builder.setOngoing(false); builder.setOngoing(false);
builder.setContentTitle(AndroidUtils.getString("telegram_stickers_service")); builder.setContentTitle(AndroidUtils.getString(R.string.telegram_stickers_service));
String text; String text;
if (success) if (success)
text = wasUpdate ? pack.title + AndroidUtils.getString("telegram_stickers_updated") : pack.title + AndroidUtils.getString("telegram_stickers_downloaded"); text = wasUpdate ? pack.title + AndroidUtils.getString(R.string.telegram_stickers_updated) : pack.title + AndroidUtils.getString(R.string.telegram_stickers_downloaded);
else else
text = wasUpdate ? pack.title + AndroidUtils.getString("telegram_stickers_error_update") : pack.title + AndroidUtils.getString("telegram_stickers_error_download"); text = wasUpdate ? pack.title + AndroidUtils.getString(R.string.telegram_stickers_error_update) : pack.title + AndroidUtils.getString(R.string.telegram_stickers_error_download);
if (e instanceof TelegramStickersGrabber.TSGException) { if (e instanceof TelegramStickersGrabber.TSGException) {
text = pack.title + ": " + e.getMessage(); text = pack.title + ": " + e.getMessage();
@@ -100,7 +99,7 @@ public class NotificationsHelper {
} }
private Notification.Builder commonBuilder() { private Notification.Builder commonBuilder() {
var builder = new Notification.Builder(c).setPriority(Notification.PRIORITY_MAX).setSmallIcon(getIdentifier("ic_download_24", "drawable")); var builder = new Notification.Builder(c).setPriority(Notification.PRIORITY_MAX).setSmallIcon(R.drawable.ic_download_24);
if (oreo()) { if (oreo()) {
builder.setChannelId(NOTIFICATION_CHANNEL_ID); builder.setChannelId(NOTIFICATION_CHANNEL_ID);
} }
File diff suppressed because it is too large Load Diff
@@ -1,8 +1,8 @@
package ru.vtosters.lite.deviceinfo; package ru.vtosters.lite.deviceinfo;
import static ru.vtosters.lite.deviceinfo.OEMDetector.hasMiuiIncrCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isEMUI; import static ru.vtosters.lite.deviceinfo.OEMDetector.isEMUI;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isMIUI; import static ru.vtosters.lite.deviceinfo.OEMDetector.isMIUI;
import static ru.vtosters.lite.deviceinfo.OEMDetector.hasMiuiIncrCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isSamsung; import static ru.vtosters.lite.deviceinfo.OEMDetector.isSamsung;
import static ru.vtosters.lite.utils.About.getBuildNumber; import static ru.vtosters.lite.utils.About.getBuildNumber;
@@ -1,11 +1,5 @@
package ru.vtosters.lite.dnr; package ru.vtosters.lite.dnr;
import static com.vk.im.engine.h.im_ic_done;
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.ui.c.im_ic_keyboard;
import static ru.vtosters.lite.dnr.DNRModule.hookDNR; import static ru.vtosters.lite.dnr.DNRModule.hookDNR;
import static ru.vtosters.lite.dnr.DNRModule.hookDNT; import static ru.vtosters.lite.dnr.DNRModule.hookDNT;
import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor; import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
@@ -13,8 +7,6 @@ import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor;
import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage; import static ru.vtosters.lite.encryption.EncryptProvider.decryptMessage;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; 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.isTablet; import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
@@ -34,6 +26,7 @@ import com.vk.im.ui.components.common.DialogAction;
import com.vk.im.ui.components.common.MsgAction; import com.vk.im.ui.components.common.MsgAction;
import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg; import com.vk.im.ui.components.viewcontrollers.popup.DelegateMsg;
import com.vk.im.ui.views.dialog_actions.DialogActionsListView; import com.vk.im.ui.views.dialog_actions.DialogActionsListView;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -49,6 +42,7 @@ import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor; import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.hooks.CryptImHook; import ru.vtosters.lite.hooks.CryptImHook;
import ru.vtosters.lite.ui.dialogs.Translate; import ru.vtosters.lite.ui.dialogs.Translate;
import ru.vtosters.lite.utils.AndroidUtils;
public class DNRInjector { public class DNRInjector {
public static void inject(Dialog dialog, List<DialogAction> list) { public static void inject(Dialog dialog, List<DialogAction> list) {
@@ -91,15 +85,15 @@ public class DNRInjector {
} }
public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) { public static LinkedHashMap<DialogAction, Integer> injectToHashMap(LinkedHashMap<DialogAction, Integer> hashMap) {
hashMap.put(DialogAction.DOWNLOAD, getIdentifier("download_dl", "string")); hashMap.put(DialogAction.DOWNLOAD, R.string.download_dl);
hashMap.put(DialogAction.DNR_ON, getIdentifier("DNR_ON", "string")); hashMap.put(DialogAction.DNR_ON, R.string.DNR_ON);
hashMap.put(DialogAction.DNR_OFF, getIdentifier("DNR_OFF", "string")); hashMap.put(DialogAction.DNR_OFF, R.string.DNR_OFF);
hashMap.put(DialogAction.DNT_ON, getIdentifier("DNT_ON", "string")); hashMap.put(DialogAction.DNT_ON, R.string.DNT_ON);
hashMap.put(DialogAction.DNT_OFF, getIdentifier("DNT_OFF", "string")); hashMap.put(DialogAction.DNT_OFF, R.string.DNT_OFF);
hashMap.put(DialogAction.ENCRYPT, getIdentifier("encryption", "string")); hashMap.put(DialogAction.ENCRYPT, R.string.encryption);
hashMap.put(DialogAction.ENCRYPT_SETT, getIdentifier("encryption_sett", "string")); hashMap.put(DialogAction.ENCRYPT_SETT, R.string.encryption_sett);
// hashMap.put(DialogAction.pinmsg, getIdentifier("pinmsg", "string")); // hashMap.put(DialogAction.pinmsg, getIdentifier("pinmsg", "string"));
// hashMap.put(DialogAction.unpinmsg, getIdentifier("unpinmsg", "string")); // hashMap.put(DialogAction.unpinmsg, getIdentifier("unpinmsg", "string"));
@@ -109,20 +103,20 @@ public class DNRInjector {
@SuppressLint("ResourceType") @SuppressLint("ResourceType")
public static List<Object> injectToList(List<Object> actions) { public static List<Object> injectToList(List<Object> actions) {
var list = new ArrayList<>(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.DOWNLOAD, 1, R.attr.im_ic_msgdl, R.string.download_dl)); // 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_ON, 2, R.attr.im_ic_pinned_msg_hide, R.string.DNR_ON)); // 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 list.add(new DialogActionsListView.b.a(DialogAction.DNR_OFF, 2, R.attr.im_ic_pinned_msg_show, R.string.DNR_OFF)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNT_ON, 2, im_ic_edit_msg, getIdentifier("DNT_ON", "string"))); // DialogAction, Int, Icon, String list.add(new DialogActionsListView.b.a(DialogAction.DNT_ON, 2, R.attr.im_ic_edit_msg, R.string.DNT_ON)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.DNT_OFF, 2, im_ic_edit_msg, getIdentifier("DNT_OFF", "string"))); // DialogAction, Int, Icon, String list.add(new DialogActionsListView.b.a(DialogAction.DNT_OFF, 2, R.attr.im_ic_edit_msg, R.string.DNT_OFF)); // DialogAction, Int, Icon, String
if (!isTablet()) { if (!isTablet()) {
list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT, 3, im_ic_keyboard, getIdentifier("encryption", "string"))); // DialogAction, Int, Icon, String list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT, 3, R.attr.im_ic_keyboard, R.string.encryption)); // DialogAction, Int, Icon, String
list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT_SETT, 3, im_ic_more_vertical, getIdentifier("encryption_sett", "string"))); // DialogAction, Int, Icon, String list.add(new DialogActionsListView.b.a(DialogAction.ENCRYPT_SETT, 3, R.attr.im_ic_more_vertical, R.string.encryption_sett)); // DialogAction, Int, Icon, String
} }
list.add(new DialogActionsListView.b.a(DialogAction.MARK_AS_READ, 4, im_ic_done, getIdentifier("vkim_dialogs_list_option_mark_as_read", "string"))); // DialogAction, Int, Icon, String list.add(new DialogActionsListView.b.a(DialogAction.MARK_AS_READ, 4, R.attr.im_ic_done, R.string.vkim_dialogs_list_option_mark_as_read)); // DialogAction, Int, Icon, String
return list; return list;
} }
@@ -197,7 +191,7 @@ public class DNRInjector {
try { try {
new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out); new MessagesDownloader().downloadDialog(peerId, new MessagesDownloader.HtmlDialogDownloaderFormatProvider(), out);
} catch (Exception e) { } catch (Exception e) {
sendToast(getString("download_dl_error")); sendToast(AndroidUtils.getString(R.string.download_dl_error));
e.printStackTrace(); e.printStackTrace();
} }
return true; return true;
@@ -299,8 +293,8 @@ public class DNRInjector {
} }
public static LinkedHashMap<MsgAction, DelegateMsg.a.a> injectToHashMapMsg(LinkedHashMap<MsgAction, DelegateMsg.a.a> hashMap) { public static LinkedHashMap<MsgAction, DelegateMsg.a.a> injectToHashMapMsg(LinkedHashMap<MsgAction, DelegateMsg.a.a> hashMap) {
hashMap.put(MsgAction.valueOf("TRANSLATE"), new DelegateMsg.a.a(getIdentifier("translator", "string"))); hashMap.put(MsgAction.valueOf("TRANSLATE"), new DelegateMsg.a.a(R.string.translator));
hashMap.put(MsgAction.valueOf("READTO"), new DelegateMsg.a.a(getIdentifier("readto", "string"))); hashMap.put(MsgAction.valueOf("READTO"), new DelegateMsg.a.a(R.string.readto));
return hashMap; return hashMap;
} }
@@ -331,13 +325,13 @@ public class DNRInjector {
if (action == MsgAction.valueOf("TRANSLATE")) { if (action == MsgAction.valueOf("TRANSLATE")) {
if (isTextExist && isReplyExist) { if (isTextExist && isReplyExist) {
Translate.showTranslatedText(context, text + "\n\n" + getString("translator_reply") + "\n" + reply); Translate.showTranslatedText(context, text + "\n\n" + context.getString(R.string.translator_reply) + "\n" + reply);
} else if (isReplyExist) { } else if (isReplyExist) {
Translate.showTranslatedText(context, getString("translator_reply") + "\n" + reply); Translate.showTranslatedText(context, context.getString(R.string.translator_reply) + "\n" + reply);
} else if (isTextExist) { } else if (isTextExist) {
Translate.showTranslatedText(context, text); Translate.showTranslatedText(context, text);
} else { } else {
sendToast(getString("translator_no_text")); sendToast(context.getString(R.string.translator_no_text));
} }
} }
} }
@@ -366,7 +360,7 @@ public class DNRInjector {
thread.start(); thread.start();
sendToast(getString("pin_dialog") + " " + getString(needToBePinned ? "dialog_pinned" : "dialog_unpinned")); sendToast(AndroidUtils.getString(R.string.pin_dialog) + " " + AndroidUtils.getString(needToBePinned ? R.string.dialog_pinned : R.string.dialog_unpinned));
} }
public static void setDnr(Dialog dialog, boolean value) { public static void setDnr(Dialog dialog, boolean value) {
@@ -7,6 +7,7 @@ import android.os.Environment;
import com.vk.core.util.ToastUtils; import com.vk.core.util.ToastUtils;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist; import com.vk.dto.music.Playlist;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
@@ -113,7 +114,7 @@ public class AudioDownloader {
private static void downloadM3U8(MusicTrack track, boolean cache) { private static void downloadM3U8(MusicTrack track, boolean cache) {
if (track.D == null) { if (track.D == null) {
ToastUtils.a(getString("link_audio_error")); ToastUtils.a(getString(R.string.link_audio_error));
return; return;
} }
@@ -8,13 +8,14 @@ import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getArray; import static ru.vtosters.lite.utils.AndroidUtils.getArray;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getResources; import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.SparseArray; import android.util.SparseArray;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.vtosters.lite.R;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@@ -31,6 +32,8 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import ru.vtosters.lite.utils.AndroidUtils;
public class MessagesDownloader { public class MessagesDownloader {
private static final String VK_DOMAIN = "vk.com"; private static final String VK_DOMAIN = "vk.com";
private static SimpleDateFormat sdformat; private static SimpleDateFormat sdformat;
@@ -67,13 +70,19 @@ public class MessagesDownloader {
pollHtml.append("<hr><p>").append(jsonObject.optString("text")).append(" · ").append(jsonObject.optString("votes")).append(" (").append(jsonObject.optString("rate")).append("%)</p>"); 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(getString("chat_export_poll_voted")).append(" ").append(poll.optString("votes")).append(" ").append(getString("chat_export_users_name")).append("</p>"); pollHtml.append("<hr><p style=\"text-align:center;\">")
.append(AndroidUtils.getString(R.string.chat_export_poll_voted))
.append(" ")
.append(poll.optString("votes"))
.append(" ")
.append(AndroidUtils.getString(R.string.chat_export_users_name))
.append("</p>");
return pollHtml.append("</div>").toString(); return pollHtml.append("</div>").toString();
} }
private static String getVideoHtml(JSONObject files) throws JSONException { private static String getVideoHtml(JSONObject files) throws JSONException {
if (files == null) return getString("chat_export_video_nolinks"); if (files == null) return AndroidUtils.getString(R.string.chat_export_video_nolinks);
Iterator<?> keys = files.keys(); Iterator<?> keys = files.keys();
StringBuilder videoHtml = new StringBuilder(); StringBuilder videoHtml = new StringBuilder();
@@ -110,7 +119,7 @@ public class MessagesDownloader {
} }
fos.write(format.provideDocumentEnd().getBytes(StandardCharsets.UTF_8)); fos.write(format.provideDocumentEnd().getBytes(StandardCharsets.UTF_8));
fos.close(); fos.close();
Toast.makeText(getGlobalContext(), getString("saved_as") + " " + out.getAbsolutePath(), Toast.LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString(R.string.saved_as) + " " + out.getAbsolutePath(), Toast.LENGTH_SHORT).show();
} catch (IOException | JSONException e) { } catch (IOException | JSONException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -318,7 +327,11 @@ public class MessagesDownloader {
"\n" + "\n" +
""; "";
return "<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta charset=\"utf-8\"><title>" + getString("chat_export_title") + "</title><style>" + style + "</style></head><body>"; return "<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta charset=\"utf-8\"><title>"
+ AndroidUtils.getString(R.string.chat_export_title)
+ "</title><style>"
+ style
+ "</style></head><body>";
} }
@Override @Override
@@ -328,7 +341,7 @@ public class MessagesDownloader {
@Override @Override
String provideHeader(String dialogName, String date) { 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\">" + getString("chat_export_header") + " (" + date + ")</h5></div><div class=\"vtex-milk-msgcont\">"; return "<div class=\"vtex-milk-header\"><h4 class=\"vtex-milk-header-txt\">VTLite</h4><h5 class=\"vtex-milk-header-sub\">" + AndroidUtils.getString(R.string.chat_export_header) + " (" + date + ")</h5></div><div class=\"vtex-milk-msgcont\">";
} }
@Override @Override
@@ -349,13 +362,13 @@ public class MessagesDownloader {
} }
String chatAction = (message.chat_action != null) ? getHtmlForChatAction(message.chat_action) : ""; String chatAction = (message.chat_action != null) ? getHtmlForChatAction(message.chat_action) : "";
String attaches = (message.attachments.size() > 0) ? "<p class=\"msg-attaches\">" + getString("attachments") + ": " + getHtmlForAttach(message.attachments) + "</p>" : ""; String attaches = (message.attachments.size() > 0) ? "<p class=\"msg-attaches\">" + AndroidUtils.getString(R.string.attachments) + ": " + getHtmlForAttach(message.attachments) + "</p>" : "";
String reply = (message.reply_message != null) ? provideReply(message.reply_message) : ""; String reply = (message.reply_message != null) ? provideReply(message.reply_message) : "";
String fwdMessages = (message.fwd_messages.size() > 0) ? provideForwardMessages(message.fwd_messages) : ""; String fwdMessages = (message.fwd_messages.size() > 0) ? provideForwardMessages(message.fwd_messages) : "";
String userLink = (user.isGroup ? "club" : "id") + user.id; String userLink = (user.isGroup ? "club" : "id") + user.id;
return "<div class=\"vtex-milk-msg" + isOut + "\" id=\"" + message.id + "\">" + return "<div class=\"vtex-milk-msg" + isOut + "\" id=\"" + message.id + "\">" +
"<p class=\"msg-from\">" + getString("from_lower") + " <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-from\">" + AndroidUtils.getString(R.string.from_lower) + " <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>" + "<p class=\"msg-body\">" + mentionsReplace(message.text) + "</p>" +
geoPosition + geoPosition +
chatAction + chatAction +
@@ -378,12 +391,12 @@ public class MessagesDownloader {
if (fwdMessages != null) { if (fwdMessages != null) {
var length = fwdMessages.length(); var length = fwdMessages.length();
if (length > 0) text = length + " " + pluralMsg(length); if (length > 0) text = length + " " + pluralMsg(length);
} else text = getString("attachment"); // Вложение } else text = AndroidUtils.getString(R.string.attachment); // Вложение
} }
return "<a href=\"#" + messageId + "\" class=\"msg-attach-link\">" + return "<a href=\"#" + messageId + "\" class=\"msg-attach-link\">" +
"<div class=\"msg-reply\">" + "<div class=\"msg-reply\">" +
"<p class=\"reply-header\">" + getString("vkim_msg_fwd_single") + "</p>" + "<p class=\"reply-header\">" + AndroidUtils.getString(R.string.vkim_msg_fwd_single) + "</p>" +
"<p class=\"reply-content\">" + user.firstName + " " + user.lastName + ": " + text + "</p>" + "<p class=\"reply-content\">" + user.firstName + " " + user.lastName + ": " + text + "</p>" +
"</div>" + "</div>" +
"</a>"; "</a>";
@@ -424,7 +437,7 @@ public class MessagesDownloader {
JSONObject reply_message = fwd_message.optJSONObject("reply_message"); JSONObject reply_message = fwd_message.optJSONObject("reply_message");
var attachesHtml = (attaches.size() > 0) ? getString("attachments") + ": " + getHtmlForAttach(attaches) : ""; var attachesHtml = (attaches.size() > 0) ? AndroidUtils.getString(R.string.attachments) + ": " + getHtmlForAttach(attaches) : "";
var replyHtml = (reply_message != null) ? provideReply(reply_message) : ""; var replyHtml = (reply_message != null) ? provideReply(reply_message) : "";
var fwdsHtml = (fwdsMsg.size() > 0) ? provideForwardMessages(fwdsMsg) : ""; // recursion XD :> var fwdsHtml = (fwdsMsg.size() > 0) ? provideForwardMessages(fwdsMsg) : ""; // recursion XD :>
@@ -447,7 +460,7 @@ public class MessagesDownloader {
} }
private String pluralMsg(int count) { private String pluralMsg(int count) {
String[] plurals = getArray("msg_plurals"); String[] plurals = getArray(R.array.msg_plurals);
var hundredModulo = count % 100; var hundredModulo = count % 100;
var tenModulo = count % 10; var tenModulo = count % 10;
@@ -466,22 +479,22 @@ public class MessagesDownloader {
switch (type) { switch (type) {
case "chat_photo_update": case "chat_photo_update":
htmlAction.append(getString("chat_export_avatar_update")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_avatar_update));
break; break;
case "chat_photo_remove": case "chat_photo_remove":
htmlAction.append(getString("chat_export_avatar_remove")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_avatar_remove));
break; break;
case "chat_create": case "chat_create":
var name = action.optString("text"); var name = action.optString("text");
htmlAction.append(getString("chat_export_chat_created")).append((!name.isEmpty()) ? " \"" + name + "\"" : ""); htmlAction.append(AndroidUtils.getString(R.string.chat_export_chat_created)).append((!name.isEmpty()) ? " \"" + name + "\"" : "");
break; break;
case "chat_title_update": case "chat_title_update":
var newName = action.optString("text"); var newName = action.optString("text");
htmlAction.append(getString("chat_export_name_changed")).append((!newName.isEmpty()) ? (" " + getString("chat_export_to") + " \"" + newName + "\"") : ""); htmlAction.append(AndroidUtils.getString(R.string.chat_export_name_changed)).append((!newName.isEmpty()) ? (" " + AndroidUtils.getString(R.string.chat_export_to) + " \"" + newName + "\"") : "");
break; break;
case "chat_invite_user": case "chat_invite_user":
var newUserId = action.optInt("member_id"); var newUserId = action.optInt("member_id");
htmlAction.append(getString("chat_export_user_added") + " ").append((newUserId > 0) ? getString("chat_export_type_user") : getString("chat_export_type_group")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_user_added) + " ").append((newUserId > 0) ? AndroidUtils.getString(R.string.chat_export_type_user) : AndroidUtils.getString(R.string.chat_export_type_group));
if (newUserId != 0) { if (newUserId != 0) {
var userLink = ((newUserId < 0) ? "club" : "id") + Math.abs(newUserId); 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>"); htmlAction.append(" <a href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\" class=\"msg-attach-link\">@").append(userLink).append("</a>");
@@ -489,7 +502,7 @@ public class MessagesDownloader {
break; break;
case "chat_kick_user": case "chat_kick_user":
var removedUserId = action.optInt("member_id"); var removedUserId = action.optInt("member_id");
htmlAction.append(getString("chat_export_user_kicked") + " ").append((removedUserId > 0) ? getString("chat_export_type_user") : getString("chat_export_type_group")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_user_kicked) + " ").append((removedUserId > 0) ? AndroidUtils.getString(R.string.chat_export_type_user) : AndroidUtils.getString(R.string.chat_export_type_group));
if (removedUserId != 0) { if (removedUserId != 0) {
var userLink = ((removedUserId < 0) ? "club" : "id") + Math.abs(removedUserId); 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>"); htmlAction.append(" <a href=\"https://" + VK_DOMAIN + "/").append(userLink).append("\" class=\"msg-attach-link\">@").append(userLink).append("</a>");
@@ -497,22 +510,22 @@ public class MessagesDownloader {
break; break;
case "chat_pin_message": case "chat_pin_message":
var message = action.optString("message"); var message = action.optString("message");
htmlAction.append(getString("chat_export_msg_pinned")).append((!message.isEmpty()) ? (" \"" + message + "\"") : ""); htmlAction.append(AndroidUtils.getString(R.string.chat_export_msg_pinned)).append((!message.isEmpty()) ? (" \"" + message + "\"") : "");
break; break;
case "chat_unpin_message": case "chat_unpin_message":
htmlAction.append(getString("chat_export_msg_unpinned")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_msg_unpinned));
break; break;
case "chat_invite_user_by_link": case "chat_invite_user_by_link":
htmlAction.append(getString("chat_export_join_by_link")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_join_by_link));
break; break;
case "chat_screenshot": case "chat_screenshot":
htmlAction.append(getString("chat_export_chat_screenshot")); htmlAction.append(AndroidUtils.getString(R.string.chat_export_chat_screenshot));
break; break;
case "custom": case "custom":
htmlAction.append(action.optString("message")); htmlAction.append(action.optString("message"));
break; break;
default: default:
htmlAction.append(getString("vkim_msg_unsupported") + " (").append(type).append(")"); htmlAction.append(AndroidUtils.getString(R.string.vkim_msg_unsupported) + " (").append(type).append(")");
break; break;
} }
@@ -531,40 +544,40 @@ public class MessagesDownloader {
switch (type) { // market_album is not supported switch (type) { // market_album is not supported
case "photo": case "photo":
var sizes = item.getJSONArray("sizes"); var sizes = item.getJSONArray("sizes");
rs.append("<a href=\"").append(sizes.getJSONObject(sizes.length() - 1).getString("url")).append("\" class=\"msg-attach-link\">").append(getString("chat_export_type_photo")).append("</a>"); rs.append("<a href=\"").append(sizes.getJSONObject(sizes.length() - 1).getString("url")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_photo)).append("</a>");
break; break;
case "doc": case "doc":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">").append(getString("chat_export_type_doc")).append("</a>"); rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_doc)).append("</a>");
break; break;
case "link": case "link":
rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">").append(getString("chat_export_type_link")).append("</a>"); rs.append("<a href=\"").append(item.getString("url")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_link)).append("</a>");
break; break;
case "wall": 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\">").append(getString("chat_export_type_wallpost")).append("</a>"); 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\">").append(AndroidUtils.getString(R.string.chat_export_type_wallpost)).append("</a>");
break; break;
case "sticker": case "sticker":
rs.append("<img style=\"width:128px;height:128px;\" src=\"").append(item.getJSONArray("images").getJSONObject(1).getString("url")).append("\"/>"); rs.append("<img style=\"width:128px;height:128px;\" src=\"").append(item.getJSONArray("images").getJSONObject(1).getString("url")).append("\"/>");
break; break;
case "audio_message": case "audio_message":
rs.append("<a href=\"").append(item.optString("link_mp3")).append("\" class=\"msg-attach-link\">").append(getString("chat_export_type_audiomsg")).append("</a>"); rs.append("<a href=\"").append(item.optString("link_mp3")).append("\" class=\"msg-attach-link\">").append(AndroidUtils.getString(R.string.chat_export_type_audiomsg)).append("</a>");
break; break;
case "audio": case "audio":
rs.append(getString("chat_export_type_audio")).append(" (").append(item.optString("artist")).append(" — ").append(item.optString("title")).append(")"); rs.append(AndroidUtils.getString(R.string.chat_export_type_audio)).append(" (").append(item.optString("artist")).append(" — ").append(item.optString("title")).append(")");
break; break;
case "video": case "video":
rs.append(getString("chat_export_type_video")).append(" (").append(getVideoHtml(item.optJSONObject("files"))).append(")"); rs.append(AndroidUtils.getString(R.string.chat_export_type_video)).append(" (").append(getVideoHtml(item.optJSONObject("files"))).append(")");
break; break;
case "wall_reply": case "wall_reply":
var link = "https://" + VK_DOMAIN + "/wall" + item.optString("owner_id") + "_" + item.optString("post_id") + "?reply=" + item.optString("id"); 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("\">").append(getString("chat_export_type_wallreply")).append("</a>"); rs.append("<a class=\"msg-attach-link\" href=\"").append(link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_wallreply)).append("</a>");
break; break;
case "story": case "story":
var story_link = "https://" + VK_DOMAIN + "/story" + item.optString("owner_id") + "_" + item.optString("id"); 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("\">").append(getString("chat_export_type_story")).append("</a>"); rs.append("<a class=\"msg-attach-link\" href=\"").append(story_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_story)).append("</a>");
break; break;
case "podcast": case "podcast":
var podcast_link = "https://" + VK_DOMAIN + "/podcast" + item.optString("owner_id") + "_" + item.optString("id"); 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("\">").append(getString("chat_export_type_podcast")).append("</a>"); rs.append("<a class=\"msg-attach-link\" href=\"").append(podcast_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_podcast)).append("</a>");
break; break;
case "gift": case "gift":
rs.append("<img src=\"").append(item.optString("thumb_96")).append("\"/>"); rs.append("<img src=\"").append(item.optString("thumb_96")).append("\"/>");
@@ -574,25 +587,25 @@ public class MessagesDownloader {
if (app != null) { if (app != null) {
var miniapp_link = "https://" + VK_DOMAIN + "/app" + app.optString("id"); var miniapp_link = "https://" + VK_DOMAIN + "/app" + app.optString("id");
rs.append("<a class=\"msg-attach-link\" href=\"").append(miniapp_link).append("\">").append(getString("chat_export_type_miniapp")).append("</a>"); rs.append("<a class=\"msg-attach-link\" href=\"").append(miniapp_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_miniapp)).append("</a>");
break; break;
} }
rs.append(getString("chat_export_error")); rs.append(AndroidUtils.getString(R.string.chat_export_error));
break; break;
case "audio_playlist": case "audio_playlist":
var playlist_link = "https://" + VK_DOMAIN + "/music/album/" + item.optString("owner_id") + "_" + item.optString("id") + "_" + item.optString("access_key"); 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(getString("chat_export_type_playlist")).append(" (").append(item.optString("title")).append(")</a>"); rs.append("<a class=\"msg-attach-link\" href=\"").append(playlist_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_playlist)).append(" (").append(item.optString("title")).append(")</a>");
break; break;
case "poll": case "poll":
rs.append(getString(item.optBoolean("anonymous") ? "chat_export_poll_anon" : "chat_export_poll_publ")).append(" ").append(getString("chat_export_type_poll")).append(" ").append(getPollHtml(item)); rs.append(AndroidUtils.getString(item.optBoolean("anonymous") ? R.string.chat_export_poll_anon : R.string.chat_export_poll_publ)).append(" ").append(AndroidUtils.getString(R.string.chat_export_type_poll)).append(" ").append(getPollHtml(item));
break; break;
case "market": case "market":
var market_item_link = "https://" + VK_DOMAIN + "/market" + item.optString("owner_id") + "_" + item.optString("id"); 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("\">").append(getString("chat_export_type_market")).append("</a>"); rs.append("<a class=\"msg-attach-link\" href=\"").append(market_item_link).append("\">").append(AndroidUtils.getString(R.string.chat_export_type_market)).append("</a>");
break; break;
default: default:
rs.append(getString("vkim_msg_unsupported")).append(" (").append(type).append(")"); rs.append(AndroidUtils.getString(R.string.vkim_msg_unsupported)).append(" (").append(type).append(")");
break; break;
} }
@@ -1,7 +1,5 @@
package ru.vtosters.lite.downloaders; package ru.vtosters.lite.downloaders;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.DownloadManager; import android.app.DownloadManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -12,6 +10,7 @@ import android.net.Uri;
import android.os.Environment; import android.os.Environment;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
@@ -50,7 +49,7 @@ public class OTADownloader {
File apk = maxIndex == -1 ? new File(downloadDir, "VTLite.apk") : new File(downloadDir, "VTLite-" + maxIndex + ".apk"); File apk = maxIndex == -1 ? new File(downloadDir, "VTLite.apk") : new File(downloadDir, "VTLite-" + maxIndex + ".apk");
APKInstallActivity.installOta(context, FileUtils.uriFromFile(apk)); APKInstallActivity.installOta(context, FileUtils.uriFromFile(apk));
} else if (status == DownloadManager.STATUS_FAILED) { } else if (status == DownloadManager.STATUS_FAILED) {
AndroidUtils.sendToast(getString("downloaderr")); AndroidUtils.sendToast(context.getString(R.string.downloaderr));
} }
} }
} }
@@ -74,12 +73,12 @@ public class OTADownloader {
e.printStackTrace(); e.printStackTrace();
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("update_error")) .setTitle(R.string.update_error)
.setMessage(AndroidUtils.getString("update_error_text")) .setMessage(R.string.update_error_text)
.setPositiveButton(AndroidUtils.getString("no"), .setPositiveButton(R.string.no,
(dialog, which) -> dialog.cancel() (dialog, which) -> dialog.cancel()
) )
.setNeutralButton(AndroidUtils.getString("yes"), .setNeutralButton(R.string.yes,
(dialog, which) -> { (dialog, which) -> {
var intent = new Intent(Intent.ACTION_VIEW) var intent = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("https://github.com/vtosters/lite/releases/latest/download/VTLite.apk")); .setData(Uri.parse("https://github.com/vtosters/lite/releases/latest/download/VTLite.apk"));
@@ -4,8 +4,6 @@ import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; 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 android.app.DownloadManager; import android.app.DownloadManager;
import android.app.ProgressDialog; import android.app.ProgressDialog;
@@ -28,7 +26,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ExternalLinkParser; import ru.vtosters.lite.utils.ExternalLinkParser;
public class VideoDownloader { public class VideoDownloader {
@@ -48,7 +45,7 @@ public class VideoDownloader {
public static void injectAction(ArrayList<MenuBottomSheetAction> list, VideoFile video) { public static void injectAction(ArrayList<MenuBottomSheetAction> list, VideoFile video) {
if (!video.U && !video.I1()) { if (!video.U && !video.I1()) {
addAction(list, DOWNLOAD_ID, R.drawable.ic_download_outline_24, R.string.download, 9); addAction(list, DOWNLOAD_ID, R.drawable.ic_download_outline_24, R.string.download, 9);
addAction(list, OPEN_EXTERNAL_LINK_ID, R.drawable.ic_link_outline_28, getIdentifier("interfacevideoext_short", "string"), 9); addAction(list, OPEN_EXTERNAL_LINK_ID, R.drawable.ic_link_outline_28, R.string.interfacevideoext_short, 9);
} }
} }
@@ -90,7 +87,7 @@ public class VideoDownloader {
} }
if (list.isEmpty()) { if (list.isEmpty()) {
ToastUtils.a(getString("videodownloaderr")); ToastUtils.a(context.getString(R.string.videodownloaderr));
return; return;
} }
@@ -127,12 +124,12 @@ public class VideoDownloader {
public static void parseVideoLink(String url, Context ctx) { public static void parseVideoLink(String url, Context ctx) {
if (url.contains("vk.com/story")) { if (url.contains("vk.com/story")) {
ToastUtils.a(AndroidUtils.getString("video_dl_stories_not_supported")); ToastUtils.a(ctx.getString(R.string.video_dl_stories_not_supported));
return; return;
} }
if (!url.contains("vk.com/video")) { if (!url.contains("vk.com/video")) {
ToastUtils.a(AndroidUtils.getString("video_dl_wrong_link")); ToastUtils.a(ctx.getString(R.string.video_dl_wrong_link));
return; return;
} }
@@ -140,7 +137,7 @@ public class VideoDownloader {
String ownerId = videoId.split("_")[0]; String ownerId = videoId.split("_")[0];
final ProgressDialog progressDialog = new ProgressDialog(ctx); final ProgressDialog progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage(AndroidUtils.getString("video_dl_progress")); progressDialog.setMessage(ctx.getString(R.string.video_dl_progress));
progressDialog.show(); progressDialog.show();
makeRequest("https://" + getApi() + "/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(),
@@ -156,7 +153,7 @@ public class VideoDownloader {
downloadVideo(videoFile, ctx); downloadVideo(videoFile, ctx);
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(ctx, AndroidUtils.getString("video_dl_error"), Toast.LENGTH_SHORT).show(); Toast.makeText(ctx, ctx.getString(R.string.video_dl_error), Toast.LENGTH_SHORT).show();
} }
}); });
} }
@@ -1,7 +1,5 @@
package ru.vtosters.lite.downloaders.notifications; package ru.vtosters.lite.downloaders.notifications;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel; import android.app.NotificationChannel;
import android.app.NotificationManager; import android.app.NotificationManager;
@@ -10,18 +8,20 @@ import android.os.Build;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class NotificationChannels { public class NotificationChannels {
public static final String MUSIC_DOWNLOAD_CHANNEL_ID = "music_download_channel"; public static final String MUSIC_DOWNLOAD_CHANNEL_ID = "music_download_channel";
public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = getString("music_downloading"); public static final String MUSIC_DOWNLOAD_CHANNEL_NAME = AndroidUtils.getString(R.string.music_downloading);
public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = getString("music_downloading_progress"); public static final String MUSIC_DOWNLOAD_CHANNEL_DESCRIPTION = AndroidUtils.getString(R.string.music_downloading_progress);
public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID = "music_playlist_download_channel"; public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID = "music_playlist_download_channel";
public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_NAME = getString("playlist_downloading"); public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_NAME = AndroidUtils.getString(R.string.playlist_downloading);
public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_DESCRIPTION = getString("playlist_downloading_progress"); public static final String MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_DESCRIPTION = AndroidUtils.getString(R.string.playlist_downloading_progress);
public static final String MUSIC_CACHING_NAME = getString("caching_track_or_pic"); public static final String MUSIC_CACHING_NAME = AndroidUtils.getString(R.string.caching_track_or_pic);
private static NotificationManagerCompat notificationManagerCompat; private static NotificationManagerCompat notificationManagerCompat;
@@ -5,8 +5,6 @@ import static android.widget.Toast.makeText;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled; import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; 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 android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.ProgressDialog; import android.app.ProgressDialog;
@@ -15,6 +13,7 @@ import android.util.Log;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import com.vtosters.lite.R;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@@ -126,7 +125,7 @@ public class FoafBase {
public static void loadAndShow(Context context, int i) { public static void loadAndShow(Context context, int i) {
ProgressDialog progressDialog = new ProgressDialog(context); ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage(getString("com_facebook_loading")); progressDialog.setMessage(context.getString(R.string.com_facebook_loading));
progressDialog.setCancelable(false); progressDialog.setCancelable(false);
progressDialog.show(); progressDialog.show();
@@ -145,16 +144,16 @@ public class FoafBase {
getNormalHumanDate(Objects.requireNonNull(matcher2.group(1))); getNormalHumanDate(Objects.requireNonNull(matcher2.group(1)));
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(getIdentifier("addinf", "string")) .setTitle(R.string.addinf)
.setMessage(getString("foafid") + .setMessage(context.getString(R.string.foafid) +
" " + i + getString("foafregdate") " " + i + context.getString(R.string.foafregdate)
+ " " + normalHumanDate + getString("foafdate") + " " + normalHumanDate + context.getString(R.string.foafdate)
+ " " + daysPassedFromFoafDate(normalHumanDate)) + " " + daysPassedFromFoafDate(normalHumanDate))
.setPositiveButton(android.R.string.ok, null) .setPositiveButton(android.R.string.ok, null)
.show(); .show();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
makeText(getGlobalContext(), getString("foaferr"), LENGTH_SHORT).show(); makeText(getGlobalContext(), context.getString(R.string.foaferr), LENGTH_SHORT).show();
} }
} }
@@ -18,7 +18,6 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NewsFeedFiltersUtils; import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
@@ -339,7 +338,10 @@ public class AdBlockHook {
return true; return true;
} }
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>())); var whitelist = AndroidUtils.getDefaultPrefs().getStringSet(
"whitelisted_filters_groups",
Collections.emptySet()
);
return whitelist.contains(id); return whitelist.contains(id);
} }
@@ -351,7 +353,10 @@ public class AdBlockHook {
id = String.valueOf(list.optInt("source_id")); id = String.valueOf(list.optInt("source_id"));
} }
var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>())); var whitelist = AndroidUtils.getDefaultPrefs().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()
);
return whitelist.contains(id); return whitelist.contains(id);
} }
@@ -2,7 +2,6 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.dnr.DNRInjector.forceInvalidateDialogActions; import static ru.vtosters.lite.dnr.DNRInjector.forceInvalidateDialogActions;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity; import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
@@ -17,12 +16,14 @@ import android.widget.LinearLayout;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.im.engine.models.dialogs.Dialog; import com.vk.im.engine.models.dialogs.Dialog;
import com.vtosters.lite.R;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import ru.vtosters.lite.encryption.EncryptProvider; import ru.vtosters.lite.encryption.EncryptProvider;
import ru.vtosters.lite.encryption.base.IMProcessor; import ru.vtosters.lite.encryption.base.IMProcessor;
import ru.vtosters.lite.utils.AndroidUtils;
public class CryptImHook { public class CryptImHook {
public static boolean isPrivateProcessor(int peerID) { public static boolean isPrivateProcessor(int peerID) {
@@ -42,7 +43,7 @@ public class CryptImHook {
int enabledPosition = 0; int enabledPosition = 0;
String[] titles = new String[processors.size() + 1]; String[] titles = new String[processors.size() + 1];
titles[0] = getString("encryption_disable"); titles[0] = AndroidUtils.getString(R.string.encryption_disable);
for (int i = 0; i < processors.size(); i++) { for (int i = 0; i < processors.size(); i++) {
IMProcessor proc = processors.get(i); IMProcessor proc = processors.get(i);
@@ -59,12 +60,12 @@ public class CryptImHook {
Activity ctx = getCurrentActivity(); Activity ctx = getCurrentActivity();
if (ctx == null) { if (ctx == null) {
sendToast(getString("app_activities_error")); sendToast(AndroidUtils.getString(R.string.app_activities_error));
return; return;
} }
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(getString("encryption_sett")) .setTitle(AndroidUtils.getString(R.string.encryption_sett))
.setSingleChoiceItems(titles, enabledPosition, (dialog, which) -> { .setSingleChoiceItems(titles, enabledPosition, (dialog, which) -> {
if (which == 0) { if (which == 0) {
if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId); if (finalEnabled != null) finalEnabled.disableEncryptFor(peerId);
@@ -96,7 +97,7 @@ public class CryptImHook {
} }
if (enabled != null && enabled.isPublic()) { if (enabled != null && enabled.isPublic()) {
sendToast(getString("encryption_public_algorithm_error")); sendToast(AndroidUtils.getString(R.string.encryption_public_algorithm_error));
return; return;
} }
@@ -111,7 +112,7 @@ public class CryptImHook {
Context ctx = getCurrentActivity(); Context ctx = getCurrentActivity();
if (ctx == null) { if (ctx == null) {
sendToast(getString("app_activities_error")); sendToast(ctx.getString(R.string.app_activities_error));
return; return;
} }
@@ -130,8 +131,8 @@ public class CryptImHook {
IMProcessor finalEnabled = enabled; IMProcessor finalEnabled = enabled;
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(getString("encryption_enter_key")) .setTitle(R.string.encryption_enter_key)
.setMessage(String.format(getString("encryption_current_algorithm_title"), enabled.getUIName())) .setMessage(String.format(ctx.getString(R.string.encryption_current_algorithm_title), enabled.getUIName()))
.setView(linearLayout) .setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
Editable edit = editText.getText(); Editable edit = editText.getText();
@@ -1,16 +1,18 @@
package ru.vtosters.lite.hooks; package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.getStringDate; import static ru.vtosters.lite.utils.AndroidUtils.getStringDate;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import com.vtosters.lite.R;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import ru.vtosters.lite.utils.AndroidUtils;
public class DateHook { public class DateHook {
public static boolean fulltime() { public static boolean fulltime() {
return getPrefsValue("dateformat").equals("noyear") || getPrefsValue("dateformat").equals("full") || getPrefsValue("dateformat").equals("noseconds"); return getPrefsValue("dateformat").equals("noyear") || getPrefsValue("dateformat").equals("full") || getPrefsValue("dateformat").equals("noseconds");
@@ -19,11 +21,11 @@ public class DateHook {
public static String getDateFormat() { public static String getDateFormat() {
switch (getPrefsValue("dateformat")) { switch (getPrefsValue("dateformat")) {
case "noyear": case "noyear":
return getString("fulltime2"); return AndroidUtils.getString(R.string.fulltime2);
case "full": case "full":
return getString("fulltime"); return AndroidUtils.getString(R.string.fulltime);
default: default:
return getString("fulltime3"); return AndroidUtils.getString(R.string.fulltime3);
} }
} }
@@ -38,7 +40,7 @@ public class DateHook {
if (!fulltime()) return null; if (!fulltime()) return null;
try { try {
return getStringDate(isFemale ? getIdentifier("last_seen_profile_f", "string") : getIdentifier("last_seen_profile_m", "string"), date.format(new Date(time))); return getStringDate(isFemale ? R.string.last_seen_profile_f : R.string.last_seen_profile_m, date.format(new Date(time)));
} catch (Throwable th) { } catch (Throwable th) {
th.printStackTrace(); th.printStackTrace();
return null; return null;
@@ -209,10 +209,13 @@ public class DockBarInjector {
val = MenuCountersState.n(); val = MenuCountersState.n();
break; break;
case tab_feedback: case tab_feedback:
case tab_news:
if (milkshake()) if (milkshake())
val = MenuCountersState.k(); val = MenuCountersState.k();
break; break;
case tab_news:
if (milkshake() && getBoolValue("newsfeed_notif", true))
val = MenuCountersState.k();
break;
case menu_friends: case menu_friends:
if (!milkshake()) if (!milkshake())
val = MenuCountersState.k(); val = MenuCountersState.k();
@@ -3,9 +3,10 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo; import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo;
import static ru.vtosters.lite.hooks.DateHook.getLocale; import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles; import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.*;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogHeader; import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogHeader;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogPlaylist;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogSeparator; import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getCatalogSeparator;
import static ru.vtosters.lite.music.cache.helpers.PlaylistHelper.getPlaylist;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.getStatic; import static ru.vtosters.lite.proxy.ProxyUtils.getStatic;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
@@ -24,6 +25,7 @@ import android.util.Log;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import com.vk.core.util.DeviceIdProvider; import com.vk.core.util.DeviceIdProvider;
import com.vk.core.util.LangUtils; import com.vk.core.util.LangUtils;
import com.vtosters.lite.R;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@@ -31,7 +33,6 @@ import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.util.Collections;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Objects; import java.util.Objects;
import java.util.Random; import java.util.Random;
@@ -41,7 +42,6 @@ import okhttp3.Headers;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate; import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.helpers.PlaylistHelper;
import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
@@ -71,7 +71,7 @@ public class JsonInjectors {
} }
public static JSONObject donateRecomm() throws JSONException { public static JSONObject donateRecomm() throws JSONException {
var title = AndroidUtils.getString("donate_to_vtl"); var title = AndroidUtils.getString(R.string.donate_to_vtl);
var link = "https://vk.com/vtosters_official"; var link = "https://vk.com/vtosters_official";
var text_color = "2D81E0"; var text_color = "2D81E0";
@@ -112,7 +112,7 @@ public class JsonInjectors {
} }
public static JSONObject vktesters(int id) throws JSONException { public static JSONObject vktesters(int id) throws JSONException {
var title = AndroidUtils.getString("tester_profile"); var title = AndroidUtils.getString(R.string.tester_profile);
var text_color = "2D81E0"; var text_color = "2D81E0";
var link = "https://" + getStatic() + "/bugs?lang=" + LangUtils.a() + "#/reporter" + id; var link = "https://" + getStatic() + "/bugs?lang=" + LangUtils.a() + "#/reporter" + id;
@@ -156,7 +156,7 @@ public class JsonInjectors {
var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id"); var peerid = Objects.requireNonNull(orig.optJSONObject("peer")).optInt("id");
var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null var pic = "https://image.pngaaa.com/641/326641-middle.png"; // can be null
var text = AndroidUtils.getString("no_data_error"); var text = AndroidUtils.getString(R.string.no_data_error);
var link = "https://vtosters.app"; // can be null var link = "https://vtosters.app"; // can be null
var linktitle = "Test button"; // can be null var linktitle = "Test button"; // can be null
@@ -165,10 +165,10 @@ public class JsonInjectors {
var isPicture = pic.endsWith(".png") || pic.endsWith(".jpg") || pic.endsWith(".jpeg") || pic.endsWith(".webp"); var isPicture = pic.endsWith(".png") || pic.endsWith(".jpg") || pic.endsWith(".jpeg") || pic.endsWith(".webp");
if (isVerified(peerid)) text = AndroidUtils.getString("i_bought") + " VTosters Premium"; if (isVerified(peerid)) text = AndroidUtils.getString(R.string.i_bought) + " VTosters Premium";
if (isPrometheus(peerid)) if (isPrometheus(peerid))
text = AndroidUtils.getString("i_bought") + " VTosters Premium Gold Prime Pro Plus"; text = AndroidUtils.getString(R.string.i_bought) + " VTosters Premium Gold Prime Pro Plus";
if (isDeveloper(peerid)) text = AndroidUtils.getString("i_created_poop"); if (isDeveloper(peerid)) text = AndroidUtils.getString(R.string.i_created_poop);
if (!isVerified(peerid) || text.equals("") || peerid == AccountManagerUtils.getUserId() || peerid == 0) { if (!isVerified(peerid) || text.equals("") || peerid == AccountManagerUtils.getUserId() || peerid == 0) {
if (getBoolValue("convBarRecomm", false)) { if (getBoolValue("convBarRecomm", false)) {
@@ -336,36 +336,34 @@ public class JsonInjectors {
public static JSONArray newsfeedlist(JSONArray items) throws JSONException { public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", ""); var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null); var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null);
var mutableFiltersSet = Collections.synchronizedSet(new LinkedHashSet<String>()); var mutableFiltersSet = new LinkedHashSet<String>();
if (filtersSet != null) if (filtersSet != null)
mutableFiltersSet.addAll(filtersSet); mutableFiltersSet.addAll(filtersSet);
synchronized (mutableFiltersSet) { for (int i = 0; i < items.length(); i++) {
for (int i = 0; i < items.length(); i++) { var item = items.optJSONObject(i);
var item = items.optJSONObject(i); if (item == null) continue;
if (item == null) continue;
var id = item.optString("id"); var id = item.optString("id");
var title = item.optString("title"); var title = item.optString("title");
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title) if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
// this items not working // this items not working
|| id.equals("kpop") || id.equals("foryou") || id.equals("kpop") || id.equals("foryou")
|| id.equals("qazaqstan") || id.equals("podcasts")) || id.equals("qazaqstan") || id.equals("podcasts"))
continue; continue;
mutableFiltersSet.add(id + "|" + title); mutableFiltersSet.add(id + "|" + title);
var hide = selectedItems.contains(id); var hide = selectedItems.contains(id);
Log.d("NewsfeedList", "Added list " + id + " to feed"); Log.d("NewsfeedList", "Added list " + id + " to feed");
item.put("is_hidden", hide) item.put("is_hidden", hide)
.put("is_unavailable", hide); .put("is_unavailable", hide);
if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list"); if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
}
getDefaultPrefs().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
.apply();
} }
getDefaultPrefs().edit().putStringSet("news_feed_items_set", mutableFiltersSet)
.apply();
return items; return items;
} }
@@ -20,9 +20,6 @@ import ru.vtosters.lite.ui.dialogs.OTADialog;
import ru.vtosters.lite.ui.dialogs.Start; import ru.vtosters.lite.ui.dialogs.Start;
import ru.vtosters.lite.utils.DeletedMessagesHandler; import ru.vtosters.lite.utils.DeletedMessagesHandler;
/**
* @
*/
public class MainActivityInjector { public class MainActivityInjector {
public static void inject(Activity activity) { public static void inject(Activity activity) {
setNeededTheme(activity); setNeededTheme(activity);
@@ -70,19 +70,25 @@ public class NewsfeedHook {
} }
public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) { public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup))); return getDefaultPrefs().getStringSet(
"whitelisted_filters_groups", Collections.emptySet()
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
} }
public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) { public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) {
return getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup))); return getDefaultPrefs().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()
).contains(String.valueOf(AccountManagerUtils.getUserID(eup)));
} }
public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) { public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) {
var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet<String>());
var id = String.valueOf(AccountManagerUtils.getUserID(eup)); var id = String.valueOf(AccountManagerUtils.getUserID(eup));
mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_filters_groups", mutableAdsSet)); var mutableAdsSet = new LinkedHashSet<>(getDefaultPrefs().getStringSet(
"whitelisted_filters_groups",
Collections.emptySet())
);
if (needWhitelist) { if (needWhitelist) {
mutableAdsSet.add(id); mutableAdsSet.add(id);
} else { } else {
@@ -93,10 +99,11 @@ public class NewsfeedHook {
} }
public static void setWhitelistedAd(ExtendedCommunityProfile eup, boolean needWhitelist) { public static void setWhitelistedAd(ExtendedCommunityProfile eup, boolean needWhitelist) {
var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet<String>());
var id = String.valueOf(AccountManagerUtils.getUserID(eup)); var id = String.valueOf(AccountManagerUtils.getUserID(eup));
mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_ad_groups", mutableAdsSet)); var mutableAdsSet = new LinkedHashSet<>(getDefaultPrefs().getStringSet(
"whitelisted_ad_groups",
Collections.emptySet()));
if (needWhitelist) { if (needWhitelist) {
mutableAdsSet.add(id); mutableAdsSet.add(id);
@@ -5,7 +5,6 @@ import static ru.vtosters.lite.hooks.JsonInjectors.setOnlineInfoUsers;
import static ru.vtosters.lite.net.Request.makeRequest; import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; 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.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.dev; import static ru.vtosters.lite.utils.Preferences.dev;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
@@ -13,6 +12,8 @@ import static ru.vtosters.lite.utils.Preferences.getPrefsFromFile;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@@ -64,37 +65,37 @@ public class OnlineFormatterHook {
case 5027722: case 5027722:
return "VK Messenger (Desktop)"; return "VK Messenger (Desktop)";
case 6146827: case 6146827:
return AndroidUtils.getString("vk_messenger") + " (Android)"; // VK Мессенджер (Android) return AndroidUtils.getString(R.string.vk_messenger) + " (Android)"; // VK Мессенджер (Android)
case 6482950: case 6482950:
return AndroidUtils.getString("vk_messenger") + " (iPhone)"; // VK Мессенджер (iPhone) return AndroidUtils.getString(R.string.vk_messenger) + " (iPhone)"; // VK Мессенджер (iPhone)
case 6481715: case 6481715:
return AndroidUtils.getString("vk_messenger") + " Dev (iPhone)"; // VK Мессенджер Dev (iPhone) return AndroidUtils.getString(R.string.vk_messenger) + " Dev (iPhone)"; // VK Мессенджер Dev (iPhone)
case 7799655: case 7799655:
return AndroidUtils.getString("vk_mail_online"); // VK Почта return AndroidUtils.getString(R.string.vk_mail_online); // VK Почта
case 7598572: case 7598572:
return AndroidUtils.getString("sferum_online") + " (Android)"; // Сферум (Android) return AndroidUtils.getString(R.string.sferum_online) + " (Android)"; // Сферум (Android)
case 7571751: case 7571751:
return AndroidUtils.getString("sferum_online") + " (iPhone)"; // Сферум (iPhone) return AndroidUtils.getString(R.string.sferum_online) + " (iPhone)"; // Сферум (iPhone)
case 7556576: case 7556576:
return AndroidUtils.getString("sferum_online"); // Сферум return AndroidUtils.getString(R.string.sferum_online); // Сферум
case 7497650: case 7497650:
return "VK ID"; return "VK ID";
case 8094476: case 8094476:
return AndroidUtils.getString("vk_calls_online") + " (Android)"; // VK Звонки (Android) return AndroidUtils.getString(R.string.vk_calls_online) + " (Android)"; // VK Звонки (Android)
case 8093730: case 8093730:
return AndroidUtils.getString("vk_calls_online") + " (iPhone)"; // VK Звонки (iPhone) return AndroidUtils.getString(R.string.vk_calls_online) + " (iPhone)"; // VK Звонки (iPhone)
case 7793118: case 7793118:
return AndroidUtils.getString("vk_calls_online") + " (Desktop)"; // VK Звонки (Desktop) return AndroidUtils.getString(R.string.vk_calls_online) + " (Desktop)"; // VK Звонки (Desktop)
case 6767438: case 6767438:
return AndroidUtils.getString("vk_music_online") + " (Android)"; // VK Музыка (Android) return AndroidUtils.getString(R.string.vk_music_online) + " (Android)"; // VK Музыка (Android)
case 8113297: case 8113297:
return AndroidUtils.getString("vk_clips_online") + " (Android)"; // VK Клипы (Android) return AndroidUtils.getString(R.string.vk_clips_online) + " (Android)"; // VK Клипы (Android)
case 8106428: case 8106428:
return AndroidUtils.getString("vk_clips_online") + " (iPhone)"; // VK Клипы (iPhone) return AndroidUtils.getString(R.string.vk_clips_online) + " (iPhone)"; // VK Клипы (iPhone)
case 5044491: case 5044491:
return "Candy"; return "Candy";
case 8114066: case 8114066:
return AndroidUtils.getString("vk_video_online"); // VK Видео return AndroidUtils.getString(R.string.vk_video_online); // VK Видео
case 4894723: case 4894723:
return "Phoenix Lite"; return "Phoenix Lite";
case 4994316: case 4994316:
@@ -173,7 +174,7 @@ public class OnlineFormatterHook {
if (appname == null) return null; if (appname == null) return null;
return getString("custom_online") + " " + appname; return AndroidUtils.getString(R.string.custom_online) + " " + appname;
} }
public static JSONObject onlineHook(JSONObject json) throws ParseException, IOException, JSONException { public static JSONObject onlineHook(JSONObject json) throws ParseException, IOException, JSONException {
@@ -1,8 +1,6 @@
package ru.vtosters.lite.hooks; package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.ClipData; import android.content.ClipData;
@@ -46,7 +44,7 @@ public class PhotoViewer {
static OkHttpClient client = new OkHttpClient(); static OkHttpClient client = new OkHttpClient();
public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) { public static boolean interceptClick(AttachmentWithMedia attachment, MenuItem item, View view) {
if (item.getItemId() == AndroidUtils.getIdentifier("search_photo", "id")) { if (item.getItemId() == R.id.search_photo) {
if (attachment instanceof PhotoAttachment) { if (attachment instanceof PhotoAttachment) {
searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment)); searchPhoto(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) { } else if (attachment instanceof DocumentAttachment) {
@@ -55,13 +53,13 @@ public class PhotoViewer {
try { try {
searchPhoto(getUrlFromDocumentAttachment(documentAttachment)); searchPhoto(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
else else
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
return true; return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("copy_photo_url", "id")) { } else if (item.getItemId() == R.id.copy_photo_url) {
if (attachment instanceof PhotoAttachment) { if (attachment instanceof PhotoAttachment) {
copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment)); copyPhotoUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) { } else if (attachment instanceof DocumentAttachment) {
@@ -70,13 +68,13 @@ public class PhotoViewer {
try { try {
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment)); copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
else else
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
return true; return true;
} else if (item.getItemId() == AndroidUtils.getIdentifier("open_original_photo", "id")) { } else if (item.getItemId() == R.id.open_original_photo) {
if (attachment instanceof PhotoAttachment) { if (attachment instanceof PhotoAttachment) {
openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment)); openUrl(getUrlFromPhotoAttachment((PhotoAttachment) attachment));
} else if (attachment instanceof DocumentAttachment) { } else if (attachment instanceof DocumentAttachment) {
@@ -85,19 +83,19 @@ public class PhotoViewer {
try { try {
openUrl(getUrlFromDocumentAttachment(documentAttachment)); openUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
else else
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
return true; return true;
} }
return false; return true;
} }
@SuppressLint("UseCompatLoadingForDrawables") @SuppressLint("UseCompatLoadingForDrawables")
public static void addMenuItems(AttachmentWithMedia attachment, ActionsPopup.b actionPopup, int i, boolean z) { public static void addMenuItems(AttachmentWithMedia attachment, ActionsPopup.b actionPopup, int i, boolean z) {
actionPopup.a(getIdentifier("search_photo_content", "string"), actionPopup.a(R.string.search_photo_content,
ThemesUtils.isDarkTheme() ThemesUtils.isDarkTheme()
? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28) ? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28)
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()), : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()),
@@ -111,15 +109,15 @@ public class PhotoViewer {
try { try {
searchPhoto(getUrlFromDocumentAttachment(documentAttachment)); searchPhoto(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
else else
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
return null; return null;
} }
); );
actionPopup.a(getIdentifier("copy_photo_url_content", "string"), actionPopup.a(R.string.copy_photo_url_content,
!ThemesUtils.isDarkTheme() !ThemesUtils.isDarkTheme()
? new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), ThemesUtils.getAccentColor()) ? new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), ThemesUtils.getAccentColor())
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE), : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE),
@@ -133,15 +131,15 @@ public class PhotoViewer {
try { try {
copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment)); copyPhotoUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
else else
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
return null; return null;
} }
); );
actionPopup.a(getIdentifier("open_original_photo_content", "string"), actionPopup.a(R.string.open_original_photo_content,
ThemesUtils.isDarkTheme() ThemesUtils.isDarkTheme()
? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28) ? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28)
: new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28), : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28),
@@ -156,10 +154,10 @@ public class PhotoViewer {
try { try {
openUrl(getUrlFromDocumentAttachment(documentAttachment)); openUrl(getUrlFromDocumentAttachment(documentAttachment));
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
else else
ToastUtils.a(getString("photo_get_error")); ToastUtils.a(R.string.photo_get_error);
} }
return null; return null;
} }
@@ -248,7 +246,7 @@ public class PhotoViewer {
if (url == null || url.isEmpty()) return; if (url == null || url.isEmpty()) return;
ClipboardManager manager = (ClipboardManager) AndroidUtils.getGlobalContext().getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager manager = (ClipboardManager) AndroidUtils.getGlobalContext().getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(ClipData.newPlainText("vk_photo_url", url)); manager.setPrimaryClip(ClipData.newPlainText("vk_photo_url", url));
Toast.makeText(AndroidUtils.getGlobalContext(), AndroidUtils.getIdentifier("copied_to_clipboard", "string"), Toast.LENGTH_SHORT).show(); Toast.makeText(AndroidUtils.getGlobalContext(), R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show();
} }
private static void openUrl(String url) { private static void openUrl(String url) {
@@ -21,15 +21,14 @@ import androidx.appcompat.view.ContextThemeWrapper;
import com.vk.auth.ui.VkAuthTextView; import com.vk.auth.ui.VkAuthTextView;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import ru.vtosters.lite.ui.fragments.ProxySettingsFragment; import ru.vtosters.lite.ui.fragments.ProxySettingsFragment;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils;
public class ProxyHook { public class ProxyHook {
public static void hookAuth(View v) { public static void hookAuth(View v) {
VkAuthTextView button = (VkAuthTextView) v; VkAuthTextView button = (VkAuthTextView) v;
button.setText(AndroidUtils.getString("proxy_setup")); button.setText(R.string.proxy_setup);
button.setOnClickListener(v1 -> callProxyDialog(v1.getContext())); button.setOnClickListener(v1 -> callProxyDialog(v1.getContext()));
} }
@@ -54,16 +53,16 @@ public class ProxyHook {
rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0); rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
rgDefault.setText(AndroidUtils.getString("proxy_disable")); rgDefault.setText(ctx.getString(R.string.proxy_disable));
rgDefault.setTextColor(getTextAttr()); rgDefault.setTextColor(getTextAttr());
rgZaborona.setText(AndroidUtils.getString("proxy_enable") + " (Zaborona)"); rgZaborona.setText(ctx.getString(R.string.proxy_enable) + " (Zaborona)");
rgZaborona.setTextColor(getTextAttr()); rgZaborona.setTextColor(getTextAttr());
rgRandomProxy.setText(AndroidUtils.getString("proxy_enable") + " (Random Socks Proxy)"); rgRandomProxy.setText(ctx.getString(R.string.proxy_enable) + " (Random Socks Proxy)");
rgRandomProxy.setTextColor(getTextAttr()); rgRandomProxy.setTextColor(getTextAttr());
rgVika.setText(AndroidUtils.getString("proxy_enable") + " (Vika Mobile)"); rgVika.setText(ctx.getString(R.string.proxy_enable) + " (Vika Mobile)");
rgVika.setTextColor(getTextAttr()); rgVika.setTextColor(getTextAttr());
rgZaborona.setChecked(isZaboronaEnabled()); rgZaborona.setChecked(isZaboronaEnabled());
@@ -72,10 +71,10 @@ public class ProxyHook {
rgVika.setChecked(isVikaProxyEnabled()); rgVika.setChecked(isVikaProxyEnabled());
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("vtlproxy")) .setTitle(ctx.getString(R.string.vtlproxy))
.setMessage(AndroidUtils.getString("proxy_warning")) .setMessage(ctx.getString(R.string.proxy_warning))
.setView(rg) .setView(rg)
.setPositiveButton(AndroidUtils.getString("vtl_confirm"), ((dialog, which) -> { // Применить .setPositiveButton(ctx.getString(R.string.vtl_confirm), ((dialog, which) -> { // Применить
if (rgZaborona.isChecked()) { if (rgZaborona.isChecked()) {
edit().putString("proxy", "zaborona").commit(); edit().putString("proxy", "zaborona").commit();
restartApplication(); restartApplication();
@@ -90,7 +89,7 @@ public class ProxyHook {
restartApplication(); restartApplication();
} }
})) }))
.setNeutralButton(AndroidUtils.getString("proxy_settings"), ((dialog, which) -> { .setNeutralButton(ctx.getString(R.string.proxy_settings), ((dialog, which) -> {
var intent = new Navigator(ProxySettingsFragment.class) var intent = new Navigator(ProxySettingsFragment.class)
.b(ctx) .b(ctx)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -5,7 +5,6 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor; import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getAttrId;
import static ru.vtosters.lite.utils.ThemesUtils.getBackgroundContent; import static ru.vtosters.lite.utils.ThemesUtils.getBackgroundContent;
import static ru.vtosters.lite.utils.ThemesUtils.getBackgroundPage; import static ru.vtosters.lite.utils.ThemesUtils.getBackgroundPage;
import static ru.vtosters.lite.utils.ThemesUtils.getColorFromAttr; import static ru.vtosters.lite.utils.ThemesUtils.getColorFromAttr;
@@ -17,6 +16,7 @@ import static ru.vtosters.lite.utils.ThemesUtils.hex;
import android.webkit.WebView; import android.webkit.WebView;
import com.vk.articles.preload.WebCachePreloader; import com.vk.articles.preload.WebCachePreloader;
import com.vtosters.lite.R;
import com.vtosters.lite.data.ThemeTracker; import com.vtosters.lite.data.ThemeTracker;
import java.io.BufferedReader; import java.io.BufferedReader;
@@ -61,10 +61,10 @@ public class VKUIHook {
.replace("%header_text%", hex(getHeaderText())) .replace("%header_text%", hex(getHeaderText()))
.replace("%accent%", hex(getAccentColor())) .replace("%accent%", hex(getAccentColor()))
.replace("%background_page%", hex(getBackgroundPage())) .replace("%background_page%", hex(getBackgroundPage()))
.replace("%content_tint_background%", hex(getColorFromAttr(getAttrId("content_tint_background")))) .replace("%content_tint_background%", hex(getColorFromAttr(R.attr.content_tint_background)))
.replace("%button_primary_background%", hex(getColorFromAttr(getAttrId("button_primary_background")))) .replace("%button_primary_background%", hex(getColorFromAttr(R.attr.button_primary_background)))
.replace("%button_outline_foreground%", hex(getColorFromAttr(getAttrId("button_outline_foreground")))) .replace("%button_outline_foreground%", hex(getColorFromAttr(R.attr.button_outline_foreground)))
.replace("%button_outline_border%", hex(getColorFromAttr(getAttrId("button_outline_border")))) .replace("%button_outline_border%", hex(getColorFromAttr(R.attr.button_outline_border)))
.replace("%text_primary%", hex(getTextAttr())); .replace("%text_primary%", hex(getTextAttr()));
@@ -2,12 +2,13 @@ package ru.vtosters.lite.hooks;
import static ru.vtosters.lite.utils.Preferences.wbios; import static ru.vtosters.lite.utils.Preferences.wbios;
import ru.vtosters.lite.utils.AndroidUtils; import com.vtosters.lite.R;
import ru.vtosters.lite.utils.ThemesUtils; import ru.vtosters.lite.utils.ThemesUtils;
public class WritebarHook { public class WritebarHook {
public static int getWriteBar() { public static int getWriteBar() {
return AndroidUtils.getIdentifier((wbios() ? "write_bar_i" : "write_bar"), "layout"); return wbios() ? R.layout.write_bar_i : R.layout.write_bar;
} }
public static int getIconsColors(int def) { public static int getIconsColors(int def) {
@@ -24,7 +24,6 @@ import java.util.concurrent.Executors;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl; import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl;
import ru.vtosters.lite.downloaders.AudioDownloader; import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.utils.AndroidUtils;
public class MusicBottomSheetHook { public class MusicBottomSheetHook {
private static final ExecutorService executor = Executors.newCachedThreadPool(); private static final ExecutorService executor = Executors.newCachedThreadPool();
@@ -61,18 +60,18 @@ public class MusicBottomSheetHook {
if (isCached(trackid)) { if (isCached(trackid)) {
actions.add(new MusicAction( actions.add(new MusicAction(
AndroidUtils.getIdentifier("music_action_toggle_download", "id"), R.id.music_action_toggle_download,
milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24, milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24,
AndroidUtils.getIdentifier("remove_from_cache", "string"), R.string.remove_from_cache,
musicTrack.F1() ? R.color.music_action_button_gray_50_alpha : R.color.caption_gray, musicTrack.F1() ? R.color.music_action_button_gray_50_alpha : R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
)); ));
} else { } else {
actions.add(new MusicAction( actions.add(new MusicAction(
AndroidUtils.getIdentifier("music_action_toggle_download", "id"), R.id.music_action_toggle_download,
milkshake() ? R.drawable.ic_download_outline_28 : R.drawable.ic_download_24, milkshake() ? R.drawable.ic_download_outline_28 : R.drawable.ic_download_24,
AndroidUtils.getIdentifier("add_to_cache", "string"), R.string.add_to_cache,
musicTrack.F1() ? R.color.music_action_button_gray_50_alpha : R.color.caption_gray, musicTrack.F1() ? R.color.music_action_button_gray_50_alpha : R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -103,10 +102,10 @@ public class MusicBottomSheetHook {
} }
public static boolean injectOnClick(int actionId, MusicTrack track, MusicPlaybackLaunchContext context, Playlist playlist) { // musictrack inj public static boolean injectOnClick(int actionId, MusicTrack track, MusicPlaybackLaunchContext context, Playlist playlist) { // musictrack inj
if (actionId == AndroidUtils.getIdentifier("play_in_vkx", "id")) if (actionId == R.id.play_in_vkx)
return tryPlayInVKX(track, context, playlist); return tryPlayInVKX(track, context, playlist);
if (actionId == AndroidUtils.getIdentifier("remove_from_cache_vkx", "id")) { if (actionId == R.id.remove_from_cache_vkx) {
getInstance().runOnService(service -> { getInstance().runOnService(service -> {
try { try {
service.deleteTrackFromCache(track.d, track.e); service.deleteTrackFromCache(track.d, track.e);
@@ -115,7 +114,7 @@ public class MusicBottomSheetHook {
} }
}); });
return true; return true;
} else if (actionId == AndroidUtils.getIdentifier("add_to_cache_vkx", "id")) { } else if (actionId == R.id.add_to_cache_vkx) {
getInstance().runOnService(service -> { getInstance().runOnService(service -> {
try { try {
service.addTrackToCache(track.d, track.e, (track.J != null) ? track.J : ""); service.addTrackToCache(track.d, track.e, (track.J != null) ? track.J : "");
@@ -126,7 +125,7 @@ public class MusicBottomSheetHook {
return true; return true;
} }
if (actionId == AndroidUtils.getIdentifier("download_mp3", "id")) { if (actionId == R.id.download_mp3) {
if (isIntegrationEnabled()) { if (isIntegrationEnabled()) {
getInstance().runOnService(service -> { getInstance().runOnService(service -> {
try { try {
@@ -146,15 +145,15 @@ public class MusicBottomSheetHook {
} }
public static boolean injectOnClick(int actionId, Playlist playlist) { // playlist inj public static boolean injectOnClick(int actionId, Playlist playlist) { // playlist inj
if (actionId == AndroidUtils.getIdentifier("play_in_vkx", "id")) if (actionId == R.id.play_in_vkx)
return tryPlayInVKX(null, null, playlist); return tryPlayInVKX(null, null, playlist);
if (actionId == AndroidUtils.getIdentifier("add_to_cache", "id")) { if (actionId == R.id.add_to_cache) {
executor.submit(() -> AudioDownloader.cachePlaylist(playlist)); executor.submit(() -> AudioDownloader.cachePlaylist(playlist));
return true; return true;
} }
if (actionId == AndroidUtils.getIdentifier("remove_from_cache_vkx", "id")) { if (actionId == R.id.remove_from_cache_vkx) {
getInstance().runOnService(service -> { getInstance().runOnService(service -> {
try { try {
service.deletePlaylistFromCache(playlist.a, playlist.b); service.deletePlaylistFromCache(playlist.a, playlist.b);
@@ -163,7 +162,7 @@ public class MusicBottomSheetHook {
} }
}); });
return true; return true;
} else if (actionId == AndroidUtils.getIdentifier("add_to_cache_vkx", "id")) { } else if (actionId == R.id.add_to_cache_vkx) {
getInstance().runOnService(service -> { getInstance().runOnService(service -> {
try { try {
service.addPlaylistToCache(playlist.a, playlist.b, (playlist.Q != null) ? playlist.Q : ""); service.addPlaylistToCache(playlist.a, playlist.b, (playlist.Q != null) ? playlist.Q : "");
@@ -174,7 +173,7 @@ public class MusicBottomSheetHook {
return true; return true;
} }
if (actionId == AndroidUtils.getIdentifier("download_mp3", "id")) { if (actionId == R.id.download_mp3) {
if (isIntegrationEnabled()) { if (isIntegrationEnabled()) {
getInstance().runOnService(service -> { getInstance().runOnService(service -> {
try { try {
@@ -207,9 +206,9 @@ public class MusicBottomSheetHook {
private static MusicAction getPlayInVKXAction() { private static MusicAction getPlayInVKXAction() {
return new MusicAction( return new MusicAction(
AndroidUtils.getIdentifier("play_in_vkx", "id"), R.id.play_in_vkx,
milkshake() ? R.drawable.ic_music_outline_24 : R.drawable.ic_music_24, milkshake() ? R.drawable.ic_music_outline_24 : R.drawable.ic_music_24,
AndroidUtils.getIdentifier("play_in_vkx", "string"), R.string.play_in_vkx,
R.color.caption_gray, R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -218,9 +217,9 @@ public class MusicBottomSheetHook {
private static MusicAction getRemoveCacheTrackAction() { private static MusicAction getRemoveCacheTrackAction() {
return new MusicAction( return new MusicAction(
AndroidUtils.getIdentifier("remove_from_cache", "id"), R.id.remove_from_cache,
milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24, milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24,
AndroidUtils.getIdentifier("remove_from_cache", "string"), R.string.remove_from_cache,
R.color.caption_gray, R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -229,9 +228,9 @@ public class MusicBottomSheetHook {
private static MusicAction addToCacheTrackAction() { private static MusicAction addToCacheTrackAction() {
return new MusicAction( return new MusicAction(
AndroidUtils.getIdentifier("add_to_cache", "id"), R.id.add_to_cache,
milkshake() ? R.drawable.ic_add_outline_28 : R.drawable.ic_add_24, milkshake() ? R.drawable.ic_add_outline_28 : R.drawable.ic_add_24,
AndroidUtils.getIdentifier("add_to_cache", "string"), R.string.add_to_cache,
R.color.caption_gray, R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -240,9 +239,9 @@ public class MusicBottomSheetHook {
private static MusicAction getRemoveCacheTrackVkxAction() { private static MusicAction getRemoveCacheTrackVkxAction() {
return new MusicAction( return new MusicAction(
AndroidUtils.getIdentifier("remove_from_cache_vkx", "id"), R.id.remove_from_cache_vkx,
milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24, milkshake() ? R.drawable.ic_delete_outline_28 : R.drawable.ic_delete_24,
AndroidUtils.getIdentifier("remove_from_cache_vkx", "string"), R.string.remove_from_cache_vkx,
R.color.caption_gray, R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -251,9 +250,9 @@ public class MusicBottomSheetHook {
private static MusicAction addToCacheTrackVkxAction() { private static MusicAction addToCacheTrackVkxAction() {
return new MusicAction( return new MusicAction(
AndroidUtils.getIdentifier("add_to_cache_vkx", "id"), R.id.add_to_cache_vkx,
milkshake() ? R.drawable.ic_add_outline_28 : R.drawable.ic_add_24, milkshake() ? R.drawable.ic_add_outline_28 : R.drawable.ic_add_24,
AndroidUtils.getIdentifier("add_to_cache_vkx", "string"), R.string.add_to_cache_vkx,
R.color.caption_gray, R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -262,9 +261,9 @@ public class MusicBottomSheetHook {
private static MusicAction downloadAsMp3Action() { private static MusicAction downloadAsMp3Action() {
return new MusicAction( return new MusicAction(
AndroidUtils.getIdentifier("download_mp3", "id"), R.id.download_mp3,
milkshake() ? R.drawable.ic_download_outline_28 : R.drawable.ic_download_24, milkshake() ? R.drawable.ic_download_outline_28 : R.drawable.ic_download_24,
AndroidUtils.getIdentifier("download_mp3", "string"), R.string.download_mp3,
R.color.caption_gray, R.color.caption_gray,
R.string.music_talkback_empty, R.string.music_talkback_empty,
false false
@@ -0,0 +1,220 @@
package ru.vtosters.lite.music;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
public class LastFMScrobbler {
private static final String KEY = "5965d63402414776c54c266db0211746";
private static final String KEY_SECRET = "d982180eed13275bb948e41cf225f88f";
private static final String URL = "https://ws.audioscrobbler.com/2.0/";
private static final OkHttpClient CLIENT = new OkHttpClient();
private static final List<String> SCROBBLED_UUIDS = new ArrayList<>();
public static void grabMusicTrack(MusicTrack musictrack) {
var uid = musictrack.y1();
var artist = musictrack.C;
var title = musictrack.f;
var duration = musictrack.h;
var track_id = musictrack.d;
var owner_id = musictrack.e;
var access_key = !TextUtils.isEmpty(musictrack.J) ? musictrack.J : "";
var album_id = musictrack.I;
var album = album_id != null ? album_id.getTitle() : null;
if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) {
Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid);
return;
}
if (Preferences.autocache() && !CacheDatabaseDelegate.isCached(uid)) {
if (LibVKXClient.isIntegrationEnabled()){
LibVKXClient.getInstance().runOnService(service -> {
try {
service.addTrackToCache(track_id, owner_id, access_key);
} catch (RemoteException e) {
e.printStackTrace();
}
});
} else {
AudioDownloader.cacheTrack(musictrack);
}
}
scrobbleTrack(duration, artist, title, uid, album);
}
public static void scrobbleTrack(
long duration,
String artist,
String title,
String uid,
@Nullable String album
) {
Log.d("Scrobbler", "scrobbleTrack: " + title + " - " + artist + " - " + duration + " - " + uid);
if (!needScrobbling(uid) || !isLoggedIn() || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0)
return;
SCROBBLED_UUIDS.add(uid);
var params = new TreeMap<String, String>();
params.put("api_key", KEY);
params.put("method", "track.scrobble");
params.put("sk", getSessionKey());
params.put("artist[0]", artist);
params.put("track[0]", title);
if (!TextUtils.isEmpty(album))
params.put("album[0]", album);
params.put("duration[0]", String.valueOf(duration));
params.put("timestamp[0]", String.valueOf(System.currentTimeMillis() / 1000));
fetch(params, new Callback() {
@Override
public void a(Call call, IOException e) {
Log.d("Scrobbler", e+"");
}
@Override
public void a(Call call, Response response) throws IOException {
Log.d("Scrobbler", "Scrobbled: " + artist + " - " + title);
Log.d("Scrobbler", "Response scrobble: " + response.a().g());
}
});
}
public static void authenticate(String username, String password) {
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
AndroidUtils.sendToast(AndroidUtils.getString(R.string.lastfm_credentials_empty));
return;
}
var params = new TreeMap<String, String>();
params.put("api_key", KEY);
params.put("method", "auth.getMobileSession");
params.put("username", username);
params.put("password", password);
fetch(params, new Callback() {
@Override
public void a(Call call, IOException e) {
Log.d("Scrobbler", "Auth failed", e);
AndroidUtils.sendToast(AndroidUtils.getString(R.string.auth_error_vtl));
}
@Override
public void a(Call call, Response response) throws IOException {
try {
var resBody = response.a().g();
var json = new JSONObject(resBody);
fetchSession(json);
Log.d("Scrobbler", "Auth response " + resBody);
} catch (JSONException e) {
Log.d("Scrobbler", "Auth failed", e);
}
}
});
}
private static String generateMD5(Map<String, String> params) {
var sb = new StringBuilder();
for (var entry : params.entrySet())
sb.append(entry.getKey()).append(entry.getValue());
return AndroidUtils.MD5(sb.append(KEY_SECRET).toString());
}
private static void fetch(TreeMap<String, String> params, Callback callback) {
// Each call must be signed with md5.
// For more information check https://www.last.fm/api
params.put("api_sig", generateMD5(params));
params.put("format", "json");
var reqBodyBuilder = new FormBody.a(StandardCharsets.UTF_8);
for (var entry : params.entrySet())
reqBodyBuilder.a(entry.getKey(), entry.getValue());
var req = new Request.a()
.b(URL)
.a(reqBodyBuilder.a())
.a();
CLIENT.a(req).a(callback);
}
public static void fetchSession(JSONObject json) throws JSONException {
if (!json.has("session")) {
Log.d("Scrobbler", "Auth failed - no session");
return;
}
var session = json.getJSONObject("session");
var name = session.getString("name");
var key = session.getString("key");
AndroidUtils.edit()
.putString("username", name)
.putString("sessionKey", key)
.putBoolean("lastfm_enabled", true)
.apply();
Log.d("Scrobbler", "Auth success as " + name + ", key " + key);
}
public static void logout() {
AndroidUtils.edit()
.remove("username")
.remove("sessionKey")
.putBoolean("lastfm_enabled", false)
.apply();
SCROBBLED_UUIDS.clear();
AndroidUtils.sendToast(AndroidUtils.getString(R.string.lastfm_logout_success));
}
public static boolean needScrobbling(String uid) {
return isLoggedIn() && isScrobblingEnabled() && !SCROBBLED_UUIDS.contains(uid);
}
public static boolean isLoggedIn() {
return !TextUtils.isEmpty(getSessionKey());
}
public static boolean isScrobblingEnabled() {
return AndroidUtils.getPreferences().getBoolean("lastfm_enabled", false);
}
public static String getUserName() {
return AndroidUtils.getDefaultPrefs().getString("username", null);
}
private static String getSessionKey() {
return AndroidUtils.getDefaultPrefs().getString("sessionKey", null);
}
}
@@ -10,59 +10,55 @@ import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import javax.crypto.NoSuchPaddingException; import javax.crypto.NoSuchPaddingException;
import java8.util.concurrent.CompletableFuture; import java8.util.concurrent.CompletableFuture;
import okhttp3.Call;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response;
import ru.vtosters.lite.music.converter.ts.FFMpeg; import ru.vtosters.lite.music.converter.ts.FFMpeg;
import ru.vtosters.lite.music.converter.ts.TSMerger; import ru.vtosters.lite.music.converter.ts.TSMerger;
import ru.vtosters.lite.music.downloader.ThumbnailDownloader; import ru.vtosters.lite.music.downloader.ThumbnailDownloader;
import ru.vtosters.lite.music.interfaces.ITrackDownloader; import ru.vtosters.lite.music.interfaces.ITrackDownloader;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.IOUtils; import ru.vtosters.lite.utils.IOUtils;
public class M3UDownloader implements ITrackDownloader { public class M3UDownloader implements ITrackDownloader {
private static final OkHttpClient client = new OkHttpClient(); private static final OkHttpClient client = new OkHttpClient();
private ExecutorService executorService = Executors.newSingleThreadExecutor();
public static M3UDownloader getInstance() { public static M3UDownloader getInstance() {
return Holder.INSTANCE; return Holder.INSTANCE;
} }
public void downloadTrack(MusicTrack track, File outDir, Callback callback, boolean cache) { public void downloadTrack(MusicTrack track, File outDir, Callback callback, boolean cache) {
var request = new Request.a() var request = new Request.a().b(track.D).a();
.b(track.D) try {
.a(); var response = client.a(request).execute().a().g();
client.a(request).a(new okhttp3.Callback() { parse(response, outDir, callback, track, cache);
@Override } catch (IOException e) {
public void a(Call call, IOException e) { e.printStackTrace();
callback.onFailure(); callback.onFailure();
} }
@Override
public void a(Call call, Response response) throws IOException {
parse(response.a().g(), outDir, callback, track, cache);
}
});
} }
private void parse(String payload, File outDir, Callback callback, MusicTrack track, boolean cache) { private void parse(String payload, File outDir, Callback callback, MusicTrack track, boolean cache) {
if (cache) if (cache) try {
try { ThumbnailDownloader.downloadThumbnails(track);
ThumbnailDownloader.downloadThumbnails(track); } catch (IOException e) {
} catch (IOException e) { e.printStackTrace();
e.printStackTrace(); }
}
VKM3UParser parser = new VKM3UParser(payload); VKM3UParser parser = new VKM3UParser(payload);
List<TransportStream> tses = parser.getTransportStreams(); List<TransportStream> tses = parser.getTransportStreams();
AtomicInteger progress = new AtomicInteger(0); AtomicInteger progress = new AtomicInteger(0);
List<CompletableFuture<Void>> futures = new ArrayList<>(); List<CompletableFuture<Void>> futures = new ArrayList<>(tses.size());
var tsesDir = new File(outDir, String.valueOf(track.d)); var filesDir = AndroidUtils.getGlobalContext().getFilesDir();
var tsesDir = new File(filesDir, String.valueOf(track.d));
tsesDir.mkdirs(); tsesDir.mkdirs();
var resultTs = new File(tsesDir, "result.ts"); var resultTs = new File(tsesDir, "result.ts");
@@ -96,8 +92,7 @@ public class M3UDownloader implements ITrackDownloader {
IOUtils.writeToFile(tsDump, content); IOUtils.writeToFile(tsDump, content);
callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size()));
callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize()); callback.onSizeReceived((long) content.length * tses.size(), parser.getHeapSize());
} catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException e) {
InvalidAlgorithmParameterException | InvalidKeyException e) {
callback.onFailure(); callback.onFailure();
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -105,19 +100,14 @@ public class M3UDownloader implements ITrackDownloader {
} }
var future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); var future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
future.exceptionally(throwable -> { future.exceptionally(throwable -> {
callback.onFailure(); callback.onFailure();
return null; return null;
}) }).thenApply(v -> TSMerger.merge(tsesDir, resultTs)).thenApply(mergeResult -> mergeResult && FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track)).thenApply(convertResult -> {
.thenApply(v -> TSMerger.merge(tsesDir, resultTs)) if (convertResult)
.thenApply(mergeResult -> mergeResult && FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track)) callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size()));
.thenApply(convertResult -> { else callback.onFailure();
if (convertResult) return convertResult;
callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / tses.size())); }).thenRun(() -> IOUtils.deleteRecursive(tsesDir)).thenRun(callback::onSuccess);
else callback.onFailure();
return convertResult;
})
.thenRun(() -> IOUtils.deleteRecursive(tsesDir))
.thenRun(callback::onSuccess);
} }
// Initialization-on-demand // Initialization-on-demand
@@ -1,213 +0,0 @@
package ru.vtosters.lite.music;
import static java.lang.String.valueOf;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.getInstance;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.*;
import static ru.vtosters.lite.utils.AndroidUtils.MD5;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.autocache;
import android.os.RemoteException;
import android.util.Log;
import androidx.annotation.Nullable;
import com.vk.dto.music.MusicTrack;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.net.NetCall;
import ru.vtosters.lite.net.NetCallback;
import ru.vtosters.lite.net.NetClient;
import ru.vtosters.lite.net.NetRequest;
import ru.vtosters.lite.net.NetResponse;
import ru.vtosters.lite.utils.AndroidUtils;
public class Scrobbler {
private static final String key = "5965d63402414776c54c266db0211746";
private static final String keysecret = "d982180eed13275bb948e41cf225f88f";
private static final String url = "https://ws.audioscrobbler.com/2.0/";
private static final NetClient client = new NetClient.Builder().build();
private static final ArrayList<String> scrobbled = new ArrayList<>();
public static void scrobbleTrack(long duration, String artist, String title, String uid, @Nullable String album) {
var string = getDefaultPrefs().getString("sessionKey", null);
var timestamp = System.currentTimeMillis() / 1000;
Log.d("Scrobbler", "scrobbleTrack: " + title + " - " + artist + " - " + duration + " - " + uid);
if (!needToBeScrobble(uid) ||
string == null ||
string.isEmpty() ||
artist == null ||
artist.isEmpty() ||
title == null ||
title.isEmpty() ||
duration == 0) return;
scrobbled.add(uid); // add to scrobbled list
TreeMap<String, String> treeMap = new TreeMap<>(); // create map for request
treeMap.put("method", "track.scrobble");
treeMap.put("sk", string);
treeMap.put("artist[0]", artist);
treeMap.put("track[0]", title);
if (album != null && !album.isEmpty())
treeMap.put("album[0]", album);
treeMap.put("timestamp[0]", valueOf(timestamp));
treeMap.put("api_key", key);
treeMap.put("duration[0]", valueOf(duration));
treeMap.put("api_sig", signMD5(treeMap));
treeMap.put("format", "json");
client.newCall(new NetRequest.Builder().url(url).post().params(treeMap).build()).enqueue(new NetCallback() {
@Override
public void onFailure(NetCall call, IOException e) {
Log.d("Scrobbler", "Error: " + e.getMessage());
}
@Override
public void onResponse(NetCall call, NetResponse response) {
Log.d("Scrobbler", "Scrobbled: " + artist + " - " + title);
Log.d("Scrobbler", "Response scrobble: " + response.getDataString());
}
});
}
public static void grabMusicTrack(MusicTrack musictrack) {
var uid = musictrack.y1();
var artist = musictrack.C;
var title = musictrack.f;
var duration = musictrack.h;
var track_id = musictrack.d;
var owner_id = musictrack.e;
var access_key = musictrack.J;
var albumid = musictrack.I;
String album;
if (albumid != null) {
album = albumid.getTitle();
} else {
album = null;
}
if (uid.isEmpty() || artist == null || artist.isEmpty() || title == null || title.isEmpty() || duration == 0) {
Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid);
return;
}
if (autocache() && !isCached(uid)) {
if (LibVKXClient.isIntegrationEnabled()){
getInstance().runOnService(service -> {
try {
service.addTrackToCache(track_id, owner_id, (access_key != null) ? access_key : "");
} catch (RemoteException e) {
e.printStackTrace();
}
});
} else {
AudioDownloader.cacheTrack(musictrack);
}
}
scrobbleTrack(duration, artist, title, uid, album);
}
private static String signMD5(Map<String, String> map) {
var sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
sb.append(entry.getKey());
sb.append(entry.getValue());
}
sb.append(keysecret);
return MD5(sb.toString());
}
public static void auth(String login, String pass) {
if (login == null || pass == null) {
sendToast(AndroidUtils.getString("lastfm_credentials_empty"));
return;
}
TreeMap<String, String> treeMap = new TreeMap<>(); // create map for request
treeMap.put("method", "auth.getMobileSession");
treeMap.put("api_key", key);
treeMap.put("username", login);
treeMap.put("password", pass);
treeMap.put("api_sig", signMD5(treeMap));
treeMap.put("format", "json");
client.newCall(new NetRequest.Builder().url(url).post().params(treeMap).build()).enqueue(new NetCallback() {
@Override
public void onFailure(NetCall call, IOException e) {
Log.d("Scrobbler", "Auth failed", e);
sendToast(AndroidUtils.getString("auth_error_vtl"));
}
@Override
public void onResponse(NetCall call, NetResponse response) {
try {
var jSONObject = new JSONObject(response.getDataString());
sessionFetcher(jSONObject);
Log.d("Scrobbler", "Auth response " + response.getDataString());
} catch (JSONException e) {
Log.d("Scrobbler", "Auth failed", e);
}
}
});
}
public static void sessionFetcher(JSONObject jsonObject) throws JSONException {
if (!jsonObject.has("session")) {
Log.d("Scrobbler", "Auth failed - no session");
return;
}
var session = jsonObject.getJSONObject("session");
var name = session.getString("name");
var key = session.getString("key");
getDefaultPrefs().edit().putString("username", name).
putString("sessionKey", key).apply();
Log.d("Scrobbler", "Auth success as " + name + ", key " + key);
}
public static void logout() {
edit().remove("username").apply();
edit().remove("sessionKey").apply();
scrobbled.clear();
sendToast(AndroidUtils.getString("lastfm_logout_success"));
}
public static boolean needToBeScrobble(String uid) {
return isLoggedIn() && isScrobblingEnabled() && !scrobbled.contains(uid);
}
public static boolean isLoggedIn() {
return getDefaultPrefs().getString("sessionKey", null) != null;
}
public static boolean isScrobblingEnabled() {
return getPreferences().getBoolean("lastfm_enabled", false);
}
public static String getUserName() {
return getDefaultPrefs().getString("username", null);
}
}
@@ -2,7 +2,6 @@ package ru.vtosters.lite.music.cache;
import static ru.vtosters.lite.music.cache.FileCacheImplementation.getCacheDir; import static ru.vtosters.lite.music.cache.FileCacheImplementation.getCacheDir;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.IOUtils.deleteRecursive; import static ru.vtosters.lite.utils.IOUtils.deleteRecursive;
@@ -19,6 +18,7 @@ import androidx.annotation.Nullable;
import com.vk.core.util.ToastUtils; import com.vk.core.util.ToastUtils;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import org.json.JSONObject; import org.json.JSONObject;
@@ -30,6 +30,7 @@ import java.util.List;
import bruhcollective.itaysonlab.libvkx.ILibVkxService; import bruhcollective.itaysonlab.libvkx.ILibVkxService;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl; import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl;
import ru.vtosters.lite.utils.AndroidUtils;
public class CacheDatabaseDelegate { public class CacheDatabaseDelegate {
private static final int DB_VERSION = 0x1; private static final int DB_VERSION = 0x1;
@@ -85,7 +86,7 @@ public class CacheDatabaseDelegate {
getHelper().getReadableDatabase().execSQL(formula); getHelper().getReadableDatabase().execSQL(formula);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
ToastUtils.a(getString("track_bd_insert_err") + " [" + e.getMessage() + "]", true); ToastUtils.a(AndroidUtils.getString(R.string.track_bd_insert_err) + " [" + e.getMessage() + "]", true);
} }
} }
@@ -96,7 +97,7 @@ public class CacheDatabaseDelegate {
public static void clear() { public static void clear() {
getHelper().getReadableDatabase().execSQL(String.format("DELETE FROM %s", TABLE_NAME)); getHelper().getReadableDatabase().execSQL(String.format("DELETE FROM %s", TABLE_NAME));
deleteRecursive(getCacheDir()); deleteRecursive(getCacheDir());
sendToast(getString("cached_tracks_deleted")); sendToast(AndroidUtils.getString(R.string.cached_tracks_deleted));
} }
@NonNull @NonNull
@@ -1,6 +1,5 @@
package ru.vtosters.lite.music.cache; package ru.vtosters.lite.music.cache;
import android.content.Context;
import android.net.Uri; import android.net.Uri;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
@@ -1,10 +1,9 @@
package ru.vtosters.lite.music.cache.helpers; package ru.vtosters.lite.music.cache.helpers;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserId;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserPhoto;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import com.vk.dto.music.Playlist; import com.vk.dto.music.Playlist;
import com.vtosters.lite.R;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@@ -15,7 +14,7 @@ import java.util.List;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate; import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.FileCacheImplementation; import ru.vtosters.lite.music.cache.FileCacheImplementation;
import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class PlaylistHelper { public class PlaylistHelper {
@@ -55,7 +54,7 @@ public class PlaylistHelper {
.put("type", 1) .put("type", 1)
.put("album_type", "main_only") .put("album_type", "main_only")
.put("title", title) .put("title", title)
.put("description", albumId + "/ " + getString("cached_album_warning")) .put("description", albumId + "/ " + AndroidUtils.getString(R.string.cached_album_warning))
.put("main_artists", new JSONArray() .put("main_artists", new JSONArray()
.put(new JSONObject().put("name", artist) .put(new JSONObject().put("name", artist)
.put("id", "-1") .put("id", "-1")
@@ -92,8 +91,8 @@ public class PlaylistHelper {
.put("owner_id", getUserId()) .put("owner_id", getUserId())
.put("type", 0) .put("type", 0)
.put("album_type", "playlist") .put("album_type", "playlist")
.put("title", getString("cached_tracks_title")) .put("title", AndroidUtils.getString(R.string.cached_tracks_title))
.put("description", getString("cached_tracks_desc")) .put("description", AndroidUtils.getString(R.string.cached_tracks_desc))
.put("access_key", "cache") .put("access_key", "cache")
.put("genres", new JSONArray()) .put("genres", new JSONArray())
.put("is_following", false) .put("is_following", false)
@@ -135,7 +134,7 @@ public class PlaylistHelper {
.put("data_type", "none") .put("data_type", "none")
.put("layout", new JSONObject() .put("layout", new JSONObject()
.put("name", "header") .put("name", "header")
.put("title", getString("cached_tracks_title"))); .put("title", AndroidUtils.getString(R.string.cached_tracks_title)));
} }
public static JSONObject getCatalogSeparator() throws JSONException { public static JSONObject getCatalogSeparator() throws JSONException {
@@ -21,7 +21,6 @@ import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate; import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.music.cache.helpers.PlaylistHelper; import ru.vtosters.lite.music.cache.helpers.PlaylistHelper;
import ru.vtosters.lite.music.cache.helpers.TracklistHelper; import ru.vtosters.lite.music.cache.helpers.TracklistHelper;
import ru.vtosters.lite.utils.NetworkUtils;
public class PlaylistInjector { public class PlaylistInjector {
@@ -1,13 +1,13 @@
package ru.vtosters.lite.music.cache.injectors; package ru.vtosters.lite.music.cache.injectors;
import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.hasTracks; import static ru.vtosters.lite.music.cache.CacheDatabaseDelegate.hasTracks;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vk.catalog2.core.CatalogParser; import com.vk.catalog2.core.CatalogParser;
import com.vk.catalog2.core.api.dto.CatalogResponse; import com.vk.catalog2.core.api.dto.CatalogResponse;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@@ -23,6 +23,7 @@ import io.reactivex.ObservableOnSubscribe;
import ru.vtosters.lite.music.cache.helpers.PlaylistHelper; import ru.vtosters.lite.music.cache.helpers.PlaylistHelper;
import ru.vtosters.lite.music.cache.helpers.TracklistHelper; import ru.vtosters.lite.music.cache.helpers.TracklistHelper;
import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NetworkUtils; import ru.vtosters.lite.utils.NetworkUtils;
public class TracklistInjector { public class TracklistInjector {
@@ -69,7 +70,7 @@ public class TracklistInjector {
} }
private static JSONObject getEmptyCatalog() throws JSONException { private static JSONObject getEmptyCatalog() throws JSONException {
return new JSONObject("{\"catalog\":{\"default_section\":\"cache\",\"sections\":[{\"id\":\"cache\",\"title\":\"" + getString("cached_content_title") + "\",\"blocks\":[{\"data_type\":\"placeholder\",\"id\":\"0\",\"layout\":{\"name\":\"placeholder_big\"},\"placeholder_ids\":[\"_synth_trackEmpty\"]}]}]},\"audios\":[],\"playlists\":[],\"placeholders\":[{\"id\":\"_synth_trackEmpty\",\"title\":\"" + getString("cached_content_empty") + "\",\"text\":\"" + getString("cached_content_empty_desc") + "\",\"buttons\":[]}]}"); return new JSONObject("{\"catalog\":{\"default_section\":\"cache\",\"sections\":[{\"id\":\"cache\",\"title\":\"" + AndroidUtils.getString(R.string.cached_content_title) + "\",\"blocks\":[{\"data_type\":\"placeholder\",\"id\":\"0\",\"layout\":{\"name\":\"placeholder_big\"},\"placeholder_ids\":[\"_synth_trackEmpty\"]}]}]},\"audios\":[],\"playlists\":[],\"placeholders\":[{\"id\":\"_synth_trackEmpty\",\"title\":\"" + AndroidUtils.getString(R.string.cached_content_empty) + "\",\"text\":\"" + AndroidUtils.getString(R.string.cached_content_empty_desc) + "\",\"buttons\":[]}]}");
} }
public static void injectIntoExistingCatalog(JSONObject catalogNode) { public static void injectIntoExistingCatalog(JSONObject catalogNode) {
@@ -160,8 +161,8 @@ public class TracklistInjector {
var catalogBanner = new JSONObject() var catalogBanner = new JSONObject()
.put("id", 1234) .put("id", 1234)
.put("image_mode", "cover") .put("image_mode", "cover")
.put("title", getString("vkx_integration_title")) .put("title", AndroidUtils.getString(R.string.vkx_integration_title))
.put("text", getString("vkx_integration_desc")) .put("text", AndroidUtils.getString(R.string.vkx_integration_desc))
.put("click_action", new JSONObject().put("action", clickAction)); .put("click_action", new JSONObject().put("action", clickAction));
var catalogBanners = new JSONArray() var catalogBanners = new JSONArray()
.put(catalogBanner); .put(catalogBanner);
@@ -200,7 +201,7 @@ public class TracklistInjector {
var section = new JSONObject() var section = new JSONObject()
.put("id", randomId) .put("id", randomId)
.put("title", getString("saved_tracks_title")) .put("title", AndroidUtils.getString(R.string.saved_tracks_title))
.put("url", "synth:cache") .put("url", "synth:cache")
.put("blocks", blocks); .put("blocks", blocks);
@@ -1,14 +1,15 @@
package ru.vtosters.lite.music.callback; package ru.vtosters.lite.music.callback;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import com.vtosters.lite.R;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels; import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.music.Callback; import ru.vtosters.lite.music.Callback;
import ru.vtosters.lite.utils.AndroidUtils;
public class MusicCallbackBuilder { public class MusicCallbackBuilder {
private static final NotificationManagerCompat notificationManager = NotificationChannels.getNotificationManager(); private static final NotificationManagerCompat notificationManager = NotificationChannels.getNotificationManager();
@@ -35,7 +36,7 @@ public class MusicCallbackBuilder {
public void onSuccess() { public void onSuccess() {
try { try {
notification notification
.setContentText(getString("player_download_finished")) .setContentText(AndroidUtils.getString(R.string.player_download_finished))
.setProgress(0, 0, false) .setProgress(0, 0, false)
.setSmallIcon(android.R.drawable.stat_sys_download_done); .setSmallIcon(android.R.drawable.stat_sys_download_done);
notificationManager.notify(notificationId, notification.build()); notificationManager.notify(notificationId, notification.build());
@@ -48,7 +49,7 @@ public class MusicCallbackBuilder {
@Override @Override
public void onFailure() { public void onFailure() {
notification.setContentText(getString("load_audio_error")).setProgress(0, 0, false); notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false);
notificationManager.notify(notificationId, notification.build()); notificationManager.notify(notificationId, notification.build());
} }
@@ -66,7 +67,7 @@ public class MusicCallbackBuilder {
if (progress == playlistSize) { if (progress == playlistSize) {
onSuccess(); onSuccess();
} else { } else {
notification.setContentText(String.format(getString("playlist_download_notf"), progress, playlistSize)); notification.setContentText(String.format(AndroidUtils.getString(R.string.playlist_download_notf), progress, playlistSize));
notification.setProgress(playlistSize, progress, false); notification.setProgress(playlistSize, progress, false);
} }
notificationManager.notify(notificationId, notification.build()); notificationManager.notify(notificationId, notification.build());
@@ -74,13 +75,13 @@ public class MusicCallbackBuilder {
@Override @Override
public void onSuccess() { public void onSuccess() {
notification.setContentText(getString("player_download_finished")); notification.setContentText(AndroidUtils.getString(R.string.player_download_finished));
notification.setProgress(0, 0, false); notification.setProgress(0, 0, false);
} }
@Override @Override
public void onFailure() { public void onFailure() {
notification.setContentText(getString("load_audio_error")).setProgress(0, 0, false); notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false);
notificationManager.notify(notificationId, notification.build()); notificationManager.notify(notificationId, notification.build());
} }
@@ -7,6 +7,7 @@ import com.arthenica.ffmpegkit.ReturnCode;
import com.vk.core.util.ToastUtils; import com.vk.core.util.ToastUtils;
import com.vk.dto.music.Artist; import com.vk.dto.music.Artist;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@@ -99,7 +100,7 @@ public class FFMpeg {
private static void checkFFMpegLibs() { private static void checkFFMpegLibs() {
var lib = new File(AndroidUtils.getGlobalContext().getFilesDir(), "libffmpegkit_abidetect.so"); var lib = new File(AndroidUtils.getGlobalContext().getFilesDir(), "libffmpegkit_abidetect.so");
if (!lib.exists()) { if (!lib.exists()) {
ToastUtils.a(AndroidUtils.getString("ffmpegkit_copy")); ToastUtils.a(R.string.ffmpegkit_copy);
copyAssets(); copyAssets();
} }
} }
@@ -1,7 +1,5 @@
package ru.vtosters.lite.music.notification; package ru.vtosters.lite.music.notification;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.app.Notification; import android.app.Notification;
import android.os.Build; import android.os.Build;
@@ -9,6 +7,7 @@ import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
import com.vtosters.lite.R;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels; import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AccountManagerUtils;
@@ -20,7 +19,7 @@ public class MusicNotificationBuilder {
public static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) { public static NotificationCompat.Builder buildDownloadNotification(MusicTrack track, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID) var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download) .setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle(getString("audio_downloading")) .setContentTitle(AndroidUtils.getString(R.string.audio_downloading))
.setContentText(track.toString()) .setContentText(track.toString())
.setPriority(NotificationCompat.PRIORITY_LOW) .setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS) .setCategory(NotificationCompat.CATEGORY_PROGRESS)
@@ -33,7 +32,7 @@ public class MusicNotificationBuilder {
public static NotificationCompat.Builder buildPlaylistDownloadNotification(String playlistName, int id) { public static NotificationCompat.Builder buildPlaylistDownloadNotification(String playlistName, int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID) var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download) .setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle(getString("playlist_downloading") + " «" + playlistName + "»") .setContentTitle(AndroidUtils.getString(R.string.playlist_downloading) + " «" + playlistName + "»")
.setContentText(playlistName) .setContentText(playlistName)
.setPriority(NotificationCompat.PRIORITY_LOW) .setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS) .setCategory(NotificationCompat.CATEGORY_PROGRESS)
@@ -46,8 +45,8 @@ public class MusicNotificationBuilder {
public static NotificationCompat.Builder buildAllAudiosDownloadNotification(int id) { public static NotificationCompat.Builder buildAllAudiosDownloadNotification(int id) {
var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID) var notificationBuilder = new NotificationCompat.Builder(AndroidUtils.getGlobalContext(), NotificationChannels.MUSIC_PLAYLIST_DOWNLOAD_CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_sys_download) .setSmallIcon(android.R.drawable.stat_sys_download)
.setContentTitle(getString("notf_audio_dl_user") + " " + AccountManagerUtils.getUsername()) .setContentTitle(AndroidUtils.getString(R.string.notf_audio_dl_user) + " " + AccountManagerUtils.getUsername())
.setContentText(getString("all_audio")) .setContentText(AndroidUtils.getString(R.string.all_audio))
.setPriority(NotificationCompat.PRIORITY_LOW) .setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_PROGRESS) .setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setAutoCancel(true) .setAutoCancel(true)
@@ -66,7 +65,7 @@ public class MusicNotificationBuilder {
builder.setSmallIcon(com.vtosters.lite.R.drawable.ic_download_outline_28) builder.setSmallIcon(com.vtosters.lite.R.drawable.ic_download_outline_28)
.setShowWhen(false) .setShowWhen(false)
.setContentTitle(getString("cached_track") + ": " + track.toString()); .setContentTitle(AndroidUtils.getString(R.string.cached_track) + ": " + track.toString());
notificationManager.notify(track.y1().hashCode(), builder.build()); notificationManager.notify(track.y1().hashCode(), builder.build());
} }
@@ -1,7 +1,6 @@
package ru.vtosters.lite.net; package ru.vtosters.lite.net;
import android.util.Base64; import android.util.Base64;
import android.util.Log;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -15,24 +14,30 @@ import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.concurrent.Executor;
public final class NetCall { public final class NetCall {
private final NetRequest req; private final NetRequest req;
private final NetClient cl; private final NetClient cl;
private final Executor executor;
protected NetCall(NetClient cl, NetRequest req) { protected NetCall(NetClient cl, NetRequest req, Executor executor) {
this.req = req; this.req = req;
this.cl = cl; this.cl = cl;
this.executor = executor;
} }
private static String constructArgs(Map<String, String> args) throws UnsupportedEncodingException { private static String constructArgs(Map<String, String> args) throws UnsupportedEncodingException {
args = new TreeMap<>(args); args = new TreeMap<>(args);
String str = ""; StringBuilder str = new StringBuilder();
for (Map.Entry<String, String> en : args.entrySet()) { for (Map.Entry<String, String> en : args.entrySet()) {
if (!str.isEmpty()) str += "&"; if (str.length() > 0)
str += URLEncoder.encode(en.getKey(), "UTF-8") + "=" + URLEncoder.encode(en.getValue(), "UTF-8"); str.append("&");
str.append(URLEncoder.encode(en.getKey(), "UTF-8"))
.append("=")
.append(URLEncoder.encode(en.getValue(), "UTF-8"));
} }
return str; return str.toString();
} }
public NetRequest request() { public NetRequest request() {
@@ -77,22 +82,13 @@ public final class NetCall {
} }
public void enqueue(NetCallback cb) { public void enqueue(NetCallback cb) {
new Thread() { executor.execute(() -> {
@Override try {
public void run() { NetResponse resp = execute();
try { cb.onResponse(NetCall.this, resp);
NetResponse resp = execute(); } catch (IOException e) {
cb.onResponse(NetCall.this, resp); cb.onFailure(NetCall.this, e);
} catch (IOException e) {
cb.onFailure(NetCall.this, e);
}
try {
interrupt();
join();
} catch (Exception e) {
Log.e("NetCall", "Failed to interrupt and join thread", e);
}
} }
}.start(); });
} }
} }
@@ -2,12 +2,16 @@ package ru.vtosters.lite.net;
import java.net.PasswordAuthentication; import java.net.PasswordAuthentication;
import java.net.Proxy; import java.net.Proxy;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class NetClient { public class NetClient {
private final long timeout; private final long timeout;
private final Proxy proxy; private final Proxy proxy;
private final PasswordAuthentication authenticator; private final PasswordAuthentication authenticator;
private final Executor executor
= Executors.newSingleThreadExecutor();
protected NetClient(Builder b) { protected NetClient(Builder b) {
timeout = b.timeout; timeout = b.timeout;
@@ -24,7 +28,7 @@ public class NetClient {
} }
public NetCall newCall(NetRequest req) { public NetCall newCall(NetRequest req) {
return new NetCall(this, req); return new NetCall(this, req, executor);
} }
public PasswordAuthentication getAuthenticator() { public PasswordAuthentication getAuthenticator() {
@@ -2,75 +2,77 @@ package ru.vtosters.lite.net;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import android.os.AsyncTask;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class Request { public class Request {
public static void makeRequest(byte[] bArr, RequestCallback RequestCallback) {
new MakeRequestTask(bArr, RequestCallback).execute(); private static final Executor EXECUTOR =
Executors.newSingleThreadExecutor();
public static void makeRequest(byte[] bArr, RequestCallback callback) {
EXECUTOR.execute(new MakeRequestTask(bArr, callback));
} }
public static void makeRequest(String str, RequestCallback RequestCallback) { public static void makeRequest(String str, RequestCallback callback) {
new MakeRequestTask(str.getBytes(), RequestCallback).execute(); makeRequest(str.getBytes(), callback);
} }
public interface RequestCallback { public interface RequestCallback {
void onResponse(String str); void onResponse(String str);
} }
private static class MakeRequestTask extends AsyncTask<Void, Void, String> { private static class MakeRequestTask implements Runnable {
private final RequestCallback callback; private final RequestCallback callback;
private final byte[] url; private final byte[] url;
private final boolean mIsPut; private final boolean mIsPut;
private final boolean mIsVTostersRequest; private final boolean mIsVTostersRequest;
public MakeRequestTask(byte[] bArr, RequestCallback RequestCallback) { public MakeRequestTask(byte[] bArr, RequestCallback callback) {
mIsVTostersRequest = false; this.mIsVTostersRequest = false;
mIsPut = false; this.mIsPut = false;
callback = RequestCallback; this.callback = callback;
url = bArr; this.url = bArr;
} }
public String doInBackground(Void... voidArr) { @Override
public void run() {
try { try {
HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(new String(url)).openConnection(); HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(new String(url)).openConnection();
httpURLConnection.setRequestMethod(mIsPut ? "PUT" : "GET"); httpURLConnection.setRequestMethod(mIsPut ? "PUT" : "GET");
if (mIsVTostersRequest) { if (mIsVTostersRequest) {
httpURLConnection.setRequestProperty("Token", getUserToken()); httpURLConnection.setRequestProperty("Token", getUserToken());
} } else {
if (!mIsVTostersRequest) {
httpURLConnection.setRequestProperty("User-Agent", Network.l.c().a()); httpURLConnection.setRequestProperty("User-Agent", Network.l.c().a());
} }
httpURLConnection.setRequestProperty("Content-Type", mIsVTostersRequest ? "Content-Type" : "application/x-www-form-urlencoded"); httpURLConnection.setRequestProperty("Content-Type", mIsVTostersRequest
? "Content-Type"
: "application/x-www-form-urlencoded");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream())); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
StringBuffer stringBuffer = new StringBuffer(); StringBuilder builder = new StringBuilder();
while (true) { while (true) {
String readLine = bufferedReader.readLine(); String readLine = bufferedReader.readLine();
if (readLine != null) { if (readLine != null) {
stringBuffer.append(readLine); builder.append(readLine);
} else { } else {
bufferedReader.close(); bufferedReader.close();
return stringBuffer.toString(); callback.onResponse(builder.toString());
break;
} }
} }
} catch (Exception e) { } catch (Exception e) {
return e.getLocalizedMessage(); callback.onResponse(e.getLocalizedMessage());
} }
} }
public void onPostExecute(String str) {
super.onPostExecute(str);
callback.onResponse(str);
}
} }
} }
@@ -17,15 +17,22 @@ public class GithubList {
.b(url) .b(url)
.a(); .a();
var response = mClient.a(link).execute().a().g(); try {
var response = mClient.a(link).execute().a().g();
if (!response.contains(":")) {
Log.d(proxyname, "No proxy found");
return null;
}
Log.d(proxyname, response);
return new ArrayList<>(Arrays.asList(response.split("\n")));
} catch (Exception e){
Log.d(proxyname, "Failed to fetch data, link: " + link);
if (!response.contains(":")) {
Log.d(proxyname, "No proxy found");
return null; return null;
} }
Log.d(proxyname, response);
return new ArrayList<>(Arrays.asList(response.split("\n")));
} }
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class Jetkai {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class TheSpeedX {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class Jetkai {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class Roosterkid {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class Hookzof {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class Jetkai {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class Roosterkid {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -4,10 +4,11 @@ import static ru.vtosters.lite.proxy.GithubList.getProxy;
import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying; import static ru.vtosters.lite.proxy.ProxyUtils.forceProxyApplying;
import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy; import static ru.vtosters.lite.proxy.ProxyUtils.hasProxy;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -35,7 +36,7 @@ public class TheSpeedX {
Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]); Log.d(TAG, "Setting proxy: " + proxy.split(":")[0] + ":" + proxy.split(":")[1]);
if (RandomProxy.showProxyResult) { if (RandomProxy.showProxyResult) {
AndroidUtils.sendToast(getString("proxy_setup_success") + " " + proxy); AndroidUtils.sendToast(AndroidUtils.getString(R.string.proxy_setup_success) + " " + proxy);
RandomProxy.showProxyResult = false; RandomProxy.showProxyResult = false;
} }
@@ -14,6 +14,8 @@ import android.util.Log;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -46,12 +48,12 @@ public class LogWriterService extends Service {
writeLog(intent, file); writeLog(intent, file);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
makeText(getGlobalContext(), AndroidUtils.getString("logfile_error"), LENGTH_SHORT).show(); makeText(getGlobalContext(), AndroidUtils.getString(R.string.logfile_error), LENGTH_SHORT).show();
} }
var notificationId = intent.getIntExtra("notificationId", 1); var notificationId = intent.getIntExtra("notificationId", 1);
var manager = (NotificationManager) getGlobalContext().getSystemService(Context.NOTIFICATION_SERVICE); var manager = (NotificationManager) getGlobalContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notificationId); manager.cancel(notificationId);
makeText(getGlobalContext(), AndroidUtils.getString("logfile_saved"), LENGTH_SHORT).show(); makeText(getGlobalContext(), AndroidUtils.getString(R.string.logfile_saved), LENGTH_SHORT).show();
stopSelf(); stopSelf();
return START_NOT_STICKY; return START_NOT_STICKY;
@@ -1,7 +1,6 @@
package ru.vtosters.lite.tgs; package ru.vtosters.lite.tgs;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
@@ -12,6 +11,7 @@ import com.vk.dto.common.Attachment;
import com.vk.dto.stickers.StickerItem; import com.vk.dto.stickers.StickerItem;
import com.vk.dto.stickers.StickerStockItem; import com.vk.dto.stickers.StickerStockItem;
import com.vk.im.engine.models.attaches.Attach; import com.vk.im.engine.models.attaches.Attach;
import com.vtosters.lite.R;
import com.vtosters.lite.attachments.PendingGraffitiAttachment; import com.vtosters.lite.attachments.PendingGraffitiAttachment;
import com.vtosters.lite.im.AppAttachToImAttachConverter; import com.vtosters.lite.im.AppAttachToImAttachConverter;
import com.vtosters.lite.upload.Upload; import com.vtosters.lite.upload.Upload;
@@ -23,6 +23,8 @@ import org.json.JSONObject;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
import ru.vtosters.lite.utils.AndroidUtils;
public class TGRoot { public class TGRoot {
public static final int N = 76820000; public static final int N = 76820000;
public static final int X = 976820000; public static final int X = 976820000;
@@ -32,11 +34,11 @@ public class TGRoot {
public static String getSummary() { public static String getSummary() {
switch (TGPref.getTGConnectMethod()) { switch (TGPref.getTGConnectMethod()) {
case 0: case 0:
return getString("ctypedirect"); return AndroidUtils.getString(R.string.ctypedirect);
case 2: case 2:
return getString("ctypesocks"); return AndroidUtils.getString(R.string.ctypesocks);
default: default:
return getString("ctypedisabled"); return AndroidUtils.getString(R.string.ctypedisabled);
} }
} }
@@ -14,7 +14,12 @@ public abstract class BaseTranslator {
private static final int YANDEX = 0; private static final int YANDEX = 0;
private static final int GOOGLE = 1; private static final int GOOGLE = 1;
private static final int DEEPL = 2; private static final int DEEPL = 2;
private final LruCache<String, String> cache = new LruCache<>(200); private final LruCache<String, String> cache = new LruCache<>(200) {
@Override
protected String create(@NonNull String text) {
return translate(text, getToLanguage());
}
};
public static String getToLanguage() { public static String getToLanguage() {
var lang = preferences.getString("lang_target", "system"); var lang = preferences.getString("lang_target", "system");
@@ -43,11 +48,8 @@ public abstract class BaseTranslator {
@NonNull @NonNull
public final String getTranslation(String text) { public final String getTranslation(String text) {
var val = cache.get(text); String v = cache.get(text);
if (val != null) assert v != null;
return val; return v;
var translation = translate(text, getToLanguage());
cache.put(text, translation);
return translation;
} }
} }
@@ -10,7 +10,6 @@ import org.json.JSONObject;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import okhttp3.MediaType; import okhttp3.MediaType;
@@ -49,14 +48,17 @@ public class DeepLTranslator extends BaseTranslator {
private static DeepLTranslator instance; private static DeepLTranslator instance;
public static DeepLTranslator getInstance() { public static DeepLTranslator getInstance() {
if (instance == null) // Race safe when the new object does not contain the state of the previous one
instance = new DeepLTranslator(); DeepLTranslator translator = instance;
return instance; if (translator == null) {
return instance = new DeepLTranslator();
}
return translator;
} }
private static Long getTimestamp(int iNumber) { private static Long getTimestamp(int iNumber) {
var now = System.currentTimeMillis(); var now = System.currentTimeMillis();
return Long.valueOf((((long) iNumber) + now) - (now % ((long) iNumber))); return (((long) iNumber) + now) - (now % ((long) iNumber));
} }
@NonNull @NonNull
@@ -73,16 +75,16 @@ public class DeepLTranslator extends BaseTranslator {
i++; i++;
} }
var id = new AtomicLong(ThreadLocalRandom.current().nextLong(Long.parseLong("10000000000"))); var id = ThreadLocalRandom.current().nextLong(1, 10000000000L);
var requestBody = String.format(REQUEST_BODY_FORMAT, var requestBody = String.format(REQUEST_BODY_FORMAT,
id.incrementAndGet(), id,
text, text,
tl, tl,
getTimestamp(i) getTimestamp(i)
); );
requestBody = (id.get() + 3) % 13 == 0 || (id.get() + 5) % 29 == 0 requestBody = (id + 3) % 13 == 0 || (id + 5) % 29 == 0
? requestBody.replace("hod\":\"", "hod\" : \"") ? requestBody.replace("hod\":\"", "hod\" : \"")
: requestBody.replace("hod\":\"", "hod\": \""); : requestBody.replace("hod\":\"", "hod\": \"");
@@ -38,9 +38,11 @@ public class GoogleTranslator extends BaseTranslator {
private static GoogleTranslator instance; private static GoogleTranslator instance;
public static GoogleTranslator getInstance() { public static GoogleTranslator getInstance() {
if (instance == null) // Race safe when the new object does not contain the state of the previous one
instance = new GoogleTranslator(); GoogleTranslator translator = instance;
return instance; if (translator == null)
return instance = new GoogleTranslator();
return translator;
} }
@NonNull @NonNull
@@ -22,9 +22,11 @@ public class YandexTranslator extends BaseTranslator {
private static YandexTranslator instance; private static YandexTranslator instance;
public static YandexTranslator getInstance() { public static YandexTranslator getInstance() {
if (instance == null) // Race safe when the new object does not contain the state of the previous one
instance = new YandexTranslator(); YandexTranslator translator = instance;
return instance; if (translator == null)
return instance = new YandexTranslator();
return translator;
} }
@NonNull @NonNull
@@ -26,11 +26,16 @@ import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import com.vtosters.lite.ui.MaterialSwitchPreference; import com.vtosters.lite.ui.MaterialSwitchPreference;
import java.util.Objects;
public class PreferencesUtil { public class PreferencesUtil {
public static void addListPreference(MaterialPreferenceToolbarFragment fragment, String key, String def, CharSequence title, CharSequence[] entries, CharSequence[] entriesValue) { public static void addListPreference(
MaterialPreferenceToolbarFragment fragment,
String key,
String def,
CharSequence title,
CharSequence[] entries,
CharSequence[] entriesValue
) {
ListPreference preference = new ListPreference(getGlobalContext()); ListPreference preference = new ListPreference(getGlobalContext());
preference.setEntries(entries); preference.setEntries(entries);
preference.setEntryValues(entriesValue); preference.setEntryValues(entriesValue);
@@ -41,7 +46,17 @@ public class PreferencesUtil {
fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference)
} }
public static void addListPreferenceIcon(MaterialPreferenceToolbarFragment fragment, String key, String def, CharSequence title, String icon, CharSequence summary, CharSequence[] entries, CharSequence[] entriesValue, Preference.OnPreferenceChangeListener listener) { public static void addListPreferenceIcon(
MaterialPreferenceToolbarFragment fragment,
String key,
String def,
CharSequence title,
int iconRes,
CharSequence summary,
CharSequence[] entries,
CharSequence[] entriesValue,
Preference.OnPreferenceChangeListener listener
) {
ListPreference preference = new ListPreference(getGlobalContext()); ListPreference preference = new ListPreference(getGlobalContext());
preference.setEntries(entries); preference.setEntries(entries);
preference.setEntryValues(entriesValue); preference.setEntryValues(entriesValue);
@@ -53,12 +68,18 @@ public class PreferencesUtil {
preference.setValue(def); preference.setValue(def);
preference.setOnPreferenceChangeListener(listener); preference.setOnPreferenceChangeListener(listener);
if (icon != null) if (iconRes != 0)
preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), icon))); // preference.setIcon preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon
fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference)
} }
public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment materialPreferenceToolbarFragment, String key, CharSequence title, CharSequence summary, boolean defValue) { public static void addMaterialSwitchPreference(
MaterialPreferenceToolbarFragment materialPreferenceToolbarFragment,
String key,
CharSequence title,
CharSequence summary,
boolean defValue
) {
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext()); MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext());
materialSwitchPreference.setTitle(title); // setTitle materialSwitchPreference.setTitle(title); // setTitle
materialSwitchPreference.setSummary(summary); // setSummary materialSwitchPreference.setSummary(summary); // setSummary
@@ -68,21 +89,37 @@ public class PreferencesUtil {
materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(materialSwitchPreference); // materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(preference) materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(materialSwitchPreference); // materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(preference)
} }
public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, int icon, boolean defValue, Preference.OnPreferenceChangeListener listener) { // public static void addMaterialSwitchPreference(
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext()); // MaterialPreferenceToolbarFragment fragment,
materialSwitchPreference.setTitle(title); // setTitle // String key,
materialSwitchPreference.setSummary(summary); // setSummary // CharSequence title,
materialSwitchPreference.setKey(key); // setKey // CharSequence summary,
materialSwitchPreference.setDefaultValue(defValue); // setDefaultValue // int iconRes,
materialSwitchPreference.setOnPreferenceChangeListener(listener); // setOnPreferenceClickListener // boolean defValue,
// Preference.OnPreferenceChangeListener listener
// ) {
// MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext());
// materialSwitchPreference.setTitle(title); // setTitle
// materialSwitchPreference.setSummary(summary); // setSummary
// materialSwitchPreference.setKey(key); // setKey
// materialSwitchPreference.setDefaultValue(defValue); // setDefaultValue
// materialSwitchPreference.setOnPreferenceChangeListener(listener); // setOnPreferenceClickListener
//
// if (iconRes != 0)
// materialSwitchPreference.setIcon(setTint(getGlobalContext(), Objects.requireNonNull(ContextCompat.getDrawable(getGlobalContext(), iconRes)))); // preference.setIcon
//
// fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference)
// }
if (icon != 1) public static void addMaterialSwitchPreference(
materialSwitchPreference.setIcon(setTint(getGlobalContext(), Objects.requireNonNull(ContextCompat.getDrawable(getGlobalContext(), icon)))); // preference.setIcon MaterialPreferenceToolbarFragment fragment,
String key,
fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference) CharSequence title,
} CharSequence summary,
int iconRes,
public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, String icon, boolean defValue, Preference.OnPreferenceChangeListener listener) { boolean defValue,
Preference.OnPreferenceChangeListener listener
) {
MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext()); MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext());
materialSwitchPreference.setTitle(title); // setTitle materialSwitchPreference.setTitle(title); // setTitle
materialSwitchPreference.setSummary(summary); // setSummary materialSwitchPreference.setSummary(summary); // setSummary
@@ -90,14 +127,19 @@ public class PreferencesUtil {
materialSwitchPreference.setDefaultValue(defValue); // setDefaultValue materialSwitchPreference.setDefaultValue(defValue); // setDefaultValue
fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(preference)
if (icon != null) if (iconRes != 0)
materialSwitchPreference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), icon))); // preference.setIcon materialSwitchPreference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon
materialSwitchPreference.setOnPreferenceChangeListener(listener); // setOnPreferenceClickListener(listener) materialSwitchPreference.setOnPreferenceChangeListener(listener); // setOnPreferenceClickListener(listener)
fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference)
} }
public static void addPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary) { public static void addPreference(
MaterialPreferenceToolbarFragment fragment,
String key,
CharSequence title,
CharSequence summary
) {
Preference preference = new Preference(getGlobalContext()); Preference preference = new Preference(getGlobalContext());
preference.setSummary(summary); // setSummary preference.setSummary(summary); // setSummary
preference.setTitle(title); // setTitle preference.setTitle(title); // setTitle
@@ -106,32 +148,51 @@ public class PreferencesUtil {
fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference)
} }
public static void addPreference(MaterialPreferenceToolbarFragment fragment, CharSequence title, CharSequence summary, @Nullable String icon, Preference.OnPreferenceClickListener listener) { public static void addPreference(
MaterialPreferenceToolbarFragment fragment,
CharSequence title,
CharSequence summary,
int iconRes,
Preference.OnPreferenceClickListener listener
) {
Preference preference = new Preference(getGlobalContext()); Preference preference = new Preference(getGlobalContext());
preference.setSummary(summary); // setSummary preference.setSummary(summary); // setSummary
preference.setTitle(title); // setTitle preference.setTitle(title); // setTitle
if (icon != null) if (iconRes != 0)
preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), icon))); // preference.setIcon preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon
preference.setOnPreferenceClickListener(listener); // preference.setOnPreferenceClickListener(listener) preference.setOnPreferenceClickListener(listener); // preference.setOnPreferenceClickListener(listener)
fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference)
} }
public static void addPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, @Nullable String icon, Preference.OnPreferenceClickListener listener) { public static void addPreference(
MaterialPreferenceToolbarFragment fragment,
String key,
CharSequence title,
CharSequence summary,
int iconRes,
Preference.OnPreferenceClickListener listener) {
Preference preference = new Preference(getGlobalContext()); Preference preference = new Preference(getGlobalContext());
preference.setSummary(summary); // setSummary preference.setSummary(summary); // setSummary
preference.setTitle(title); // setTitle preference.setTitle(title); // setTitle
preference.setKey(key); // setKey preference.setKey(key); // setKey
if (icon != null) if (iconRes != 0)
preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), icon))); // preference.setIcon preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon
preference.setOnPreferenceClickListener(listener); // preference.setOnPreferenceClickListener(listener) preference.setOnPreferenceClickListener(listener); // preference.setOnPreferenceClickListener(listener)
fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference)
} }
public static void addPreferenceDrawable(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, CharSequence summary, @Nullable Drawable icon, Preference.OnPreferenceClickListener listener) { public static void addPreferenceDrawable(
MaterialPreferenceToolbarFragment fragment,
String key,
CharSequence title,
CharSequence summary,
@Nullable Drawable icon,
Preference.OnPreferenceClickListener listener
) {
Preference preference = new Preference(getGlobalContext()); Preference preference = new Preference(getGlobalContext());
preference.setSummary(summary); // setSummary preference.setSummary(summary); // setSummary
preference.setTitle(title); // setTitle preference.setTitle(title); // setTitle
@@ -210,9 +271,8 @@ public class PreferencesUtil {
return typedValue.data; return typedValue.data;
} }
private static Drawable getDrawable(Context ctx, String name) { private static Drawable getDrawable(Context ctx, int drawableRes) {
var id = ctx.getResources().getIdentifier(name, "drawable", ctx.getPackageName()); return ContextCompat.getDrawable(ctx, drawableRes);
return ContextCompat.getDrawable(ctx, id);
} }
public interface EditTextPrefChangeListener { public interface EditTextPrefChangeListener {
@@ -11,7 +11,7 @@ import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import ru.vtosters.lite.utils.AndroidUtils; import com.vtosters.lite.R;
public class APKInstallActivity extends AppCompatActivity { public class APKInstallActivity extends AppCompatActivity {
public static final int REQUEST_INSTALL_PERMISSION = 1; public static final int REQUEST_INSTALL_PERMISSION = 1;
@@ -67,7 +67,7 @@ public class APKInstallActivity extends AppCompatActivity {
startActivity(intent); startActivity(intent);
} catch (Exception e) { } catch (Exception e) {
Toast.makeText(this, AndroidUtils.getString("apk_install_error") + " " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); Toast.makeText(this, getString(R.string.apk_install_error) + " " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
} }
finish(); finish();
@@ -2,7 +2,6 @@ package ru.vtosters.lite.ui.adapters;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Typeface; import android.graphics.Typeface;
@@ -17,6 +16,8 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vtosters.lite.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -261,7 +262,7 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
} }
public void bindCategory(boolean fist) { public void bindCategory(boolean fist) {
mCategoryTitle.setText(getString(fist ? "selected_items" : "unselected_items")); mCategoryTitle.setText(fist ? R.string.selected_items : R.string.unselected_items);
mCategoryTitleContainer.setVisibility(View.VISIBLE); mCategoryTitleContainer.setVisibility(View.VISIBLE);
mMovingItemContainer.setVisibility(View.INVISIBLE); mMovingItemContainer.setVisibility(View.INVISIBLE);
} }
@@ -18,6 +18,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.widget.TextViewCompat; import androidx.core.widget.TextViewCompat;
import com.vtosters.lite.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -92,7 +94,7 @@ public class ImagineArrayAdapter extends ArrayAdapter<ImagineArrayAdapter.Imagin
// if make radiobutton without layout inflation it can't be unclickable // if make radiobutton without layout inflation it can't be unclickable
var checkedTextView = (CheckedTextView) LayoutInflater.from(getContext()) var checkedTextView = (CheckedTextView) LayoutInflater.from(getContext())
.inflate(AndroidUtils.getIdentifier("select_dialog_singlechoice_material", "layout"), parent, false); .inflate(R.layout.select_dialog_singlechoice_material, parent, false);
// for amoled // for amoled
var tintList = new ColorStateList( var tintList = new ColorStateList(
new int[][] { new int[] { android.R.attr.state_checked }, new int[] { -android.R.attr.state_checked }}, new int[][] { new int[] { android.R.attr.state_checked }, new int[] { -android.R.attr.state_checked }},
@@ -23,7 +23,7 @@ public class MessagesPreviewAdapter extends RecyclerView.Adapter<MessagesPreview
private static final int ME = 0x0; private static final int ME = 0x0;
private static final int ANONYMOUS = -0x1; private static final int ANONYMOUS = -0x1;
private final String[] mMessages = AndroidUtils.getArray("wallpaper_change_dialog"); private final String[] mMessages = AndroidUtils.getArray(R.array.wallpaper_change_dialog);
private static int getColorFromAttribute(Context context, int attrId) { private static int getColorFromAttribute(Context context, int attrId) {
TypedValue typedValue = new TypedValue(); TypedValue typedValue = new TypedValue();
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.adapters; package ru.vtosters.lite.ui.adapters;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getResources; import static ru.vtosters.lite.utils.AndroidUtils.getResources;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -22,12 +21,12 @@ import androidx.recyclerview.widget.RecyclerView;
import com.aefyr.tsg.g2.TelegramStickersPack; import com.aefyr.tsg.g2.TelegramStickersPack;
import com.aefyr.tsg.g2.TelegramStickersService; import com.aefyr.tsg.g2.TelegramStickersService;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
import ru.vtosters.lite.tgs.TGPref; import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.ui.components.IItemMovingListener; import ru.vtosters.lite.ui.components.IItemMovingListener;
import ru.vtosters.lite.utils.AndroidUtils;
public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.StickerPackViewHolder> implements IItemMovingListener { public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.StickerPackViewHolder> implements IItemMovingListener {
private static final TelegramStickersService sService = TelegramStickersService.getInstance(getGlobalContext()); private static final TelegramStickersService sService = TelegramStickersService.getInstance(getGlobalContext());
@@ -36,13 +35,12 @@ public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.
@NonNull @NonNull
@Override @Override
public StickerPackViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public StickerPackViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
int resID = getIdentifier("tgs_entry", "layout"); var view = LayoutInflater.from(parent.getContext()).inflate(R.layout.tgs_entry, parent, false);
var view = LayoutInflater.from(parent.getContext()).inflate(resID, parent, false);
var holder = new StickerPackViewHolder(view); var holder = new StickerPackViewHolder(view);
holder.mStickerPreview.setImageResource(getIdentifier("icon_vk_104", "drawable")); holder.mStickerPreview.setImageResource(R.drawable.icon_vk_104);
holder.mUpdateButton.setImageDrawable(recolorDrawable(getResources().getDrawable(getIdentifier("ic_camera_switch_48", "drawable")))); holder.mUpdateButton.setImageDrawable(recolorDrawable(getResources().getDrawable(R.drawable.ic_camera_switch_48)));
holder.mDeleteButton.setImageDrawable(recolorDrawable(getResources().getDrawable(getIdentifier("vkim_ic_msg_delete", "drawable")))); holder.mDeleteButton.setImageDrawable(recolorDrawable(getResources().getDrawable(R.drawable.vkim_ic_msg_delete)));
return holder; return holder;
} }
@@ -132,7 +130,7 @@ public class StickerPackAdapter extends RecyclerView.Adapter<StickerPackAdapter.
mName.setText(pack.title); mName.setText(pack.title);
mSwitch.setChecked(pack.enabled); mSwitch.setChecked(pack.enabled);
mSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> sService.setPackEnabled(pack, isChecked, false)); mSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> sService.setPackEnabled(pack, isChecked, false));
mStickersCount.setText(pack.stickersCount + " " + AndroidUtils.getString("stickerscount")); mStickersCount.setText(pack.stickersCount + " " + mStickersCount.getContext().getString(R.string.stickerscount));
// Color костыль // Color костыль
int color = getTextAttr(); int color = getTextAttr();
@@ -11,6 +11,8 @@ import android.content.SharedPreferences;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
@@ -43,7 +45,7 @@ public class BackupManager {
public static void backupOnlines() throws IOException { public static void backupOnlines() throws IOException {
if (getPrefContent("onlines.xml") == null) { if (getPrefContent("onlines.xml") == null) {
Toast.makeText(getGlobalContext(), AndroidUtils.getString("no_data_to_backup"), LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString(R.string.no_data_to_backup), LENGTH_SHORT).show();
return; return;
} }
@@ -55,10 +57,10 @@ public class BackupManager {
FileWriter out = new FileWriter(file); FileWriter out = new FileWriter(file);
out.write(getPrefContent("onlines.xml")); out.write(getPrefContent("onlines.xml"));
out.close(); out.close();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_saved_in") + " " + file.getAbsolutePath(), LENGTH_LONG).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString(R.string.backup_saved_in) + " " + file.getAbsolutePath(), LENGTH_LONG).show();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_save_error"), LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString(R.string.backup_save_error), LENGTH_SHORT).show();
} }
} }
@@ -71,10 +73,10 @@ public class BackupManager {
FileWriter out = new FileWriter(file); FileWriter out = new FileWriter(file);
out.write(getPrefContent("com.vtosters.lite_preferences.xml")); out.write(getPrefContent("com.vtosters.lite_preferences.xml"));
out.close(); out.close();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_saved_in") + " " + file.getAbsolutePath(), LENGTH_LONG).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString(R.string.backup_saved_in) + " " + file.getAbsolutePath(), LENGTH_LONG).show();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(getGlobalContext(), AndroidUtils.getString("backup_save_error"), LENGTH_SHORT).show(); Toast.makeText(getGlobalContext(), AndroidUtils.getString(R.string.backup_save_error), LENGTH_SHORT).show();
} }
} }
@@ -1,9 +1,6 @@
package ru.vtosters.lite.ui.components; package ru.vtosters.lite.ui.components;
import static ru.vtosters.lite.utils.About.getBuildNumber;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; 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 android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
@@ -17,6 +14,8 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
import com.vtosters.lite.R;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
@@ -65,13 +64,13 @@ public class CrashReporter {
var psaveLogIntent = PendingIntent.getService(getGlobalContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT); var psaveLogIntent = PendingIntent.getService(getGlobalContext(), 0, saveLogIntent, PendingIntent.FLAG_CANCEL_CURRENT);
var builder = new Notification.Builder(getGlobalContext()); var builder = new Notification.Builder(getGlobalContext());
builder.setSmallIcon(getIdentifier("ic_bug_24", "drawable")); builder.setSmallIcon(R.drawable.ic_bug_24);
builder.setContentTitle(getString("vtl_crashed")); builder.setContentTitle(activity.getString(R.string.vtl_crashed));
builder.setContentText(logString); builder.setContentText(logString);
builder.setStyle(new Notification.BigTextStyle().bigText(logString)); builder.setStyle(new Notification.BigTextStyle().bigText(logString));
builder.setAutoCancel(true); builder.setAutoCancel(true);
builder.addAction(new Notification.Action(0, getString("vtl_crash_upload"), PendingIntent.getActivity(getGlobalContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT))); builder.addAction(new Notification.Action(0, activity.getString(R.string.vtl_crash_upload), PendingIntent.getActivity(getGlobalContext(), (int) (Math.random() * 100.0d), foxbinIntent, PendingIntent.FLAG_CANCEL_CURRENT)));
builder.addAction(new Notification.Action(0, getString("vtl_crash_save"), psaveLogIntent)); builder.addAction(new Notification.Action(0, activity.getString(R.string.vtl_crash_save), psaveLogIntent));
if (Build.VERSION.SDK_INT >= 26) { if (Build.VERSION.SDK_INT >= 26) {
builder.setChannelId("crashes"); builder.setChannelId("crashes");
@@ -1,24 +1,25 @@
package ru.vtosters.lite.ui.components; package ru.vtosters.lite.ui.components;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import android.content.res.Resources; import android.content.res.Resources;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import com.vtosters.lite.R;
public class FragAnimationKit { public class FragAnimationKit {
// Q // Q
private static final int actOpenEnter = getIdentifier("q_enter", "anim"); private static final int actOpenEnter = R.anim.q_enter;
private static final int actOpenExit = getIdentifier("q_exit", "anim"); private static final int actOpenExit = R.anim.q_exit;
private static final int actCloseEnter = getIdentifier("q_pop_enter", "anim"); private static final int actCloseEnter = R.anim.q_pop_enter;
private static final int actCloseExit = getIdentifier("q_pop_exit", "anim"); private static final int actCloseExit = R.anim.q_pop_exit;
// Slide // Slide
private static final int SactOpenEnter = getIdentifier("legacy_enter", "anim"); private static final int SactOpenEnter = R.anim.legacy_enter;
private static final int SactOpenExit = getIdentifier("legacy_exit", "anim"); private static final int SactOpenExit = R.anim.legacy_exit;
private static final int SactCloseEnter = getIdentifier("legacy_pop_enter", "anim"); private static final int SactCloseEnter = R.anim.legacy_pop_enter;
private static final int SactCloseExit = getIdentifier("legacy_pop_exit", "anim"); private static final int SactCloseExit = R.anim.legacy_pop_exit;
// System // System
private static final Resources resources = Resources.getSystem(); private static final Resources resources = Resources.getSystem();
private static final int SSactOpenEnter = resources.getIdentifier("activity_open_enter", "anim", "android"); private static final int SSactOpenEnter = resources.getIdentifier("activity_open_enter", "anim", "android");
@@ -27,11 +27,11 @@ public class IconManager {
// available labels list // available labels list
public static List<String> sLabels = Arrays.asList( public static List<String> sLabels = Arrays.asList(
"standard", "vt" "standard", "vt", "vkontakte"
); );
public static List<String> sLabelsNames = Arrays.asList( public static List<String> sLabelsNames = Arrays.asList(
"VK", "VTLite" "VK", "VTLite", "VKontakte"
); );
// available icons list for verified users // available icons list for verified users
@@ -43,15 +43,6 @@ public class IconManager {
"VK", "VTLite", "Navy", "Tiger", "Spring", "Sea", "Sakura", "Party", "Paint", "Flamingo", "Old Logo", "Navy alter", "Tiger alter", "Spring alter", "Sea alter", "Sakura alter", "Party alter", "Paint alter", "Flamingo alter" "VK", "VTLite", "Navy", "Tiger", "Spring", "Sea", "Sakura", "Party", "Paint", "Flamingo", "Old Logo", "Navy alter", "Tiger alter", "Spring alter", "Sea alter", "Sakura alter", "Party alter", "Paint alter", "Flamingo alter"
); );
// available labels list for verified users
public static List<String> sLabelsPlus = Arrays.asList(
"standard", "vt", "vkontakte"
);
public static List<String> sLabelsPlusNames = Arrays.asList(
"VK", "VTLite", "VKontakte"
);
public static List<String> icons() { public static List<String> icons() {
return hasVerification() && isValidSignature() ? sIconsPlusNames : sIconsNames; // delete later sdk check return hasVerification() && isValidSignature() ? sIconsPlusNames : sIconsNames; // delete later sdk check
} }
@@ -73,16 +64,8 @@ public class IconManager {
Log.d("IconManager", "iconSwitcher: icon = " + icon + ", appname = " + appName); Log.d("IconManager", "iconSwitcher: icon = " + icon + ", appname = " + appName);
List<String> iconsList; List<String> iconsList = (hasVerification() && isValidSignature()) ? sIconsPlus : sIcons;
List<String> labelsList; List<String> labelsList = sLabels;
if (hasVerification() && isValidSignature()) {
iconsList = sIconsPlus;
labelsList = sLabelsPlus;
} else {
iconsList = sIcons;
labelsList = sLabels;
}
if (oldIcon != null && oldAppName != null) { if (oldIcon != null && oldAppName != null) {
oldIconIndex = iconsList.indexOf(oldIcon); oldIconIndex = iconsList.indexOf(oldIcon);
@@ -7,9 +7,10 @@ import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.app.Activity; import android.app.Activity;
import com.vtosters.lite.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet;
import ru.vtosters.lite.ui.vkui.VBottomSheetBuilder; import ru.vtosters.lite.ui.vkui.VBottomSheetBuilder;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
@@ -18,28 +19,26 @@ public class NewsfeedListManager {
public static void callEditorPopup(Activity activity) { public static void callEditorPopup(Activity activity) {
var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", ""); var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", "");
var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", Collections.synchronizedSet(new LinkedHashSet<>())); var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", Collections.emptySet());
var list = new ArrayList<VBListItem>(); var list = new ArrayList<VBListItem>(filtersSet.size());
if (filtersSet.size() == 0) { if (filtersSet.isEmpty()) {
sendToast(AndroidUtils.getString("newsfeed_list_update_feed")); sendToast(activity.getString(R.string.newsfeed_list_update_feed));
return; return;
} }
synchronized (filtersSet) { for (String item : filtersSet) {
for (String item : filtersSet) { var id = item.substring(0, item.indexOf("|"));
var id = item.substring(0, item.indexOf("|")); var title = item.substring(item.indexOf("|") + 1);
var title = item.substring(item.indexOf("|") + 1);
list.add(new VBListItem(id, title, selectedItems.contains(id))); list.add(new VBListItem(id, title, selectedItems.contains(id)));
}
} }
VBottomSheetBuilder.show(activity, new VBottomSheetBuilder.VBSContent( VBottomSheetBuilder.show(activity, new VBottomSheetBuilder.VBSContent(
AndroidUtils.getString("newsfeed_list_choose_to_hide"), activity.getString(R.string.newsfeed_list_choose_to_hide),
buildListOf(activity, list), buildListOf(activity, list),
new VBottomSheetBuilder.VBSContent.VBSButton( new VBottomSheetBuilder.VBSContent.VBSButton(
AndroidUtils.getString("save"), activity.getString(R.string.save),
() -> { () -> {
var newSelectedItems = ""; var newSelectedItems = "";
for (VBListItem item : list) for (VBListItem item : list)
@@ -48,15 +47,17 @@ public class NewsfeedListManager {
getDefaultPrefs().edit() getDefaultPrefs().edit()
.putString("news_feed_selected_items", newSelectedItems) .putString("news_feed_selected_items", newSelectedItems)
.apply(); .apply();
sendToast(AndroidUtils.getString("newsfeed_list_update_feed_to_work")); sendToast(activity.getString(R.string.newsfeed_list_update_feed_to_work));
} }
) )
)); ));
} }
public static void resetHideItems() { public static void resetHideItems() {
getDefaultPrefs().edit().remove("news_feed_selected_items").remove("news_feed_items_set") getDefaultPrefs().edit()
.remove("news_feed_selected_items")
.remove("news_feed_items_set")
.apply(); .apply();
sendToast(AndroidUtils.getString("newsfeed_list_hidden_reseted")); sendToast(AndroidUtils.getString(R.string.newsfeed_list_hidden_reseted));
} }
} }
@@ -4,6 +4,8 @@ import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import android.os.Build; import android.os.Build;
import com.vtosters.lite.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -87,33 +89,33 @@ public class SuperAppEditorManager {
private SuperAppItem getItemByTag(String tag) { private SuperAppItem getItemByTag(String tag) {
switch (tag) { switch (tag) {
case "menu": case "menu":
return SuperAppItem.valuesOf("menu", AndroidUtils.getString("superapp_menu")); return SuperAppItem.valuesOf("menu", AndroidUtils.getString(R.string.superapp_menu));
case "miniapps": case "miniapps":
return SuperAppItem.valuesOf("miniapps", AndroidUtils.getString("superapp_miniapps")); return SuperAppItem.valuesOf("miniapps", AndroidUtils.getString(R.string.superapp_miniapps));
case "vkpay_slim": case "vkpay_slim":
return SuperAppItem.valuesOf("vkpay_slim", AndroidUtils.getString("superapp_vkpay")); return SuperAppItem.valuesOf("vkpay_slim", AndroidUtils.getString(R.string.superapp_vkpay));
case "greeting": case "greeting":
return SuperAppItem.valuesOf("greeting", AndroidUtils.getString("superapp_greeting")); return SuperAppItem.valuesOf("greeting", AndroidUtils.getString(R.string.superapp_greeting));
case "promo": case "promo":
return SuperAppItem.valuesOf("promo", AndroidUtils.getString("superapp_miniapps_promo")); return SuperAppItem.valuesOf("promo", AndroidUtils.getString(R.string.superapp_miniapps_promo));
case "holiday": case "holiday":
return SuperAppItem.valuesOf("holiday", AndroidUtils.getString("superapp_holiday")); return SuperAppItem.valuesOf("holiday", AndroidUtils.getString(R.string.superapp_holiday));
case "weather": case "weather":
return SuperAppItem.valuesOf("weather", AndroidUtils.getString("superapp_weather")); return SuperAppItem.valuesOf("weather", AndroidUtils.getString(R.string.superapp_weather));
case "sport": case "sport":
return SuperAppItem.valuesOf("sport", AndroidUtils.getString("superapp_sport")); return SuperAppItem.valuesOf("sport", AndroidUtils.getString(R.string.superapp_sport));
case "games": case "games":
return SuperAppItem.valuesOf("games", AndroidUtils.getString("superapp_games")); return SuperAppItem.valuesOf("games", AndroidUtils.getString(R.string.superapp_games));
case "informer": case "informer":
return SuperAppItem.valuesOf("informer", AndroidUtils.getString("superapp_informer")); return SuperAppItem.valuesOf("informer", AndroidUtils.getString(R.string.superapp_informer));
case "food": case "food":
return SuperAppItem.valuesOf("food", AndroidUtils.getString("superapp_food")); return SuperAppItem.valuesOf("food", AndroidUtils.getString(R.string.superapp_food));
case "event": case "event":
return SuperAppItem.valuesOf("event", AndroidUtils.getString("superapp_event")); return SuperAppItem.valuesOf("event", AndroidUtils.getString(R.string.superapp_event));
case "music": case "music":
return SuperAppItem.valuesOf("music", AndroidUtils.getString("superapp_music")); return SuperAppItem.valuesOf("music", AndroidUtils.getString(R.string.superapp_music));
case "vk_run": case "vk_run":
return SuperAppItem.valuesOf("vk_run", AndroidUtils.getString("superapp_vk_run")); return SuperAppItem.valuesOf("vk_run", AndroidUtils.getString(R.string.superapp_vk_run));
default: default:
return null; return null;
} }
@@ -1,10 +1,5 @@
package ru.vtosters.lite.ui.dialogs; package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -14,29 +9,32 @@ import android.os.PowerManager;
import android.provider.Settings; import android.provider.Settings;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import ru.vtosters.lite.deviceinfo.OEMDetector; import ru.vtosters.lite.deviceinfo.OEMDetector;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.Preferences;
public class DisableBattery { public class DisableBattery {
public static void alert(Activity activity) { public static void alert(Activity activity) {
if (OEMDetector.isOEM() && Build.VERSION.SDK_INT >= 23 && getBoolValue("showDoze", true)) { if (!(OEMDetector.isOEM() && Build.VERSION.SDK_INT >= 23 && Preferences.getBoolValue("showDoze", true)))
final Context context = getGlobalContext(); return;
if (!((PowerManager) context.getSystemService(Context.POWER_SERVICE)).isIgnoringBatteryOptimizations(context.getPackageName())) { final var packName = activity.getPackageName();
new VkAlertDialog.Builder(activity) final var manager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
.setTitle(getString("batteryissuetitle")) if (manager.isIgnoringBatteryOptimizations(packName)) return;
.setMessage(getString("batteryissuesumm")) new VkAlertDialog.Builder(activity)
.setCancelable(false) .setTitle(R.string.batteryissuetitle)
.setPositiveButton(getString("batteryissuebtn1"), (dialogInterface, i) -> { .setMessage(R.string.batteryissuesumm)
var intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) .setCancelable(false)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .setPositiveButton(R.string.batteryissuebtn1, (dialogInterface, i) -> {
.setData(Uri.parse("package:" + context.getPackageName())); var intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
context.startActivity(intent); .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.setData(Uri.parse("package:" + packName));
activity.startActivity(intent);
}) })
.setNeutralButton(getString("batteryissuebtn2"), .setNeutralButton(R.string.batteryissuebtn2,
(dialogInterface, i) -> edit().putBoolean("showDoze", false).apply() (dialogInterface, i) -> AndroidUtils.edit().putBoolean("showDoze", false).apply()
) )
.show(); .show();
}
}
} }
} }
@@ -1,8 +1,6 @@
package ru.vtosters.lite.ui.dialogs; package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.GmsUtils.isGmsInstalled; import static ru.vtosters.lite.utils.GmsUtils.isGmsInstalled;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
@@ -11,6 +9,7 @@ import android.content.Intent;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import ru.vtosters.lite.ui.fragments.InstallGMSFragment; import ru.vtosters.lite.ui.fragments.InstallGMSFragment;
@@ -18,19 +17,18 @@ public class InstallGMS {
public static void alert(final Activity activity) { public static void alert(final Activity activity) {
if (!isGmsInstalled() && getBoolValue("showAlertGms", true)) { if (!isGmsInstalled() && getBoolValue("showAlertGms", true)) {
new VkAlertDialog.Builder(activity) new VkAlertDialog.Builder(activity)
.setTitle(getString("warning")) .setTitle(activity.getString(R.string.warning))
.setMessage(getString("gmsissuesumm")) .setMessage(activity.getString(R.string.gmsissuesumm))
.setCancelable(false) .setCancelable(false)
.setPositiveButton(getString("gmsissuebtn1"), ( .setPositiveButton(activity.getString(R.string.gmsissuebtn1), (
dialogInterface, i) -> edit().putBoolean("showAlertGms", false).apply() dialogInterface, i) -> edit().putBoolean("showAlertGms", false).apply()
) )
.setNeutralButton(getString("gmsissuebtn2"), (dialogInterface, i) -> { .setNeutralButton(activity.getString(R.string.gmsissuebtn2), (dialogInterface, i) -> {
edit().putBoolean("showAlertGms", false).apply(); edit().putBoolean("showAlertGms", false).apply();
var context = getGlobalContext();
var intent = new Navigator(InstallGMSFragment.class) var intent = new Navigator(InstallGMSFragment.class)
.b(context) .b(activity)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); activity.startActivity(intent);
}) })
.show(); .show();
} }
@@ -16,7 +16,6 @@ import androidx.appcompat.widget.SwitchCompat;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R; import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils; import ru.vtosters.lite.utils.LayoutUtils;
public class MessageSettings { public class MessageSettings {
@@ -52,12 +51,12 @@ public class MessageSettings {
four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
zero.setText(AndroidUtils.getString("proxy_disable")); // Отключить zero.setText(context.getString(R.string.proxy_disable)); // Отключить
one.setText(AndroidUtils.getString("message_self_destruct_15sec")); one.setText(context.getString(R.string.message_self_destruct_15sec));
two.setText(AndroidUtils.getString("message_self_destruct_1min")); two.setText(context.getString(R.string.message_self_destruct_1min));
three.setText(AndroidUtils.getString("message_self_destruct_5min")); three.setText(context.getString(R.string.message_self_destruct_5min));
four.setText(AndroidUtils.getString("message_self_destruct_1hour")); four.setText(context.getString(R.string.message_self_destruct_1hour));
five.setText(AndroidUtils.getString("message_self_destruct_24hours")); five.setText(context.getString(R.string.message_self_destruct_24hours));
zero.setTextColor(getTextAttr()); zero.setTextColor(getTextAttr());
one.setTextColor(getTextAttr()); one.setTextColor(getTextAttr());
@@ -89,7 +88,7 @@ public class MessageSettings {
@SuppressLint("UseSwitchCompatOrMaterialCode") @SuppressLint("UseSwitchCompatOrMaterialCode")
var silentSwitch = new SwitchCompat(new ContextThemeWrapper(context, R.style.Widget_AppCompat_CompoundButton_Switch)); var silentSwitch = new SwitchCompat(new ContextThemeWrapper(context, R.style.Widget_AppCompat_CompoundButton_Switch));
silentSwitch.setText(AndroidUtils.getString("silent_messages")); silentSwitch.setText(context.getString(R.string.silent_messages));
silentSwitch.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); silentSwitch.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
silentSwitch.setTextColor(getTextAttr()); silentSwitch.setTextColor(getTextAttr());
silentSwitch.setChecked(isSilentEnabled); silentSwitch.setChecked(isSilentEnabled);
@@ -106,12 +105,12 @@ public class MessageSettings {
mContainer.addView(silentSwitch, LayoutUtils.createLinear(-1, -2)); mContainer.addView(silentSwitch, LayoutUtils.createLinear(-1, -2));
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("message_send_settings_title")) .setTitle(context.getString(R.string.message_send_settings_title))
.setMessage(AndroidUtils.getString("silent_messages_time_select")) .setMessage(context.getString(R.string.silent_messages_time_select))
.setCancelable(true) .setCancelable(true)
.setView(mContainer) .setView(mContainer)
.setNegativeButton(AndroidUtils.getString("cancel"), null) .setNegativeButton(context.getString(R.string.cancel), null)
.setPositiveButton(AndroidUtils.getString("vtl_confirm"), (dialog, which) -> { // Применить .setPositiveButton(context.getString(R.string.vtl_confirm), (dialog, which) -> { // Применить
var checked = rg.getCheckedRadioButtonId(); var checked = rg.getCheckedRadioButtonId();
if (checked == zero.getId()) { if (checked == zero.getId()) {
@@ -1,9 +1,9 @@
package ru.vtosters.lite.ui.dialogs; package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import android.app.Activity; import android.app.Activity;
import com.vtosters.lite.R;
import ru.vtosters.lite.downloaders.OTADownloader; import ru.vtosters.lite.downloaders.OTADownloader;
import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper; import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper;
import ru.vtosters.lite.utils.OTAUtils; import ru.vtosters.lite.utils.OTAUtils;
@@ -29,9 +29,9 @@ public class OTADialog implements OTAUtils.OTAListener {
mActivity.runOnUiThread(() -> { mActivity.runOnUiThread(() -> {
// Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show(); // Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show();
new ModalBottomSheetWrapper(mActivity) new ModalBottomSheetWrapper(mActivity)
.setTitle(getString("newversion") + " " + mHelper.getNewVersionName()) .setTitle(mActivity.getString(R.string.newversion) + " " + mHelper.getNewVersionName())
.setUpdateInfoView(mHelper.getUpdateDescription()) .setUpdateInfoView(mHelper.getUpdateDescription())
.setPositiveButton(getString("updateanddownload"), () -> { .setPositiveButton(mActivity.getString(R.string.updateanddownload), () -> {
OTADownloader.downloadBuild(mHelper.getDownloadUrl()); OTADownloader.downloadBuild(mHelper.getDownloadUrl());
}) })
.show(); .show();
@@ -10,8 +10,8 @@ import android.widget.LinearLayout;
import android.widget.SeekBar; import android.widget.SeekBar;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils; import ru.vtosters.lite.utils.LayoutUtils;
public class RoundingSeekbarDialog { public class RoundingSeekbarDialog {
@@ -26,12 +26,12 @@ public class RoundingSeekbarDialog {
mContainer.addView(seek, LayoutUtils.createLinear(-1, -2)); mContainer.addView(seek, LayoutUtils.createLinear(-1, -2));
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("pic_rounding_title")) .setTitle(context.getString(R.string.pic_rounding_title))
.setMessage(AndroidUtils.getString("pic_rounding_info")) .setMessage(context.getString(R.string.pic_rounding_info))
.setCancelable(true) .setCancelable(true)
.setNegativeButton(AndroidUtils.getString("cancel"), null) .setNegativeButton(context.getString(R.string.cancel), null)
.setView(mContainer) .setView(mContainer)
.setPositiveButton(AndroidUtils.getString("vtl_confirm"), (dialog, which) -> { .setPositiveButton(context.getString(R.string.vtl_confirm), (dialog, which) -> {
edit().putInt("pic_rounding", seek.getProgress()).commit(); edit().putInt("pic_rounding", seek.getProgress()).commit();
restartApplicationWithTimer(); restartApplicationWithTimer();
}) })
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.dialogs; package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.app.Activity; import android.app.Activity;
@@ -10,8 +9,10 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import ru.vtosters.lite.deviceinfo.OEMDetector; import ru.vtosters.lite.deviceinfo.OEMDetector;
import ru.vtosters.lite.utils.AndroidUtils;
public class Start { public class Start {
public static void alert(final Activity activity) { public static void alert(final Activity activity) {
@@ -20,13 +21,13 @@ public class Start {
} }
if (getBoolValue("showAlert", true)) if (getBoolValue("showAlert", true))
new VkAlertDialog.Builder(activity) new VkAlertDialog.Builder(activity)
.setTitle(getString("warning")) .setTitle(R.string.warning)
.setMessage(getWelcome()) .setMessage(getWelcome())
.setCancelable(false) .setCancelable(false)
.setPositiveButton(getString("startbtn2"), .setPositiveButton(R.string.startbtn2,
(dialogInterface, i) -> edit().putBoolean("showAlert", false).apply() (dialogInterface, i) -> edit().putBoolean("showAlert", false).apply()
) )
.setNeutralButton(getString("startbtn1"), .setNeutralButton(R.string.startbtn1,
(dialogInterface, i) -> { (dialogInterface, i) -> {
edit().putBoolean("showAlert", false).apply(); edit().putBoolean("showAlert", false).apply();
activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/vtosters"))); activity.startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/vtosters")));
@@ -37,10 +38,10 @@ public class Start {
} }
private static String getWelcome() { private static String getWelcome() {
String Default = getString("startsumm1"); String Default = AndroidUtils.getString(R.string.startsumm1);
if (OEMDetector.isOEM()) { if (OEMDetector.isOEM()) {
return Default + getString("startsumm2"); return Default + AndroidUtils.getString(R.string.startsumm2);
} }
return Default; return Default;
@@ -1,13 +1,13 @@
package ru.vtosters.lite.ui.dialogs; package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme; import static ru.vtosters.lite.utils.ThemesUtils.isDarkTheme;
import android.app.Activity; import android.app.Activity;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.ui.themes.VKThemeHelper; import com.vk.core.ui.themes.VKThemeHelper;
import com.vtosters.lite.R;
import ru.vtosters.lite.hooks.VKUIHook; import ru.vtosters.lite.hooks.VKUIHook;
import ru.vtosters.lite.utils.Preferences; import ru.vtosters.lite.utils.Preferences;
@@ -16,15 +16,15 @@ public class ThemeChanging {
public static void changeTheme(Activity activity, float[] f) { public static void changeTheme(Activity activity, float[] f) {
if (Preferences.systemtheme()) { if (Preferences.systemtheme()) {
new VkAlertDialog.Builder(activity) new VkAlertDialog.Builder(activity)
.setTitle(getString("warning")) .setTitle(R.string.warning)
.setMessage(getString("system_theme_warning")) .setMessage(R.string.system_theme_warning)
.setCancelable(false) .setCancelable(false)
.setPositiveButton(getString("proxy_disable"), (dialogInterface, i) -> { // Отключить .setPositiveButton(R.string.proxy_disable, (dialogInterface, i) -> { // Отключить
edit().putString("currsystemtheme", !isDarkTheme() ? "dark" : "light").commit(); edit().putString("currsystemtheme", !isDarkTheme() ? "dark" : "light").commit();
VKThemeHelper.b(activity, f); VKThemeHelper.b(activity, f);
VKUIHook.clearWebCache(); VKUIHook.clearWebCache();
}) })
.setNeutralButton(getString("cancel"), null) .setNeutralButton(R.string.cancel, null)
.show(); .show();
} else { } else {
VKThemeHelper.b(activity, f); VKThemeHelper.b(activity, f);
@@ -10,36 +10,54 @@ import android.os.Looper;
import android.util.Log; import android.util.Log;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import ru.vtosters.lite.translators.BaseTranslator; import ru.vtosters.lite.translators.BaseTranslator;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class Translate { public class Translate {
private static final Executor ASYNC_EXECUTOR
= Executors.newSingleThreadExecutor();
private static final Executor MAIN_EXECUTOR
= new DelegateExecutor();
public static void showTranslatedText(Context context, String text) { public static void showTranslatedText(Context context, String text) {
new Thread(() -> { BaseTranslator translator = BaseTranslator.getInstance();
if (translator == null) return;
ASYNC_EXECUTOR.execute(() -> {
try { try {
var translation = BaseTranslator.getInstance().getTranslation(text); var translation = translator.getTranslation(text);
new Handler(Looper.getMainLooper()).post(() -> { MAIN_EXECUTOR.execute(() -> showDialog(context, translation));
showDialog(context, translation);
});
} catch (Exception e) { } catch (Exception e) {
Log.e("Translate", e + ""); Log.e("Translate", e + "");
} }
}).start(); });
} }
private static void showDialog(Context context, String text) { private static void showDialog(Context context, String text) {
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("translator_title")) .setTitle(R.string.translator_title)
.setMessage(text) .setMessage(text)
.setPositiveButton(AndroidUtils.getString("close"), .setPositiveButton(R.string.close,
(dialog, which) -> dialog.cancel()) (dialog, which) -> dialog.cancel())
.setNeutralButton(AndroidUtils.getString("copy"), (dialog, which) -> { .setNeutralButton(R.string.copy, (dialog, which) -> {
var clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); var clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
var clip = ClipData.newPlainText("Copied Text", text); var clip = ClipData.newPlainText("Copied Text", text);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(AndroidUtils.getString(R.string.copied_to_clipboard));
}) })
.show(); .show();
} }
private static class DelegateExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override
public void execute(Runnable command) {
handler.post(command);
}
}
} }
@@ -3,7 +3,6 @@ package ru.vtosters.lite.ui.dialogs;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled; import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import android.app.Activity; import android.app.Activity;
@@ -11,6 +10,7 @@ import android.content.Intent;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import ru.vtosters.lite.ui.fragments.VKUIwrapper; import ru.vtosters.lite.ui.fragments.VKUIwrapper;
@@ -18,12 +18,12 @@ public class VKIDProtection {
public static void alert(final Activity activity) { public static void alert(final Activity activity) {
if (!getBoolValue("showAlertVkId", true)) return; if (!getBoolValue("showAlertVkId", true)) return;
new VkAlertDialog.Builder(activity) new VkAlertDialog.Builder(activity)
.setTitle(getString("warning")) .setTitle(R.string.warning)
.setMessage(getString("vkidsumm")) .setMessage(R.string.vkidsumm)
.setCancelable(false) .setCancelable(false)
.setPositiveButton(getString("startbtn2"), .setPositiveButton(R.string.startbtn2,
(dialogInterface, i) -> edit().putBoolean("showAlertVkId", false).apply()) (dialogInterface, i) -> edit().putBoolean("showAlertVkId", false).apply())
.setNeutralButton(getString("vkiddisable"), (dialogInterface, i) -> { .setNeutralButton(R.string.vkiddisable, (dialogInterface, i) -> {
edit().putBoolean("showAlertVkId", false).apply(); edit().putBoolean("showAlertVkId", false).apply();
VKUIwrapper.setLink( VKUIwrapper.setLink(
isAnyProxyEnabled() isAnyProxyEnabled()
@@ -1,19 +1,19 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.Preferences.offline; import static ru.vtosters.lite.utils.Preferences.offline;
import android.os.Bundle; import android.os.Bundle;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
public class ActivityFragment extends MaterialPreferenceToolbarFragment { public class ActivityFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_activity", "xml")); addPreferencesFromResource(R.xml.preferences_activity);
findPreference("setoffline").setEnabled(offline()); findPreference("setoffline").setEnabled(offline());
} }
@@ -25,6 +25,6 @@ public class ActivityFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlactivity", "string"); return R.string.vtlactivity;
} }
} }
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import android.os.Bundle; import android.os.Bundle;
@@ -25,14 +24,13 @@ import com.vtosters.lite.R;
import ru.vtosters.lite.ui.adapters.CategorizedAdapter; import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
import ru.vtosters.lite.ui.components.DockBarEditorManager; import ru.vtosters.lite.ui.components.DockBarEditorManager;
import ru.vtosters.lite.ui.components.ItemMovingCallback; import ru.vtosters.lite.ui.components.ItemMovingCallback;
import ru.vtosters.lite.utils.AndroidUtils;
public class DockBarEditorFragment extends BaseToolbarFragment { public class DockBarEditorFragment extends BaseToolbarFragment {
@CallSuper @CallSuper
@Override @Override
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) { public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
setTitle(getIdentifier("dockbar_editor", "string")); setTitle(R.string.dockbar_editor);
FrameLayout content = new FrameLayout(getContext()); FrameLayout content = new FrameLayout(getContext());
@@ -50,7 +48,7 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2)); container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
TextView save = new TextView(new ContextThemeWrapper(getContext(), R.style.VKUIButton_Primary)); TextView save = new TextView(new ContextThemeWrapper(getContext(), R.style.VKUIButton_Primary));
save.setText(AndroidUtils.getString("save")); save.setText(requireContext().getString(R.string.save));
save.setOnClickListener(v -> { save.setOnClickListener(v -> {
DockBarEditorManager.getInstance().save(); DockBarEditorManager.getInstance().save();
restartApplication(); restartApplication();
@@ -64,7 +62,7 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(dp2px(10), 0)); buttonsContainer.addView(divider, new LinearLayout.LayoutParams(dp2px(10), 0));
TextView reset = new TextView(new ContextThemeWrapper(getContext(), R.style.VKUIButton_Primary)); TextView reset = new TextView(new ContextThemeWrapper(getContext(), R.style.VKUIButton_Primary));
reset.setText(AndroidUtils.getString("reset")); reset.setText(requireContext().getString(R.string.reset));
reset.setOnClickListener(v -> { reset.setOnClickListener(v -> {
DockBarEditorManager.getInstance().reset(); DockBarEditorManager.getInstance().reset();
restartApplication(); restartApplication();
@@ -2,7 +2,6 @@ package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; 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.getPrefsValue;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters;
@@ -18,16 +17,16 @@ import androidx.preference.Preference;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vk.newsfeed.NewsfeedSettingsFragment; import com.vk.newsfeed.NewsfeedSettingsFragment;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.components.NewsfeedListManager; import ru.vtosters.lite.ui.components.NewsfeedListManager;
import ru.vtosters.lite.utils.AndroidUtils;
public class FeedFragment extends MaterialPreferenceToolbarFragment { public class FeedFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_feed", "xml")); addPreferencesFromResource(R.xml.preferences_feed);
prefs(); prefs();
} }
@@ -73,7 +72,7 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
}); });
var str = getDefaultPrefs().getString("news_feed_selected_items", ""); var str = getDefaultPrefs().getString("news_feed_selected_items", "");
findPreference("newsfeedlistmanager").setSummary( findPreference("newsfeedlistmanager").setSummary(
String.format(AndroidUtils.getString("feed_hidden"), (!TextUtils.isEmpty(str) ? str.split(",").length : 0)) String.format(requireContext().getString(R.string.feed_hidden), (!TextUtils.isEmpty(str) ? str.split(",").length : 0))
); );
findPreference("newsfeedlistmanager_reset").setOnPreferenceClickListener(preference -> { findPreference("newsfeedlistmanager_reset").setOnPreferenceClickListener(preference -> {
NewsfeedListManager.resetHideItems(); NewsfeedListManager.resetHideItems();
@@ -86,23 +85,23 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
var count = text.split(", ").length; var count = text.split(", ").length;
if (count < 1 || text.isEmpty()) { if (count < 1 || text.isEmpty()) {
return AndroidUtils.getString("feed_no_elements"); return requireContext().getString(R.string.feed_no_elements);
} else { } else {
return String.format(AndroidUtils.getString("feed_elements_count"), count); return String.format(requireContext().getString(R.string.feed_elements_count), count);
} }
} }
private void remdialog(String key, Context context) { private void remdialog(String key, Context context) {
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("warning")) .setTitle(requireContext().getString(R.string.warning))
.setMessage(AndroidUtils.getString("delete_elements_confirm")) .setMessage(requireContext().getString(R.string.delete_elements_confirm))
.setCancelable(false) .setCancelable(false)
.setPositiveButton(AndroidUtils.getString("yes"), (dialogInterface, i) -> { .setPositiveButton(requireContext().getString(R.string.yes), (dialogInterface, i) -> {
edit().remove(key).apply(); edit().remove(key).apply();
sendToast(AndroidUtils.getString("elements_deleted_success")); sendToast(requireContext().getString(R.string.elements_deleted_success));
setupFilters(); setupFilters();
}) })
.setNegativeButton(AndroidUtils.getString("cancel"), .setNegativeButton(requireContext().getString(R.string.cancel),
(dialogInterface, i) -> dialogInterface.dismiss()) (dialogInterface, i) -> dialogInterface.dismiss())
.show(); .show();
} }
@@ -119,9 +118,9 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
var count = str.toString().split(", ").length; var count = str.toString().split(", ").length;
if (count < 1 || (str.length() == 0)) { if (count < 1 || (str.length() == 0)) {
return AndroidUtils.getString("feed_no_elements"); return requireContext().getString(R.string.feed_no_elements);
} else { } else {
return String.format(AndroidUtils.getString("feed_elements_count"), count); return String.format(requireContext().getString(R.string.feed_elements_count), count);
} }
} }
@@ -146,6 +145,6 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlfeed", "string"); return R.string.vtlfeed;
} }
} }
@@ -31,10 +31,9 @@ import androidx.appcompat.view.ContextThemeWrapper;
import androidx.core.content.res.ResourcesCompat; import androidx.core.content.res.ResourcesCompat;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class IconsFragment extends MaterialPreferenceToolbarFragment { public class IconsFragment extends MaterialPreferenceToolbarFragment {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
public static void callSelectDialog(Context ctx, String appicon) { public static void callSelectDialog(Context ctx, String appicon) {
@@ -63,7 +62,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
rgVK.setText("VK"); rgVK.setText("VK");
rgVK.setTextColor(getTextAttr()); rgVK.setTextColor(getTextAttr());
rgVKontakte.setText(AndroidUtils.getString("app_name_alter")); rgVKontakte.setText(ctx.getString(R.string.app_name_alter));
rgVKontakte.setTextColor(getTextAttr()); rgVKontakte.setTextColor(getTextAttr());
rgVKontakte.setChecked(defname.contains("vkontakte")); rgVKontakte.setChecked(defname.contains("vkontakte"));
@@ -71,9 +70,9 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
rgDefault.setChecked(defname.contains("vt") || defname.isEmpty()); rgDefault.setChecked(defname.contains("vt") || defname.isEmpty());
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("app_name_select_title")) .setTitle(R.string.app_name_select_title)
.setView(rg) .setView(rg)
.setPositiveButton(AndroidUtils.getString("vtl_confirm"), ((dialog, which) -> { .setPositiveButton(R.string.vtl_confirm, ((dialog, which) -> {
if (rgDefault.isChecked()) { if (rgDefault.isChecked()) {
edit().putString("appname", "vt").commit(); edit().putString("appname", "vt").commit();
edit().putString("selectedicon", appicon).commit(); edit().putString("selectedicon", appicon).commit();
@@ -91,7 +90,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
switchComponent(appicon, "vkontakte", deficon, defname); switchComponent(appicon, "vkontakte", deficon, defname);
} }
})) }))
.setNegativeButton(AndroidUtils.getString("cancel"), .setNegativeButton(R.string.cancel,
((dialog, which) -> dialog.dismiss())) ((dialog, which) -> dialog.dismiss()))
.show(); .show();
} }
@@ -101,17 +100,16 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
int vtosterXml = getIdentifier("empty", "xml"); this.addPreferencesFromResource(R.xml.empty);
this.addPreferencesFromResource(vtosterXml);
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) { if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
addPreference(this, "", AndroidUtils.getString("icons_warning"), AndroidUtils.getString("icons_warning_info"), "ic_about_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.icons_warning), requireContext().getString(R.string.icons_warning_info), R.drawable.ic_about_outline_28, preference -> {
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/"))); getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/")));
return false; return false;
}); });
} }
addPreferenceCategory(this, AndroidUtils.getString("icons_title")); addPreferenceCategory(this, requireContext().getString(R.string.icons_title));
for (var i = 0; i < icons().size(); i++) { for (var i = 0; i < icons().size(); i++) {
if (icons().get(i) == null || iconsValues().get(i) == null) return; if (icons().get(i) == null || iconsValues().get(i) == null) return;
@@ -119,20 +117,20 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
String iconname = icons().get(i); String iconname = icons().get(i);
String icon = iconsValues().get(i); String icon = iconsValues().get(i);
String icondrawable; int iconRes;
if (icon.equals("vt")) { if (icon.equals("vt")) {
icondrawable = "vt_launcher_round"; iconRes = R.mipmap.vt_launcher_round;
} else if (icon.contains("standard")) { } else if (icon.contains("standard")) {
icondrawable = "ic_launcher_round"; iconRes = R.mipmap.ic_launcher_round;
} else { } else {
icondrawable = "ic_launcher_" + icon; iconRes = getIdentifier("ic_launcher_" + icon, "mipmap");
} }
Drawable drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier(icondrawable, "mipmap"), null); Drawable drawable = ResourcesCompat.getDrawable(getResources(), iconRes, null);
if (drawable == null) { if (drawable == null) {
drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier("ic_bug_outline_28", "drawable"), null); drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_bug_outline_28, null);
} }
addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> { addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
@@ -142,7 +140,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
} }
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) { if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
addPreferenceCategory(this, AndroidUtils.getString("unavailable_icons")); addPreferenceCategory(this, requireContext().getString(R.string.unavailable_icons));
for (var i = 2; i < sIconsPlusNames.size(); i++) { for (var i = 2; i < sIconsPlusNames.size(); i++) {
if (sIconsPlusNames.get(i) == null || sIconsPlus.get(i) == null) return; if (sIconsPlusNames.get(i) == null || sIconsPlus.get(i) == null) return;
@@ -150,24 +148,24 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment {
String iconname = sIconsPlusNames.get(i); String iconname = sIconsPlusNames.get(i);
String icon = sIconsPlus.get(i); String icon = sIconsPlus.get(i);
String icondrawable; int iconRes;
if (icon.equals("vt")) { if (icon.equals("vt")) {
icondrawable = "vt_launcher_round"; iconRes = R.mipmap.vt_launcher_round;
} else if (icon.contains("standard")) { } else if (icon.contains("standard")) {
icondrawable = "ic_launcher_round"; iconRes = R.mipmap.ic_launcher_round;
} else { } else {
icondrawable = "ic_launcher_" + icon; iconRes = getIdentifier("ic_launcher_" + icon, "mipmap");
} }
Drawable drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier(icondrawable, "mipmap"), null); Drawable drawable = ResourcesCompat.getDrawable(getResources(), iconRes, null);
if (drawable == null) { if (drawable == null) {
drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier("ic_bug_outline_28", "drawable"), null); drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_bug_outline_28, null);
} }
addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> { addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
sendToast(AndroidUtils.getString("unavailable_icon_warning")); sendToast(requireContext().getString(R.string.unavailable_icon_warning));
return false; return false;
}); });
} }
@@ -1,20 +1,19 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import android.os.Bundle; import android.os.Bundle;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
public class InstallGMSFragment extends MaterialPreferenceToolbarFragment { public class InstallGMSFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_gms", "xml")); addPreferencesFromResource(R.xml.preferences_gms);
} }
@Override @Override
public int T4() { public int T4() {
return getIdentifier("installgms", "string"); return R.string.installgms;
} }
} }
@@ -1,6 +1,5 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.isTablet; import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
@@ -10,16 +9,16 @@ import android.os.Bundle;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.ui.dialogs.RoundingSeekbarDialog; import ru.vtosters.lite.ui.dialogs.RoundingSeekbarDialog;
import ru.vtosters.lite.utils.AndroidUtils;
public class InterfaceFragment extends MaterialPreferenceToolbarFragment { public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_interface", "xml")); addPreferencesFromResource(R.xml.preferences_interface);
prefs(); prefs();
} }
@@ -43,9 +42,9 @@ public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
} }
if (getPreferences().getInt("pic_rounding", 0) == 0) { if (getPreferences().getInt("pic_rounding", 0) == 0) {
findPreference("customrounding").setSummary(AndroidUtils.getString("disabled")); findPreference("customrounding").setSummary(requireContext().getString(R.string.disabled));
} else { } else {
findPreference("customrounding").setSummary(String.format(AndroidUtils.getString("rounding_size"), getPreferences().getInt("pic_rounding", 0))); findPreference("customrounding").setSummary(String.format(requireContext().getString(R.string.rounding_size), getPreferences().getInt("pic_rounding", 0)));
} }
} }
@@ -63,6 +62,6 @@ public class InterfaceFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlinterface", "string"); return R.string.vtlinterface;
} }
} }
@@ -1,12 +1,11 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.isVkxInstalled; import static bruhcollective.itaysonlab.libvkx.client.LibVKXClient.isVkxInstalled;
import static ru.vtosters.lite.music.Scrobbler.isLoggedIn; import static ru.vtosters.lite.music.LastFMScrobbler.isLoggedIn;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
@@ -29,6 +28,7 @@ import androidx.preference.Preference;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import org.json.JSONObject; import org.json.JSONObject;
@@ -44,7 +44,7 @@ import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import ru.vtosters.lite.downloaders.AudioDownloader; import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.downloaders.VideoDownloader; import ru.vtosters.lite.downloaders.VideoDownloader;
import ru.vtosters.lite.music.Scrobbler; import ru.vtosters.lite.music.LastFMScrobbler;
import ru.vtosters.lite.music.cache.CacheDatabaseDelegate; import ru.vtosters.lite.music.cache.CacheDatabaseDelegate;
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter; import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
@@ -66,8 +66,8 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
container.addView(input, lp); container.addView(input, lp);
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("video_dl_enter_link")) .setTitle(R.string.video_dl_enter_link)
.setPositiveButton(AndroidUtils.getString("download"), .setPositiveButton(R.string.download,
(dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx)) (dialog, which) -> VideoDownloader.parseVideoLink(input.getText().toString(), ctx))
.setView(container) .setView(container)
.show(); .show();
@@ -76,7 +76,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_media", "xml")); addPreferencesFromResource(R.xml.preferences_media);
prefs(); prefs();
} }
@@ -107,15 +107,15 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
}); });
if (isLoggedIn()) { if (isLoggedIn()) {
findPreference("lastfm_auth").setSummary(AndroidUtils.getString("lastfm_authorized_as") + " " + Scrobbler.getUserName()); findPreference("lastfm_auth").setSummary(requireContext().getString(R.string.lastfm_authorized_as) + " " + LastFMScrobbler.getUserName());
} else { } else {
findPreference("lastfm_enabled").setEnabled(false); findPreference("lastfm_enabled").setEnabled(false);
} }
findPreference("cached_tracks").setSummary(String.format(AndroidUtils.getString("cached_tracks_counter"), CacheDatabaseDelegate.getTrackCount())); findPreference("cached_tracks").setSummary(String.format(requireContext().getString(R.string.cached_tracks_counter), CacheDatabaseDelegate.getTrackCount()));
findPreference("cached_tracks").setOnPreferenceClickListener(preference -> { findPreference("cached_tracks").setOnPreferenceClickListener(preference -> {
if (CacheDatabaseDelegate.getTrackCount() == 0) { if (CacheDatabaseDelegate.getTrackCount() == 0) {
sendToast(AndroidUtils.getString("no_cache_error")); sendToast(requireContext().getString(R.string.no_cache_error));
} else { } else {
delcache(requireContext()); delcache(requireContext());
} }
@@ -133,9 +133,9 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
findPreference("select_photo_search_engine").setOnPreferenceClickListener(preference -> { findPreference("select_photo_search_engine").setOnPreferenceClickListener(preference -> {
var items = Arrays.asList( var items = Arrays.asList(
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("yandex", "drawable"), "Yandex"), new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.yandex, "Yandex"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("google", "drawable"), "Google"), new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.google, "Google"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("microsoft", "drawable"), "Bing") new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.microsoft, "Bing")
); );
var adapter = new ImagineArrayAdapter(getContext(), items); var adapter = new ImagineArrayAdapter(getContext(), items);
@@ -156,7 +156,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx); final EditText fn = new EditText(ctx);
fn.setHint(AndroidUtils.getString("lastfm_login")); fn.setHint(R.string.lastfm_login);
fn.setTextColor(getTextAttr()); fn.setTextColor(getTextAttr());
fn.setHintTextColor(getSTextAttr()); fn.setHintTextColor(getSTextAttr());
fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -167,7 +167,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
fn.setLayoutParams(margin); fn.setLayoutParams(margin);
final EditText ln = new EditText(ctx); final EditText ln = new EditText(ctx);
ln.setHint(AndroidUtils.getString("lastfm_password")); ln.setHint(R.string.lastfm_password);
ln.setTextColor(getTextAttr()); ln.setTextColor(getTextAttr());
ln.setHintTextColor(getSTextAttr()); ln.setHintTextColor(getSTextAttr());
ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
@@ -176,12 +176,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
ln.setLayoutParams(margin); ln.setLayoutParams(margin);
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("lastfm_enter_credentials")) .setTitle(R.string.lastfm_enter_credentials)
.setPositiveButton(AndroidUtils.getString("lastfm_enter"), .setPositiveButton(R.string.lastfm_enter,
(dialog, which) -> { (dialog, which) -> {
String login = fn.getText().toString(); String login = fn.getText().toString();
String pass = ln.getText().toString(); String pass = ln.getText().toString();
Scrobbler.auth(login, pass); LastFMScrobbler.authenticate(login, pass);
} }
) )
.setView(linearLayout) .setView(linearLayout)
@@ -190,22 +190,22 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
private void logout(Context ctx) { private void logout(Context ctx) {
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("lastfm_logout_title")) .setTitle(R.string.lastfm_logout_title)
.setMessage(AndroidUtils.getString("lastfm_logout_confirm")) .setMessage(R.string.lastfm_logout_confirm)
.setPositiveButton(AndroidUtils.getString("vkim_yes"), .setPositiveButton(R.string.vkim_yes,
(dialog, which) -> Scrobbler.logout()) (dialog, which) -> LastFMScrobbler.logout())
.setNeutralButton(AndroidUtils.getString("vkim_no"), .setNeutralButton(R.string.vkim_no,
(dialog, which) -> dialog.cancel()) (dialog, which) -> dialog.cancel())
.show(); .show();
} }
private void delcache(Context ctx) { private void delcache(Context ctx) {
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("warning")) .setTitle(R.string.warning)
.setMessage(AndroidUtils.getString("cached_tracks_remove_confirm")) .setMessage(R.string.cached_tracks_remove_confirm)
.setPositiveButton(AndroidUtils.getString("yes"), .setPositiveButton(R.string.yes,
(dialog, which) -> executor.submit(CacheDatabaseDelegate::clear)) (dialog, which) -> executor.submit(CacheDatabaseDelegate::clear))
.setNeutralButton(AndroidUtils.getString("no"), .setNeutralButton(R.string.no,
(dialog, which) -> dialog.cancel()) (dialog, which) -> dialog.cancel())
.show(); .show();
} }
@@ -217,12 +217,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
} }
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(AndroidUtils.getString("download_method")) .setTitle(R.string.download_method)
.setMessage(AndroidUtils.getString("download_method_desc")) .setMessage(R.string.download_method_desc)
.setPositiveButton(AndroidUtils.getString("download_method_cache"), (dialog, which) -> { .setPositiveButton(R.string.download_method_cache, (dialog, which) -> {
executor.submit(AudioDownloader::cacheAllAudios); executor.submit(AudioDownloader::cacheAllAudios);
}) })
.setNegativeButton(AndroidUtils.getString("download_method_mp3"), (dialog, which) -> { .setNegativeButton(R.string.download_method_mp3, (dialog, which) -> {
executor.submit(AudioDownloader::downloadAllAudios); executor.submit(AudioDownloader::downloadAllAudios);
}) })
.show(); .show();
@@ -240,9 +240,9 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
var response = new JSONObject(new OkHttpClient().a(request).execute().a().g()); var response = new JSONObject(new OkHttpClient().a(request).execute().a().g());
if (response.optInt("response") == 1) { if (response.optInt("response") == 1) {
requireActivity().runOnUiThread(() -> sendToast(AndroidUtils.getString("video_history_cleaned"))); requireActivity().runOnUiThread(() -> sendToast(requireContext().getString(R.string.video_history_cleaned)));
} else { } else {
requireActivity().runOnUiThread(() -> sendToast(AndroidUtils.getString("delete_video_history_error"))); requireActivity().runOnUiThread(() -> sendToast(requireContext().getString(R.string.delete_video_history_error)));
} }
Log.d("VideoHistory", response.toString()); Log.d("VideoHistory", response.toString());
@@ -259,12 +259,12 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
private void deleteVideoHistoryDialog(Context context) { private void deleteVideoHistoryDialog(Context context) {
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("warning")) .setTitle(R.string.warning)
.setMessage(AndroidUtils.getString("delete_video_history_confirm")) .setMessage(R.string.delete_video_history_confirm)
.setCancelable(false) .setCancelable(false)
.setPositiveButton(AndroidUtils.getString("yes"), .setPositiveButton(R.string.yes,
(dialogInterface, i) -> deleteVideoHistory()) (dialogInterface, i) -> deleteVideoHistory())
.setNegativeButton(AndroidUtils.getString("cancel"), .setNegativeButton(R.string.cancel,
(dialogInterface, i) -> dialogInterface.dismiss()) (dialogInterface, i) -> dialogInterface.dismiss())
.show(); .show();
} }
@@ -288,6 +288,6 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlmedia", "string"); return R.string.vtlmedia;
} }
} }
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; 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.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.isTablet; import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
@@ -18,6 +17,7 @@ import androidx.preference.Preference;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import java.util.Arrays; import java.util.Arrays;
@@ -29,7 +29,7 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_messages", "xml")); addPreferencesFromResource(R.xml.preferences_messages);
prefs(); prefs();
} }
@@ -44,8 +44,8 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
findPreference("lang_service").setOnPreferenceClickListener(preference -> { findPreference("lang_service").setOnPreferenceClickListener(preference -> {
var items = Arrays.asList( var items = Arrays.asList(
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("ic_yandex_translate_icon", "drawable"), "Yandex Translate"), new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.ic_yandex_translate_icon, "Yandex Translate"),
new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("ic_google_translate_logo", "drawable"), "Google Translate") new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.ic_google_translate_logo, "Google Translate")
// new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("ic_deepl_logo_icon", "drawable"), "DeepL") // new ImagineArrayAdapter.ImagineArrayAdapterItem(getIdentifier("ic_deepl_logo_icon", "drawable"), "DeepL")
); );
@@ -63,8 +63,8 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
}); });
findPreference("vkme_notifs").setEnabled(vkme()); findPreference("vkme_notifs").setEnabled(vkme());
findPreference("wallpapers").setIcon(recolorDrawable(getGlobalContext().getDrawable(getIdentifier("ic_media_outline_28", "drawable")))); findPreference("wallpapers").setIcon(recolorDrawable(getGlobalContext().getDrawable(R.drawable.ic_media_outline_28)));
findPreference("vkme").setIcon(getIdentifier("ic_vkme_28", "drawable")); findPreference("vkme").setIcon(R.drawable.ic_vkme_28);
if (isTablet()) { if (isTablet()) {
findPreference("alteremoji").setVisible(false); findPreference("alteremoji").setVisible(false);
@@ -111,6 +111,6 @@ public class MessagesFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlmessages", "string"); return R.string.vtlmessages;
} }
} }
@@ -10,7 +10,6 @@ import static ru.vtosters.lite.ui.components.BackupManager.restoreBackup;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
@@ -46,6 +45,7 @@ import com.vk.mediastore.MediaStorage;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vk.pushes.PushSubscriber; import com.vk.pushes.PushSubscriber;
import com.vk.stickers.Stickers; import com.vk.stickers.Stickers;
import com.vtosters.lite.R;
import com.vtosters.lite.auth.VKAccountManager; import com.vtosters.lite.auth.VKAccountManager;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import com.vtosters.lite.im.ImEngineProvider; import com.vtosters.lite.im.ImEngineProvider;
@@ -63,7 +63,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_other", "xml")); addPreferencesFromResource(R.xml.preferences_other);
prefs(); prefs();
} }
@@ -76,7 +76,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
String token = data.getStringExtra("token"); String token = data.getStringExtra("token");
AndroidUtils.getPreferences().edit().putString("vk_admin_token", token).apply(); AndroidUtils.getPreferences().edit().putString("vk_admin_token", token).apply();
Log.d("VkAdminToken", token); Log.d("VkAdminToken", token);
Toast.makeText(getContext(), AndroidUtils.getString("token_saved"), LENGTH_SHORT).show(); Toast.makeText(getContext(), requireContext().getString(R.string.token_saved), LENGTH_SHORT).show();
} }
} }
} }
@@ -112,22 +112,22 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
var pref = getDefaultPrefs().getString("autoclearcache", "Default"); var pref = getDefaultPrefs().getString("autoclearcache", "Default");
switch (pref) { switch (pref) {
case "Default": case "Default":
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_disabled")); findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_disabled));
break; break;
case "100mb": case "100mb":
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_100mb")); findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_100mb));
break; break;
case "500mb": case "500mb":
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_500mb")); findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_500mb));
break; break;
case "1gb": case "1gb":
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_1gb")); findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_1gb));
break; break;
case "2gb": case "2gb":
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_2gb")); findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_2gb));
break; break;
case "5gb": case "5gb":
findPreference("autoclearcache").setSummary(AndroidUtils.getString("cache_5gb")); findPreference("autoclearcache").setSummary(requireContext().getString(R.string.cache_5gb));
break; break;
} }
@@ -160,12 +160,12 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0); rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
RadioButton zero = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton zero = new RadioButton(new ContextThemeWrapper(getContext(), R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton one = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton one = new RadioButton(new ContextThemeWrapper(getContext(), R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton two = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton two = new RadioButton(new ContextThemeWrapper(getContext(), R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton three = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton three = new RadioButton(new ContextThemeWrapper(getContext(), R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton four = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton four = new RadioButton(new ContextThemeWrapper(getContext(), R.style.Widget_AppCompat_CompoundButton_RadioButton));
RadioButton five = new RadioButton(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton)); RadioButton five = new RadioButton(new ContextThemeWrapper(getContext(), R.style.Widget_AppCompat_CompoundButton_RadioButton));
rg.addView(zero); rg.addView(zero);
rg.addView(one); rg.addView(one);
@@ -181,7 +181,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); four.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f)); five.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
zero.setText(AndroidUtils.getString("autoclearcachedisabled")); zero.setText(requireContext().getString(R.string.autoclearcachedisabled));
one.setText("100 MB"); one.setText("100 MB");
two.setText("500 MB"); two.setText("500 MB");
three.setText("1 GB"); three.setText("1 GB");
@@ -203,12 +203,12 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
five.setChecked(val == 5); five.setChecked(val == 5);
new VkAlertDialog.Builder(getContext()) new VkAlertDialog.Builder(getContext())
.setTitle(AndroidUtils.getString("cache_clean_title")) .setTitle(requireContext().getString(R.string.cache_clean_title))
.setMessage(AndroidUtils.getString("cache_select_size")) .setMessage(requireContext().getString(R.string.cache_select_size))
.setCancelable(true) .setCancelable(true)
.setNegativeButton(AndroidUtils.getString("cancel"), null) .setNegativeButton(requireContext().getString(R.string.cancel), null)
.setView(rg) .setView(rg)
.setPositiveButton(AndroidUtils.getString("save"), (dialog, which) -> { .setPositiveButton(requireContext().getString(R.string.save), (dialog, which) -> {
var sizes = new String[] { "Default", "100mb", "500mb", "1gb", "2gb", "5gb" }; var sizes = new String[] { "Default", "100mb", "500mb", "1gb", "2gb", "5gb" };
var id = rg.getCheckedRadioButtonId(); var id = rg.getCheckedRadioButtonId();
getDefaultPrefs().edit() getDefaultPrefs().edit()
@@ -221,8 +221,8 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
private void cacheCleanDialog() { private void cacheCleanDialog() {
new VkAlertDialog.Builder(getContext()) new VkAlertDialog.Builder(getContext())
.setTitle(AndroidUtils.getString("select_which_clean")) .setTitle(requireContext().getString(R.string.select_which_clean))
.setItems(AndroidUtils.getArray("cache_cleaner"), (dialog, which) -> { .setItems(AndroidUtils.getArray(R.array.cache_cleaner), (dialog, which) -> {
switch (which) { switch (which) {
case 0: { case 0: {
SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE); SharedPreferences prefs2 = getContext().getSharedPreferences("stickers_storage", Context.MODE_PRIVATE);
@@ -262,7 +262,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
clearWebViewCache(); clearWebViewCache();
break; break;
} }
Toast.makeText(getContext(), AndroidUtils.getString("cache_cleaned"), LENGTH_SHORT).show(); Toast.makeText(getContext(), requireContext().getString(R.string.cache_cleaned), LENGTH_SHORT).show();
}) })
.show(); .show();
} }
@@ -273,14 +273,14 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
private void delprefs(Context context) { private void delprefs(Context context) {
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setTitle(AndroidUtils.getString("warning")) .setTitle(requireContext().getString(R.string.warning))
.setMessage(AndroidUtils.getString("settings_reset_confirm")) .setMessage(requireContext().getString(R.string.settings_reset_confirm))
.setCancelable(false) .setCancelable(false)
.setPositiveButton(AndroidUtils.getString("yes"), (dialogInterface, i) -> { .setPositiveButton(requireContext().getString(R.string.yes), (dialogInterface, i) -> {
deletePrefs(); deletePrefs();
restartApplication(); restartApplication();
}) })
.setNegativeButton(AndroidUtils.getString("cancel"), (dialogInterface, i) -> dialogInterface.dismiss()) .setNegativeButton(requireContext().getString(R.string.cancel), (dialogInterface, i) -> dialogInterface.dismiss())
.show(); .show();
} }
@@ -317,7 +317,7 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
try { try {
backupOnlines(); backupOnlines();
} catch (IOException e) { } catch (IOException e) {
Toast.makeText(getContext(), AndroidUtils.getString("no_data_to_backup"), LENGTH_SHORT).show(); Toast.makeText(getContext(), requireContext().getString(R.string.no_data_to_backup), LENGTH_SHORT).show();
} }
return true; return true;
} }
@@ -326,8 +326,8 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
class c implements Preference.OnPreferenceClickListener { class c implements Preference.OnPreferenceClickListener {
public void copy(Context context, String str) { public void copy(Context context, String str) {
((ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", str)); ((ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", str));
makeText(context, AndroidUtils.getString("copybtn"), LENGTH_SHORT).show(); makeText(context, requireContext().getString(R.string.copybtn), LENGTH_SHORT).show();
ToastUtils.a(AndroidUtils.getString("tokenwarning")); ToastUtils.a(requireContext().getString(R.string.tokenwarning));
} }
@Override // android.support.v7.preference.Preference.c @Override // android.support.v7.preference.Preference.c
@@ -342,12 +342,12 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
VKAccount b = VKAccountManager.d(); VKAccount b = VKAccountManager.d();
PushSubscriber.e.a(); PushSubscriber.e.a();
ToastUtils.a(AndroidUtils.getString("fcmtokenrem")); ToastUtils.a(requireContext().getString(R.string.fcmtokenrem));
AndroidUtils.getGlobalContext().getSharedPreferences("gcm", 0).edit().clear().apply(); AndroidUtils.getGlobalContext().getSharedPreferences("gcm", 0).edit().clear().apply();
OtherFragment.this.getListView().postDelayed(() -> { OtherFragment.this.getListView().postDelayed(() -> {
PushSubscriber.e.a(true); PushSubscriber.e.a(true);
ToastUtils.a(AndroidUtils.getString("fcmtokenget")); ToastUtils.a(requireContext().getString(R.string.fcmtokenget));
ToastUtils.a(AndroidUtils.getString("fcmtokenfixed")); ToastUtils.a(requireContext().getString(R.string.fcmtokenfixed));
}, 1000); }, 1000);
return true; return true;
} }
@@ -359,14 +359,14 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
var arr = BackupManager.getBackupsNames(); var arr = BackupManager.getBackupsNames();
var adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, arr); var adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, arr);
new VkAlertDialog.Builder(getContext()) new VkAlertDialog.Builder(getContext())
.setTitle(AndroidUtils.getString("select_backup")) .setTitle(requireContext().getString(R.string.select_backup))
.setAdapter(adapter, (dialog, which) -> { .setAdapter(adapter, (dialog, which) -> {
try { try {
restoreBackup(arr[which]); restoreBackup(arr[which]);
Toast.makeText(getContext(), AndroidUtils.getString("backup_success"), LENGTH_LONG).show(); Toast.makeText(getContext(), requireContext().getString(R.string.backup_success), LENGTH_LONG).show();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(getContext(), AndroidUtils.getString("backup_error"), LENGTH_LONG).show(); Toast.makeText(getContext(), requireContext().getString(R.string.backup_error), LENGTH_LONG).show();
} }
}) })
.show(); .show();
@@ -376,6 +376,6 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlother", "string"); return R.string.vtlother;
} }
} }
@@ -1,27 +1,25 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.proxy.RandomProxy.setupNewProxy; import static ru.vtosters.lite.proxy.RandomProxy.setupNewProxy;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.os.Bundle; import android.os.Bundle;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import java.io.IOException; import java.io.IOException;
import ru.vtosters.lite.utils.AndroidUtils;
public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment { public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_proxy", "xml")); addPreferencesFromResource(R.xml.preferences_proxy);
findPreference("random_proxy").setOnPreferenceClickListener(preference -> { findPreference("random_proxy").setOnPreferenceClickListener(preference -> {
try { try {
setupNewProxy(); setupNewProxy();
} catch (IOException e) { } catch (IOException e) {
sendToast(AndroidUtils.getString("get_proxy_error")); sendToast(requireContext().getString(R.string.get_proxy_error));
} }
return true; return true;
}); });
@@ -29,6 +27,6 @@ public class ProxySettingsFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlproxy", "string"); return R.string.vtlproxy;
} }
} }
@@ -1,7 +1,6 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplication;
import android.os.Build; import android.os.Build;
@@ -21,10 +20,11 @@ import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vtosters.lite.R;
import ru.vtosters.lite.ui.adapters.CategorizedAdapter; import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
import ru.vtosters.lite.ui.components.ItemMovingCallback; import ru.vtosters.lite.ui.components.ItemMovingCallback;
import ru.vtosters.lite.ui.components.SuperAppEditorManager; import ru.vtosters.lite.ui.components.SuperAppEditorManager;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LayoutUtils; import ru.vtosters.lite.utils.LayoutUtils;
import ru.vtosters.lite.utils.ThemesUtils; import ru.vtosters.lite.utils.ThemesUtils;
@@ -33,7 +33,7 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
@CallSuper @CallSuper
@Override @Override
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) { public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
setTitle(getIdentifier("superapp_editor", "string")); setTitle(R.string.superapp_editor);
FrameLayout content = new FrameLayout(getContext()); FrameLayout content = new FrameLayout(getContext());
@@ -42,7 +42,7 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
content.addView(container, new FrameLayout.LayoutParams(-1, -1)); content.addView(container, new FrameLayout.LayoutParams(-1, -1));
TextView message = new TextView(getContext()); TextView message = new TextView(getContext());
message.setText(AndroidUtils.getString("superapp_editor_message")); message.setText(R.string.superapp_editor_message);
message.setTextSize(16.0f); message.setTextSize(16.0f);
message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
message.setTextColor(ThemesUtils.getTextAttr()); message.setTextColor(ThemesUtils.getTextAttr());
@@ -64,7 +64,7 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2)); container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
TextView save = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary)); TextView save = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary));
save.setText(AndroidUtils.getString("save")); save.setText(R.string.save);
save.setOnClickListener(v -> { save.setOnClickListener(v -> {
SuperAppEditorManager.getInstance().save(); SuperAppEditorManager.getInstance().save();
restartApplication(); restartApplication();
@@ -78,7 +78,7 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(dp2px(10), 0)); buttonsContainer.addView(divider, new LinearLayout.LayoutParams(dp2px(10), 0));
TextView reset = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary)); TextView reset = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary));
reset.setText(AndroidUtils.getString("reset")); reset.setText(R.string.reset);
reset.setOnClickListener(v -> { reset.setOnClickListener(v -> {
SuperAppEditorManager.getInstance().reset(); SuperAppEditorManager.getInstance().reset();
restartApplication(); restartApplication();
@@ -1,16 +1,15 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.deviceinfo.OEMDetector.detectMiuiV2;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getEmuiVersionCode; import static ru.vtosters.lite.deviceinfo.OEMDetector.getEmuiVersionCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionCode; import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionIncrementalCode; import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionIncrementalCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionName; import static ru.vtosters.lite.deviceinfo.OEMDetector.getMiuiUiVersionName;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getOneUiMajorVersion; import static ru.vtosters.lite.deviceinfo.OEMDetector.getOneUiMajorVersion;
import static ru.vtosters.lite.deviceinfo.OEMDetector.getOneUiMinorVersion; import static ru.vtosters.lite.deviceinfo.OEMDetector.getOneUiMinorVersion;
import static ru.vtosters.lite.deviceinfo.OEMDetector.hasMiuiIncrCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isEMUI; import static ru.vtosters.lite.deviceinfo.OEMDetector.isEMUI;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isFlyme; import static ru.vtosters.lite.deviceinfo.OEMDetector.isFlyme;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isMIUI; import static ru.vtosters.lite.deviceinfo.OEMDetector.isMIUI;
import static ru.vtosters.lite.deviceinfo.OEMDetector.hasMiuiIncrCode;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isOneUi; import static ru.vtosters.lite.deviceinfo.OEMDetector.isOneUi;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isSamsung; import static ru.vtosters.lite.deviceinfo.OEMDetector.isSamsung;
import static ru.vtosters.lite.deviceinfo.OEMDetector.isVivo; import static ru.vtosters.lite.deviceinfo.OEMDetector.isVivo;
@@ -18,7 +17,6 @@ import static ru.vtosters.lite.deviceinfo.OEMDetector.isZenUI;
import static ru.vtosters.lite.ui.PreferencesUtil.addPreference; import static ru.vtosters.lite.ui.PreferencesUtil.addPreference;
import static ru.vtosters.lite.ui.PreferencesUtil.addPreferenceCategory; import static ru.vtosters.lite.ui.PreferencesUtil.addPreferenceCategory;
import static ru.vtosters.lite.utils.About.getBuildNumber; import static ru.vtosters.lite.utils.About.getBuildNumber;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.isTablet; import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.isValidSignature; import static ru.vtosters.lite.utils.Preferences.isValidSignature;
@@ -29,16 +27,15 @@ import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class SystemInfo extends MaterialPreferenceToolbarFragment { public class SystemInfo extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("empty", "xml")); addPreferencesFromResource(R.xml.empty);
var oneUiMajorVersion = String.valueOf(getOneUiMajorVersion()); var oneUiMajorVersion = String.valueOf(getOneUiMajorVersion());
var oneUiMinorVersion = String.valueOf(getOneUiMinorVersion()); var oneUiMinorVersion = String.valueOf(getOneUiMinorVersion());
@@ -70,124 +67,124 @@ public class SystemInfo extends MaterialPreferenceToolbarFragment {
addPreferenceCategory(this, "App information"); addPreferenceCategory(this, "App information");
addPreference(this, "", "Package name", packageName, null, preference -> { addPreference(this, "", "Package name", packageName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", packageName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", packageName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Commit", commit, null, preference -> { addPreference(this, "", "Commit", commit, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", commit)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", commit));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Valid Signature", "Value: " + isValidSignature, null, null); addPreference(this, "", "Valid Signature", "Value: " + isValidSignature, 0, null);
addPreference(this, "", "isTablet", "Value: " + isTablet, null, null); addPreference(this, "", "isTablet", "Value: " + isTablet, 0, null);
addPreferenceCategory(this, "System information"); addPreferenceCategory(this, "System information");
addPreference(this, "", "SDK Version", sdkVersion, null, preference -> { addPreference(this, "", "SDK Version", sdkVersion, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", sdkVersion)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", sdkVersion));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Product Name", productName, null, preference -> { addPreference(this, "", "Product Name", productName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", productName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", productName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Device Name", deviceName, null, preference -> { addPreference(this, "", "Device Name", deviceName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", deviceName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", deviceName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Board Name", boardName, null, preference -> { addPreference(this, "", "Board Name", boardName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", boardName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", boardName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Manufacturer Name", manufacturerName, null, preference -> { addPreference(this, "", "Manufacturer Name", manufacturerName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", manufacturerName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", manufacturerName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Brand Name", brandName, null, preference -> { addPreference(this, "", "Brand Name", brandName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", brandName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", brandName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "Model Name", modelName, null, preference -> { addPreference(this, "", "Model Name", modelName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", modelName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", modelName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreferenceCategory(this, "OEM Information"); addPreferenceCategory(this, "OEM Information");
if (isOneUi){ if (isOneUi){
addPreference(this, "", "OneUiMajorVersion", oneUiMajorVersion, null, preference -> { addPreference(this, "", "OneUiMajorVersion", oneUiMajorVersion, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", oneUiMajorVersion)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", oneUiMajorVersion));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "OneUiMinorVersion", oneUiMinorVersion, null, preference -> { addPreference(this, "", "OneUiMinorVersion", oneUiMinorVersion, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", oneUiMinorVersion)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", oneUiMinorVersion));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
} else if (isMiui) { } else if (isMiui) {
addPreference(this, "", "miuiUiVersionName", miuiUiVersionName, null, preference -> { addPreference(this, "", "miuiUiVersionName", miuiUiVersionName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", miuiUiVersionName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", miuiUiVersionName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
addPreference(this, "", "miuiUiVersionCodeName", miuiUiVersionCodeName, null, preference -> { addPreference(this, "", "miuiUiVersionCodeName", miuiUiVersionCodeName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", miuiUiVersionCodeName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", miuiUiVersionCodeName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
if (hasMiuiIncrCode) { if (hasMiuiIncrCode) {
addPreference(this, "", "miuiIncrementalCodeName", miuiIncrementalCodeName, null, preference -> { addPreference(this, "", "miuiIncrementalCodeName", miuiIncrementalCodeName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", miuiIncrementalCodeName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", miuiIncrementalCodeName));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
} }
} else if (isEMUI){ } else if (isEMUI){
addPreference(this, "", "emuiVersionCode", emuiVersionCode, null, preference -> { addPreference(this, "", "emuiVersionCode", emuiVersionCode, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", emuiVersionCode)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", emuiVersionCode));
sendToast(AndroidUtils.getString("copied_to_clipboard")); sendToast(requireContext().getString(R.string.copied_to_clipboard));
return false; return false;
}); });
} else { } else {
addPreference(this, "", "No info", "No information about OEM", null, null); addPreference(this, "", "No info", "No information about OEM", 0, null);
} }
addPreferenceCategory(this, "OEM List"); addPreferenceCategory(this, "OEM List");
addPreference(this, "", "isOneUi", "Value: " + isOneUi, null, null); addPreference(this, "", "isOneUi", "Value: " + isOneUi, 0, null);
addPreference(this, "", "isMiui", "Value: " + isMiui, null, null); addPreference(this, "", "isMiui", "Value: " + isMiui, 0, null);
addPreference(this, "", "isEMUI", "Value: " + isEMUI, null, null); addPreference(this, "", "isEMUI", "Value: " + isEMUI, 0, null);
addPreference(this, "", "isFlyme", "Value: " + isFlyme, null, null); addPreference(this, "", "isFlyme", "Value: " + isFlyme, 0, null);
addPreference(this, "", "isSamsung", "Value: " + isSamsung, null, null); addPreference(this, "", "isSamsung", "Value: " + isSamsung, 0, null);
addPreference(this, "", "isVivo", "Value: " + isVivo, null, null); addPreference(this, "", "isVivo", "Value: " + isVivo, 0, null);
addPreference(this, "", "isZenUI", "Value: " + isZenUI, null, null); addPreference(this, "", "isZenUI", "Value: " + isZenUI, 0, null);
} }
} }
@@ -1,9 +1,9 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.isTablet; import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer;
import static ru.vtosters.lite.utils.Preferences.milkshake;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -12,6 +12,7 @@ import android.os.Bundle;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
@@ -20,7 +21,7 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
addPreferencesFromResource(getIdentifier("preferences_themes", "xml")); addPreferencesFromResource(R.xml.preferences_themes);
prefs(); prefs();
} }
@@ -33,6 +34,8 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment {
findPreference("dockbar_tab_titles").setOnPreferenceClickListener(new restart()); findPreference("dockbar_tab_titles").setOnPreferenceClickListener(new restart());
findPreference("dockbar_accent").setOnPreferenceClickListener(new restart()); findPreference("dockbar_accent").setOnPreferenceClickListener(new restart());
findPreference("dockcounter").setOnPreferenceClickListener(new restart()); findPreference("dockcounter").setOnPreferenceClickListener(new restart());
findPreference("newsfeed_notif").setOnPreferenceClickListener(new restart());
findPreference("newsfeed_notif").setVisible(milkshake());
if (isTablet()) { if (isTablet()) {
findPreference("dockbarsett").setVisible(false); findPreference("dockbarsett").setVisible(false);
@@ -78,6 +81,6 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtlthemes", "string"); return R.string.vtlthemes;
} }
} }
@@ -1,6 +1,5 @@
package ru.vtosters.lite.ui.fragments; package ru.vtosters.lite.ui.fragments;
import static com.vtosters.lite.NotificationUtils.Type.Default;
import static ru.vtosters.lite.ui.PreferencesUtil.addListPreferenceIcon; import static ru.vtosters.lite.ui.PreferencesUtil.addListPreferenceIcon;
import static ru.vtosters.lite.ui.PreferencesUtil.addMaterialSwitchPreference; import static ru.vtosters.lite.ui.PreferencesUtil.addMaterialSwitchPreference;
import static ru.vtosters.lite.ui.PreferencesUtil.addPreference; import static ru.vtosters.lite.ui.PreferencesUtil.addPreference;
@@ -12,7 +11,6 @@ import static ru.vtosters.lite.utils.AccountManagerUtils.getUserPhoto;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUsername; import static ru.vtosters.lite.utils.AccountManagerUtils.getUsername;
import static ru.vtosters.lite.utils.AccountManagerUtils.isVKTester; import static ru.vtosters.lite.utils.AccountManagerUtils.isVKTester;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue;
import static ru.vtosters.lite.utils.AndroidUtils.isTablet; import static ru.vtosters.lite.utils.AndroidUtils.isTablet;
import static ru.vtosters.lite.utils.CacheUtils.humanReadableByteCountBin; import static ru.vtosters.lite.utils.CacheUtils.humanReadableByteCountBin;
@@ -44,6 +42,8 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.StringRes;
import com.aefyr.tsg.g2.TelegramStickersService; import com.aefyr.tsg.g2.TelegramStickersService;
import com.vk.about.AboutAppFragment; import com.vk.about.AboutAppFragment;
import com.vk.balance.BalanceFragment; import com.vk.balance.BalanceFragment;
@@ -51,6 +51,7 @@ import com.vk.navigation.Navigator;
import com.vk.notifications.settings.NotificationsSettingsFragment; import com.vk.notifications.settings.NotificationsSettingsFragment;
import com.vk.webapp.fragments.PrivacyFragment; import com.vk.webapp.fragments.PrivacyFragment;
import com.vtosters.lite.MainActivity; import com.vtosters.lite.MainActivity;
import com.vtosters.lite.R;
import com.vtosters.lite.auth.VKAccountManager; import com.vtosters.lite.auth.VKAccountManager;
import com.vtosters.lite.auth.VKAuth; import com.vtosters.lite.auth.VKAuth;
import com.vtosters.lite.fragments.money.music.control.subscription.MusicSubscriptionControlFragment; import com.vtosters.lite.fragments.money.music.control.subscription.MusicSubscriptionControlFragment;
@@ -72,35 +73,35 @@ import ru.vtosters.lite.utils.SSFSUtils;
import ru.vtosters.lite.utils.ThemesUtils; import ru.vtosters.lite.utils.ThemesUtils;
public class VTSettings extends MaterialPreferenceToolbarFragment { public class VTSettings extends MaterialPreferenceToolbarFragment {
public static String getValAsString(String stringid, Boolean value) { public static String getValAsString(@StringRes int strRes, Boolean value) {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
if (value) { if (value) {
return AndroidUtils.getString(stringid) + ": " + AndroidUtils.getString("vtlsettenabled"); return AndroidUtils.getString(strRes) + ": " + AndroidUtils.getString(R.string.vtlsettenabled);
} }
return AndroidUtils.getString(stringid) + ": " + AndroidUtils.getString("vtlsettdisabled"); return AndroidUtils.getString(strRes) + ": " + AndroidUtils.getString(R.string.vtlsettdisabled);
} }
public static String getSSFSsumm() { public static String getSSFSsumm() {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
if (hasSpecialVerif()) if (hasSpecialVerif())
return AndroidUtils.getString("vtlssfssumm") + ": " + AndroidUtils.getString("vtlsettverifyes"); return AndroidUtils.getString(R.string.vtlssfssumm) + ": " + AndroidUtils.getString(R.string.vtlsettverifyes);
return AndroidUtils.getString("vtlssfssumm") + ": " + AndroidUtils.getString("vtlsettverifno"); return AndroidUtils.getString(R.string.vtlssfssumm) + ": " + AndroidUtils.getString(R.string.vtlsettverifno);
} }
public static String getDocksumm() { public static String getDocksumm() {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
return AndroidUtils.getString("vtldocksumm") + ": " + DockBarEditorManager.getInstance().getSelectedTabs().size(); return AndroidUtils.getString(R.string.vtldocksumm) + ": " + DockBarEditorManager.getInstance().getSelectedTabs().size();
} }
public static String getTGSsumm() { public static String getTGSsumm() {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
return AndroidUtils.getString("vtltgssumm") + ": " + TelegramStickersService.getInstance(AndroidUtils.getGlobalContext()).getPacksListReference().size(); return AndroidUtils.getString(R.string.vtltgssumm) + ": " + TelegramStickersService.getInstance(AndroidUtils.getGlobalContext()).getPacksListReference().size();
} }
public static String getProxysumm() { public static String getProxysumm() {
@@ -109,9 +110,9 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
if (type.equals("noproxy") || type.isEmpty()) if (type.equals("noproxy") || type.isEmpty())
type = AndroidUtils.getString("vtlsettdisabled"); type = AndroidUtils.getString(R.string.vtlsettdisabled);
return AndroidUtils.getString("vtlproxysumm") + ": " + type; return AndroidUtils.getString(R.string.vtlproxysumm) + ": " + type;
} }
public static String getThemesumm() { public static String getThemesumm() {
@@ -142,13 +143,13 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
public static String getSuperappsumm() { public static String getSuperappsumm() {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
return AndroidUtils.getString("elements_hidden_count") + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size(); return AndroidUtils.getString(R.string.elements_hidden_count) + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size();
} }
public static String getCachesumm() { public static String getCachesumm() {
if (disableSettingsSumms()) return null; if (disableSettingsSumms()) return null;
return AndroidUtils.getString("autoclearcachesumm") + " " + humanReadableByteCountBin(CacheUtils.getInstance().size); return AndroidUtils.getString(R.string.autoclearcachesumm) + " " + humanReadableByteCountBin(CacheUtils.getInstance().size);
} }
private void switchTheme(boolean isDarkTheme) { private void switchTheme(boolean isDarkTheme) {
@@ -160,24 +161,23 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
var feedsumm = getValAsString("vtlfeedsumm", ads()); var feedsumm = getValAsString(R.string.vtlfeedsumm, ads());
var docksumm = getDocksumm(); var docksumm = getDocksumm();
var msgsumm = isTablet() ? getValAsString("autotranslate_title", autotranslate()) : getValAsString("vtlmsgsumm", vkme()); var msgsumm = isTablet() ? getValAsString(R.string.autotranslate_title, autotranslate()) : getValAsString(R.string.vtlmsgsumm, vkme());
var activitysumm = getValAsString("vtlactivitysumm", offline()); var activitysumm = getValAsString(R.string.vtlactivitysumm, offline());
var themessumm = getValAsString("vtlthemessumm", navbar()); var themessumm = getValAsString(R.string.vtlthemessumm, navbar());
var tgssumm = getTGSsumm(); var tgssumm = getTGSsumm();
var superapp = getSuperappsumm(); var superapp = getSuperappsumm();
var mediasumm = getValAsString("vtlinterfacesumm", shortinfo()); var mediasumm = getValAsString(R.string.vtlinterfacesumm, shortinfo());
var interfacesumm = getValAsString("showstories", stories()); var interfacesumm = getValAsString(R.string.showstories, stories());
var proxysumm = getProxysumm(); var proxysumm = getProxysumm();
var othersumm = getValAsString("vtlothersumm", vtverif()); var othersumm = getValAsString(R.string.vtlothersumm, vtverif());
var ssfs = getSSFSsumm(); var ssfs = getSSFSsumm();
var about = "Commit: " + getBuildNumber(); var about = "Commit: " + getBuildNumber();
int vtosterXml = getIdentifier("empty", "xml"); this.addPreferencesFromResource(R.xml.empty);
this.addPreferencesFromResource(vtosterXml);
addPreferenceDrawable(this, "", getUsername(), AndroidUtils.getString("vtllogout"), getDrawableFromUrl(getUserPhoto(), "ic_user_circle_outline_28", true, true), preference -> { addPreferenceDrawable(this, "", getUsername(), requireContext().getString(R.string.vtllogout), getDrawableFromUrl(getUserPhoto(), R.drawable.ic_user_circle_outline_28, true, true), preference -> {
try { try {
VKAuth.a("logout", false); VKAuth.a("logout", false);
} catch (Exception ignored) { } catch (Exception ignored) {
@@ -192,7 +192,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtssfs"), ssfs, "ic_link_circle_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtssfs), ssfs, R.drawable.ic_link_circle_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
VKUIwrapper.setLink(SSFSUtils.getSSFSLink()); VKUIwrapper.setLink(SSFSUtils.getSSFSLink());
Intent a2 = new Navigator(VKUIwrapper.class).b(context); Intent a2 = new Navigator(VKUIwrapper.class).b(context);
@@ -201,15 +201,15 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreferenceCategory(this, AndroidUtils.getString("appearance_theme_use_system")); addPreferenceCategory(this, requireContext().getString(R.string.appearance_theme_use_system));
if (Build.VERSION.SDK_INT >= 28) { if (Build.VERSION.SDK_INT >= 28 && milkshake()) {
addListPreferenceIcon( addListPreferenceIcon(
this, this,
"currsystemtheme", "currsystemtheme",
"system", "system",
AndroidUtils.getString("appearance_theme_use_system"), requireContext().getString(R.string.appearance_theme_use_system),
"ic_palette_outline_28", getThemesumm(), R.drawable.ic_palette_outline_28, getThemesumm(),
new String[] { "Системная тема", "Тёмная тема", "Светлая тема" }, new String[] { "Системная тема", "Тёмная тема", "Светлая тема" },
new String[] { "system", "dark", "light" }, new String[] { "system", "dark", "light" },
(preference, o) -> { (preference, o) -> {
@@ -223,7 +223,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
} else { } else {
addMaterialSwitchPreference(this, "", AndroidUtils.getString("vtsettdarktheme"), "", "ic_palette_outline_28", isDarkTheme(), (preference, o) -> { addMaterialSwitchPreference(this, "", requireContext().getString(R.string.vtsettdarktheme), "", R.drawable.ic_palette_outline_28, isDarkTheme(), (preference, o) -> {
final var switchPreference = (MaterialSwitchPreference) preference; final var switchPreference = (MaterialSwitchPreference) preference;
final var isDarkTheme = !switchPreference.isChecked(); final var isDarkTheme = !switchPreference.isChecked();
switchTheme(isDarkTheme); switchTheme(isDarkTheme);
@@ -232,9 +232,9 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
} }
if (!isGmsInstalled()) { if (!isGmsInstalled()) {
addPreferenceCategory(this, AndroidUtils.getString("gmsname")); addPreferenceCategory(this, requireContext().getString(R.string.gmsname));
addPreference(this, "", AndroidUtils.getString("installgms"), "", "ic_about_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.installgms), "", R.drawable.ic_about_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(InstallGMSFragment.class).b(context); Intent a2 = new Navigator(InstallGMSFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -244,9 +244,9 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
} }
if (devmenu()) { if (devmenu()) {
addPreferenceCategory(this, AndroidUtils.getString("sett_debug")); addPreferenceCategory(this, requireContext().getString(R.string.sett_debug));
addPreference(this, "", AndroidUtils.getString("sett_debug"), "", "ic_bug_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.sett_debug), "", R.drawable.ic_bug_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(SettingsDebugFragment.class).b(context); Intent a2 = new Navigator(SettingsDebugFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -254,16 +254,16 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addMaterialSwitchPreference(this, "ssl", AndroidUtils.getString("debug_developer_force_ssl"), AndroidUtils.getString("debug_developer_force_ssl_summary"), "ic_globe_outline_28", true, (preference, o) -> { addMaterialSwitchPreference(this, "ssl", requireContext().getString(R.string.debug_developer_force_ssl), requireContext().getString(R.string.debug_developer_force_ssl_summary), R.drawable.ic_globe_outline_28, true, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("ssl", value).commit(); edit().putBoolean("ssl", value).commit();
return true; return true;
}); });
} }
addPreferenceCategory(this, AndroidUtils.getString("vtsettaccount")); addPreferenceCategory(this, requireContext().getString(R.string.vtsettaccount));
addPreference(this, "", AndroidUtils.getString("vkconnect"), "", "ic_user_circle_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vkconnect), "", R.drawable.ic_user_circle_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
VKUIwrapper.officalLinks("account"); VKUIwrapper.officalLinks("account");
Intent a2 = new Navigator(VKUIwrapper.class).b(context); Intent a2 = new Navigator(VKUIwrapper.class).b(context);
@@ -272,7 +272,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("privacy_settings"), "", "ic_privacy_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.privacy_settings), "", R.drawable.ic_privacy_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(PrivacyFragment.class).b(context); Intent a2 = new Navigator(PrivacyFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -280,7 +280,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("sett_account"), "", "ic_user_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.sett_account), "", R.drawable.ic_user_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(SettingsAccountFragment.class).b(context); Intent a2 = new Navigator(SettingsAccountFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -289,7 +289,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
if (isVKTester()) { if (isVKTester()) {
addPreference(this, "", AndroidUtils.getString("bugs"), "", "ic_bug_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.bugs), "", R.drawable.ic_bug_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
VKUIwrapper.officalLinks("bugs"); VKUIwrapper.officalLinks("bugs");
Intent a2 = new Navigator(VKUIwrapper.class).b(context); Intent a2 = new Navigator(VKUIwrapper.class).b(context);
@@ -299,9 +299,9 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
} }
addPreferenceCategory(this, AndroidUtils.getString("vtlvksettings")); addPreferenceCategory(this, requireContext().getString(R.string.vtlvksettings));
addPreference(this, "", AndroidUtils.getString("sett_general"), "", "ic_settings_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.sett_general), "", R.drawable.ic_settings_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(SettingsGeneralFragment.class).b(context); Intent a2 = new Navigator(SettingsGeneralFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -309,7 +309,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("blacklist"), "", "ic_users_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.blacklist), "", R.drawable.ic_users_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(BlacklistFragment.class).b(context); Intent a2 = new Navigator(BlacklistFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -317,7 +317,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("sett_notifications"), "", "ic_menu_notification_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.sett_notifications), "", R.drawable.ic_menu_notification_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(NotificationsSettingsFragment.class).b(context); Intent a2 = new Navigator(NotificationsSettingsFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -326,7 +326,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
if (VKAccountManager.d().isMusicSubs()) { if (VKAccountManager.d().isMusicSubs()) {
addPreference(this, "", AndroidUtils.getString("subscription_music"), "", "ic_music_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.subscription_music), "", R.drawable.ic_music_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(MusicSubscriptionControlFragment.class).b(context); Intent a2 = new Navigator(MusicSubscriptionControlFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -335,7 +335,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
} }
addPreference(this, "", AndroidUtils.getString("votes"), "", "ic_coins_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.votes), "", R.drawable.ic_coins_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(BalanceFragment.class).b(context); Intent a2 = new Navigator(BalanceFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -343,12 +343,12 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreferenceCategory(this, AndroidUtils.getString("vtsettmod")); addPreferenceCategory(this, requireContext().getString(R.string.vtsettmod));
if (vkme()) { if (vkme()) {
addPreference(this, "", AndroidUtils.getString("warning"), AndroidUtils.getString("vkme_mode_info"), "ic_about_outline_28", preference -> false); addPreference(this, "", requireContext().getString(R.string.warning), requireContext().getString(R.string.vkme_mode_info), R.drawable.ic_about_outline_28, preference -> false);
} else { } else {
addPreference(this, "", AndroidUtils.getString("vtlfeed"), feedsumm, "ic_newsfeed_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlfeed), feedsumm, R.drawable.ic_newsfeed_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(FeedFragment.class).b(context); Intent a2 = new Navigator(FeedFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -357,7 +357,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
} }
addPreference(this, "", AndroidUtils.getString("vtlmedia"), mediasumm, "ic_media_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlmedia), mediasumm, R.drawable.ic_media_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(MediaFragment.class).b(context); Intent a2 = new Navigator(MediaFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -365,7 +365,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtlmessages"), msgsumm, "ic_message_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlmessages), msgsumm, R.drawable.ic_message_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(MessagesFragment.class).b(context); Intent a2 = new Navigator(MessagesFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -373,7 +373,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtltgs"), tgssumm, "ic_telegram_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtltgs), tgssumm, R.drawable.ic_telegram_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(StickersFragment.class).b(context); Intent a2 = new Navigator(StickersFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -381,7 +381,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtlthemes"), themessumm, "ic_write_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlthemes), themessumm, R.drawable.ic_write_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(ThemesFragment.class).b(context); Intent a2 = new Navigator(ThemesFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -389,7 +389,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtlinterface"), interfacesumm, "ic_interface_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlinterface), interfacesumm, R.drawable.ic_interface_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(InterfaceFragment.class).b(context); Intent a2 = new Navigator(InterfaceFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -399,7 +399,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
if(!vkme()){ if(!vkme()){
if (!isTablet()) { if (!isTablet()) {
addPreference(this, "", AndroidUtils.getString("dockbar_editor"), docksumm, "ic_list_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.dockbar_editor), docksumm, R.drawable.ic_list_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent intent = new Navigator(DockBarEditorFragment.class).b(context); Intent intent = new Navigator(DockBarEditorFragment.class).b(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -408,7 +408,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
}); });
if (milkshake() && superapp()) { if (milkshake() && superapp()) {
addPreference(this, "", AndroidUtils.getString("superapp_editor"), superapp, "ic_services_outline_28", (preference) -> { addPreference(this, "", requireContext().getString(R.string.superapp_editor), superapp, R.drawable.ic_services_outline_28, (preference) -> {
Context context = requireContext(); Context context = requireContext();
Intent intent = new Navigator(SuperAppEditorFragment.class).b(context); Intent intent = new Navigator(SuperAppEditorFragment.class).b(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -419,7 +419,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
} }
} }
addPreference(this, "", AndroidUtils.getString("vtlactivity"), activitysumm, "ic_write_outline_28_new_accent", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlactivity), activitysumm, R.drawable.ic_write_outline_28_new_accent, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(ActivityFragment.class).b(context); Intent a2 = new Navigator(ActivityFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -427,7 +427,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtlproxy"), proxysumm, "ic_globe_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlproxy), proxysumm, R.drawable.ic_globe_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(ProxySettingsFragment.class).b(context); Intent a2 = new Navigator(ProxySettingsFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -435,7 +435,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtlother"), othersumm, "ic_more_horizontal_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtlother), othersumm, R.drawable.ic_more_horizontal_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(OtherFragment.class).b(context); Intent a2 = new Navigator(OtherFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -443,9 +443,9 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreferenceCategory(this, AndroidUtils.getString("vtsettaboutmod")); addPreferenceCategory(this, requireContext().getString(R.string.vtsettaboutmod));
addPreference(this, "", AndroidUtils.getString("menu_about"), about, "ic_about_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.menu_about), about, R.drawable.ic_about_outline_28, preference -> {
Context context = requireContext(); Context context = requireContext();
Intent a2 = new Navigator(AboutAppFragment.class).b(context); Intent a2 = new Navigator(AboutAppFragment.class).b(context);
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -453,25 +453,25 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("opencommit"), "", "ic_link_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.opencommit), "", R.drawable.ic_link_outline_28, preference -> {
requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse(getCommitLink()))); requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse(getCommitLink())));
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("vtfaq"), AndroidUtils.getString("vtfaqsumm"), "ic_help_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.vtfaq), requireContext().getString(R.string.vtfaqsumm), R.drawable.ic_help_outline_28, preference -> {
requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/s/vtosters_faq"))); requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://t.me/s/vtosters_faq")));
return false; return false;
}); });
addPreference(this, "", AndroidUtils.getString("reportbug"), AndroidUtils.getString("reportbugsumm"), "ic_bug_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.reportbug), requireContext().getString(R.string.reportbugsumm), R.drawable.ic_bug_outline_28, preference -> {
requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://github.com/vtosters/lite/issues"))); requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://github.com/vtosters/lite/issues")));
return false; return false;
}); });
if (isValidSignature()) { if (isValidSignature()) {
addPreferenceCategory(this, AndroidUtils.getString("updates")); addPreferenceCategory(this, requireContext().getString(R.string.updates));
addPreference(this, "", AndroidUtils.getString("checkforupdates"), "", "ic_download_outline_28", preference -> { addPreference(this, "", requireContext().getString(R.string.checkforupdates), "", R.drawable.ic_download_outline_28, preference -> {
OTADialog.checkUpdates(getActivity()); OTADialog.checkUpdates(getActivity());
return false; return false;
}); });
@@ -485,6 +485,6 @@ public class VTSettings extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("notification_settings", "string"); return R.string.notification_settings;
} }
} }
@@ -4,7 +4,6 @@ import static android.widget.Toast.LENGTH_SHORT;
import static android.widget.Toast.makeText; import static android.widget.Toast.makeText;
import static ru.vtosters.lite.tgs.TGPref.setTGBotKey; import static ru.vtosters.lite.tgs.TGPref.setTGBotKey;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor; import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor;
import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr;
@@ -38,6 +37,7 @@ import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.navigation.Navigator; import com.vk.navigation.Navigator;
import com.vtosters.lite.R;
import java.io.File; import java.io.File;
@@ -45,7 +45,6 @@ import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.ui.adapters.StickerPackAdapter; import ru.vtosters.lite.ui.adapters.StickerPackAdapter;
import ru.vtosters.lite.ui.components.StickerTouchHelperCallback; import ru.vtosters.lite.ui.components.StickerTouchHelperCallback;
import ru.vtosters.lite.ui.fragments.BaseToolbarFragment; import ru.vtosters.lite.ui.fragments.BaseToolbarFragment;
import ru.vtosters.lite.utils.AndroidUtils;
public class StickersFragment extends BaseToolbarFragment { public class StickersFragment extends BaseToolbarFragment {
public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST"; public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST";
@@ -84,7 +83,7 @@ public class StickersFragment extends BaseToolbarFragment {
protected void onCreateMenu(Menu menu) { protected void onCreateMenu(Menu menu) {
var item = menu.add(0, 0, 0, ""); var item = menu.add(0, 0, 0, "");
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
item.setIcon(getIdentifier("ic_settings_24", "drawable")); item.setIcon(R.drawable.ic_settings_24);
super.onCreateMenu(menu); super.onCreateMenu(menu);
} }
@@ -115,7 +114,7 @@ public class StickersFragment extends BaseToolbarFragment {
@Override @Override
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) { public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
setTitle(getIdentifier("vtltgs", "string")); setTitle(R.string.vtltgs);
FrameLayout layout = new FrameLayout(getContext()); FrameLayout layout = new FrameLayout(getContext());
@@ -131,7 +130,7 @@ public class StickersFragment extends BaseToolbarFragment {
layout.addView(mRecycler, new ViewGroup.LayoutParams(-1, -1)); layout.addView(mRecycler, new ViewGroup.LayoutParams(-1, -1));
FloatingActionButton mAddStickerPack = new FloatingActionButton(getContext()); FloatingActionButton mAddStickerPack = new FloatingActionButton(getContext());
mAddStickerPack.setImageResource(getIdentifier("ic_add_24", "drawable")); mAddStickerPack.setImageResource(R.drawable.ic_add_24);
mAddStickerPack.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); mAddStickerPack.setBackgroundTintList(ColorStateList.valueOf(getAccentColor()));
mAddStickerPack.setOnClickListener(v2 -> fabClick()); mAddStickerPack.setOnClickListener(v2 -> fabClick());
@@ -158,14 +157,14 @@ public class StickersFragment extends BaseToolbarFragment {
private void fabClick() { private void fabClick() {
int method = TGPref.getTGConnectMethod(); int method = TGPref.getTGConnectMethod();
if (method == -1) { if (method == -1) {
openMenu(AndroidUtils.getString("stickersconnection")); openMenu(requireContext().getString(R.string.stickersconnection));
return; return;
} }
initGrabber(); initGrabber();
if (method == TYPE_SOCKS) { if (method == TYPE_SOCKS) {
if (TGPref.getTGProxyIP() == null) { if (TGPref.getTGProxyIP() == null) {
openMenu(AndroidUtils.getString("stickersproxy1")); openMenu(requireContext().getString(R.string.stickersproxy1));
} }
} else if (method == TYPE_DIRECT) { } else if (method == TYPE_DIRECT) {
final Runnable callback = () -> { final Runnable callback = () -> {
@@ -182,8 +181,8 @@ public class StickersFragment extends BaseToolbarFragment {
editText.setLayoutParams(margin); editText.setLayoutParams(margin);
new VkAlertDialog.Builder(getContext()) new VkAlertDialog.Builder(getContext())
.setTitle(AndroidUtils.getString("stickershelp1")) .setTitle(requireContext().getString(R.string.stickershelp1))
.setMessage(AndroidUtils.getString("stickershelp2")) .setMessage(requireContext().getString(R.string.stickershelp2))
.setView(linearLayout) .setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
String pack = editText.getText().toString(); String pack = editText.getText().toString();
@@ -240,8 +239,8 @@ public class StickersFragment extends BaseToolbarFragment {
editText.setLayoutParams(margin); editText.setLayoutParams(margin);
new VkAlertDialog.Builder(getContext()) new VkAlertDialog.Builder(getContext())
.setTitle(AndroidUtils.getString("stickersapi5")) .setTitle(requireContext().getString(R.string.stickersapi5))
.setMessage(AndroidUtils.getString("stickersapi6")) .setMessage(requireContext().getString(R.string.stickersapi6))
.setView(linearLayout) .setView(linearLayout)
.setPositiveButton(android.R.string.ok, (dialog, which) -> { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
setTGBotKey(editText.getText().toString()); setTGBotKey(editText.getText().toString());
@@ -250,11 +249,11 @@ public class StickersFragment extends BaseToolbarFragment {
.setNegativeButton(android.R.string.cancel, .setNegativeButton(android.R.string.cancel,
(dialog, which) -> dialog.dismiss() (dialog, which) -> dialog.dismiss()
) )
.setNeutralButton(AndroidUtils.getString("stickersapi7"), .setNeutralButton(requireContext().getString(R.string.stickersapi7),
(dialog, which) -> new VkAlertDialog.Builder(getContext()) (dialog, which) -> new VkAlertDialog.Builder(getContext())
.setTitle(AndroidUtils.getString("stickersapi8")) .setTitle(requireContext().getString(R.string.stickersapi8))
.setMessage(AndroidUtils.getString("stickersapi9") + .setMessage(requireContext().getString(R.string.stickersapi9) +
AndroidUtils.getString("stickersapi10")) requireContext().getString(R.string.stickersapi10))
.setPositiveButton(android.R.string.ok, null) .setPositiveButton(android.R.string.ok, null)
.show() .show()
) )
@@ -268,7 +267,7 @@ public class StickersFragment extends BaseToolbarFragment {
final ProgressDialog progressDialog = new ProgressDialog(context); final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage(AndroidUtils.getString("stickersapi1")); progressDialog.setMessage(requireContext().getString(R.string.stickersapi1));
progressDialog.show(); progressDialog.show();
mGrabber.checkKey(new TelegramStickersGrabber.KeyCheckListener() { mGrabber.checkKey(new TelegramStickersGrabber.KeyCheckListener() {
@@ -276,7 +275,7 @@ public class StickersFragment extends BaseToolbarFragment {
public void onKeyChecked(boolean ok) { public void onKeyChecked(boolean ok) {
progressDialog.dismiss(); progressDialog.dismiss();
if (!ok) { if (!ok) {
makeText(context, AndroidUtils.getString("stickersapi2"), LENGTH_SHORT).show(); makeText(context, requireContext().getString(R.string.stickersapi2), LENGTH_SHORT).show();
setTGBotKey(null); setTGBotKey(null);
return; return;
} }
@@ -289,9 +288,9 @@ public class StickersFragment extends BaseToolbarFragment {
public void onNetError() { public void onNetError() {
progressDialog.dismiss(); progressDialog.dismiss();
new VkAlertDialog.Builder(context) new VkAlertDialog.Builder(context)
.setMessage(AndroidUtils.getString("stickersapi3")) .setMessage(requireContext().getString(R.string.stickersapi3))
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(AndroidUtils.getString("stickersapi4"), (arg0, arg1) -> checkApiKey(callback)) .setPositiveButton(requireContext().getString(R.string.stickersapi4), (arg0, arg1) -> checkApiKey(callback))
.show(); .show();
} }
}); });
@@ -1,17 +1,15 @@
package ru.vtosters.lite.ui.fragments.tgstickers; package ru.vtosters.lite.ui.fragments.tgstickers;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import android.os.Bundle; import android.os.Bundle;
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber; import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
import com.vk.core.util.ToastUtils; import com.vk.core.util.ToastUtils;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import ru.vtosters.lite.tgs.TGPref; import ru.vtosters.lite.tgs.TGPref;
import ru.vtosters.lite.tgs.TGRoot; import ru.vtosters.lite.tgs.TGRoot;
import ru.vtosters.lite.ui.PreferencesUtil; import ru.vtosters.lite.ui.PreferencesUtil;
import ru.vtosters.lite.utils.AndroidUtils;
public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragment { public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragment {
@@ -19,19 +17,19 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
int vtosterXml = getIdentifier("empty", "xml"); int vtosterXml = R.xml.empty;
addPreferencesFromResource(vtosterXml); addPreferencesFromResource(vtosterXml);
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("sprefsstickers")); PreferencesUtil.addPreferenceCategory(this, requireContext().getString(R.string.sprefsstickers));
PreferencesUtil.addPreference(this, "", AndroidUtils.getString("sprefsdelkey"), "", null, preference -> { PreferencesUtil.addPreference(this, "", requireContext().getString(R.string.sprefsdelkey), "", 0, preference -> {
TGPref.setTGBotKey(null); TGPref.setTGBotKey(null);
ToastUtils.a(AndroidUtils.getString("sprefsdelkey2")); ToastUtils.a(requireContext().getString(R.string.sprefsdelkey2));
return false; return false;
}); });
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("sprefsnetwork")); PreferencesUtil.addPreferenceCategory(this, requireContext().getString(R.string.sprefsnetwork));
PreferencesUtil.addListPreference(this, "VTGS:CM", "0", AndroidUtils.getString("sprefsctype"), new CharSequence[]{ PreferencesUtil.addListPreference(this, "VTGS:CM", "0", requireContext().getString(R.string.sprefsctype), new CharSequence[]{
AndroidUtils.getString("ctypedirect"), AndroidUtils.getString("ctypesocks") requireContext().getString(R.string.ctypedirect), requireContext().getString(R.string.ctypesocks)
}, new String[]{ }, new String[]{
"0", "2" "0", "2"
}); });
@@ -46,22 +44,22 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
return true; return true;
}); });
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("ssocks")); PreferencesUtil.addPreferenceCategory(this, requireContext().getString(R.string.ssocks));
PreferencesUtil.addEditTextPreference(this, "tg_proxy_host", AndroidUtils.getString("ssockshost"), (preference, o) -> { PreferencesUtil.addEditTextPreference(this, "tg_proxy_host", requireContext().getString(R.string.ssockshost), (preference, o) -> {
TGPref.setTGProxyIP((String) o); TGPref.setTGProxyIP((String) o);
return true; return true;
}); });
PreferencesUtil.addEditTextPreference(this, "tg_proxy_port", AndroidUtils.getString("ssocksport"), (preference, o) -> { PreferencesUtil.addEditTextPreference(this, "tg_proxy_port", requireContext().getString(R.string.ssocksport), (preference, o) -> {
try { try {
TGPref.setTGProxyPort(Integer.parseInt((String) o)); TGPref.setTGProxyPort(Integer.parseInt((String) o));
return true; return true;
} catch (Exception e) { } catch (Exception e) {
ToastUtils.a(AndroidUtils.getString("ssockswport")); ToastUtils.a(requireContext().getString(R.string.ssockswport));
return false; return false;
} }
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "tg_proxy_auth", AndroidUtils.getString("ssocksauth"), "", null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "tg_proxy_auth", requireContext().getString(R.string.ssocksauth), "", 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
findPreference("tg_proxy_login").setEnabled(value); // findPreference("tg_proxy_login").setEnabled(value); findPreference("tg_proxy_login").setEnabled(value); // findPreference("tg_proxy_login").setEnabled(value);
@@ -70,11 +68,11 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
TGPref.setTGProxyPassEnabled(value); TGPref.setTGProxyPassEnabled(value);
return true; return true;
}); });
PreferencesUtil.addEditTextPreference(this, "tg_proxy_login", AndroidUtils.getString("ssockslogin"), (preference, o) -> { PreferencesUtil.addEditTextPreference(this, "tg_proxy_login", requireContext().getString(R.string.ssockslogin), (preference, o) -> {
TGPref.setTGProxyUserPass((String) o, TGPref.getTGProxyPass()); TGPref.setTGProxyUserPass((String) o, TGPref.getTGProxyPass());
return true; return true;
}); });
PreferencesUtil.addEditTextPreference(this, "tg_proxy_pass", AndroidUtils.getString("ssockspass"), (preference, o) -> { PreferencesUtil.addEditTextPreference(this, "tg_proxy_pass", requireContext().getString(R.string.ssockspass), (preference, o) -> {
TGPref.setTGProxyUserPass(TGPref.getTGProxyUser(), (String) o); TGPref.setTGProxyUserPass(TGPref.getTGProxyUser(), (String) o);
return true; return true;
}); });
@@ -85,7 +83,7 @@ public class StickersPreferencesFragment extends MaterialPreferenceToolbarFragme
@Override @Override
public int T4() { public int T4() {
return getIdentifier("vtltgs", "string"); return R.string.vtltgs;
} }
} }
@@ -4,7 +4,6 @@ import static ru.vtosters.lite.foaf.FoafBase.loadAndShow;
import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedAd; import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedAd;
import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedFilter; import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedFilter;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserID; 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 static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import android.content.ClipData; import android.content.ClipData;
@@ -17,6 +16,7 @@ import android.view.View;
import com.vk.core.dialogs.actionspopup.ActionsPopup; import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.profile.ui.components.CommunityFragmentActionsMenuBuilder; import com.vk.profile.ui.components.CommunityFragmentActionsMenuBuilder;
import com.vk.profile.ui.components.ProfileFragmentActionsMenuBuilder; import com.vk.profile.ui.components.ProfileFragmentActionsMenuBuilder;
import com.vtosters.lite.R;
import com.vtosters.lite.api.ExtendedCommunityProfile; import com.vtosters.lite.api.ExtendedCommunityProfile;
import com.vtosters.lite.api.ExtendedUserProfile; import com.vtosters.lite.api.ExtendedUserProfile;
@@ -28,6 +28,7 @@ import java.util.Objects;
import kotlin.Unit; import kotlin.Unit;
import kotlin.jvm.b.Functions; import kotlin.jvm.b.Functions;
import ru.vtosters.lite.hooks.NewsfeedHook; import ru.vtosters.lite.hooks.NewsfeedHook;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.RenameTool; import ru.vtosters.lite.utils.RenameTool;
public class MenuBuilder { public class MenuBuilder {
@@ -58,17 +59,17 @@ public class MenuBuilder {
try { try {
final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb); final ExtendedUserProfile eup = (ExtendedUserProfile) pfambObject.get(mb);
final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext(); final Context ctx = ((View) Objects.requireNonNull(apView.get(builder))).getContext();
addItem(builder, getString("menu_copy_id"), () -> { addItem(builder, AndroidUtils.getString(R.string.menu_copy_id), () -> {
copy(ctx, String.valueOf(getUserID(eup))); copy(ctx, String.valueOf(getUserID(eup)));
return Unit.a; return Unit.a;
}); });
addItem(builder, getString("menu_addon_info"), () -> { addItem(builder, AndroidUtils.getString(R.string.menu_addon_info), () -> {
loadAndShow(ctx, getUserID(eup)); loadAndShow(ctx, getUserID(eup));
return Unit.a; return Unit.a;
}); });
addItem(builder, getString("menu_change_name"), () -> { addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
RenameTool.createDialog(eup, ctx); RenameTool.createDialog(eup, ctx);
return Unit.a; return Unit.a;
}); });
@@ -85,25 +86,25 @@ public class MenuBuilder {
final boolean isPageWhitelistedFilter = NewsfeedHook.isWhitelistedFilter(ecp); final boolean isPageWhitelistedFilter = NewsfeedHook.isWhitelistedFilter(ecp);
final boolean isPageWhitelistedAds = NewsfeedHook.isWhitelistedAd(ecp); final boolean isPageWhitelistedAds = NewsfeedHook.isWhitelistedAd(ecp);
addItem(builder, getString("menu_copy_id"), () -> { addItem(builder, AndroidUtils.getString(R.string.menu_copy_id), () -> {
copy(ctx, String.valueOf(getUserID(ecp))); copy(ctx, String.valueOf(getUserID(ecp)));
return Unit.a; return Unit.a;
}); });
addItem(builder, getString("menu_change_name"), () -> { addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
RenameTool.createDialogGroup(ecp, ctx); RenameTool.createDialogGroup(ecp, ctx);
return Unit.a; return Unit.a;
}); });
addItem(builder, getString(isPageWhitelistedFilter ? "remove_from_filter_whitelist" : "add_to_filter_whitelist"), () -> { addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> {
setWhitelistedFilter(ecp, !isPageWhitelistedFilter); setWhitelistedFilter(ecp, !isPageWhitelistedFilter);
sendToast(getString(isPageWhitelistedFilter ? "removed_from_whitelist_success" : "added_to_whitelist_success")); sendToast(AndroidUtils.getString(isPageWhitelistedFilter ? R.string.removed_from_whitelist_success : R.string.added_to_whitelist_success));
return Unit.a; return Unit.a;
}); });
addItem(builder, getString(isPageWhitelistedAds ? "remove_from_ads_whitelist" : "add_to_ads_whitelist"), () -> { addItem(builder, AndroidUtils.getString(isPageWhitelistedAds ? R.string.remove_from_ads_whitelist : R.string.add_to_ads_whitelist), () -> {
setWhitelistedAd(ecp, !isPageWhitelistedAds); setWhitelistedAd(ecp, !isPageWhitelistedAds);
sendToast(getString(isPageWhitelistedAds ? "removed_from_whitelist_success" : "added_to_whitelist_success")); sendToast(AndroidUtils.getString(isPageWhitelistedAds ? R.string.removed_from_whitelist_success : R.string.added_to_whitelist_success));
return Unit.a; return Unit.a;
}); });
@@ -117,7 +118,7 @@ public class MenuBuilder {
ClipData clip = ClipData.newPlainText("MBH-ST", txt); ClipData clip = ClipData.newPlainText("MBH-ST", txt);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
sendToast(getString("menu_copied")); sendToast(AndroidUtils.getString(R.string.menu_copied));
} }
public static void addItem(final ActionsPopup.b builder, final String title, final Functions onClick) throws InvocationTargetException, IllegalAccessException { public static void addItem(final ActionsPopup.b builder, final String title, final Functions onClick) throws InvocationTargetException, IllegalAccessException {
@@ -2,7 +2,6 @@ package ru.vtosters.lite.ui.vkui;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
@@ -12,6 +11,7 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.vk.core.dialogs.bottomsheet.ModalBottomSheet; import com.vk.core.dialogs.bottomsheet.ModalBottomSheet;
import com.vtosters.lite.R;
public class ModalBottomSheetWrapper { public class ModalBottomSheetWrapper {
public final ModalBottomSheet.a builder; public final ModalBottomSheet.a builder;
@@ -34,7 +34,7 @@ public class ModalBottomSheetWrapper {
container.setOrientation(LinearLayout.VERTICAL); container.setOrientation(LinearLayout.VERTICAL);
changelogView.setPadding(0, dp2px(8), 0, 0); changelogView.setPadding(0, dp2px(8), 0, 0);
changelogView.setText(getString("changelog") + ": \n" + changelog); changelogView.setText(context.getString(R.string.changelog) + ": \n" + changelog);
changelogView.setTextColor(getTextAttr()); changelogView.setTextColor(getTextAttr());
container.addView(changelogView, new LinearLayout.LayoutParams(-1, -2)); container.addView(changelogView, new LinearLayout.LayoutParams(-1, -2));
@@ -7,7 +7,6 @@ import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaperFile;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.removeWallpaper; import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.removeWallpaper;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.requestUpdateWallpaper; import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.requestUpdateWallpaper;
import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.edit;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
import static ru.vtosters.lite.utils.Preferences.hasVerification; import static ru.vtosters.lite.utils.Preferences.hasVerification;
@@ -21,6 +20,7 @@ import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
import com.vtosters.lite.R;
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
import com.vtosters.lite.im.ImEngineProvider; import com.vtosters.lite.im.ImEngineProvider;
@@ -53,23 +53,22 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
public void onCreate(Bundle bundle) { public void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
int vtosterXml = getIdentifier("empty", "xml"); addPreferencesFromResource(R.xml.empty);
addPreferencesFromResource(vtosterXml);
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("vkim_settings_appearance_chat_preview_title")); PreferencesUtil.addPreferenceCategory(this, requireContext().getString(R.string.vkim_settings_appearance_chat_preview_title));
mWPPreviewPref = new WallpaperPreferences(getContext()); mWPPreviewPref = new WallpaperPreferences(getContext());
mWPPreviewPref.setIcon(null); mWPPreviewPref.setIcon(null);
mWPPreviewPref.setIconSpaceReserved(false); mWPPreviewPref.setIconSpaceReserved(false);
getPreferenceScreen().addPreference(mWPPreviewPref); getPreferenceScreen().addPreference(mWPPreviewPref);
PreferencesUtil.addPreference(this, "wp_set", AndroidUtils.getString("wallpaper_select"), AndroidUtils.getString("wallpaper_from_gallery"), "ic_picture_outline_28", preference -> { PreferencesUtil.addPreference(this, "wp_set", requireContext().getString(R.string.wallpaper_select), requireContext().getString(R.string.wallpaper_from_gallery), R.drawable.ic_picture_outline_28, preference -> {
startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI), 1488); startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI), 1488);
removeStickCache(); removeStickCache();
return true; return true;
}); });
PreferencesUtil.addPreference(this, "wp_clear", AndroidUtils.getString("wallpaper_remove"), "", "ic_delete_outline_28", preference -> { PreferencesUtil.addPreference(this, "wp_clear", requireContext().getString(R.string.wallpaper_remove), "", R.drawable.ic_delete_outline_28, preference -> {
removeWallpaper(); removeWallpaper();
requestUpdateWallpaper(); requestUpdateWallpaper();
mWPPreviewPref.redraw(); mWPPreviewPref.redraw();
@@ -77,30 +76,30 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addPreferenceCategory(this, AndroidUtils.getString("vtlfilters")); PreferencesUtil.addPreferenceCategory(this, requireContext().getString(R.string.vtlfilters));
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) { if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
PreferencesUtil.addPreference(this, "", AndroidUtils.getString("filters_warning"), AndroidUtils.getString("icons_warning_info"), null, preference -> { PreferencesUtil.addPreference(this, "", requireContext().getString(R.string.filters_warning), requireContext().getString(R.string.icons_warning_info), 0, preference -> {
requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/"))); requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app/donate/")));
return false; return false;
}); });
} }
PreferencesUtil.addListPreference(this, "msg_blur_radius", "disabled", AndroidUtils.getString("filter_blur"), AndroidUtils.getArray("filter_types"), new String[]{ PreferencesUtil.addListPreference(this, "msg_blur_radius", "disabled", requireContext().getString(R.string.filter_blur), AndroidUtils.getArray(R.array.filter_types), new String[]{
"disabled", "low", "med", "high" "disabled", "low", "med", "high"
}); });
PreferencesUtil.addListPreference(this, "msg_dim", "off", AndroidUtils.getString("filter_dim"), AndroidUtils.getArray("filter_dim_types"), new String[]{ PreferencesUtil.addListPreference(this, "msg_dim", "off", requireContext().getString(R.string.filter_dim), AndroidUtils.getArray(R.array.filter_dim_types), new String[]{
"off", "dim_black", "dim_white" "off", "dim_black", "dim_white"
}); });
PreferencesUtil.addListPreference(this, "msg_mosaic", "disabled", AndroidUtils.getString("filter_mosaic"), AndroidUtils.getArray("filter_types"), new String[]{ PreferencesUtil.addListPreference(this, "msg_mosaic", "disabled", requireContext().getString(R.string.filter_mosaic), AndroidUtils.getArray(R.array.filter_types), new String[]{
"disabled", "low", "med", "high" "disabled", "low", "med", "high"
}); });
if (hasVerification()) { if (hasVerification()) {
PreferencesUtil.addMaterialSwitchPreference(this, "msg_monochrome", AndroidUtils.getString("filter_monochrome"), "", null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_monochrome", requireContext().getString(R.string.filter_monochrome), "", 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_monochrome", value).commit(); edit().putBoolean("msg_monochrome", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -108,7 +107,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "msg_invert", AndroidUtils.getString("filter_invert_colors"), "", null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_invert", requireContext().getString(R.string.filter_invert_colors), "", 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_invert", value).commit(); edit().putBoolean("msg_invert", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -116,7 +115,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "msg_sepia", AndroidUtils.getString("filter_sepia"), "", null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_sepia", requireContext().getString(R.string.filter_sepia), "", 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_sepia", value).commit(); edit().putBoolean("msg_sepia", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -124,7 +123,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "msg_emboss", AndroidUtils.getString("filter_emboss"), AndroidUtils.getString("filter_maybe_lag"), null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_emboss", requireContext().getString(R.string.filter_emboss), requireContext().getString(R.string.filter_maybe_lag), 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_emboss", value).commit(); edit().putBoolean("msg_emboss", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -132,7 +131,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "msg_engrave", AndroidUtils.getString("filter_engrave"), AndroidUtils.getString("filter_maybe_lag"), null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_engrave", requireContext().getString(R.string.filter_engrave), requireContext().getString(R.string.filter_maybe_lag), 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_engrave", value).commit(); edit().putBoolean("msg_engrave", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -140,7 +139,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "msg_flea", AndroidUtils.getString("filter_flea"), "", null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_flea", requireContext().getString(R.string.filter_flea), "", 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_flea", value).commit(); edit().putBoolean("msg_flea", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -148,7 +147,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
return true; return true;
}); });
PreferencesUtil.addMaterialSwitchPreference(this, "msg_snow", AndroidUtils.getString("filter_flea"), "", null, false, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "msg_snow", requireContext().getString(R.string.filter_flea), "", 0, false, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("msg_snow", value).commit(); edit().putBoolean("msg_snow", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -157,7 +156,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
}); });
} }
PreferencesUtil.addMaterialSwitchPreference(this, "compresswp", AndroidUtils.getString("compress_wallpaper_title"), AndroidUtils.getString("compress_wallpaper_summ"), null, true, (preference, o) -> { PreferencesUtil.addMaterialSwitchPreference(this, "compresswp", requireContext().getString(R.string.compress_wallpaper_title), requireContext().getString(R.string.compress_wallpaper_summ), 0, true, (preference, o) -> {
boolean value = (boolean) o; boolean value = (boolean) o;
edit().putBoolean("compresswp", value).commit(); edit().putBoolean("compresswp", value).commit();
requestUpdateWallpaper(); requestUpdateWallpaper();
@@ -232,6 +231,6 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment {
@Override @Override
public int T4() { public int T4() {
return getIdentifier("wallpapers", "string"); return R.string.wallpapers;
} }
} }
@@ -3,7 +3,6 @@ package ru.vtosters.lite.ui.wallpapers;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getFilteredFile; import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getFilteredFile;
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaperFile; import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaperFile;
import static ru.vtosters.lite.utils.AndroidUtils.dp2px; import static ru.vtosters.lite.utils.AndroidUtils.dp2px;
import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
@@ -16,6 +15,8 @@ import androidx.preference.PreferenceViewHolder;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vtosters.lite.R;
import ru.vtosters.lite.ui.adapters.MessagesPreviewAdapter; import ru.vtosters.lite.ui.adapters.MessagesPreviewAdapter;
public class WallpaperPreferences extends Preference { public class WallpaperPreferences extends Preference {
@@ -38,21 +39,21 @@ public class WallpaperPreferences extends Preference {
public WallpaperPreferences(Context context, AttributeSet attributeSet, int defStyleAttr, int i1) { public WallpaperPreferences(Context context, AttributeSet attributeSet, int defStyleAttr, int i1) {
super(context, attributeSet, defStyleAttr, i1); super(context, attributeSet, defStyleAttr, i1);
setLayoutResource(getIdentifier("wppreview", "layout")); setLayoutResource(R.layout.wppreview);
} }
@Override @Override
public void onBindViewHolder(PreferenceViewHolder preferenceViewHolder) { public void onBindViewHolder(PreferenceViewHolder preferenceViewHolder) {
super.onBindViewHolder(preferenceViewHolder); super.onBindViewHolder(preferenceViewHolder);
mRecyclerView = (RecyclerView) preferenceViewHolder.findViewById(getIdentifier("install_btn_container", "id")); mRecyclerView = (RecyclerView) preferenceViewHolder.findViewById(R.id.install_btn_container);
mRecyclerView.setPadding(0, dp2px(8), 0, 0); mRecyclerView.setPadding(0, dp2px(8), 0, 0);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.setAdapter((mAdapter = new MessagesPreviewAdapter())); mRecyclerView.setAdapter((mAdapter = new MessagesPreviewAdapter()));
mRecyclerView.setClickable(false); mRecyclerView.setClickable(false);
mRecyclerView.setFocusable(false); mRecyclerView.setFocusable(false);
mChatBackground = (ImageView) preferenceViewHolder.findViewById(getIdentifier("author", "id")); mChatBackground = (ImageView) preferenceViewHolder.findViewById(R.id.author);
requestBg(); requestBg();
} }
@@ -4,7 +4,6 @@ import static com.vk.im.engine.h.im_bg_chat;
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getFilteredDrawable; import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getFilteredDrawable;
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
import static ru.vtosters.lite.utils.AndroidUtils.getPreferences; import static ru.vtosters.lite.utils.AndroidUtils.getPreferences;
import static ru.vtosters.lite.utils.AndroidUtils.getString;
import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.getBoolValue;
@@ -14,10 +13,13 @@ import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import com.vtosters.lite.R;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.ThemesUtils; import ru.vtosters.lite.utils.ThemesUtils;
import vigo.sdk.Log; import vigo.sdk.Log;
@@ -74,8 +76,8 @@ public class WallpapersHooks {
} }
private static Boolean eligibleWallpaperFile(File file) { private static Boolean eligibleWallpaperFile(File file) {
if (file.length() >= 6291456) { if (file.length() >= 0x600000) {
sendToast(getString("wallpaper_size_limit")); sendToast(AndroidUtils.getString(R.string.wallpaper_size_limit));
removeWallpaper(); removeWallpaper();
return false; return false;
} else { } else {
@@ -134,13 +136,13 @@ public class WallpapersHooks {
String radius = getPreferences().getString("msg_blur_radius", "disabled"); String radius = getPreferences().getString("msg_blur_radius", "disabled");
switch (radius) { switch (radius) {
case "low": case "low":
return getString("wallpapers_low"); return AndroidUtils.getString(R.string.wallpapers_low);
case "med": case "med":
return getString("wallpapers_med"); return AndroidUtils.getString(R.string.wallpapers_med);
case "high": case "high":
return getString("wallpapers_high"); return AndroidUtils.getString(R.string.wallpapers_high);
default: default:
return getString("wallpapers_disabled"); return AndroidUtils.getString(R.string.wallpapers_disabled);
} }
} }
@@ -148,11 +150,11 @@ public class WallpapersHooks {
String radius = getPreferences().getString("msg_dim", "disabled"); String radius = getPreferences().getString("msg_dim", "disabled");
switch (radius) { switch (radius) {
case "dim_black": case "dim_black":
return getString("wallpapers_dim_black"); return AndroidUtils.getString(R.string.wallpapers_dim_black);
case "dim_white": case "dim_white":
return getString("wallpapers_dim_white"); return AndroidUtils.getString(R.string.wallpapers_dim_white);
default: default:
return getString("wallpapers_disabled"); return AndroidUtils.getString(R.string.wallpapers_disabled);
} }
} }
@@ -160,13 +162,13 @@ public class WallpapersHooks {
String radius = getPreferences().getString("msg_mosaic", "disabled"); String radius = getPreferences().getString("msg_mosaic", "disabled");
switch (radius) { switch (radius) {
case "low": case "low":
return getString("wallpapers_low"); return AndroidUtils.getString(R.string.wallpapers_low);
case "med": case "med":
return getString("wallpapers_med"); return AndroidUtils.getString(R.string.wallpapers_med);
case "high": case "high":
return getString("wallpapers_high"); return AndroidUtils.getString(R.string.wallpapers_high);
default: default:
return getString("wallpapers_disabled"); return AndroidUtils.getString(R.string.wallpapers_disabled);
} }
} }
@@ -11,6 +11,8 @@ import static ru.vtosters.lite.utils.Preferences.isValidSignature;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import com.vtosters.lite.R;
import java.io.IOException; import java.io.IOException;
import java.util.Scanner; import java.util.Scanner;
@@ -22,10 +24,10 @@ public class About {
public static void injectToToolBar(View view) { public static void injectToToolBar(View view) {
view.setOnLongClickListener(v -> { view.setOnLongClickListener(v -> {
if (devmenu()) { if (devmenu()) {
sendToast(AndroidUtils.getString("debug_menu_already_activated")); sendToast(AndroidUtils.getString(R.string.debug_menu_already_activated));
} else { } else {
edit().putBoolean("devmenu", true).apply(); edit().putBoolean("devmenu", true).apply();
sendToast(AndroidUtils.getString("debug_menu_activated")); sendToast(AndroidUtils.getString(R.string.debug_menu_activated));
} }
return true; return true;
}); });
@@ -1,32 +1,31 @@
package ru.vtosters.lite.utils; package ru.vtosters.lite.utils;
import static ru.vtosters.lite.hooks.DateHook.getLocale;
import static ru.vtosters.lite.utils.Preferences.preferences;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build; import android.os.Build;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import com.vk.core.util.Screen; import com.vk.core.util.Screen;
import com.vk.core.util.ToastUtils;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import ru.vtosters.lite.hooks.DateHook;
public class AndroidUtils { public class AndroidUtils {
public static SharedPreferences getDefaultPrefs() { public static SharedPreferences getDefaultPrefs() {
if (preferences == null) if (Preferences.preferences == null)
preferences = PreferenceManager.getDefaultSharedPreferences(getGlobalContext()); Preferences.preferences = PreferenceManager.getDefaultSharedPreferences(getGlobalContext());
return preferences; return Preferences.preferences;
} }
public static SharedPreferences getPreferences() { public static SharedPreferences getPreferences() {
@@ -69,10 +68,14 @@ public class AndroidUtils {
return 0; return 0;
} // Get res id } // Get res id
public static String[] getArray(String resourcename) { public static String[] getArray(int arrayId) {
return getResources().getStringArray(getIdentifier(resourcename, "array")); return getResources().getStringArray(arrayId);
} // Get array from arrays.xml } // Get array from arrays.xml
public static String getString(int id) {
return getGlobalContext().getString(id);
}
public static String getString(String resourcename) { public static String getString(String resourcename) {
return getGlobalContext().getString(getIdentifier(resourcename, "string")); return getGlobalContext().getString(getIdentifier(resourcename, "string"));
} // Get string via getIdentifier } // Get string via getIdentifier
@@ -90,7 +93,7 @@ public class AndroidUtils {
} }
public static Context setDefaultLocale(Context context) { public static Context setDefaultLocale(Context context) {
Locale locale = new Locale(getLocale()); Locale locale = new Locale(DateHook.getLocale());
Locale.setDefault(locale); Locale.setDefault(locale);
var resources = context.getResources(); var resources = context.getResources();
@@ -123,26 +126,25 @@ public class AndroidUtils {
} }
public static void sendToast(String text) { public static void sendToast(String text) {
Toast.makeText(getGlobalContext(), text, Toast.LENGTH_SHORT).show(); ToastUtils.a(text);
} }
public static String MD5(String s) { public static String MD5(String s) {
try { try {
var messageDigest = MessageDigest.getInstance("MD5"); var md = MessageDigest.getInstance("MD5");
md.update(s.getBytes());
var md5 = md.digest();
var sb = new StringBuilder(); var sb = new StringBuilder();
messageDigest.update(s.getBytes()); for (var b : md5) {
byte[] digest = messageDigest.digest(); var hex = Integer.toHexString(b & 0xFF);
for (byte b : digest) { if (hex.length() == 1)
StringBuilder hexString = new StringBuilder(Integer.toHexString(b & 255)); sb.append(0);
while (hexString.length() < 2) { sb.append(hex);
hexString.insert(0, "0");
}
sb.append(hexString);
} }
return sb.toString(); return sb.toString();
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
e.printStackTrace(); e.printStackTrace();
return null;
} }
return null;
} }
} }
@@ -14,6 +14,7 @@ import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
import com.vk.imageloader.VKImageLoader; import com.vk.imageloader.VKImageLoader;
import com.vk.media.player.cache.AutoPlayCacheHolder; import com.vk.media.player.cache.AutoPlayCacheHolder;
import com.vk.stickers.Stickers; import com.vk.stickers.Stickers;
import com.vtosters.lite.R;
import java.text.CharacterIterator; import java.text.CharacterIterator;
import java.text.StringCharacterIterator; import java.text.StringCharacterIterator;
@@ -48,7 +49,7 @@ public class CacheUtils {
size = IOUtils.getDirSize(getGlobalContext().getCacheDir()); size = IOUtils.getDirSize(getGlobalContext().getCacheDir());
if (size >= getSizeForDelete()) { if (size >= getSizeForDelete()) {
if (dev()) sendToast(AndroidUtils.getString("cache_cleaned")); if (dev()) sendToast(AndroidUtils.getString(R.string.cache_cleaned));
VKImageLoader.e(); VKImageLoader.e();
ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a); ImAudioMsgPlayerProvider.b().e(PlayerActionSources.a);
ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a); ImAudioMsgPlayerProvider.b().d(PlayerActionSources.a);
@@ -4,7 +4,6 @@ import static androidx.core.app.ActivityCompat.requestPermissions;
import static ru.vtosters.lite.net.Request.makeRequest; import static ru.vtosters.lite.net.Request.makeRequest;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken; 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.AndroidUtils.sendToast;
import android.Manifest; import android.Manifest;
@@ -14,6 +13,7 @@ import android.content.Context;
import android.content.SyncResult; import android.content.SyncResult;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log; import android.util.Log;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@@ -22,6 +22,7 @@ import com.vk.auth.VKAuthUtils;
import com.vk.contacts.ContactsSyncAdapterService; import com.vk.contacts.ContactsSyncAdapterService;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import com.vtosters.lite.R;
import com.vtosters.lite.auth.VKAccountManager; import com.vtosters.lite.auth.VKAccountManager;
import org.json.JSONException; import org.json.JSONException;
@@ -41,7 +42,7 @@ public class ContactsUtils {
Log.d("ContactsUtils", "Result: " + mainJson + ", enabled sync: " + enabled); Log.d("ContactsUtils", "Result: " + mainJson + ", enabled sync: " + enabled);
} catch (JSONException e) { } catch (JSONException e) {
Log.d("ContactsUtils", e.getMessage()); Log.d("ContactsUtils", e.getMessage());
sendToast(getString("contact_sync_error")); sendToast(AndroidUtils.getString(R.string.contact_sync_error));
} }
}); });
} }
@@ -49,9 +50,9 @@ public class ContactsUtils {
public static void uploadContacts(Activity ctx) { public static void uploadContacts(Activity ctx) {
try { try {
if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
sendToast(getString("contact_permission_toast")); sendToast(ctx.getString(R.string.contact_permission_toast));
requestPermissions(LifecycleUtils.getCurrentActivity(), new String[]{Manifest.permission.READ_CONTACTS}, 11111); requestPermissions(LifecycleUtils.getCurrentActivity(), new String[]{Manifest.permission.READ_CONTACTS}, 11111);
sendToast(getString("contact_permission_toast")); sendToast(ctx.getString(R.string.contact_permission_toast));
requestPermissions(ctx, new String[]{Manifest.permission.READ_CONTACTS}, 11111); requestPermissions(ctx, new String[]{Manifest.permission.READ_CONTACTS}, 11111);
} else { } else {
var account = VKAuthUtils.a.a(VKAccountManager.d().Z()); var account = VKAuthUtils.a.a(VKAccountManager.d().Z());
@@ -64,9 +65,12 @@ public class ContactsUtils {
public static void getContactsStatus(Context ctx) { public static void getContactsStatus(Context ctx) {
final ProgressDialog progressDialog = new ProgressDialog(ctx); final ProgressDialog progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage(getString("contact_info_loading")); progressDialog.setMessage(ctx.getString(R.string.contact_info_loading));
progressDialog.show(); progressDialog.show();
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
var request = new okhttp3.Request.a() var request = new okhttp3.Request.a()
.b("https://" + getApi() + "/method/execute?https=1&v=5.153&code=return%20API.account.getInfo().settings%5B44%5D.value%3B&access_token=" + getUserToken()) .b("https://" + getApi() + "/method/execute?https=1&v=5.153&code=return%20API.account.getInfo().settings%5B44%5D.value%3B&access_token=" + getUserToken())
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")) .a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"))
@@ -84,10 +88,10 @@ public class ContactsUtils {
boolean enabledsync = resp.equals("contact"); boolean enabledsync = resp.equals("contact");
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(getString("contact_sync_title")) .setTitle(R.string.contact_sync_title)
.setMessage(getString("contact_sync_state") + ": " + getString(enabledsync ? "contact_sync_enabled" : "contact_sync_disabled")) .setMessage(ctx.getString(R.string.contact_sync_state) + ": " + ctx.getString(enabledsync ? R.string.contact_sync_enabled : R.string.contact_sync_disabled))
.setCancelable(true) .setCancelable(true)
.setPositiveButton(getString(!enabledsync ? "enable" : "proxy_disable"), .setPositiveButton(!enabledsync ? R.string.enable : R.string.proxy_disable,
(dialog, which) -> setContactsSync(!enabledsync) (dialog, which) -> setContactsSync(!enabledsync)
) )
// .setNegativeButton("Импортировать контакты", // .setNegativeButton("Импортировать контакты",

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